software1987 Tech-Blog

10Okt/120

Probleme mit Faraday und Omniauth

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.

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 Bitfeldgröß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. Daher habe ich 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