Freitag, 31. August 2012

Vorbereitungen für JRuby 1.6.8

Charles Nutter hat den CI-Server für JRuby 1.6.x wieder angeworfen. Damit sind jetzt wieder Snapshot-Builds auf http://ci.jruby.org/snapshots/1.6.x/ verfügbar. Charles fixt für da 1.6.8-Release gerade Bugs und hätte gerne  noch Input.

Donnerstag, 30. August 2012

Mittwoch, 29. August 2012

JRuby-Gem schreiben: Teil 2 von Richard Huang

Richard Huang hat Teil zwei seines Tutorials how to write a jruby gem online gestellt. Schwerpunkt ist diesmal die Erweiterung um Java-Code, um eine bessere Performance zu errreichen. Auch diesmal ist viel Quellcode dabei, von dem man sich einiges abschauen kann.

Dienstag, 28. August 2012

Sehr interessanter Vortrag: JRuby at Square (Payment-Provider)

Xavier Shay hat auf der JRubyConf 2012 einen sehr interessanten Vortrag über JRuby bei Square gehalten. Square ist ein Payment-Provider für kleine Händler, der gerade viel Aufmerksamkeit und Kapital erhält. Jack Dorsey (Twitter) ist CEO von Square.
Xavier Shay beschreibt die Abwägungen und den Entscheidungsprozess der zum Einsatz von JRuby geführt hat. Dabei lag der Schwerpunkt auf Zuverlässigkeit (Payment-Provider!), nicht auf Performance. Im Vortrag kommen auch Probleme zur Sprache, die aufgetreten sind. Das 30-minütige Vortragsvideo kann auf Vimeo angeschaut werden und ist unbedingt sehenswert.

Sonntag, 26. August 2012

Datenbank für JRuby: H2 oder MySQL?

Gabor Vitez schreibt in seinem Blog, warum er sich für die H2-Datenbank (das ist eine embedded Java-DB) anstatt MySQL für eine Applikation entschieden hat. Dazu gibt es Benchmarks und weitere Argumente. Sehr lesenwswert.

Samstag, 25. August 2012

SafetyPin: Gem zum Zugriff auf JCR

Vielleicht interessant für Ruby-Anwendungen, die  ein Java Content Repository (JCR) benutzen sollen: SafetyPin, ein Gem von Jordan Raine  zum Zugriff auf JCR. JCR wird in verschiedenen Java-CMS genommen um Content zu speichern. Das Gem ist noch sehr jung, hat die Version 0.0.5 und Dokumentation fehlt auch noch komplett. Es gibt Query-Methoden, die SQL2 (eine JCR-Query-Sprache) verwenden, um JCR-Nodes zu finden.

Freitag, 24. August 2012

Ruboto - JRuby on Android at JRubyConf.eu 2012

Uwe Kubosch hat seine Vortragsfolien Ruboto - JRuby on Android auf speakerdeck online gestellt. Uwe ist ein Ruboto Core Developer. In seinem Vortrag geht es um die Historie von JRuby, das Tooling und einige Codebeispiele.

Mittwoch, 22. August 2012

JRuby läuft auf dem Raspberry Pi, jffi-Library wird benötigt

Nachdem mein erster Versuch, JRuby 1.7 unter Java 7 auf dem Raspberry Pi zum Laufen zu bekommen gescheitert ist, hier eine Anleitung, wie das dann doch klappt -  es sind allerdings ein paar Hürden zu überwinden..

Grundlagen:

  • Der Raspberry Pi ist ein kleiner Linux-Rechner (256MB RAM, ARM-Prozessor, Ethernet, USB, HD-Video usw), der sehr günstig zu haben ist (etwa 40€). JRuby darauf wäre doch mal nett..
  • Für die ARM-Architektur und damit den Raspberry Pi fehlt die jffi-Library (Java Foreign Function Interface), die wird von JRuby benötigt und musste von mir selbst kompiliert werden, da sie architekturspezifisch und momentan noch nicht in der JRuby-Distribution drin ist. Dazu braucht man git und maven und den JDK. Wer das nicht selbst machen will, kann die fertig kompilierte Libary hier runterladen und nach jruby-1.7.0.preview2/lib/native/arm-Linux kopieren.
  • Ich verwende Oracle Java, da der Java-Compiler benötigt wird (siehe unten) und OpenJDK wohl etwas langsam ist.
  • Oracles Java braucht  eine Distribution mit der "armel"-Architektur, da es das Soft Float ABI verwendet. Das schließt die normale Raspbian-Distribution aus, da diese "armhf" (Hardware-Floating-Point) verwendet!

