software1987 Tech-Blog

10Okt/120

Probleme mit Faraday und Omniauth

rvm Logo

Für meinen englischsprachigen, in Ruby on Rails geschriebenen Blog geekmonkey.org nutze ich das Gem Omniauth. Nach einer Neuinstallation auf einem neuen Server bekam ich beim OAuth-Login via Github plötzlich folgenden Fehler:


Faraday::Error::ConnectionFailed
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

Da ich RVM zum verwalten unterschiedlicher Ruby-Versionen nutze, lag es nah, dass bei der Installation von Ruby 1.9.3 irgendwas schief gelaufen war. Eine kurze Google-Suche ergab, dass dies ein Problem mit der auf meinem System installierten Version der openssl Bibliothek ist. Um das Problem zu lösen, kann man mit rvm eine passende Version der openssl Bibliothek nachinstallieren. Bei der Gelegenheit lässt sich auch gerade eine angepasste Version von libreadline installieren:


sudo apt-get install libreadline-dev
rvm pkg install readline
rvm pkg install openssl
rvm reinstall all --force --with-openssl-dir=$rvm_path/usr

Dies lädt und kompiliert die beiden Bibliotheken readline und openssl für alle rvm rubies und kompiliert danach alle (!) installierten Ruby-Versionen neu. Angelegte Gemsets werden dabei nicht gelöscht und können daher nach Fertigstellung der Installation direkt weiter verwendet werden.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
30Okt/110

Ruby BitField C Extension

Angetrieben durch die Vorlesung "Evolutionäre Algorithmen" an der Technischen Hochschule Mittelhessen habe ich eine Ruby Extension entwickelt mit der sich Bitfelder performant und speichersparend abbilden lassen. In der Vorlesung betrachtet man als Bitfelder abgebildete "Gene" (die bis auf die Idee der Mutation, Crossover, Selektion nichts mit Ihren biologischen Vorbildern zutun haben). Da man in Ruby nicht direkt einzelne Bits ansprechen kann (man kann sie natürlich über Integers mit Bitshifts abbilden) und ein Array von Integern bei entsprechenden Bitfeld größen viel Speicher benötigt (4 Byte * Anzahl Bits) leidet die Performance des gesamten Algorithmus' darunter.

Die von C++ stammende Boost Bibliothek stellt einen Datentypen dynamic_bitset zur Verfügung mit dem Bitfelder nahezu beliebiger Größe effizient verwaltet werden können. In relativ kurzer Zeit habe ich daher eine Ruby Extension in C/C++ geschrieben die diesen Datentypen in Ruby zur Verfügung stellt. Das Ergebnis lässt sich durchaus sehen: Im Vergleich zu meiner vorherigen Implementierung in der ein Bitfeld als Integer-Array abgebildet wurde hat sich die Performance um den Faktor 15 verbessert.

Die Extension ist als Gem verfügbar und lässt sich mit:

gem install bitfield

installieren.

Quellcode: https://github.com/halfdan/ruby-bitfield
Rubygem:  https://rubygems.org/gems/bitfield

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
3Okt/110

PHP 5.4: Built-In Webserver

Die aktuell im Beta Status befindliche Version 5.4 von PHP wartet mit einigen neuen Features auf. Eines davon ist ein integrierter Webserver mit dem sich Skripte direkt ausführen und im Browser anzeigen lassen.

  -S <addr>:<port> Run with built-in web server.
  -t <docroot>     Specify document root <docroot> for built-in
                   web server.

Wenn man nach dem Start des Webservers phpinfo() aufruft erhält man im Feld "Server API" die Anzeigt "Built-in HTTP server".

PHP 5.4 Alpha2 - phpinfo()

PHP 5.4 Alpha2 - phpinfo()

Mit dem Kommando "php -S localhost:8080 -t /srv/www/" lässt sich der Webserver auf Port 8080 starten, der Document Root liegt dabei auf /srv/www. Dieser Webserver ermöglicht es Entwicklern ihre Anwendung zu testen ohne zusätzlich einen Webserver wie Apache, Nginx, Lighttpd aufzusetzen. Es ist nur eine Frage der Zeit bis Entwicklungsumgebungen dieses Feature nutzen werden.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
3Jul/111

