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

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!

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!

veröffentlicht unter: Ruby, Webentwicklung keine Kommentare
19Aug/100

Ruby 1.9.2

Gestern ist Ruby 1.9.2 veröffentlicht worden. Ruby 1.9.2 ist zumeist kompatibel mit dem Vorgänger 1.9.1 und wird daher bei einer Installation unter Linux auch in das gleiche Verzeichnis installiert.

Die neue Version löst mit einer Neu-Implementierung der Time Klasse das Jahr 2038 Problem und erweitert die Socket API um bessere IPv6-Unterstützung zu bieten.

Die neue Klasse "Random" generiert Pseudozufallszahlen und unterstützt unterschiedliche Zufallszahlengeneratoren.

Installation

Wie immer kann der Quellcode von ruby-lang.org heruntergeladen werden:

http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p0.tar.gz
http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p0.tar.bz2
http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p0.zip

Alternativ kann man auch RVM nutzen, welches bereits aktualisiert wurde um das neue Release zu unterstützen:

rvm update --head && rvm reload && rvm install 1.9.2 && rvm 1.9.2 --default

Offizieller Artikel: http://www.ruby-lang.org/en/news/2010/08/18/ruby-1-9-2-is-released/