komplette Installation:

  1. Auf http://www.raspberrypi.org/downloads gibt es ein Debian Wheezy-Image mit "armel"-Architektur, bei mir war das 2012-08-08-wheezy-armel.zip
  2. Dieses Image entpacken und per "dd" (Linux) oder entsprechendem Windows-Tool auf eine SD-Card bringen (min 2GB)
  3. Raspberry ans Ethernet klemmen, schauen was er für eine IP-Adresse erhält, per ssh einloggen und konfigurieren (sudo raspi-config, locale und ssh). Neu starten.
  4. Bei Oracle den SDK runterladen. Das geht über http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1637583.html, dort muß man ein paar Fragen beantworten. Leider geht das nicht vom Raspberry Pi aus, sondern nur über einen richtigen Browser..
  5. Java-SDK auf den Raspi kopieren, dann auf dem Raspberry Pi einloggen
  6. Java-SDK als Root installieren und als Standard setzen
  7. mkdir /opt/javacd /opt/java
    tar -zxf /home/pi/jdk-7u6-linux-arm-sfp.tar.gz
    update-alternatives --install "/usr/bin/javac" "javac" "/opt/java/jdk1.7.0_06/bin/javac" 1
    update-alternatives --install "/usr/bin/java" "java" "/opt/java/jdk1.7.0_06/bin/java" 1 
  8. Wer die jffi-Library nicht selbst kompilieren will, kann sie hier runterladen und nach jruby-1.7.0.preview2/lib/native/arm-Linux kopieren, die Schritte 9-16 entfallen dann.
  9. git auf dem Raspberry Pi installieren: sudo apt-get install git 
  10. Die folgenden Schritte als User "pi"
  11. maven auf dem Raspberry Pi installieren. Das habe ich nicht per apt-get gemacht, da dann gleich OpenJDK mit installiert wird, sondern Maven direkt von http://maven.apache.org/download.html geholt, entpackt und den PATH des Users "pi" entsprechend erweitert.
  12. jffi holen: git clone https://github.com/jnr/jffi
  13. jffi-Library kompilieren: cd jffi; mvn install
  14. Als User "pi" das neueste jruby-1.7.2 (momentan http://jruby.org/2012/08/07/jruby-1-7-0-preview2) runterladen und entpacken.
  15. Kompilierte Library ins richtige JRuby-Verzeichnis kopieren: mv ./jffi/target/jni/arm-Linux jruby-1.7.0.preview2/lib/native/
  16. Nun noch Pfade und JRUBY_HOME setzen:
     export JRUBY_HOME=/home/pi/jruby-1.7.0.preview2
     export PATH=$PATH:$JRUBY_HOME/bin
  17. Jetzt kann z.B. Rails (dauert sehr lange) oder Sinatra installiert werden: 
jruby -S gem install rails
Fetching: i18n-0.6.0.gem (100%)
.
.
Successfully installed rails-3.2.8
28 gems installed

Warum das Ganze?

Um zu sehen, was auf der kleinen Kiste geht. Die Performance habe ich mir noch nicht angeschaut, da kommt sicher noch ein Blog-Eintrag.

Video: hochverfügbarer Cluster mit TorqueBox

Joe Kutner, (Autor des Buches Deploying with JRuby) zeigt in einem kurzen Video, wie einfach es ist, einen hochverfügbaren Cluster mit Torquebox aufzusetzen. Das wird nur durch Konfiguration erreicht, Codeanpassungen sind nicht nötig.

Dienstag, 21. August 2012

Montag, 20. August 2012

jruby-memcached 0.4.1 erschienen

Aurora Feint Inc hat die Version 0.4.1 des jruby-memcached Gems auf github gestellt. jruby-memcached ist kompatibel zum MRI-memcached-Gem.  Laut benchmark ist es das schnellste memcached Gem für JRuby.

Freitag, 17. August 2012

Ruboto: Beispiel-App für Android von Marc Berszick

Wer an einem Beispiel nachvollziehen will, wie man eine Android-App mit Ruboto (JRuby auf Android) baut, kann das auf http://rubysource.com/ruboto-rubys-and-androids-first-born/ nachvollziehen. Marc Berszick zeigt das Schritt für Schritt von der Installation des Android-SDK bis zum Quellcode anhand einer simplifizierten Anwendung.


Donnerstag, 16. August 2012

Versuch: JRuby auf dem Raspberry Pi

Neulich ist mein Raspberry Pi eingetroffen, und ich habe natürlich probiert, dort JRuby zum Laufen zu bekommen. Leider ist mir das nicht gelungen...

Meine Umgebung:

Da ich Hardware-nahe Sachen ausprobieren will, habe ich auf einer 4GB-SD-Karte  Adafruits Occidentalis 0.1-Distribution installiert.
Anschließend war ein Kernel-Update fällig (Interrupts!) und zwar mit Chris Boots Raspberry Pi 3.2.23 Kernel. Das geht nur mit Gewalt (--force-architecture), aber der Raspi läuft:

pi@raspberrypi ~ $ uname -a
Linux raspberrypi 3.2.23-rpi1+ #3 Sun Jul 15 16:46:51 BST 2012 armv6l GNU/Linux

Anschließend Java 7 installiert:

pi@raspberrypi ~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get install openjdk-7-jdk
pi@raspberrypi ~ $ java -version
java version "1.7.0_03"

Prima bis jetzt, aber dann wird es duster:

Mit JRuby 1.7preview2



pi@raspberrypi ~ $ ./jruby-1.7.0.preview2/bin/jruby -S gem install rails
java.lang.ExceptionInInitializerError
    at com.kenai.jffi.Foreign.getInstance(Foreign.java:95)
.
.
Caused by: java.lang.UnsatisfiedLinkError: could not locate stub library in jar file.  Tried [jni/arm-Linux/libjffi-1.2.so, /jni/arm-Linux/libjffi-1.2.so]
    at com.kenai.jffi.internal.StubLoader.getStubLibraryStream(StubLoader.java:345)
    at com.kenai.jffi.internal.StubLoader.loadFromJar(StubLoader.java:292)
    at com.kenai.jffi.internal.StubLoader.load(StubLoader.java:235)
    at com.kenai.jffi.internal.StubLoader.<clinit>(StubLoader.java:395)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at com.kenai.jffi.Init.load(Init.java:68)
    ... 33 more
ArgumentError: cannot import class `org.jruby.RubyProcess' as `RubyProcess'
     java_import at file:/home/pi/jruby-1.7.0.preview2/lib/jruby.jar!/jruby/java/core_ext/object.rb:63
             map at org/jruby/RubyArray.java:2355
     java_import at file:/home/pi/jruby-1.7.0.preview2/lib/jruby.jar!/jruby/java/core_ext/object.rb:22
  ProcessManager at file:/home/pi/jruby-1.7.0.preview2/lib/jruby.jar!/jruby/kernel/jruby/process_manager.rb:7
           JRuby at file:/home/pi/jruby-1.7.0.preview2/lib/jruby.jar!/jruby/kernel/jruby/process_manager.rb:6
          (root) at file:/home/pi/jruby-1.7.0.preview2/lib/jruby.jar!/jruby/kernel/jruby/process_manager.rb:3
            load at org/jruby/RubyKernel.java:1050
          (root) at file:/home/pi/jruby-1.7.0.preview2/lib/jruby.jar!/jruby/kernel.rb:1


nicht schön.

Nächster Versuch Java 7 mit JRuby 1.6.7.2

pi@raspberrypi ~ $ jruby -v
jruby 1.6.7.2 (ruby-1.8.7-p357) (2012-05-01 26e08ba) (OpenJDK Zero VM 1.7.0_03) [linux-arm-java]

aber ein Fehler bei der Rails-Installation

pi@raspberrypi ~ $ ./jruby-1.6.7.2/bin/jruby -S gem install rails
ArgumentError: Illformed requirement [">= 0"]

Nächster Versuch: Java 6 mit JRuby 1.7preview2. 


Hier hängt sich der Raspi bei "jruby -version" komplett auf, er ist gar nicht mehr übers Netz erreichbar, im Log sehe ich leider nichts.

Nächster Versuch: Java 6 mit JRuby 1.6.7.2


Hier meldet sich Java und JRuby korrekt:
pi@raspberrypi ~ $ java -version
java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.3) (6b24-1.11.3-2+rpi1)
OpenJDK Zero VM (build 20.0-b12, mixed mode)