Force SSL mit Nginx

Beim Umstellen meines Server von Apache + Passenger und Lighttpd auf den leichtgewichtigen Nginx + Passenger habe ich einige SSL Zertifikate mit Installiert. Dabei ist es interessant einen möglichst leichten Weg zu haben bei einzelnen Domains eine SSL Verbindung zu erzwingen.

Dafür genügen im server Kontext bereits die folgenden Zeilen:

if ($scheme = http) {
    rewrite ^(.*)$ https://$host$uri last;
}
Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
4Jun/110

InterNetworX XMLRPC API für Ruby

Der Domain Registrar InterNetworX (kurz: inwx) stellt eine XMLRPC API zur Verfügung mit der man automatisiert Domains/Handles anlegen, editieren oder löschen kann. Zudem kann man noch Einträge im Nameserver bearbeiten.

INWX stellt für Entwickler eine API-Beschreibung, sowie Beispiel Implementierungen für PHP und Java zur Verfügung (link). Der Entwickler Philipp Klaus hat in seinem Blog zusätzlich eine Python-Portierung der API-Implementierung vorgestellt.

Im letzten Jahr habe ich für ein Ruby on Rails Projekt eine Ruby Implementierung geschrieben die ich nun hier vorstellen möchte.

Voraussetzungen

  • Ruby 1.9.x (Abhängigkeit zu XMLRPC/Client)

Installation

Der Quellcode wird auf Github gehostet. Daher gibt es zwei Wege um an den Quellcode zu gelangen:

via git:

git clone git://github.com/halfdan/ruby-inwx-xmlrpc.git

via direktem Download:

.tar.gz, .zip

Benutzung

Die INWX-API stellt eine Reihe an Objekten zur Verfügung auf denen sich Methoden aufrufen lassen. Im folgenden Beispiel wird auf dem Objekt "domain" die Methode "info" mit einem Parameter ":domain" aufgerufen, als Rückgabe liefert die API entsprechend Informationen über die angegebene Domain.

require "INWX/DomainRobot"
require "YAML"

addr = "api.ote.domrobot.com"
# addr = "api.domrobot.com"
user = "your_username"
pass = "your_password"
lang = "en"

domainRobot = INWX::DomainRobot.new(addr, user, pass, lang, true)

object = "domain"
method = "info"

params = { :domain => "software1987.de" }

result = domainRobot.call(object, method, params)

puts YAML::dump(result)

Die Library lässt sich also sehr einfach verwenden. Hier noch einmal eine schrittweise Erklärung:

  1. Einbinden der Library:
    require "INWX/DomainRobot"
  2. Festlegen der Login-Daten und der Login-Addresse (hier: das OTE Testsystem)
  3. Instanziieren des DomainRobots (letzter Parameter gibt an ob eine sichere Verbindung verwendet werden soll):
    domainRobot = INWX::DomainRobot.new(addr,user,pass,lang,true)
  4. Festlegen des Objekts und der Methode (siehe xmlrpc.pdf im INWX Download) mit Parametern.
  5. Ausführen des XMLRPC-Requests:
    domainRobot.call(object, method, params)

Bei Fragen zur Bibliothek stehe ich gerne zur Verfügung!

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
2Jun/110

PHP 5.4: Short Syntax for Arrays

Als aktiver Leser der PHP internals bekommt man recht frühzeitig Informationen über neue Features oder solche die vorgeschlagen werden. Neben der aktuellen Diskussionen um einen neuen Release Prozess über den die Entwickler in den kommenden Tagen abstimmen werden, gibt es eine Neuauflage einer Diskussion [2] aus dem Jahr 2008.

Um in PHP ein Array zu initialisieren und mit Werten vorzubelegen muss bisher immer das Keyword "array" verwendet werden.

$a = array(1,2,3);
$b = array(
  'domain' => 'software1987',
  'tld' => 'de'
);