pi@raspberrypi ~ $ jruby -v
jruby 1.7.0.preview2 (1.9.3p203) 2012-08-07 4a6bb0a on OpenJDK Zero VM 1.6.0_24-b24 [linux-arm]

aber eine Rails-Installation funktioniert nicht:

pi@raspberrypi ~ $ ./jruby-1.6.7.2/bin/jruby -S gem install rails
ArgumentError: Illformed requirement [">= 0"]
          parse at /home/pi/./jruby-1.6.7.2/lib/ruby/site_ruby/1.8/rubygems/requirement.rb:81
     initialize at /home/pi/./jruby-1.6.7.2/lib/ruby/site_ruby/1.8/rubygems/requirement.rb:106
           map! at org/jruby/RubyArray.java:2371
     initialize at /home/pi/./jruby-1.6.7.2/lib/ruby/site_ruby/1.8/rubygems/requirement.rb:106
        default at /home/pi/./jruby-1.6.7.2/lib/ruby/site_ruby/1.8/rubygems/requirement.rb:62
  Specification at /home/pi/./jruby-1.6.7.2/lib/ruby/site_ruby/1.8/rubygems/specification.rb:83
         (root) at /home/pi/./jruby-1.6.7.2/lib/ruby/site_ruby/1.8/rubygems/specification.rb:29
         (root) at /home/pi/./jruby-1.6.7.2/lib/ruby/site_ruby/1.8/rubygems/specification.rb:51
        require at org/jruby/RubyKernel.java:1033
         (root) at /home/pi/./jruby-1.6.7.2/lib/ruby/site_ruby/1.8/rubygems/defaults/jruby.rb:1273
        require at org/jruby/RubyKernel.java:1033
         (root) at /home/pi/./jruby-1.6.7.2/bin/gem:8