In anderen Sprachen gibt es hierfür eine leicht kürzere Syntax (Beispiel: Ruby):

a = [1,2,3]
b = { :domain => 'software1987', :tld => 'de' }

In der aktuellen Diskussion geht es darum, eine vergleichbare Kurzsyntax für PHP einzuführen. Die Idee dazu ist bereits aus dem Jahr 2003 und taucht seitdem immer wieder Mal auf den Mailinglisten auf. Aktuell wird wieder über die Kurzsyntax abgestimmt und es sieht aktuell so aus als könnte einer der beiden Vorschläge tatsächlich Eingang in PHP 5.4 findet.

Vorschlag 1:

$a = [1, 2, 3];
$b = ['foo': 'orange', 'bar': 'apple', 'baz': 'lemon'];

Vorschlag 2:

$a = [1, 2, 3];
$b = ['foo' => 'orange', 'bar' => 'apple', 'baz' => 'lemon'];

Die Abstimmung [1] findet aktuell nur darüber statt, ob eine dieser Vorschläge implementiert werden soll oder nicht (zum Zeitpunkt des schreibens: 17 Ja / 1 Nein).

Links

[1] https://wiki.php.net/rfc/shortsyntaxforarrays/vote - Abstimmung über RFC
[2] https://wiki.php.net/rfc/shortsyntaxforarrays - Request for Comments

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
11Mrz/116

beanstalkd unter Windows mit Cygwin

Vor ein paar Tagen bin ich auf beanstalkd aufmerksam geworden. Beanstalkd ist eine Warteschlange, welche man nutzen kann um Arbeitsaufgaben einzustelen und an anderer Stelle wieder abzuarbeiten. Ein passendes Beispiel ist das Hochladen und Konvertieren von Videos in einer Webapplikation. Nachdem der Upload fertig gestellt ist, möchte man den Benutzer nicht warten lassen, bis sein Video in ein anderes Format konvertiert worden ist. Man stellt also nach dem Upload eine Arbeitsaufgabe in die Warteschlange und kann dem Benutzer danach auf eine andere Seite verweisen. Ein anderer Prozess nimmt die Arbeitsaufgabe aus der Warteschlange entgegen und bearbeitet diese.

Beanstalkd gefällt mir persönlich sehr gut, da die Anzahl an Client-Bibliotheken sehr hoch ist, das Programm sehr schnell arbeitet und vorallem einen Möglichkeit bietet Arbeitsaufgaben persistent zu machen. Beanstalkd schreibt dabei die Arbeitsaufgaben in ein binäres Logfile, sodass es nach einem Reboot wieder an gleicher Stelle weiterarbeiten kann wo es aufgehört hat.

Das Tool wird von Keith Rarick entwickelt und steht für Linux und Mac zum Download bereit. Einen Windows Build wird aktuell nicht angeboten. Ich habe mich daher daran gemacht, beanstalkd unter Cygwin zum laufen zu bringen und konnte dies erfolgreich umsetzen. 