Hat jemand JRuby auf dem Raspberry Pi zum laufen bekommen, bzw eine Idee, was hier schiefläuft?


Mittwoch, 15. August 2012

JRuby 1.7: Release-Candidate kommt bald

Das JRuby-Team hat angekündigt, daß der erste Release-Candidate für JRuby 1.7 bald kommt. Das endgültige Release ist für September geplant. Bis dahin wird noch Feedback benötigt, was fürs Release noch unbedingt gefixt werden muß.

Dienstag, 14. August 2012

Montag, 13. August 2012

Graphische Ausgabe von JRuby-Profilerdaten

Theo Hultberg hat ein Tool namens DotProfilePrinter geschrieben, das den JRuby-Profiler-Output im DOT-Format von GraphViz speichert. Damit hat man übersichtliche Graphen des zeitlichen Verhaltens seines Ruby-Scripts in jierarchischer Darstellung.

Samstag, 11. August 2012

JRuby-Gems-Mojo: Gems via Maven in Java-Projekten

Mit JRuby-Gems-mojo lassen sich JRuby Gems in Maven-basierten Java-Projekten verwenden. Dadurch kann man Teile des Java-Projekts in JRuby entwickeln und das ganze per Maven bauen.

Freitag, 10. August 2012

Ruboto: neues Release, mehr Entwickler (JRuby auf Android)