Beanstalkd selbst kompilieren

  1. Cygwin herunterladen und die folgenden Pakete installieren: gcc 4.5.0, autoconf, make
  2. Download der beanstalkd sourcen (https://github.com/kr/beanstalkd), entweder direkt als Download oder per Git (z.B. mit msysgit)
  3. Download der aktuellen libevent Bilbiothek (nicht unter Cygwin verfügbar)
  4. Entpacken beider Archive
  5. Cygwin Bash starten, mit "cd" in das Verzeichnis von libevent wechseln und "./configure && make && make install" ausführen
  6. Nun mit "cd" in das Verzeichnis von beanstalkd wechseln und dort "./configure" ausführen
  7. Nun muss manuell das Makefile geöffnet werden und dort bei den CPPFLAGS den Teilstring "-Werror" entfernen. Dieser verhindert das Kompilieren da eine Warning als Error interpretiert wird. Diese Warning ist jedoch m.M.n. unbedenklich.
  8. Nun mit "make && make install" beanstalkd kompilieren und installieren.
  9. Fertig!

Beim Ausführen von "make install" kann es passieren, dass ein Fehler auftritt ("Datei oder Verzeichnis nicht gefunden"). Vor dem Installieren sollte sichergestellt werden, dass beide Archive nicht in einem Verzeichnis liegen dessen absoluter Pfad ein Leerzeichen enthält (z.b. C:/Dokumente und Einstellungen/.. funktioniert nicht).

Download

Ich biete hier die aktuelle Version 1.4.6 von beanstalkd an. Diese ist lauffähig unter Windows. Ich übernehme keine Garantie für korrekte Ausführung und hafte nicht für etwaige Schäden die durch den Download oder die Benutzung entstehen könnten. beanstalkd wird von Keith Rarick entwickelt und steht unter GNU General Public Licence Version 3.

beanstalkd-1.4.6-cygwin.tar.gz
beanstalkd-1.4.6-cygwin.zip

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
13Feb/110

MPEG-LA vs. Google – Wo ist der Sinn von Softwarepatenten?

Nachdem ich zuletzt auf die Firmenpolitik von Oracle eingegangen bin, möchte ich an dieser Stelle einen Kommentar zur MPEG LA (Licencing Administration) posten.

Das Thema Softwarepatente keimt dabei im jüngsten Artikel von heise.de (Original: mpegla.com) erneut auf. Die MPEG LA hat angekündigt mit der Suche nach Patenten gegen das, von Google, unter einer Open Source Lizenz veröffentlichte WebM/VP8-Format zu beginnen. Das Format ist in letzter Zeit öfter in den Medien erwähnt worden, da Google den alleinigen Support von WebM im Browser Chrome angekündigt hatte. Firefox und Opera unterstützen für das HTML5 Video-Tag schon länger das ebenfalls freie OGG Vorbis und haben nun auch WebM-Unterstützung eingebaut. Microsoft und Apple, die selbst Patentinhaber beim H.264/AVC Lizenz-Pool sind, hatten sich zuletzt kritisch über WebM geäußert und die Patentfreiheit des Codecs angezweifelt. So werden beide Browser (Safari und IE9) WebM vorerst nur über ein Plugin unterstützen und sonst das proprietäre H.264 nutzen. Der H.264-Codec wird von der MPEG LA Lizenzfrei zur Verfügung gestellt, solange der Codec für das Internet-Streaming freier Inhalte genutzt wird.

In Europa sind Softwarepatente bisher nicht umgesetzt, ein entsprechender Antrag ist 2002 fehlgeschlagen. Nach Artikel 52 des Europäischen Patentübereinkommens (EPÜ) sind mathematische Formeln sowie "Programme für Datenverarbeitungsanlagen" als solche von Patenten ausgeschlossen.

Trotz diesem Ausschluss gibt es in Europa einige angemeldete Patente für H.264/AVC. Inwiefern diese unter die obengenannten Ausschlusskriterien fallen lässt sich an dieser Stelle schwer sagen.

Anstatt die Entwicklung von Software und Technik voran zu treiben behindern Patentbestrebungen wie diese, die freie Entfaltung und die Entwicklungsmöglichkeiten weltweit. Wie kann man als Entwickler eines neuen Codecs sicher sein, nicht gegen irgendwelche obstrusen Softwarepatente zu verstoßen, wenn nicht einmal der von Google gekaufte VP8-Codec dagegen gefeit ist. Der Erfolg oder Misserfolg der Bestrebungen der MPEG LA wird ausschlaggebend für die weiteren Entwicklungen der Softwarebranche und -patente sein.

Für den Anwender bleibt zu hoffen, dass sich mit der browserübergreifenden Einführung von HTML5 ein Codec durchsetzen wird. Gleiches gilt natürlich für Anbieter von Video-Content, da diese bisher entweder Flash benutzen oder aber bei Einsatz des Video-Tags ein Flash-Fallback anbieten müssen.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
28Jan/110

Netbeans 7 und die krux mit Oracle

Da habe ich mich die Tage noch gefreut, dass Netbeans 7.0 bald vor der Tür steht und nun erreicht mich die folgende Nachricht über Heise: http://www.heise.de/newsticker/meldung/NetBeans-7-Rails-Unterstuetzung-faellt-raus-1179098.html

Oracle hat beschlossen im Zuge der Veröffentlichung von Java 7 und dem damit verbundenen JDK7 alle verfügbaren Ressourcen primär in die Erweiterung von von Netbeans für Java 7 zu stecken. Damit geht Netbeans wieder ein Teil der Entwicklergemeinde verloren. Ich zumindest habe es immer genossen mit Netbeans meine Rails-Applications zu entwickeln, doch das wird nun leider bald ein Ende haben müssen. Die Hoffnung bleibt aber, dass das Rails-Plugin von der Community weitergetragen wird und Rails 3.0 irgendwann komplett unterstützt wird (aktuell Rails 3.0 Beta).

Ich werde mich nun wohl nach einer neuen IDE umschauen müssen. Textmate fällt bei mir raus da ich primär auf Linux/Windows arbeite und auch möglichst eine IDE haben möchte die auf beidem funktioniert. Aptana Radrails 2 scheint bisher eine brauchbare Alternative zu sein, auch wenn diese IDE auf Eclipse aufbaut.

Danke Oracle für das zerstören gut geleiteter Open Source Projekte. Auf Wiedersehen Open Solaris, OpenOffice, Hudson, MySQL und Willkommen LibreOffice, Jenkins und MariaDB!

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
veröffentlicht unter: Ruby, Webentwicklung keine Kommentare
3Sep/100

MongoSession – Ein PHP Session-Handler mit MongoDB

MongoSession

MongoSession ist eine Implementierung eines MongoDB Session-Handlers für PHP. Diese Klasse wurde als drop-in Lösung entwickelt um von normalem Session-Handling einfach umstellen zu können. Die Klasse wurde ursprünglich von Corey Ballou entwickelt und im Blog vorgestellt. Als ich das Projek auf Github geforkt hatte stellte ich schnell fest, dass der Code ungetestet und nicht funktional war. Nach einigen Testläufen ist MongoSession nun aber einsatzbereit.

Benutzung

Die einfachste Möglichkeit MongoSession zu verwenden, ist der folgende Code:

<?php
require_once('MongoSession.php');
$session = new MongoSession();
?>

Der Konstruktor von MongoSession setzt einen neuen Session-Handler, startet die Session (session_start()) und stellt eine Verbindung zum MongoDB-Server auf localhost her.

require_once('MongoSession.php');

// Array zur Konfiguration von MongoSession
$config = array(
	// Gültigkeitsbereich des Cookies
        'cookie_path' => '/',
        'cookie_domain' => '.mydomain.com', // .mydomain.com

        // Session
        'lifetime' => 3600, // session lifetime in Sekunden
        'database' => 'session', // Name der MongoDB database
        'collection' => 'session', // Name der MongoDB collection
        'persistent' => false, // Persistente Verbindung?
        'persistent_name' => 'MongoSession, // Name der Verbindung

	// Array von MongoDB servern
        'servers' => array(
            	array(
	                'host' => Mongo::DEFAULT_HOST,
	                'port' => Mongo::DEFAULT_PORT,
	                'username' => null,
	                'password' => null,
        	)
        )
);

$session = new MongoSession($_config);

Der obige Code zeigt wie man MongoSession mit Hilfe eines Array umkonfigurieren kann. Im Vergleich zur ursprünglichen Implementierung ist hier die Möglichkeit hinzugekommen persistente Verbindungen zum Server aufzubauen. Diese muss allerdings mit einem global (auf dem Server) eindeutigem Namen versehen werden, da sie sonst von jedem auf dem gleichen Server wiederverwendet werden kann.

Download

Das Projekt wird auf Github gehostet. Jeder der die Klasse verwenden möchte kann sich die aktuellste Version direkt von Github herunterladen.

Alternativ kann das Projekt natürlich auch mit git geklont werden:

git clone git://github.com/halfdan/MongoSession.git
Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)