Bei Ruboto gibt es Neuigkeiten: demnächst gibt es eine neues Release 0.7.1, der Release-Candidate liegt zum Download bereit. Außerdem sind neue Entwickler zum Projekt gestossen, so daß das Projekt mehr Geschwindigket aufnehmen wird.
Ruboto basiert auf JRuby - man kann damit (J)Ruby-Scripte auf Android-Geräten ausführen, die Zugriff auf das komplette Android-API haben.

Donnerstag, 9. August 2012

jruby-memcached 0.3.0 released

Eine neue Version des JRuby-memcached-Gems ist erschienen.  Richard Huang hat das Gem nun komplett nach  Java portiert. Die Performance wurde dadurch nochmal gesteigert. Seine Benchmark-Zahlen zeigen sehr gute Zahlen in einem Vergleich mit verschiedenen memcached-Adaptern.

Mittwoch, 8. August 2012

JRuby 1.7.0.preview2 Released

Wei angekündigt wurde nun die Preview2 des nächsten JRuby-Release (1.7) veröffentlicht. Größte Änderung ist, daß der invokedynamic-Support als Default abgeschaltet ist. Das ist sehr schade, es ist aber Problemen bei Java7 geschuldet. Wenn diese dort gefixt sind, wird das wieder eingeschaltet. Wie üblich wurden jede Menge Fehler gefixt, insbesondere Kompatibilitätspobleme mit Ruby 1.9.



Dienstag, 7. August 2012

Wie man ein JRuby-Gem schreibt..

.. erläutert Richard Huang anhand seine memcached-gems. Vom Directory-Layout bis zu den über maven gemanageten Abhängigkeiten ist alles beschrieben.

Montag, 6. August 2012

Beispiel: Java-Extension für ein JRuby Gem

Im Blog The If Works gibt es Sourcecode für eine JRuby-Extension, die in ein Gem integriert wird. Der Code wird so beschrieben, daß man nach der Lektüre in der Lage sein sollte, selbst eine Extension zu schreiben.

Sonntag, 5. August 2012

Azul macht die Zing JVM etwas zugänglicher für OpenSource-Projekte

Azul Systems hat seine Zing JVM für OpenSource-Entwickler verfügbar gemacht. Diese JVM ist - laut Hersteller - die am besten skalierende JVM. Zielgruppe ist in-memory computing and Big Data analytics,  Anwendungen mit niedrigen Antwortzeiten. Zing JVM läuft auf Red Hat Enterprise Linux, SUSE Linux Enterprise Server, CentOS und Ubuntu Linux.

Freitag, 3. August 2012

Foreman und JRuby

Mark beschreibt in seinem Blog, wie er Foreman beigebracht hat, mit JRuby umzugehen. Mit Foreman kann man mehrere Prozesse gleichzeitig mit einem Kommandozeilenaufruf starten und den Output aller Skripte  komfortabel beobachten - normalerweise unterstützt es jedoch nur MRI Ruby.

Donnerstag, 2. August 2012

Bei Mountain-Lion IP-Problemen: export JAVA_OPTS="-Djava.net.preferIPv4Stack=true"

Bei neueren Java-Versionen (z.B. nach einem Upgrade auf Mountain Lion) will Java (und damit JRuby) mit IPv6 ins Netz, das klappt meistens nicht.
 
export JAVA_OPTS="-Djava.net.preferIPv4Stack=true" 
oder
jruby -J-Djava.net.preferIPv4Stack=true your_code.rb
meint

Mittwoch, 1. August 2012

developerworks: Manage Ruby and gems with RVM

Auf IBMs developerworks gibt es einen Einführungstext zu RVM. Mit RVM kann man verschiedene Ruby-Versionen auf einem Rechner verwalten, so daß mehrere Projekte mit unterschiedlichen  Rubies, GEM und Umgebungen laufen können. Ein Muß für jeden Entwickler. RVM kennt natürlich auch die neueste JRuby-Version.