<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>JRuby on Rails</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/" />
    <link rel="self" type="application/atom+xml" href="http://www.jrubyonrails.de/atom.xml" />
    <id>tag:,2009-01-05:/20</id>
    <updated>2010-03-03T15:37:31Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.23-en</generator>

<entry>
    <title>JRuby, Rails3 und RailsWayCon 2010</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2010/03/jruby-rails3-und-railswaycon-2010.html" />
    <id>tag:www.jrubyonrails.de,2010://20.1685</id>

    <published>2010-03-03T07:11:38Z</published>
    <updated>2010-03-03T15:37:31Z</updated>

    <summary>JRuby Die meisten JRuby-Nutzer kommen bekanntlich aus dem Java-Umfeld. Sie nutzen die Agilität der Scriptsprache Ruby mit der ausgereiften Infrastruktur und einer Unmenge an Bibliotheken der Java-Welt. Daher werden die meisten auch Ant kennen. In der Ruby-Welt heißt Ant Rake!...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tutorials" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="gems" label="Gems" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="plugins" label="Plugins" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails3" label="Rails3" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="railswaycon2010" label="RailsWayCon 2010" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tutorial" label="Tutorial" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="update" label="Update" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<h4 class="blogentry">JRuby</h4>
Die meisten JRuby-Nutzer kommen bekanntlich aus dem Java-Umfeld. Sie nutzen die Agilität der Scriptsprache Ruby mit der ausgereiften Infrastruktur und einer Unmenge an Bibliotheken der Java-Welt. Daher werden die meisten auch <a title="Ant - Java build tool" rel="nofollow" target="_blank" href="http://ant.apache.org/">Ant</a> kennen.  In der Ruby-Welt heißt Ant <a title="Rake - Ruby Make Tool" rel="nofollow" target="_blank" href="http://rake.rubyforge.org/">Rake</a>! 
<br/><br/>
Thomas Enebo zeigt nun in seinem <a title="Rake and Ant Together: A Pick It n' Stick It Approach" rel="nofollow" target="_blank" href="http://www.engineyard.com/blog/2010/rake-and-ant-together-a-pick-it-n-stick-it-approach/">Blogeintrag</a> wie man
<ul>
<li>Ant-Tasks mit Rake aufruft</li>
<li>Rake mittels Ant nutzt</li>
<li>Rake-Tasks als aufrufbare Ant-Targets importiert (und umgekehrt)</li>
</ul>
<br/>
Ein weiterer interessanter Artikel von Charles Nutter gibt Tipps um eine bessere JRuby-Startzeit zu erreichen. Im Artikel <a title="JRuby Startup Time Tips" rel="nofollow" target="_blank" href="http://blog.headius.com/2010/03/jruby-startup-time-tips.html">JRuby Startup Time Tips</a> zeigt er, wie man mittels JVM Java_OPTS die Startperformance beschleunigen kann.
<br/><br/>

<h4 class="blogentry">Ruby on Rails 3</h4>
Die Rails 3 Beta ist nun schon eine Weile zum Ausprobieren freigegeben. Falls Euch vor dem geplanten Update eurer Rails 2.3.x Anwendung Fragen wie
<ul>
<li>Was muss man beim Update beachten?</li>
<li>Wo finde ich Anleitungen zur Rails 3 Umstellung?</li>
<li>Welche Plugins und Gems laufen schon mit Rails 3?</li>
</ul>

durch den Kopf gehen, hier ein paar interessante Links zu Rails 3.
<br/><br/>
Auf <a title="Rails3 Tutorials, Screencasts und Blogeinträgen" rel="nofollow" target="_blank" href="http://www.rubyonrails.de/2010/02/links-fur-rails-3/">rubyonrails.de</a> gibt es eine super Sammlung von Tutorials, Screencasts und Blogeinträgen.
<br/><br/>
Die Webanwendung <a title="http://railsplugins.org/" rel="nofollow" target="_blank" href="http://railsplugins.org/">http://railsplugins.org/</a> bietet eine gute Übersicht, welche Plugins schon für Rails 3 bereit sind. Diese Liste kann von allen aktiv erweitert und aktualisiert werden. Des Weiteren wird zu jedem Plugin angegeben, ob es threadsicher ist, mit Ruby 1.9 und/oder JRuby läuft.
<br/><br/>

<h4 class="blogentry">RailsWayCon 2010</h4>
<span class="clearfix"><img alt="RailsWayConf 2010" src="/images/railswaycon2010.gif" class="float-left"/>Wer sich lieber selbst ein Bild von der aktuellen JRuby/Rails-Entwicklung machen will, findet sicherlich wieder viele interessante Vorträge auf der diesjährigen <a title="RailsWayCon 2010" rel="nofollow" target="_blank" href="http://it-republik.de/conferences/railswaycon2010/">RailsWayCon</a> vom 31. Mai bis zum 2. Juni in Berlin.</span>
]]>
        
    </content>
</entry>

<entry>
    <title>Ruby on Rails 3 bald als Beta verfügbar</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2010/01/ruby-on-rails-3-bald-als-beta-verfugbar.html" />
    <id>tag:www.jrubyonrails.de,2010://20.1679</id>

    <published>2010-01-29T09:52:58Z</published>
    <updated>2010-02-09T18:03:49Z</updated>

    <summary>Rails 3 ist die Verschmelzung von Rails und Merb (im Dezember 2008 angekündigt). Die Rails-Entwickler haben vor allem die schnelleren Teile des Merb-Frameworks integriert. (Performance in Rails 3 ) Weitere Neuerungen sind eine verbesserte Modularität, die Unterstützung für die JavaScript-Bibliothek...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="merb" label="Merb" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails3" label="Rails3" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Rails 3 ist die Verschmelzung von Rails und Merb (<a title="Rails und Merb werden eins" target="_blank" href="http://weblog.rubyonrails.org/2008/12/23/merb-gets-merged-into-rails-3">im Dezember 2008 angekündigt</a>). Die Rails-Entwickler haben vor allem die schnelleren Teile des Merb-Frameworks integriert. (<a title="Performance in Rails 3" target="_blank" href="http://www.engineyard.com/blog/2009/rails-and-merb-merge-performance-part-2-of-6/">Performance in Rails 3 </a>)
<br/>
Weitere Neuerungen sind eine verbesserte <a title="Rails 3 Modularität" target="_blank" href="http://www.engineyard.com/blog/2009/rails-and-merb-merge-the-anniversary-part-1-of-6/">Modularität</a>, die Unterstützung für die JavaScript-Bibliothek jQuery und eine einfachere Routing-API, um die Webanwendungen auf Basis der REST-Architektur besser zu unterstützen.
Die Entwicklung und Integration von Plugins wird vereinfacht und die Anwendung soll besser gegen Cross-Site-Scripting-Attacken (XSS) geschützt sein.
<br/><br/>
Die erste Beta von Rails 3 könnte schon im Februar erscheinen.
<br/><br/>
Interessant wird das Zusammenspiel von JRuby mit Rails 3. Die ersten Performance-Messungen von Yehuda Katz zeigen ein sehr erfreuliches Bild.
<img class="image_without_border" width="660" alt="Performance Messungen Rails 3 mit unterschiedlichen Implementationen (EngineYard Blog)" title="Performance Messungen Rails 3 mit unterschiedlichen Implementationen (EngineYard Blog)" src="http://eyweb-images.s3.amazonaws.com/blog_crossimp.jpg"/>
(Bildquelle: <a title="Performance in Rails 3" target="_blank" href="http://www.engineyard.com/blog/2009/rails-and-merb-merge-performance-part-2-of-6/">Performance in Rails 3 </a>)
<br/>
<br/>
<b>Update:</b> Mittlerweile ist die Beta tatsächlich draußen (<a href="http://weblog.rubyonrails.org/" target="_blank">zur Meldung</a>). Sie ist natürlich noch nicht perfekt, aber um einen Eindruck vom neuen Framework zu bekommen und den Entwicklern erste Reaktionen zukommen zu lassen, reicht sie vollkommen aus.

<div class="more_links">weiterführende Links und Quellen</div>
<a href="http://www.engineyard.com/blog/2009/my-five-favorite-things-about-rails-3/" target="_blank" title="My Five Favorite Things About Rails 3">My Five Favorite Things About Rails 3</a><br/>
<a href="http://weblog.rubyonrails.org/" target="_blank">Rails 3 im Rails-Blog</a><br/>
<a href="http://www.engineyard.com/blog/2010/rails-3-beta-is-out-a-retrospective/" target="_blank">Blog-Eintrag über Rails 3 von Yehuda Katz</a><br/>
<a href="http://www.rubyinside.com/rails-3-0-beta-links-2966.html" target="_blank">Rails 3.0 Beta: 36 Links and Resources To Get You Going</a><br/>
<a href="http://railscasts.com/episodes/200-rails-3-beta-and-rvm" target="_blank">Railscast #200 Rails 3 Beta and RVM</a><br/>
<a href="http://rvm.beginrescueend.com/" target="_blank">RVM - Ruby Version Manager</a><br/>
]]>
        
    </content>
</entry>

<entry>
    <title>Observer in Migration ausschalten</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2010/01/observer-in-migration-ausschalten.html" />
    <id>tag:www.jrubyonrails.de,2010://20.1623</id>

    <published>2010-01-13T10:49:26Z</published>
    <updated>2010-01-13T11:19:48Z</updated>

    <summary>Vor einiger Zeit erwähnten wir die Komplikationen, die auftreten können, wenn man Migrationen in Rails mit den realen Modellen der Anwendung durchführt. Um Validierungen, before_update-Methoden und ähnliches während der Migration auszuschalten, ist es oft günstig, der Migration eine eigene Version...</summary>
    <author>
        <name>Martin</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="datenbank" label="datenbank" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="dbmigrate" label="db:migrate" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="migration" label="migration" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="observer" label="observer" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="rails" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Vor einiger Zeit erwähnten wir die <a href="http://www.jrubyonrails.de/2009/07/statische-migrationen-flexible-anwendung.html">Komplikationen</a>, die auftreten können, wenn man Migrationen in Rails mit den realen Modellen der Anwendung durchführt. Um Validierungen, <code>before_update</code>-Methoden und ähnliches während der Migration auszuschalten, ist es oft günstig, der Migration eine eigene Version des Models zu geben.<br/>
Dazu noch ein Tipp:<br/>
Mit
<code>Model.delete_observers</code>
können Observer, welche am Model lauschen, entfernt werden.
Da die Observer vom eigentlichen Model unabhängig sind, ist während der Migration nicht garantiert, dass die Observer problemlos arbeiten können.
]]>
        
    </content>
</entry>

<entry>
    <title>GlassFish-Gem 1.0.0</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/12/glassfish-gem-1-0.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1562</id>

    <published>2009-12-14T10:46:58Z</published>
    <updated>2009-12-14T16:42:49Z</updated>

    <summary>Das GlassFish-Gem von Vivek Pandey ist in der Version 1.0.0 erschienen. Neuerungen sind neben einigen BugFixes: die Implementierung mittels des neu erschienen Glassfish v3 Servers die Startzeit wurde um ca. 15% verbessert die Unterstützung von Rack (Ruby Webserver Interface) ist...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tutorials" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="capistrano" label="Capistrano" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="gem" label="Gem" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="glassfish" label="Glassfish" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Das GlassFish-Gem von <a href="http://www.java.net/blogs/vivekp" target="_blank" title="Vivek Pandey Blog">Vivek Pandey</a> ist in der Version 1.0.0 erschienen. 
<br/>
<br/>
Neuerungen sind neben einigen BugFixes:
<ol>
<li>die Implementierung mittels des neu erschienen <a href="http://www.sun.com/software/products/glassfishv3/" target="_blank" title="Glassfish v3 Server">Glassfish v3 Servers</a></li>
<li>die Startzeit wurde um ca. 15% verbessert</li>
<li>die Unterstützung von <a href="http://rack.rubyforge.org/" target="_blank" title="Rack">Rack</a> (Ruby Webserver Interface) ist komplett</li>
<li>es ist möglich, Glassfish mittels eines Codeblockes auszuführen
<pre class="brush: ruby; gutter: true">
GlassFish::Server.start(:address=>"127.0.0.1", :port=>4000) do
  use Rack::CommonLogger
  use Rack::ShowExceptions
  map "/hello" do
    use Rack::Lint
    run Proc.new {[200, {"Content-Type" => "text/html"}, "Hello"]}
  end
end
</pre>
</li>
<li>der Sinatra-Support wurde verbessert</li>
<li>auf der Kommandozeile kann die IP Adresse mitgegeben werden</li>
<li>die Konfiguration von Grizzly (NIO based HTTP Lib) kann mittels der <code>glassfish.yml</code> festgelegt werden</li>
<li>man findet es nun auch bei <a target="_blank" href="http://gemcutter.org/gems/glassfish" title="GemCutter GlassFish Gem">GemCutter</a></li>
</ol>

Was ist eigentlich das GlassFish-Gem?
]]>
        <![CDATA[<h4 class="blogentry">Das Gem kurz erklärt</h4>

Das GlassFish-Gem ist eine Deployment Strategy mit der man Ruby on Rails Anwendungen mittels JRuby direkt von der Kommandozeile starten kann. Analog zu Mongrel oder Webrick kann man seine Rails-Anwendung nur mit Hilfe eines Gems starten. Die Installation eines kompletten Java Application Servers kann entfallen.
<br/><br/>

<h4 class="blogentry">Installation und erstes Starten</h4>

<ol>
<li>Das Gem mittels <code>gem install glassfish</code> installieren.</li>
<li>In das Rails-Anwendungsverzeichnis wechseln und mittels <code>glassfish</code> den GlassFish-Server starten. GlassFish startet mit den default Einstellungen.</li>
<li>Unter 127.0.0.1:3000 ist der Server erreichbar.</li>
</ol>

<h4 class="blogentry">Konfiguration</h4>

Beim Starten kann man dem GlassFish-Server einige Paramter mitgeben. Mittels <code>glassfish -h</code> bekommt man eine Übersicht der Möglichkeiten angezeigt.

<pre class="brush: plain; light: true;">
glassfish [OPTION] APPLICATION_PATH
        -h, --help:             show help
        -c, --contextroot PATH: change the context root (default: '/')
        -p, --port PORT:        change server port (default: 3000)
        -a, --address HOST:     bind to HOST address (default: 0.0.0.0)
        -e, --environment ENV:  change rails environment (default: development)
        -n --runtimes NUMBER:   Number of JRuby runtimes to create initially
        --runtimes-min NUMBER:  Minimum JRuby runtimes to create
        --runtimes-max NUMBER:  Maximum number of JRuby runtimes to create
        -d, --daemon:           Run GlassFish as daemon. Currently works with
                                    Linux and Solaris OS.
        -P, --pid FILE:         PID file where PID will be written. Applicable
                                    when used with -d option. The default pid file
                                    is tmp/pids/glassfish-&lt;PID&gt;.pid
        -l, --log FILE:         Log file, where the server log messages will go.
                                    By default the server logs go to
                                    log/development.log file. To see the logs on
                                    console run with -l option without any argument.
        --log-level LEVEL:      Log level 0 to 7. 0:OFF, 1:SEVERE, 2:WARNING,
                                    3:INFO (default), 4:FINE, 5:FINER, 6:FINEST,
                                    7:ALL.
        --config FILE:          Configuration file location. Use glassfish.yml
                                    as template. Generate it using 'gfrake config'
                                    command.

        APPLICATION_PATH (optional): Path to the application to be run (default:
        current).

        For further configuration, run GlassFish rake command 'gfrake -T'
</pre>

Man kann nun entweder die Parameter auf der Kommandozeile angeben (<code>glassfish -p &lt;port&gt; -e production -c &lt;context&gt; -d</code>) oder mittels des Rake-Tasks <code>gfrake config</code> eine <code>glassfish.yml</code>-Datei im <code>/config</code>-Verzeichnis der Rails-Anwendung erzeugen. Die dann in der <code>glassfish.yml</code> angegeben Einstellungen werden bei Ausführung von <code>glassfish</code> ausgelesen und genutzt.


<h4 class="blogentry">Deployment mittels Capistrano</h4><a href="http://blogs.sun.com/Jacobkessler/entry/capistrano_and_glassfish_now_with" target="_blank">Jacob Kessler</a> stellt in seinem Blog ein <a href="http://www.capify.org/index.php/Capistrano" target="_blank" title="Capistrano">Capistrano</a>-Rezept vor, mit dem das Deployment von Rails-Anwendungen auf den GlassFish zum Kinderspiel wird.

<pre class="brush: ruby; gutter: true">
set :context_root, "/"
set :jruby_location, "/home/objectfab/jruby/"
set :gf_port, "3000"
set :environment, "production"
set :jruby_runtimes, "1"
set :jruby_min_runtimes, "1"
set :jruby_max_runtimes, "2"

namespace :gem do 
  desc "Start Glassfish Gem from a shutdown state"
  task :cold do
    start
  end

  desc "Stop a server running Glassfish Gem"
  task :stop do
    run "kill -INT $(cat #{current_path}/capistrano-#{application})"
  end

  desc "Starts a server running Glassfish Gem"<
  task :start do
    run "#{jruby_location}bin/jruby -S glassfish --contextroot #{context_root} --port #{gf_port} --environment #{environment} --runtimes #{jruby_runtimes} --runtimes-min #{jruby_min_runtimes} --runtimes-max #{jruby_max_runtimes} -P #{current_path}/capistrano-#{application} --daemon #{release_path}"
  end

  desc "Restarts a server running Glassfish Gem"
  task :restart do
    stop
    start
  end
end
</pre> 




<div class="more_links">weiterführende Links und Quellen</div>
<a target="_blank" href="http://weblogs.java.net/blog/vivekp/archive/2009/12/10/glassfish-gem-100-available" title="GlassFish Gem 1.0.0 is available">GlassFish Gem 1.0.0 is available</a><br/>
<a target="_blank" href="http://glassfishgem.rubyforge.org/files/README_txt.html" title="GlassFish Gem 1.0.0 Release Notes">GlassFish Gem 1.0.0 Release Notes</a><br/>
<a target="_blank" href="http://rubyforge.org/projects/glassfishgem/" title="RubyForge GlassFish Gem">RubyForge GlassFish Gem</a><br/>
<a target="_blank" href="http://gemcutter.org/gems/glassfish" title="GemCutter GlassFish Gem">GemCutter GlassFish Gem</a><br/>
<a target="_blank" href="http://wiki.glassfish.java.net/Wiki.jsp?page=JRuby" title="GlassFish Wiki JRuby">GlassFish Wiki JRuby</a><br/>
<a target="_blank" href="http://kenai.com/projects/jruby/pages/JRubyOnRailsWithGlassfishGem" title="JRuby on Rails With GlassFish Gem">JRuby on Rails With GlassFish Gem</a><br/>]]>
    </content>
</entry>

<entry>
    <title>Einführung ins Test Driven Development</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/12/einfuhrung-ins-test-driven-development.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1561</id>

    <published>2009-12-09T13:47:05Z</published>
    <updated>2009-12-09T15:53:12Z</updated>

    <summary> Nicht erst mit dem Bekannterwerden von Rails erfreuen sich Unit-Tests und insbesondere das Test Driven Development immer größerer Beliebtheit. Rails bringt bereits viel Funktionalität mit, damit das Testen von Models, Controllern und Views sehr vereinfacht wird....</summary>
    <author>
        <name>Martin</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="Links" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rspec" label="RSpec" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="selenium" label="Selenium" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="test" label="Test" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>
Nicht erst mit dem Bekannterwerden von Rails erfreuen sich Unit-Tests und insbesondere das Test Driven Development immer größerer Beliebtheit. Rails bringt bereits viel Funktionalität mit, damit das Testen von Models, Controllern und Views sehr vereinfacht wird.
</p>
]]>
        <![CDATA[<p>
So ist der Einstieg ins Testen einfach - die grundlegende Abfolge von Methoden-Aufrufen und <code>assert</code>-Verifizierungen geht schnell ins Blut über. Überlegt man sich aber, was alles für Tools und Strukturen nötig sind, um auch in größeren Projekten schnell und ohne Nebenwirkungen eine gute Testabdeckung zu schaffen, kommt man auf eine beachtliche Menge. Das fängt bei der strukturierten Verwendung von Testdaten und -datenbanken an, geht über Mocking von externen Komponenten bis hin zum ferngesteuerten Browser, der sich selbstständig durch die Anwendung klickt. Gerade im Bereich der Webanwendungen, die selbst schon eine Vielzahl Technologien beinhalten (Ruby, HTML, Javascript, CSS...) ist es nicht immer einfach, alles zu testen.
</p>
<p>Henning Koch hat ein 
<a href="http://www.makandra.de/malennachzahlen/kurs/" target="_blank">Tutorial</a> in Video-Form verfasst, in dem er in 30 Minuten einen guten Überblick über Theorie und Praxis von einfachen Tests mit <a href="http://rspec.info/" target="_blank">RSpec</a> über die Organisation von Datenbanken bis hin zu browsergestützten Akzeptanztests mit <a href="http://seleniumhq.org/" target="_blank">Selenium</a>. Dabei geht es ihm nicht so sehr um die Technik (dafür gibt es bereits genügend Anleitungen) als um das Ziel des Ganzen.
</p>
<br/>
<br/>
<b>weiterführende Links</b><br>
<a href="http://www.makandra.de/malennachzahlen/kurs/" target="_blank">Das Tutorial</a><br/>
<a href="http://rspec.info/" target="_blank">RSpec</a><br/>
<a href="http://seleniumhq.org/" target="_blank">Selenium</a><br/>]]>
    </content>
</entry>

<entry>
    <title>Rails 2.3.5, JRuby und Java</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/12/rails-235-jruby-und-java.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1553</id>

    <published>2009-12-02T09:34:23Z</published>
    <updated>2009-12-02T11:16:02Z</updated>

    <summary>Es ist viel passiert in der letzten Zeit! JRuby ist in der Version 1.4 erschienen. Rails kommt mit einem neuen Bugfix-Release 2.3.5, in dem es auch mittels des RailsXss-Plugins von Michael Koziarski einen Vorgeschmack auf die kommende Rails 3 Version...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Links" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="java" label="Java" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby14" label="JRuby 1.4" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails235" label="Rails 2.3.5" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Es ist viel passiert in der letzten Zeit! <a href="http://www.jruby.org/download" target="_blank" title="JRuby-Downloadseite">JRuby</a> ist in der Version 1.4 erschienen. <a href="http://weblog.rubyonrails.org/2009/11/30/ruby-on-rails-2-3-5-released" target="_blank" title="Ruby on Rails 2.3.5">Rails</a> kommt mit einem neuen Bugfix-Release 2.3.5, in dem es auch mittels des <a href="http://github.com/nzkoz/rails_xss" target="blank">RailsXss-Plugins</a> von Michael Koziarski einen Vorgeschmack auf die kommende Rails 3 Version gibt.
<br/>
<br/>
Wer etwas mehr über die Vorträge zur ersten <a href="http://www.jrubyconf.com/index.html" target="_blank" title="JRubyConf2009">JRuby-Konferenz</a> erfahren will, kann sich bei <a href="http://www.ruby-mine.de/2009/11/23/jrubyconf2009-startup-time" target="_blank" title="JRubyConf">ruby-mine</a> informieren.
<br/>
<br/>
Die JRuby-Entwickler <a href="http://blog.nicksieger.com/" target="_blank" title="Nick Sieger Blog">Nick Sieger</a>, <a href="http://blog.headius.com/" target="_blank" title="Charles Nutter Blog">Charles Nutter</a> und <a href="http://blog.enebo.com/" target="_blank" title="Thomas Enebo Blog">Thomas Enebo</a> schreiben auf dem <a href="http://www.engineyard.com/blog/" target="_blank" title="Engine Yard Blog">Engine Yard Blog</a> weiterhin interessante Artikel. 

<ul>
	<li><a href="http://www.engineyard.com/blog/2009/scripting-java-libraries-with-jruby/" title="Scripting Java Libraries With JRuby" target="_blank">Scripting Java Libraries With JRuby</a><br/>Sehr anschaulich wird gezeigt, wie man mittels JRuby auf Java zugreift, Java-Klassen importiert und Java-Methoden aufruft.</li>
	<li><a href="http://www.engineyard.com/blog/2009/youve-got-java-in-my-ruby/" target="_blank" title="You've Got Java in My Ruby">You've Got Java in My Ruby</a><br/>Thomas Enebo zeigt wie man Java-Klassen und APIs mittel der Ruby-Schreibweise nutzen kann.</li>
	<li><a href="http://www.engineyard.com/blog/2009/xml-parsing-in-ruby/" target="_blank" title="The State of XML Parsing in Ruby">The State of XML Parsing in Ruby</a><br/>Einen Überblick einiger XML-Bibliotheken (<a href="http://www.germane-software.com/software/rexml/" target="_blank" title="REXML">REXML</a>, <a href="http://nokogiri.org/" target="_blank" title="Nokogiri">Nokogiri</a>, <a href="http://de.wikipedia.org/wiki/Java_API_for_XML_Processing" title="Java API for XML Processing" target="_blank">JAXP</a>) im Zusammenspiel mit verschiedenen Ruby- und JRuby-Versionen, sowie deren Performance liefert Nick Sieger in seinem Blogeintrag. </li>
	<li><a href="http://www.engineyard.com/blog/2009/j-is-for-jvm-why-the-j-in-jruby/" target="_blank" title="J is for JVM: Why the 'J' in JRuby?">J is for JVM: Why the 'J' in JRuby?</a><br/> Wofür steht das J vor Ruby. Thomas Enebo erklärt das Zusammenspiel von <a href="http://de.wikipedia.org/wiki/Java_Virtual_Machine" target="_blank" title="Java Virtual Machine">JVM</a> und Ruby mit seinen Vor- und Nachteilen.</li>
</ul>
]]>
        
    </content>
</entry>

<entry>
    <title>RubyMine 2.0 veröffentlicht</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/11/rubymine-20-veroffentlicht.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1552</id>

    <published>2009-11-17T07:22:53Z</published>
    <updated>2009-11-17T07:44:11Z</updated>

    <summary>Seit der ersten Veröffentlichung von RubyMine arbeiten wir mit dieser coolen IDE und sind sehr zufrieden. Seit einigen Wochen konnten wir nun schon Beta-Versionen des neuen Releases testen und können sagen, dass JetBrains hier nochmal richtig gute Erweiterungen geschaffen hat:...</summary>
    <author>
        <name>Martin</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jetbrains" label="JetBrains" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="Ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rubymine" label="Rubymine" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Seit der ersten Veröffentlichung von RubyMine arbeiten wir mit dieser coolen IDE und sind sehr zufrieden. Seit einigen Wochen konnten wir nun schon Beta-Versionen des neuen Releases testen und können sagen, dass JetBrains hier nochmal richtig gute <a href="http://www.jetbrains.com/ruby/whatsnew/index.html" target="_blank">Erweiterungen</a> geschaffen hat: Oft verwendete Ruby- und Rails-Techniken wie HAML, RSpec, Cucumber und die Rails-I18n-API werden direkt von der IDE unterstützt und die Editoren wissen noch mehr über den Aufbau der Rails-Projekte, sodass viele neue Refactorings und Code Inspections möglich wurden.
Außerdem wurde die JRuby-Unterstützung verbessert - so lassen sich nun zum Beispiel auch unter Windows die gestarteten Server ohne den Umweg über den Task-Manager beenden.
<br/><br/>
Die Arbeit mit den Betas machte schon Spaß, das fertige Release freut uns um so mehr.<br/>
Zum Download geht es <a href="http://www.jetbrains.com/ruby/download/index.html" target="_blank">hier</a>.
]]>
        
    </content>
</entry>

<entry>
    <title>JRuby 1.4 Release ist fertig</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/11/jruby-14-ist-fertig.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1548</id>

    <published>2009-11-03T07:43:41Z</published>
    <updated>2009-11-03T08:13:54Z</updated>

    <summary>Die JRuby-Version 1.4 ist seit dem 2. November erhältlich. Einige Neuerungen sind die Ruby 1.8.7 Unterstützung (1.8.7 patchlevel 174), weitere Verbesserungen für Ruby 1.9 und die *.bat Scripte für Windowsnutzer. Die Java-Integration wurde durch neue Java- Methoden erweitert, der Windows-Installer...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Links" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby14" label="JRuby 1.4" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="release" label="Release" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Die JRuby-Version 1.4 ist seit dem 2. November erhältlich. Einige Neuerungen sind die Ruby 1.8.7 Unterstützung (1.8.7 patchlevel 174), weitere Verbesserungen für Ruby 1.9 und die *.bat Scripte für Windowsnutzer. Die Java-Integration wurde durch neue Java- Methoden erweitert, der Windows-Installer erneuert, es gibt einen neuen YAML-Parser und vieles mehr. 
<br/><br/>
Alle Neuerungen und die über 300 Bugfixes kann man sich auf der <a href="http://www.jruby.org/news" target="_blank" title="JRuby.org News">JRuby.org News Seite</a> anschauen oder sich im Engine Yard Blogeintrag  <a href="http://www.engineyard.com/blog/2009/5-things-to-look-for-in-jruby-1-4/" target="_blank" title="5 Things to Look for in JRuby 1.4">5 Things to Look for in JRuby 1.4</a> noch ausführlicher und mit Beispielen erläutert durchlesen.


<div class="more_links">weiterführende Links und Quellen</div>
<a href="http://www.jruby.org/" target="_blank" title="JRuby.org Homepage">JRuby.org Homepage</a><br/>
<a href="http://www.jruby.org/download" target="_blank" title="JRuby Downloadseite">JRuby 1.4 Downloadseite</a><br/>
<a href="http://www.engineyard.com/blog/2009/5-things-to-look-for-in-jruby-1-4/" target="_blank" title="5 Things to Look for in JRuby 1.4">5 Things to Look for in JRuby 1.4</a><br/>
]]>
        
    </content>
</entry>

<entry>
    <title>JRuby und Ruby interpretieren Erb-Kommentare unterschiedlich</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/10/jruby-und-ruby-interpretieren-erb-kommentare-unterschiedlich.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1544</id>

    <published>2009-10-13T12:10:08Z</published>
    <updated>2009-10-13T13:12:59Z</updated>

    <summary><![CDATA[Erst neulich berichteten wir von Kommentaren in Erb-Files, die das Layout zerstören. Heute haben wir eine unserer Anwendungen testweise auf reinem Ruby laufen lassen und mussten hier folgenden Unterschied feststellen. Wenn man in einem Erb-File einen einzeiligen Kommentar mit &lt;%...]]></summary>
    <author>
        <name>Martin</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="erb" label="erb" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="jruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="kommentar" label="kommentar" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Erst neulich <a href="http://www.jrubyonrails.de/2009/08/view-helper-mit-kommentaren.html" target="_blank">berichteten wir</a> von Kommentaren in Erb-Files, die das Layout zerstören. Heute haben wir eine unserer Anwendungen testweise auf reinem Ruby laufen lassen und mussten hier folgenden Unterschied feststellen. Wenn man in einem Erb-File einen einzeiligen Kommentar mit <br/>
<code>&lt;% # comment %></code> oder <code>&lt;%- #comment %></code><br/>
schreibt, geht das unter JRuby - unter Ruby aber nicht. Dort werden in merkwürdiger Weise Teile von nachfolgenden Statements abgeschnitten, sodass dann Teile des HTML-Quellcodes auf der Webseite landen. Hier sollte also nur die <a href="http://corelib.rubyonrails.org/classes/ERB.html" target="_blank">korrekte</a> Form 
<code>&lt;%# comment%></code> verwendet werden.]]>
        
    </content>
</entry>

<entry>
    <title>JRuby 1.4.0RC1 ist da</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/10/jruby-140rc1-ist-da.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1542</id>

    <published>2009-10-06T16:13:04Z</published>
    <updated>2009-10-06T16:19:54Z</updated>

    <summary>Die erste 1.4 JRuby Version liegt als Releasekandidat vor. Unter http://jruby.org/news werden die Neuerungen und über 200 Bugfixes seit Version 1.3.1 ausführlich beschrieben....</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby14" label="JRuby 1.4" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Die erste 1.4 JRuby Version liegt als Releasekandidat vor. Unter <a target="_blank" href="http://jruby.org/news">http://jruby.org/news</a> werden die Neuerungen und über 200 Bugfixes seit Version 1.3.1 ausführlich beschrieben. 

]]>
        
    </content>
</entry>

<entry>
    <title>Vorschau auf JRuby 1.4</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/09/vorschau-auf-jruby-14.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1541</id>

    <published>2009-09-23T05:38:28Z</published>
    <updated>2009-09-23T07:24:38Z</updated>

    <summary>Die JRuby-Entwicklung geht trotz oder gerade wegen des Arbeitgeberwechsels (JRuby-Team verlässt Sun) unaufhaltsam weiter. Gerade wurden, neben den üblichen Bugfixes, 5 Hauptthemen der neuen Version JRuby 1.4 angekündigt. JRuby 1.4 wird kompatibel zu Ruby 1.8.7 Weitere Verbesserungen der Ruby 1.9...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="java" label="Java" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby14" label="JRuby 1.4" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="Ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby187" label="Ruby 1.8.7" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Die JRuby-Entwicklung geht trotz oder gerade wegen des Arbeitgeberwechsels (<a href="http://www.jrubyonrails.de/2009/07/jruby-team-verlasst-sun.html">JRuby-Team verlässt Sun</a>) unaufhaltsam weiter. 
<br/><br/>
Gerade wurden, neben den üblichen Bugfixes, 5 Hauptthemen der neuen Version JRuby 1.4 angekündigt.

<ol>
	<li><b>JRuby 1.4 wird kompatibel zu Ruby 1.8.7</b><br/><br/></li>
	<li><b>Weitere Verbesserungen der Ruby 1.9 Unterstützung.</b><br/><br/></li>
        <li><b>Ein neuer YAML-Parser wird enthalten sein.</b> (<a target="_blank" href="http://olabini.com/blog/tag/yecht/">geschrieben von Ola Bini</a>)<br/><br/></li>
        <li><b>Die Java-Integration wird verbessert.</b> 
<br/><br/>
Genauer gesagt soll es möglich sein, präziser zu bestimmen, welche Java-Methoden angesprochen werden sollen.
<br/>
Zur Zeit gibt es nämlich das Problem, dass, wenn man z.B. die Methode <code>use()</code> bei dieser Java-Klasse
     <pre class="brush: java; gutter: true">
public class Overloaded {
    public static void use(int i) { /* ... */ }
    public static void use(long l) { /* ... */ }
}
</pre>
mit JRuby aufruft,
   <pre class="brush: ruby; gutter: true">
&nbsp;
Java::Overloaded.use 10
&nbsp;
</pre>
 die Methode <code>public static void use(long l)</code> genutzt wird. Das jetzige JRuby-Verhalten erzwingt eine Umwandlung von Ruby-<code>Fixnum</code> in einen <code>long</code>-Wert in Java. Daher kann nie die Java-Methode mit dem <code>int</code>-Argument aufgerufen werden.<br/><br/>
</li>
        <li><b>Die Generierung von echten Java-Klassen aus Ruby wird "experimentell" enthalten sein.</b>
<br/><br/>
Zum Beispiel wird aus:
   <pre class="brush: ruby; gutter: true">
require 'java'
require 'jruby/core_ext'

class SimpleTest
  def equals
    raise "not equal" unless 1.0 == 1
  end
end

SimpleTest.add_method_signature("equals", [java.lang.Void::TYPE])
SimpleTest.add_method_annotation("equals", org.junit.Test => {})
SimpleTest.become_java!
</pre>

 <pre class="brush: java; gutter: true">
package ruby;
import org.junit.Test;
public class SimpleTest {
    @Test
    public void equals() {
        // dispatch back to Ruby code here
    }
}
</pre>

</li>
</ol>

Ausführlicher kann man sich die Punkte und Beispiele im <a href="http://www.engineyard.com/blog/2009/5-things-to-look-for-in-jruby-1-4/" target="_blank">Engine Yard Blog</a> durchlesen.



<div class="more_links">weiterführende Links und Quellen</div>
<a target="_blank" href="http://www.jruby.org/">www.jruby.org</a><br/>
<a href="http://www.engineyard.com/blog/2009/5-things-to-look-for-in-jruby-1-4/" target="_blank">
5 Things to Look for in JRuby 1.4</a><br/>
<a  target="_blank" href="http://kenai.com/projects/ruby2java/pages/Home">JRuby Ruby-to-Java Compiler </a><br/>
]]>
        
    </content>
</entry>

<entry>
    <title>JRuby Anwendungen kundenspezifisch anpassen</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/09/jruby-anwendungen-kundenspezifisch-anpassen.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1538</id>

    <published>2009-09-17T07:45:00Z</published>
    <updated>2009-12-08T13:14:30Z</updated>

    <summary><![CDATA[Branding und Customizing einer JRuby on Rails Anwendung Wenn man Rails-Anwendungen für Kunden betreibt, muss man fr&uuml;hzeitig an kundenspezifische Anpassungen denken. Neben dem kundenspezifischen Design (Farben und Logos aus dem Corporate Design, "Branding") spielen dabei auch konfigurierbare Feature-Sets ("Customizing") eine...]]></summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tutorials" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="branding" label="Branding" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="css" label="CSS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="layout" label="Layout" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="multitenant" label="multi-tenant" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="multitenancy" label="Multitenancy" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tutorial" label="Tutorial" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<h4 class="blogentry">Branding und Customizing einer JRuby on Rails Anwendung</h4>

Wenn man Rails-Anwendungen für Kunden betreibt, muss man fr&uuml;hzeitig an kundenspezifische Anpassungen denken. Neben dem kundenspezifischen Design (Farben und Logos aus dem Corporate Design, "Branding") spielen dabei auch konfigurierbare Feature-Sets ("Customizing") eine wichtige Rolle. Natürlich wird jeder Kunde sowohl seine eigene Datenbank bekommen als auch seinen eigenen Rails-Server: Sicherheit geht vor! 

<div class="clearfix" >
<a href="https://www.objecttime.de/demo" target="_blank">
<img class="float-left" src="/images/artikel/branding/acme_beispiel_blue.png" alt="ObjectTime Branding Blue"/>
<img class="float-left" src="/images/artikel/branding/acme_beispiel_orange.png" alt="ObjectTime Branding Orange"/></a>
</div>
Jedoch will man als Entwickler nicht deswegen mehrere Kopien des Quelltextes 
auf dem aktuellen Stand halten müssen. In diesem Artikel wollen wir unser 
Branding-Konzept am Beispiel unserer <a href="https://www.objecttime.de/demo" target="_blank">Zeiterfassung ObjectTime</a> vorstellen. An den Stellen, wo wir es einsetzen, hat es sich bereits ausgezahlt.
]]>
        <![CDATA[Um ein kundenspezifisches Layout und Funktionen zu erreichen, haben wir uns entschlossen die Funktionalität des <a  target="_blank" href="http://caldersphere.rubyforge.org/warbler/">Warbler Gems</a> zu nutzen, um kundenspezifische war-Dateien beim Build-Prozess zu erhalten. Außerdem können mittels einer Konfigurationsdatei names <code>feature_settings.rb</code> bestimmte Features ein- oder ausgeschaltet werden.
<br/><br/>
Wie funktioniert das nun genau?


<h4 class="blogentry">1. Verzeichnisstruktur Anpassungen</h4>
<div class="clearfix" >
<img class="float-left" src="/images/artikel/branding/verzeichnisstruktur.png" alt="Branding verzeichnisstruktur"/>
Wir erweitern die typische Rails Verzeichnisstruktur um ein <code>/branding</code> Verzeichnis. Die nächste Verzeichnisebene benennt die Namen unserer kundenspezifischen Anwendungen. In unserem Beispiel haben wir also zwei kundenspezifische Anwendungen <code>acme_orange_color</code> und <code>acme_zeiterfassung</code>. 
<br/><br/><b>Wichtig: Diese Namen sind gleichzeitig die Namen der später erzeugten war-Dateien!</b>
<br/><br/>Innerhalb dieser einzelnen Anwendungs-"Branding"-Verzeichnisse werden nun alle Dateien, analog zur typischen Rails-Verzeichnisstruktur, hinterlegt, die beim Bauen der kundenspezifischen Anwendung die Originalanwendungsdateien überschreiben sollen. 
So gibt es ein <code>config</code> Verzeichnis, in welchem alle für den Kunden zutreffenden Konfigurationen abgelegt werden und ein <code>public</code> Verzeichnis, in welchem die speziellen Bilder, angepassten Stylesheets und Javascript Dateien liegen. Es ist auch denkbar, dass es hier zus&auml;tzlich ein kundenspezifisches <code>app/views</code> Verzeichnis gibt, in dem man spezielle Views der Anwendung nach Kundenwunsch anpasst.
</div >

Im <code>config</code> Verzeichnis gibt es z.b.:
<ul><li>den jeweilige <code>:session_key</code> in der <code>session_store.rb</code></li><li>die Datenbankverbindungen in der <code>database.yml</code></li><li>die einzelnen Features werden in der <code>feature_settings.rb</code> ein- oder ausgeschaltet</li><li>und innerhalb des <b>neuen</b> Verzeichnisses <code>locales_branding</code> werden die kundenspezifischen I18N Übersetzungen abgelegt.</li></ul>

Im <code>public</code> Verzeichnis finden sich z.B.:
<ul><li>die kundenspezifischen  Bilder in <code>/public/images/</code></li><li>im Verzeichnis <code>public/stylesheets/</code> liegen die <code>print_branding.css</code> und <code>screen_branding.css</code> (Die Einbindung dieser Dateien wird gleich genauer erläutert.)</li></ul>


<h4 class="blogentry">2. Layout Anpassungen</h4>
<div class="clearfix" >
<img class="float-left" src="/images/artikel/branding/verzeichnisstruktur_css.png" alt="Branding verzeichnisstruktur CSS"/>
Damit das kundenspezifischen Layout auch in der Anwendung angezeigt wird, haben wir in der <code>layout.html.erb</code> zusätzliche Stylesheets includiert: <code>print_branding.css</code> und <code>screen_branding.css</code>. Diese beiden Dateien existieren auch in der Standard Rails Verzeichnisstruktur, sind dort aber leer. Mit Leben gefüllt werden sie in den jeweiligen <code>/branding</code> Verzeichnissen.
</div>
<b>WICHTIG: Die beiden <code>*_branding.css</code> Dateien müssen nach den Standard CSS Dateien aufgerufen werden.</b>
<pre class="brush: ruby; gutter: true">
<%= stylesheet_link_tag 'screen.css',
                            'print.css',
                            'screen_branding.css',
                            'print_branding.css',
                            :cache => true %>
</pre>


<h4 class="blogentry">3. Konfigurationsanpassungen</h4>
Damit wir auch die Internationalisierung der Anwendung kundenspezifisch gestalten können, gibt es das Verzeichnis <code>locales_branding</code>. Es ist in der Standard Rails Verzeichnisstruktur erneut leer und wird in den <code>/branding</code> Verzeichnissen gefüllt.
Wir teilen Rails durch die Angabe folgender Zeilen in der <code>environment.rb</code> innerhalb des <code>Rails::Initializer.run do |config|</code> Blockes mit, dass für die I18N-Auswertung alle <code>*.yml</code> Dateien aus den Verzeichnissen <code>config/locales</code> (inklusive aller Unterverzeichnisse) genommen werden.
<br/><br/>
<b>WICHTIG ist wieder die Aufrufreihenfolge! </b>
<br/>Indem wir <code>config/locales_branding</code> erst nach <code>config/locales</code> der Railsumgebung bekannt machen, werden schon definierte &Uuml;bersetzungen aus dem Verzeichnis <code>config/locales</code> mit kundenspezifischen aus dem <code>config/locales_branding</code>-Verzeichnis &uuml;berschrieben.

<pre class="brush: ruby; gutter: true">
  # The internationalization framework can be changed to have another default locale (standard is :en) or more load paths.
  # All files from config/locales/*.rb,yml are added automatically.
  config.i18n.load_path += Dir[File.join(RAILS_ROOT, 'config', 'locales', '**', '*.{rb,yml}')]
  config.i18n.load_path += Dir[File.join(RAILS_ROOT, 'config', 'locales_branding', '**', '*.{rb,yml}')]
  config.i18n.default_locale = :de
</pre>

Desweiteren hatten wir anfangs des Tutorials erw&auml;hnt, dass auch bestimmte Features für Kunden ein- oder ausgeschaltet werden k&ouml;nnen. Diese Ein- oder Ausschalten wird in der Konfigurationsdatei <code>feature_setting.rb</code> erledigt. Dazu muss diese Datei in der <code>environment.rb</code> vor dem <code>Rails::Initializer.run do |config| Block</code> geladen werden.

<pre class="brush: ruby; gutter: true">
# Set the global constants for feature enabling
require File.join(File.dirname(__FILE__), 'feature_settings')
</pre>
Beispiel der <code>feature_settings.rb</code>:
<pre class="brush: ruby; gutter: true">
# Feature Schalter

$FEATURE_LOGIN_INFO_TEXT         = false
$FEATURE_RESET_DB                = false
$FEATURE_SHOW_RESET_DB_COUNTDOWN = false
</pre>

<h4 class="blogentry">4. Rake Build Anpassungen</h4>
Soweit so gut! Nun kommt das eigentlich Spannende. Wir "mixen" unsere kundenspezifischen Anwendungsdatein zu einer <code>war-Datei</code> zusammen. 
<br/><br/>
Im Standard Rails Verzeichnis <code>config/</code> befindet sich unsere <code>warble.rb</code> Konfigurationsdatei. (Auf genauere Informationen zu den einzelnen Konfigurationsmöglichkeiten innerhalb der <code>warble.rb</code> gehen wir hier nicht ein. Mehr Infornationen findet man unter <a target="_blank" href="http://caldersphere.rubyforge.org/warbler/">Warbler::Config</a>). In dieser Datei definieren wir das "default" <code>config.staging_dir</code>. Diese Einstellung bezeichnet das Verzeichnis, in dem die Standarddateien für unsere war-Datei zusammengetragen werden. Unter Standarddateien verstehen wir hier alle Dateien, die zur erfolgreichen Ausführung der Anwendung innerhalb der war-Datei benötigt werden, ohne die speziellen kundenspezifischen Dateien aus dem <code>/branding</code> Verzeichnissen.
<pre class="brush: ruby; gutter: true">
Warbler::Config.new do |config|
  # Temporary directory where the application is staged
  config.staging_dir = "tmp/war/default" 
  ...
  # Hier folgen alle weiteren Konfigurationen.
  ...
</pre>
<br/><br/>
In unserer Build Datei <code>Rakefile</code> stellen wir nun spezielle Rake Tasks zur Erstellung der kundenspezifischen war-Dateien zur Verfügung. 

<pre class="brush: ruby; gutter: true">
namespace :zeiterfassung do
    CONFIG_DIR                    = "config"
    CUSTOMIZE_DIR                 = "branding"
    PUBLIC_DIR                    = "public"
    WEBINF_DIR                    = "WEB-INF"
    WAR_TMP_PATH                  = "tmp/war"
    DEFAULT_WAR_TMP_PATH          = "#{WAR_TMP_PATH}/default"
    WARBLER_CONFIG_FILE           = "warble.rb"
    URLREWRITE_FILE               = "urlrewrite.xml"
    NO_BRANDING_DIRS              = %w[ . .. .svn ]
  
  desc "Build customize WAR Files"
  task :branding_war_files => ["war:app", "war:public", "war:webxml"] do    
    Dir.foreach(CUSTOMIZE_DIR) do |d|
      if File.directory?("#{CUSTOMIZE_DIR}/#{d}") && !(NO_BRANDING_DIRS.include? d)
        puts "Start build #{d}"
        customize_app_path = File.join(RAILS_ROOT, CUSTOMIZE_DIR, "#{d}")
        war_tmp_path       = File.join(RAILS_ROOT, WAR_TMP_PATH, "#{d}")
        # tmp und Log Verzeichnisse anlegen
        Rake::Task['zeiterfassung:create_tmp_and_log_dir'].invoke

        # default Dateien kopieren
        cp_r(File.join(RAILS_ROOT, DEFAULT_WAR_TMP_PATH), war_tmp_path)

        # Copy all customize Files
        cp_r(File.join(customize_app_path, CONFIG_DIR, "."),  File.join(war_tmp_path, WEBINF_DIR, CONFIG_DIR))
        cp_r(File.join(customize_app_path, PUBLIC_DIR, "."),  war_tmp_path)
               
        warble_namespace = "#{d}"
        config = Warbler::Config.new do |config|
          config.staging_dir = WAR_TMP_PATH + "/#{d}"
          config.war_name = "#{d}"
        end
        Warbler::Task.new(warble_namespace, config)
        Rake::Task[warble_namespace+":jar"].invoke
      end
    end
  end
    
  desc "create tmp and log Dir in war file"
  task :create_tmp_and_log_dir do
    path = File.join(RAILS_ROOT, DEFAULT_WAR_TMP_PATH, WEBINF_DIR)
    cd path
    makedirs "tmp"
    makedirs "log"
    cd RAILS_ROOT
  end
 
end
</pre>
Was passiert hier im Einzelnen?<br/>
Zuerst wird für die Anwendung ein eigener namespace angelegt. Der Task <code>:branding_war_files</code> erledigt nun die ganzen Aufgaben. Bei seiner Ausführung werden zuerst die Tasks <code>"war:app", "war:public", "war:webxml"</code> hintereindander ausgeführt. Diese Tasks sind Standdardtasks des <code>Warbler Gems</code>. Der namespace "war:" kommt durch die <code>warble.rb</code> Konfigurationsdatei im Standard Rails <code>/config</code>Verzeichnis. Beim initialen Laden der Railsumgebung wird automatisch ein namespace "war:" mit den Konfigurationseinstellungen aus der <code>warble.rb</code> erzeugt.

<ul><li><b>war:app und war:public</b> kopiert alle Anwendungsdateien (auch benötigte Libs und Gems) in das vorher angegebene <code>staging_dir</code></li><li><b>war:webxml</b> generiert die <code>web.xml</code> Datei für die Anwednung</li></ul>

Nachdem nun im Verzeichnis <code>DEFAULT_WAR_TMP_PATH == tmp/war/default</code> die Standarddateien für unsere war-Datei zusammengetragen wurden beginnt die eigentliche kundenspezifische Anpassung.
<br/><br/>
Die Schleife <code>Dir.foreach(CUSTOMIZE_DIR) do |d| ... end</code> durchläuft alle direkten Unterverzeichnisse des <code>/branding</code> Verzeichnisses und erstellt für jedes dieser Verzeichnisse eine war-Datei. In unserem Beispiel sind es die beiden Verzeichnisse <code>acme_orange_color</code> und <code>acme_zeiterfassung</code>. Für jede dieser beiden Anwendungen werden die Dateien aus dem <code>DEFAULT_WAR_TMP_PATH</code> in die kundenspezifischen Verzeichnisse <code>tmp/war/acme_orange_color</code> und <code>tmp/war/acme_zeiterfassung</code> kopiert und anschliessend die Dateien aus den jeweiligen <code>branding</code> Verzeichnis darüber gelegt. In Zeile 29 des Task Beispieles wird für jede kundenspezifische Anwendung ein neuer namespace definiert, um den mit dem Warbler Gem kommenden <code>namespace:jar</code> Task zum Packen der Anwendung nutzen zu können.

<br/><br/>
Mittels <code>rake zeiterfassung:branding_war_files</code> können die war-Dateien nun erstellt werden. Wir erhalten in unserem Beispiel 2 Dateien - <code>acme_orange_color.war</code> und <code>acme_zeiterfassung.war</code>

<div class="more_links">weiterführende Links und Quellen</div>
<a target="_blank" href="http://www.jruby.org/">www.jruby.org</a><br/>
<a target="_blank" href="http://caldersphere.rubyforge.org/warbler/">Warbler Gem</a><br/>
<a target="_blank" href="http://github.com/dasil003/rails-multisite/tree/master">rails-multisite Gem</a><br/>
<a target="_blank" href="http://www.slideshare.net/tim.lossen.de/multi-tenancy-made-easy">Multi-Tenancy Made Easy von Tim Lossen</a><br/>
<a target="_blank" href="http://aac2009.confreaks.com/06-feb-2009-14-30-writing-multi-tenant-applications-in-rails-guy-naor.html">Writing Multi-Tenant Applications in Rails von Guy Naor  [Video]</a></br>
<a target="_blank" href="http://en.wikipedia.org/wiki/Multitenancy">Multitenancy</a><br/>
<a target="_blank" href="http://de.wikipedia.org/wiki/Corporate_Design">Corporate Design</a>]]>
    </content>
</entry>

<entry>
    <title>Rails 2.3.4 im Tomcat 6</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/09/rails-234-im-tomcat-6.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1540</id>

    <published>2009-09-16T09:55:26Z</published>
    <updated>2009-09-16T10:17:03Z</updated>

    <summary>Da mit dem Einzug von Rack 1.0 das Upgrade auf Rails 2.3 unter JRuby etwas problematisch war, mussten wir bisher mit Rails 2.2 Vorlieb nehmen (zumindest bei den Anwendungen, die Cookies benutzten). Mit dem Erscheinen von JRuby-Rack 0.9.5 werden diese...</summary>
    <author>
        <name>Martin</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jruby131" label="JRuby 1.3.1" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jrubyonrails" label="JRuby on Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jrubyrack" label="JRuby-Rack" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails234" label="Rails 2.3.4" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="warbler" label="Warbler" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        Da mit dem Einzug von Rack 1.0 das Upgrade auf Rails 2.3 unter JRuby etwas problematisch war, mussten wir bisher mit Rails 2.2 Vorlieb nehmen (zumindest bei den Anwendungen, die Cookies benutzten).
Mit dem Erscheinen von JRuby-Rack 0.9.5 werden diese Funktionen nun auch unterstützt. Wir haben gleich die komplette Infrastruktur erneuert: Mit dem Warbler 0.9.14 kommt nun auch JRuby 1.3.1 zum Einsatz (mittlerweile gepackt im Gem &quot;jruby-jars&quot;).
        <![CDATA[Im Tomcat 6.0.16 unter Suse Linux gab es ein Problem: Offenbar sind dort einige Verzeichnisse nicht gesetzt, sodass JRuby-Rack beim Initialisieren mit einer Exception aussteigt:
<pre class="brush: ruby; gutter: true">
SEVERE: Error: unable to initialize application
org.jruby.rack.RackInitializationException: no such file to load -- rack
</pre>
Die Lösung bietet ein kleiner Hack: Im Start-Script des Tomcat <code>$CATALINA_HOME/bin/catalina.sh</code> mussten wir ein <code>cd $CATALINA_HOME</code> eintragen, nachdem sichergestellt ist, dass <code>$CATALINA_HOME</code> nicht nochmal umgeschrieben oder das Verzeichnis gewechselt wird.
<br/><br/>
Leider tritt das Problem auch im JBoss 5.1 auf, der ja Tomcat als Bibliothek nutzt. Dort ist die Lösung nicht so einfach, weswegen wir unsere Anwendungen dort noch nicht umstellen konnten.
<br/>
Es gibt die Vermutung, dass dieses Problem mit einem Bug in JRuby zusammen hängt:
<a href="http://jira.codehaus.org/browse/JRUBY-3935" target="_blank">Bug-Report</a>.

<div class="more_links">weiterführende Links und Quellen</div>
<a href="http://kenai.com/projects/warbler/pages/Home">Warbler</a><br/>
<a href="http://kenai.com/projects/jruby-rack/pages/Home">JRuby-Rack</a><br/>
<a href="http://jira.codehaus.org/browse/JRUBY-3935">Bug-Report bei JRuby<br/>]]>
    </content>
</entry>

<entry>
    <title>Erste JRuby Konferenz - Kostenlos!</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/09/erste-jruby-konferenz-kostenlos.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1539</id>

    <published>2009-09-13T09:57:25Z</published>
    <updated>2009-09-13T10:45:05Z</updated>

    <summary>JRubyConf 22. November 2009 in San Francisco Nach drei Jahren JRuby Entwicklung ist es soweit die erste reine JRuby Konferenz steht an und das kostenlos! Ok sie findet nicht in Europa statt, sondern in San Francisco. Aber sicherlich wird es...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Links" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="engineyard" label="Engine Yard" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="java" label="Java" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="konferenz" label="Konferenz" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<h4 class="blogentry">JRubyConf 22. November 2009 in San Francisco</h4>

Nach drei Jahren JRuby Entwicklung ist es soweit die erste reine JRuby Konferenz steht an und das kostenlos! Ok sie findet nicht in Europa statt, sondern in San Francisco. Aber sicherlich wird es auch bald bei uns JRuby Konferenzen geben. 

<br/><br/>
Auf <a target="_blank" href="http://www.jrubyconf.com/">www.jrubyconf.com</a> findet man weitere Infos über die Konferenz und Registrierung. Sie wird von Engine Yard präsentiert, der Firma, bei der seit Neustem der Großteil der JRuby Kernentwickler arbeitet.


<div class="more_links">weiterführende Links und Quellen</div>
<a target="_blank" href="http://www.jruby.org/">www.jruby.org</a><br/>
<a target="_blank" href="http://www.jrubyconf.com/">www.jrubyconf.com</a><br/>
<a target="_blank" href="http://www.engineyard.com/blog/2009/announcing-the-first-ever-jrubyconf/">Announcing JRubyConf 2009</a><br/>

]]>
        
    </content>
</entry>

<entry>
    <title>View-Helper mit Kommentaren</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/08/view-helper-mit-kommentaren.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1537</id>

    <published>2009-08-26T06:26:50Z</published>
    <updated>2009-10-06T10:32:36Z</updated>

    <summary><![CDATA[Heute mal ein Bericht von einer Merkwürdigkeit, über die wir soeben gestolpert sind: &lt;% my_helper do #comment %&gt; &lt;div&gt;Text&lt;/div&gt; &lt;%= function() %&gt; &lt;% end %&gt; my_helper ist ein normaler Helper - in unserem Fall sollte er sich den Code nehmen...]]></summary>
    <author>
        <name>Martin</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="helper" label="Helper" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="Ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="view" label="View" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Heute mal ein Bericht von einer Merkwürdigkeit, über die wir soeben gestolpert sind:
<pre class="brush: ruby; gutter: true">
<!-- in einem ERB-View -->

&lt;% my_helper do #comment %&gt;
  &lt;div&gt;Text&lt;/div&gt;
  &lt;%= function() %&gt;
&lt;% end %&gt;
</pre>

<code>my_helper</code> ist ein normaler Helper - in unserem Fall sollte er sich den Code nehmen und auf der Webseite als Text anzeigen, was auch klappte. Nur im Produktivsystem war lediglich die Ausgabe von <code>function()</code> zu sehen. Wieso? <br/><br/>
Was hier falsch ist, ist der Kommentar direkt nach dem <code>do</code>. RubyMine zeigt zwar eine korrekte Syntax und auf meinem <code>localhost</code>-System funktioniert es auch. Warum es nur produktiv nicht klappte, bleibt ein Rätsel, wir konnten bisher nur rausfinden, dass es nicht an der Environment liegt.

]]>
        
    </content>
</entry>

<entry>
    <title>Cache-Probleme bei nicht-migrierter DB</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/08/cache-probleme-bei-nicht-migrierter-db.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1536</id>

    <published>2009-08-10T06:49:36Z</published>
    <updated>2009-08-26T09:29:57Z</updated>

    <summary>Vor einiger Zeit berichteten wir über eine Möglichkeit, Datenbank-Aktualisierungen auch unter JRuby einfach nach dem Deployment durchzuführen, indem man die Migration über den Browser anstößt. Wir haben das nun schon eine Weile - auch produktiv - im Einsatz und sind...</summary>
    <author>
        <name>Martin</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="cache" label="Cache" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="database" label="Database" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="db" label="DB" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="migration" label="Migration" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Vor einiger Zeit <a href="http://www.jrubyonrails.de/2009/04/datenbankmigration-im-browser.html" target="_blank">berichteten wir</a> über eine Möglichkeit, Datenbank-Aktualisierungen auch unter JRuby einfach nach dem Deployment durchzuführen, indem man die Migration über den Browser anstößt.<br/>
Wir haben das nun schon eine Weile - auch produktiv - im Einsatz und sind sehr zufrieden damit. Es gibt aber einen Punkt, den man bei der Anwendungsentwicklung im Blick haben muss.]]>
        <![CDATA[In einer unserer Anwendungen verwendeten wir ein Model <code>State</code>. Da es von diesem Model nur begrenzte Instanzen gab, wurden diese in einer Konstante gehalten:
<pre class="brush: ruby; gutter: true">
  class State < ActiveRecord::Base
    
     OPEN   = State.find_by_name("open")
     CLOSED = State.find_by_name("closed")
     
     ...

  end

  state_open = State::OPEN
</pre>
Das stellt zunächst kein Problem dar. Bis man die Anwendung in einer Produktionsumgebung laufen lässt. Die Zeile <code>config.cache_classes = true
</code> in unserer Konfiguration sorgt nämlich dafür, dass alle Klassen beim Laden der Anwendung (und das ist bei JRuby das Laden der WAR-Datei) ausgelesen und gespeichert werden. Wenn nun die Klasse <code>State</code> ausgelesen wird, werden natürlich auch die Konstanten gesetzt. Und dafür wird ein Datenbank-Zugriff gemacht. Wenn also die Migration, die die Tabelle <code>states</code> anlegt, noch nicht gelaufen ist, schlägt bereits das Laden der Anwendung fehl - wodurch wir die Migration selbst gar nicht mehr ausführen können.
<br/><br/>
Die Vermeidung ist in unserem Beispiel einfach:
<pre class="brush: ruby; gutter: true">
  class State < ActiveRecord::Base
    
     OPEN   = "open"
     CLOSED = "closed"

     def self.get_state name
       find_by_name(name)
     end
     
     def self.get_open
       get_state OPEN
     end

     ...

  end

  state_open = State.get_open()
</pre>
Hier findet der Datenbankzugriff erst statt, wenn er wirklich benötigt wird.
<br/>
In Rails 2.2 gibt es bestimmte <a href="https://rails.lighthouseapp.com/projects/8994/tickets/802" target="_blank">Fälle</a>, in denen das Problem auch ohne JRuby auftritt. Dort geht es allerdings um die Ausführung von rake-Tasks in Produktionsumgebungen. Diese Fehler sind aber mit Rails 2.3 behoben.
<br/><br/>
<b>Quellen:</b><br/>
<a href="http://www.jrubyonrails.de/2009/04/datenbankmigration-im-browser.html" target="_blank">Artikel "Datenbankmigration im Browser"</a><br/>
<a href="https://rails.lighthouseapp.com/projects/8994/tickets/802" target="_blank">Bugreport für Rails 2.2</a>



]]>
    </content>
</entry>

<entry>
    <title>Statische Migrationen, flexible Anwendung</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/07/statische-migrationen-flexible-anwendung.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1533</id>

    <published>2009-07-30T11:46:41Z</published>
    <updated>2009-08-04T07:45:42Z</updated>

    <summary>Da wir unsere Projekte meist im Team bearbeiten, standen wir schon öfter vor folgendem Problem: Ein Entwickler startet ein neues Projekt und legt das Model User an. Da das Projekt am Anfang steht, hat der User erst mal nur ein...</summary>
    <author>
        <name>Martin</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tutorials" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="migration" label="Migration" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="model" label="Model" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="Ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="validierung" label="Validierung" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Da wir unsere Projekte meist im Team bearbeiten, standen wir schon öfter vor folgendem Problem:<br/>
Ein Entwickler startet ein neues Projekt und legt das Model <code>User</code> an. Da das Projekt am Anfang steht, hat der User erst mal nur ein Login. In der Migration wird auch gleich ein "admin"-User angelegt. Ein paar Tage später wird entschieden, dass beim <code>User</code> auch Vor- und Nachname benötigt werden. Also legt der Entwickler eine Migration an, die dem User diese Felder hinzufügt und das <code>User</code>-Model erhält Validierungen, damit die Vor- und Nachnamen auch befüllt werden.<br/>
<br/>
Nun kommt ein zweiter Entwickler zum Projekt hinzu. Er checkt die Sourcen frisch aus und will seine Entwicklungs-DB migrieren. Schon die erste Migration schlägt fehl, da diese den "admin"-User ohne Vor- und Nachnamen anlegen will. Auch später im Produktivsystem funktioniert diese Migration nicht mehr.<br/>
Noch spannender wird es, wenn im Laufe der Zeit durch ein Refactoring ein Model ganz entfernt wurde. Alle vorangehenden Migrationen, die irgendwie auf die Klasse zugreifen wollen, schlagen fehl. Kurzum: Die Anwendung entwickelt sich dynamisch, während die Migrationen zum jeweiligen Anwendungsstand in Stein gemeißelt werden.

]]>
        <![CDATA[Für die Entwicklung wäre es vermutlich einfach, in Migrationen gar keine Daten zu setzen oder zu ändern. Aber spätestens in der Wartungsphase der Anwendung müssen bei DB-Änderungen auch die Daten angepasst werden.<br/>
Deswegen haben wir über verschiedene Lösungsmöglichkeiten nachgedacht und sind auf folgende Ansätze gestoßen: <br/>
<ul>
  <li>
In Migrationen nur reines SQL benutzen? Damit gibt man die Einfachheit von Rails auf. Und gerade die Tatsache, Rails-Code in Migrationen zu schreiben, macht sie doch so attraktiv.</li>
<li>Alle Migrationen rückwirkend entsprechend des Datenmodels anpassen? Das entspricht nicht dem Konzept der Migrationen. Außerdem ist es zu aufwändig, sobald ein paar mehr Migrationen vorhanden sind.</li>
<li><a href="http://www.wilcoxd.com/blog/rails-migrations-and-model-validations.html" target="_blank">Ryan Wilcox</a> schlägt vor, Validierungen mittels <code>:if => Proc.new {|o| o.responds_to? :checked_attr}</code>deaktivieren, wenn die Datenbank das Attribut nicht kennt. Das funktioniert zwar für die Validierungen. Aber sollen wirklich alle Validierungen mit so einem hässlichen Block erweitert werden, nur um die Migrationen zu unterstützen?</li>
<li>In Migrationen statt <code>User.create!</code> einfach <code>user = User.build</code> und <code>user.save!(false)</code> nutzen? Auch dieser Ansatz funktioniert für die Validierungen, nicht aber bei den Refactorings</li>
</ul>
Schließlich half uns ein Eintrag in den <a href="http://guides.rails.info/migrations.html#using-models-in-your-migrations" target="_blank">RailsGuides</a>:
Einfach das Model in der Migration selbst definieren:
<pre class="brush: ruby; gutter: true">
  class ChangeUser < ActiveRecord::Migration
    class User < ActiveRecord::Base
    end

    def self.up
       ...
    end

    def self.down
       ...
    end
  end
</pre>
So hat die Migration ihr eigenes Model, keine der Validierungen stört hier und die Migration kann auch dann auf die Tabelle zugreifen, wenn das eigentliche Model in der Anwendung schon lang entfernt wurde.<br/><br/>
Natürlich muss man aufpassen, dass man keine selbstgeschriebenen <code>User</code>-Methoden in der Migration nutzt. Auch die has_many- und belongs_to-Methoden sind nicht vorhanden, was man beim Setzen einiger Werte beachten muss. Zumindest bei den N:M-Beziehungen ist das Einfügen der habtm-Zeile sinnvoll, da sonst die N:M-Tabelle wirklich von Hand befüllt werden muss.
<pre class="brush: ruby; gutter: true">
  class CreateUser < ActiveRecord::Migration
    class User < ActiveRecord::Base
       has_and_belongs_to_many :roles
    end

    class Role < ActiveRecord::Base
    end

    def self.up
      ...
      adminUser = User.create! {:login => "admin"}
      adminRole = Role.create! {:title => "admin"}
      userRole  = Role.create! {:title => "user"}
      
      adminUser.role_ids = [adminRole.id, userRole.id]
      adminUser.save!
    end
    
    def self.down
      ...
    end
  end
</pre>
Hier gibt es noch eine kleine Falle: <code>adminUser.roles = [adminRole, userRole]</code> wird nicht funktionieren, da der Setter den Typ des Objekts prüft. Und <code>Role</code> ist nicht gleich <code>CreateUser::Role</code>.<br/><br/>

Ansonsten ist das wirklich ein schöner Weg, die Migration vom aktuellen Zustand der Anwendung zu trennen.

<br/><br/>
<b>Links und Quellen</b><br/>
<a href="http://guides.rails.info/migrations.html#using-models-in-your-migrations" target="_blank">Artikel in den RailsGuides</a>
<br/>
<a href="http://www.wilcoxd.com/blog/rails-migrations-and-model-validations.html" target = "_blank">Ryan Wilcox' Blog-Eintrag</a>]]>
    </content>
</entry>

<entry>
    <title>JRuby-Team verlässt Sun</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/07/jruby-team-verlasst-sun.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1532</id>

    <published>2009-07-30T06:14:39Z</published>
    <updated>2009-07-31T06:23:27Z</updated>

    <summary>Wie auf PC World zu lesen war, verlassen die JRuby-Entwickler Nick Sieger, Charles Nutter und Thomas Enebo ihren bisherigen Arbeitgeber Sun Microsystems. Der Grund ist offenbar die Unsicherheit, die bzgl. JRuby mit der Übernahme Suns durch Oracle entstand. Ihr neuer...</summary>
    <author>
        <name>Martin</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Wie auf <a href="http://www.pcworld.com/article/169145/suns_jruby_team_jumps_ship_to_engine_yard.html" target="_blank">PC World</a> zu lesen war, verlassen die JRuby-Entwickler Nick Sieger, Charles Nutter und Thomas Enebo ihren bisherigen Arbeitgeber Sun Microsystems. Der Grund ist offenbar die Unsicherheit, die bzgl. JRuby mit der Übernahme Suns durch Oracle entstand. Ihr neuer Arbeitgeber Engine Yard ist ein "Ruby on Rails"-Hoster, der aufgrund der gestiegenen Bedeutung die Entwicklung von JRuby vorran treiben möchte. Auf ihrem <a href="http://www.engineyard.com/blog/" target="_blank">Blog</a> kann man auch von den Plänen zu kommerziellem Support lesen.

<br/><br/><br/>
<b>weiterführende Links und Quellen</b>
<br/>
<a href="http://www.engineyard.com/" target="_blank">Webseite von Engine Yard</a>
<br/>
<a href="http://www.engineyard.com/blog/" target="_blank">Blog-Eintrag bei Engine Yard</a>
<br/>
<a href="http://www.pcworld.com/article/169145/suns_jruby_team_jumps_ship_to_engine_yard.html" target="_blank">News bei PC World</a><br/>
<a href="http://entwickler.de/zonen/portale/psecom,id,99,news,50232.html" target="_blank">Interview mit Charles Nutter auf entwickler.de</a>]]>
        
    </content>
</entry>

<entry>
    <title>JRuby.org im neuen Glanz mit JRuby 1.3.1</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/07/jrubyorg-im-neuen-glanz-mit-jruby-131.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1531</id>

    <published>2009-07-21T20:07:11Z</published>
    <updated>2009-07-22T06:00:42Z</updated>

    <summary>Die JRuby Jungs haben nicht nur die neue 1.3.1 Version herausgebracht, sondern auch begonnen, Ihre Webseite aufzupeppen. http://www.jruby.org erstrahlt seit Kurzem in neuem Glanz und lädt zum Testen von JRuby ein. In der JRuby-Version 1.3.1 wurden kleinere Bugs behoben. JRuby...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Links" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby131" label="JRuby 1.3.1" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jrubyorg" label="jruby.org" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Die JRuby Jungs haben nicht nur die neue 1.3.1 Version herausgebracht, sondern auch begonnen, Ihre Webseite aufzupeppen. <a href="http://www.jruby.org/" target="_blank">http://www.jruby.org</a> erstrahlt seit Kurzem in neuem Glanz und lädt zum Testen von JRuby ein.
<br/><br/>
In der JRuby-Version 1.3.1 wurden kleinere Bugs behoben. <a href="http://www.jruby.org/news" target="_blank">JRuby Release Information</a>

<div class="more_links">weiterführende Links und Quellen</div>
<a href="http://kenai.com/projects/jruby/pages/Home" target="_blank">JRuby Wiki</a><br/>
<a href="http://www.jruby.org/" target="_blank">http://www.jruby.org/</a>
]]>
        
    </content>
</entry>

<entry>
    <title>Fehler in AJAX-Request anzeigen</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/06/fehler-in-ajax-request-anzeigen.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1528</id>

    <published>2009-06-11T15:29:35Z</published>
    <updated>2009-06-12T13:25:32Z</updated>

    <summary>Während der Entwicklung tritt bei dem ein oder anderen Entwickler doch mal ein Fehler auf, auf den uns Rails mit einem Exception-Text und dem Stacktrace hinweist. So lassen sich die Fehler meist schnell finden und beseitigen. Im produktiven Einsatz sollte...</summary>
    <author>
        <name>Martin</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ajax" label="Ajax" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="fehler" label="Fehler" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rubyonrails" label="Ruby on Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>Während der Entwicklung tritt bei dem ein oder anderen Entwickler doch mal ein Fehler auf, auf den uns Rails mit einem Exception-Text und dem Stacktrace hinweist. So lassen sich die Fehler meist schnell finden und beseitigen. Im produktiven Einsatz sollte sowas zwar nicht mehr passieren, aber falls doch, wird mittels des Status-Codes 500 auf den internen Fehler hingewiesen und das Log mit der Exception gefüllt.</p>
<p>
Doch was ist, wenn so ein Fehler in Mitten eines AJAX-Aufrufs passiert? Dann bleibt der Request auf dem Server hängen und der Browser erhält nie eine Antwort. Der Nutzer (egal ob Entwickler oder Endanwender) erhält keine Rückmeldung.</p>
]]>
        <![CDATA[<p>Das lässt sich ändern, indem man die <code>rescue_from</code>-Methode von Rails benutzt. Sie ist dafür gedacht, auf spezielle Exceptions zu reagieren - besonders auf welche, die vom Entwickler definiert wurden.</br>
Wir wandeln diesen Gedanken ab und fangen im <code>ApplicationController</code> alle Fehler ab:</p>
<pre class="brush: ruby; gutter: true">

# Alle Fehler durch eigene Methode abfangen
rescue_from Exception, :with => show_javascript_errors

</pre>
<p>Bevor jetzt die ersten Schmerzensschreie zu hören sind, soll schnell gesagt werden, dass im ersten Schritt der behandelnden Methode sichergestellt wird, dass Nicht-Javascript-Requests von ihr nicht betroffen sind. Hier ist die Fehlerbehandlung von Rails einfach ausreichend.</p>
<p>Was können wir nun tun, wenn während eines AJAX-Requests ein Fehler auftrat? Wir können einen HTTP-Request draus machen, indem wir auf eine normale Action weiterleiten. Wir haben uns für die "index"-Action des aktuellen Controllers entschieden, weil AJAX-Links ja typischerweise beim Einstellen bestimmter Filter einer Liste oder ähnlichem vorkommen. Sind kritischere Aktionen im Gang, ist es vielleicht sinnvoll, gleich zu einer allgemeinen Fehlerseite weiterzuleiten.</p>
<pre class="brush: ruby; gutter: true">
  def show_javascript_errors(exception)    
    respond_to do |format|

      format.html {rescue_action_without_handler(exception)}
      format.xml  {rescue_action_without_handler(exception)}
      format.js do
        log_error(exception) if logger

        if (ENV['RAILS_ENV'] == 'development')
          flash[:error] = exception.clean_message
        else
          flash[:error] = "Ein interner Fehler ist aufgetreten!"
        end
        render :update do |page|
          page.redirect_to {:action => 'index'}
        end
      end
    end
  end
</pre>
<p>In der Entwicklung bekommt man mit dem Fehlertext eine erste Idee, woran es denn hapert. Andernfalls wird - ähnlich zur 500er-Seite - ein allgemeiner Fehler ausgegeben und der Nutzer weiß wenigstens, woran er ist. Der genaue Fehler wird natürlich auch ins Log geschrieben.</p>
<p>Und wenn es nun ein grober Fehler ist, wie eine Datenbankverbindung, die soeben gekappt wurde? Dann wird natürlich der Aufruf der "index"-Action genauso scheitern und eine Exception bzw. die 500er-Seite anzeigen - so, als wäre es von Anfang an ein HTTP-Request gewesen.</p>]]>
    </content>
</entry>

<entry>
    <title>JRuby 1.3.0</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/06/jruby-130.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1527</id>

    <published>2009-06-05T07:34:02Z</published>
    <updated>2009-06-07T21:19:36Z</updated>

    <summary>Wie Ola Bini schon auf der RailsWayCon letzte Woche angekündigt hatte, ist jetzt die neue JRuby Version 1.3.0 erschienen. Sie kann wie immer unter http://jruby.codehaus.org/ heruntergeladen werden. Die wichtigste Neuerung ist die Anpassung an die Google App Engine, sowie weitere...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="googleappengine" label="Google App Engine" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby130" label="JRuby 1.3.0" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Wie Ola Bini schon auf der RailsWayCon letzte Woche angekündigt hatte, ist jetzt die neue JRuby Version 1.3.0 erschienen. Sie kann wie immer unter <a href="http://jruby.codehaus.org/" target="_blank">http://jruby.codehaus.org/</a> heruntergeladen werden. Die wichtigste Neuerung ist die Anpassung an die Google App Engine, sowie weitere Performance Verbesserungen bei z.B. der Nutzung von Java Arrays.

<br/><br/>
<div class="more_links">weiterführende Links und Quellen</div>
<a target="_blank" href="http://jruby.codehaus.org/">jruby.org</a>
<br/>
<a target="_blank" href="http://www.jruby.de/articles/2009/06/04/jruby-1-3-0-ist-da">jruby.de</a>
<br/>
<a target="_blank" href="http://olabini.com/blog/2009/04/jruby-on-rails-on-google-app-engine/">JRuby on Rails on Google App Engine</a>
<br/>
<a target="_blank" href="http://blog.headius.com/2009/05/jruby-nailgun-support-in-130.html">JRuby Nailgun Support in 1.3.0</a>
<br/>


]]>
        
    </content>
</entry>

<entry>
    <title>RubyMine 1.1</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/06/rubymine-11.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1526</id>

    <published>2009-06-02T16:10:52Z</published>
    <updated>2009-06-05T16:41:42Z</updated>

    <summary>Vor einigen Tagen haben die Jungs von JetBrains RubyMine 1.1 veröffentlicht und einige neue Features eingebaut. Unter anderem werden jetzt auch Projekte mit Rails 2.3.2 unterstützt und Cucumber-Spezifikationen haben einen Runner spendiert bekommen. Wir arbeiten nun seit einem Monat RubyMine...</summary>
    <author>
        <name>Martin</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="rubyrubymine" label="Ruby RubyMine" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Vor einigen Tagen haben die Jungs von JetBrains <a href="http://www.jetbrains.com/ruby/whatsnew/index.html" target="_blank">RubyMine 1.1</a> veröffentlicht und einige neue Features eingebaut. Unter anderem werden jetzt auch Projekte mit Rails 2.3.2 unterstützt und Cucumber-Spezifikationen haben einen Runner spendiert bekommen.
Wir arbeiten nun seit einem Monat RubyMine und werden immer noch ab und zu mit kleinen Dingen positiv überrascht. Gerade die gute Integration dieser netten Features bewegen immer mehr Entwickler bei uns zu RubyMine zu wechseln. Unser Chef hat schon eine Ladung Lizenzen besorgt ;-)]]>
        
    </content>
</entry>

<entry>
    <title>Is it JRuby?</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/06/is-it-jruby.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1525</id>

    <published>2009-06-01T10:10:38Z</published>
    <updated>2009-06-01T19:11:09Z</updated>

    <summary>Jeder der schon mit JRuby entwickelt hat, wird schon das eine oder andere mal beim Installieren eines Gems gefragt haben - Funktioniert dieses Gem mit JRuby? Carl Mercier hat aus diesem Grund die Webseite IsItJruby.com ins Leben gerufen, auf der...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Links" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="gem" label="Gem" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="isitjruby" label="isitjruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="kompatible" label="kompatible" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Jeder der schon mit JRuby entwickelt hat, wird schon das eine oder andere mal beim Installieren eines Gems gefragt haben - Funktioniert dieses <a href="http://de.wikipedia.org/wiki/RubyGems" target="_blank">Gem</a> mit JRuby?
<br/>
<img class="float-left" src="http://blog.carlmercier.com/wp-content/uploads/2009/05/picture-2.png" width="300" alt="Is it JRuby"/>
Carl Mercier hat aus diesem Grund die Webseite <a href="http://isitjruby.com/" target="_blank">IsItJruby.com</a> ins Leben gerufen, auf der die Gem Kompatibilität zu JRuby erläutert wird. <br/><br/>Zu jeden Gem wird eine URL für weiter Infos gezeigt und jeder ist eingeladen mittels Kommentar seine Erfahrungen mit dem Gem mitzuteilen. Ein sehr nützlicher Service, der manche Suche nach kompatiblen Gems vereinfacht.
<br class="clearer "/>
]]>
        
    </content>
</entry>

<entry>
    <title>Aktuelles von der RailsWayCon</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/05/aktuelles-von-der-railswaycon.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1524</id>

    <published>2009-05-25T12:10:42Z</published>
    <updated>2009-06-05T09:35:31Z</updated>

    <summary>Vom 25. Mai bis zum 27. Mai sind wir in Berlin zur RailsWayCon. Die Konferenz hält einige interessante Vorträge und Workshops bereit. Mal sehen was für Neuigkeiten und Ideen wir mitnehmen können. Unter http://railsmagazin.de/railswaycon-in-6-minuten-1411 findet man auch ein cooles Video...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="berlin" label="Berlin" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="konferenz" label="Konferenz" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="railswaycon2009" label="RailsWayCon 2009" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Vom 25. Mai bis zum 27. Mai sind wir in Berlin zur RailsWayCon. Die Konferenz hält einige interessante Vorträge und Workshops bereit. Mal sehen was für Neuigkeiten und Ideen wir mitnehmen können.
<br/><br/>
Unter <a href="http://railsmagazin.de/railswaycon-in-6-minuten-1411" target="_blank">http://railsmagazin.de/railswaycon-in-6-minuten-1411</a> findet man auch ein cooles Video mit Eindrücken der RailsWayCon.





]]>
        <![CDATA[<br/>
<h4 class="blogentry">Tag 1 - 25. Mai 2009</h4>
4:30 Uhr Aufstehen und auf nach Berlin.
<br/><br/>
9:00 Uhr Strahlender Sonnenschein und wir gehen jetzt rein ;-)<br/>Wir sind pünktlich im Berliner Kongress Center und gespannt auf die folgenden 3 Tage. Die Konferenz startet mit zwei Power Workshops "Behaviour-Driven Design" und "Deploying Ruby on Rails Applications".
<br/><br/>
<b>"Deploying Ruby on Rails Applications"</b><br/>
Jonathan Weiss und Mathias Meyer gaben eine gute Übersicht über die verschiedenen und am weitesten verbreiteten 
Ruby on Rails Deployment Möglichkeiten. Angefangen von Mongrel Web Cluster, über <a href="http://www.modrails.com/" target="_blank">Phusion Passenger</a> auf <a href="http://de.wikipedia.org/wiki/Nginx" target="_blank">Nginx</a> oder Apache Web Server bis zum <a href="http://wiki.jruby.org/wiki/Warbler" target="_blank">JRuby Warbler</a> wurden die verschiedenen Ansätze beleuchtet. Schwerpunkt war dann das Automatisieren des Deployment-Prozesses mit <a href="http://www.capify.org/" target="_blank">Capistrano</a>. 
Hier wurden anschaulich an einem Mitmachbeispiel die Vorteile von Capistrano gezeigt.
Sehr interessant fanden wir auch das Eigenprodukt <a href="http://labs.peritor.com/webistrano" target="_blank">Webistrano</a>, welches die Vorzüge des automatischen Deployments noch um eine Weboberfläche erweitert und somit die Konfiguation des Deployment-Prozesses noch weiter optimiert. Weitere Schwerpunkte des Workshops waren Monitoring und Skalierbarkiet von Rails Anwendungen, sowie Ansätze für eine Volltext-Suche.
<br/><br/>
<b>"Behaviour-Driven Design - in practive"</b><br/>
Jens-Christian Fischer zeigt anhand eines kleinen Projekts, wie man mit <a href="http://rspec.info/" target="_blank">RSpec</a>, <a href="http://wiki.github.com/aslakhellesoy/cucumber/" target="_blank">Cucumber</a> und <a href="http://github.com/brynary/webrat/tree/master" target="_blank">Webrats</a> Test-Driven bzw. Behaviour-Driven Development betreibt. Da wir mit Twitter einen externen Service ansteuern, ist es auch sinnvoll, Stubs bzw. Mocks zu nutzen. Deren Erstellung ist wirklich kinderleicht. Mit <a href="http://toolmantim.com/articles/fixtureless_datas_with_machinist_and_sham" target="_blank">Machinist</a> können wir uns außerdem Blueprints für Objekte erstellen, wenn wir keine DB-bezogenen Fixtures verwenden wollen.

<br/><br/><br/>
<h4 class="blogentry">Tag 2 - 26. Mai 2009</h4>
Heute gibt es 15 Veranstaltungen zur Auswahl. Man hat die Qual der Wahl, wenn gleichzeitig interessante Vorträge stattfinden. Wir werden wohl abstimmen, wer von uns in welchen Vortag geht. ;-)

<br/><br/>
<b>"The State of Asynchronous Processing in Ruby</b></br>
<br/>
Mit <code>Thread.new() { ... }</code> erzeugt man in Ruby einen neuen Thread. Dabei tauchen aber einige Probleme auf, die uns Mathias Meyer erläutert. Für die alltäglichen Probleme wie das Aufbereiten von statistischen Daten, tägliche Email-Erinnerungen oder lange Upload-Tasks möchte man wahrscheinlich größere Lösungen, wie beispielsweise Rufus oder <a href="http://github.com/ezmobius/nanite/tree/master/" target="_blank">Nanite</a>. Diese haben dann Jobs, welche verwaltet und durch JobRunner ausgeführt werden. Dass man sicherstellen sollte, dass diese Jobs auch von Fehlern berichten, dürfte niemanden überraschen.

<br/><br/>
<b>"JRuby Internals"</b><br/>
Wie schaffen es die Jungs in JRuby-Core-Team Ruby auf der JVM laufen zu lassen? Wer das schon immer mal genauer wissen wollte, war beim Vortrag von <a href="http://olabini.com/blog/" target="_blank">Ola Bini</a> genau richtig. Er zeigte uns stichpunktartig einige Ansätze und Implementationen von JRuby. Erklärte wie funktioniert der "Lexer" oder Compiler und warum sie z.B. die Umsetzung von Array neu implementiert haben. Es war ein guter Einblick in die Arbeit des JRuby Teams.

<br/><br/>
<b>"Show the Frontend some Love: HAML and SASS</b><br/>
Jeder der Rails kennt weiß, das eines der Hauptprinzipien DRY heißt (Don't Repeate Yourself).
Auch Ui-seitig wird dort viel mit den ERB-Templates erreicht. Jan Krutisch zeigte in seinem Vortrag wie man ein Rails-Frontent mit <a href="http://haml.hamptoncatlin.com/" target="_blank">HAML</a> und <a href="http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html" target="_blank">SASS</a> umsetzen kann. Cool!!! Also wer schon immer vergeblich nach Konstanten und Mixins in CSS suchte, ist hier genau richtig.
Das werden wir uns in nächster Zeit genauer ansehen. Als Bonus gab noch eine kurze Einführung in <a href="http://wiki.github.com/chriseppstein/compass" target="_blank">Compass - ein CSS Framework</a>.

<br/><br/>
<b>"Automating Project Creation with Rails Templates"</b><br/>
Schon das fünfte Rails-Projekt gestartet und wieder zuerst die gleichen Plugins installiert, die gleichen Gems eingetragen und die gleiche Admin-Struktur aufgebaut? Mit dem <a href="http://weblog.rubyonrails.org/2009/2/1/rails-2-3-0-rc1-templates-engines-rack-metal-much-more" target="_blank">Template-System</a> von Rails 2.3, in das uns Michael Johann einführte, kann man die Erzeugung eines Projekts automatisieren. In einem kurzen Beispiel zeigte er uns, wie Benutzerabfragen getätigt wurden, Routen erzeugt und Rake-Tasks ausgeführt wurden. Auch ein Git-Repository mit initialem Commit kann so gleich automatisch erzeugt werden. Ideal, wenn man viele kleinere Rails-Applikationen mit gleicher Technik bauen will.

<br/><br/>
<b>"The Pleasure and Pain of Migrating to jRuby"</b><br/>
Seine Erfahrungen bei der Migration einer Ruby on Rails Anwendung nach JRuby, erläuterte <a href="http://lesseverything.com/steven-bristol" target="_blank">Steven Bristol</a> in seinem Vortrag. Er zeigt einige von ihm angewandteTricks um die FullText-Suche zum Laufen zu bringen und klagte über seine Probleme beim Deployment mit Glassfish.

<br/><br/>
<b>"RESTful Rails for Fun and Profit: Making HTTP work for you"</b><br/>
Der Vortrag von Stefan Tilkov war definitiv einer der Höhepunkte des Tages. Klar hatte jeder seiner Zuhörer bereits von REST gehört, 
aber nach dieser Stunde weiss man auch genug, um diese Technik einzusetzen. Gerade die Intergation über Anwendungsgrenzen hinweg ist 
eine Stärke von REST und genau das haben wir in naher Zukunft bei einem wichtigen Kunden vor uns.

<br/><br/>
<b>"Ioke for Ruby Developers"</b><br/>
Ola Bini hielt einen Vortrag, der möglichst weit von Rails und auch ein wenig von Ruby entfernt war - nämlich über seine eigene Sprache namens <a href="http://ioke.org/" target="_blank">Ioke</a>. Diese befindet sich noch im Anfangsstadium, enthält aber schon einige interessante Features.

<br/><br/>
<b>Keynote - "Present and future of Programming Languages"</b><br/>
Ola Bini hielt auch die Keynote, in der er kurz seine Meinung zur Geschichte der verschiedenen Programmiersprachen zusammenfasst und deren Zukunft erläutert. Es wird spannend ;-) Unsere T-Shirts fand er interessant!

<br/><br/>
<b>"Refactoring Rails Applications"</b><br/>
In einer sehr anschaulichen Weise zeigte <a href="http://blog.innerewut.de/" target="_blank">Jonathan Weiss</a> seine Arbeitsweise und Vorgehen beim Refactoring. Am Beispiel von Redmine zeigte er, wie man die Rails-Controller schlank halten kann, die Businesslogik in die Models verschiebt und mit für sich selbst sprechenden Methodennamen arbeitet. Das alles natürlich immer mit der Unterstützung von Unittests. 

<br/><br/>
<b>"Are you taking things too far?"</b><br/>
RESTful Design dürfte der aktuellste Hype innerhalb der Rails-Community sein. Doch drückt die URL "comments/edit/1" wirklich die eigentlich Struktur aus, wenn ein Comment doch zu einem Post eines Users gehört? Müssen wir nicht eher "users/2/posts/3/comments/edit/1" schreiben? Die Antwort lautet natürlich hier ziemlich eindeutig "Nein". In anderen Beispielen zu DRY und Testing zeigte Michael Koziarski vom Rails-Coreteam aber, dass es nicht immer einfach ist, den Punkt zum Aufhören zu finden.

<br/><br/>
<b>"jQuery with Rails"</b><br/>
Wer kennt es nicht - das Javascript Framework jQuery! <a href="http://yehudakatz.com/" target="_blank">Yehuda Katz</a>, einer der führenden Köpfe aus der Rails und jQuery Entwicklung, erläuterte in seinem Vortrag seine Herangehensweise bei der Integration von jQuery Funktionalität in das Railsframework. Welche Schritte und Überlegungen sind seiner Meinung nach notwendig, um gute Rails-Helper zu programieren.

<br/><br/>
So nun ist aber Schluss für Heute. Aber nur bei mit den Vorträgen! Es kommt ja noch die Abendveranstaltung. Auf geht's!

<br/><br/><br/>
<h4 class="blogentry">Tag 3 - 27. Mai 2009</h4>
Der letzte Tag der RailsWayCon ist angebrochen. Auch heute erwarten uns interessante Vorträge und Gespräche mit den neuen und schon geknüpften Kontakten.

<br/><br/>
<b>"Metaprogramming Ruby for Fun & Profit"</b><br/>
Unglaublich wie einfach einige Dinge in Ruby zu erledigen sind. <a href="http://nealford.com/my/bio.htm" target="_blank">Neal Ford</a> zeigte in seinem Vortrag einige Möglichkeiten von "Monkey-Patching", "Method-Hooking", "Eigenclass" und ... Cool!!! Es lohnt wirklich sich die Zeit zu nehmen um seine Vorträge auf http://github.com/nealford anzushen. Hier das <a href="http://github.com/nealford/presentations/raw/cb98471b7a6ccc18c6c590cd163434df38dd12e0/Meta-programming%20Ruby%20for%20Fun%20and%20Profit%20(Neal%20Ford).pdf">PDF-Präsentation</a> des RailsWayCon Vortrages.

<br/><br/>
<b>"Rails Performance"</b><br/>
Anders als erwartet erzählte Michael Koziarski nicht über Performance einzelner Rails-Komponenten, sondern erklärte uns, dass beim User oft nur Bruchteile von interner Optimierungsarbeit ankommen, da Dinge wie das Laden von Bildern, von Javascripts oder das Ausführungen vieler Folge Requests meist mehr Zeit in Anspruch nehmen als das eigentliche Rendern der HTML-Seite. Dennoch gab es noch ein paar wertvolle Hinweise rund um das Caching von Views, Models und Actions.

<br/><br/>
<b>"From Rails to Rack: Making Rails 3 a better Ruby Citizen"</b><br/>
Rails 3 nimmt Gestalt an. Yeduda Katz erläuterte die <a href="http://weblog.rubyonrails.org/2008/12/23/merb-gets-merged-into-rails-3" target="_blank">Merb-Rails-Vereinung</a> in Rails 3. Rails ist dann viel modularer aufgebaut, so dass einzelne Teile z.B. der Middleware sehr gut austauschbar sind. Sehr verbessert wird die Javscript-Integration. Es ist dann ohne weiteres möglich zwischen den einzelnen JS-Frameworks (z.B. jQuery, Prototyp, Mootools,...) zu wechseln.
<br/>Wann ist es soweit? Das liess er dann doch im Geheimen. ;-)

<br/><br/>
<b>"Boost your Website's Performance with Frontend Optimization"</b><br/>
In diesem kurzen Vortrag wurden uns die verschiedenen Möglichkeiten der Optimierung des Frontends von Ralph von der Heyden vorgestellt. Das Zusammenfassen von Javascripts und CSS-Dateien und das Spriting von Hintergrundbildern gehörte genauso zu den Themen wie der Webseiten-Check mit <a href="https://addons.mozilla.org/de/firefox/addon/5369" target="_blank">YSlow</a>. Es gab ein paar Überschneidungen mit dem Vortrag von Michael Koziarski, aber ein wenig Wiederholung tut uns natürlich auch gut.

<br/><br/>
<b>"Ruby/Rails in the Enterprise"</b><br/>
Es funktioniert! <a href="http://maik-schmidt.de/" target="_blank">Maik Schmidt</a> veranschaulichte uns sehr gut seine Erfahrungen beim Einsatz von Ruby und Rails bei Vodafone. Er berichtete, welche Sichtweise und Anforderungen Programmierer von Enterprise-Software an Ruby on Rails haben und mit welchen Problemen (namentlich am Beispiel der I18n Umsetzung) sie zu kämpfen hatten. Interessant war auch der Performancevergleich des internen Ruby XML PullParsers mit anderen, wie LibXML oder JRuby/Woodstox. Unglaublich wie langsam der interne XML Parser schon bei dem einfachen Beispiel im Vergleich zu den anderen ist. Ein sehr gelungener Vortrag und das nicht nur, weil Maik Schmidt meinte, er würde das nächste Projekt mit Sicherheit in JRuby on Rails beginnen.

<br/><br/>
<h4 class="blogentry">Fazit</h4>
Das war ein guter Start für die RailsWayCon. Die Vortragsthemen, gerade die der Jungs aus dem Core Team der JRuby und Rails Entwicklung waren spannend und lieferten für mich manchen neuen Denkanstoß. Das BCC mitten in Berlin als Veranstaltungsort ist gut gewählt, doch leider waren die Raumgrößen nicht immer passend ausgesucht. Des öfteren war es doch recht überfüllt. Die Stimmung war aber trotzdem gut, Kontakte wurden geknüpft und wir sind mit der JRuby Entwicklung auf dem richtigen Weg.


<br/><br/>
<div class="more_links">weiterführende Links und Quellen</div>
<a target="_blank" href="http://it-republik.de/konferenzen/planer/railswaycon_timetable.html">RailsWayCon Timetable</a>
<br/>
<a target="_blank" href="http://www.ruby-mine.de/2009/5/25/railswaycon-2009">Die Konferenz aus Sicht der Ruby-Mine Blogers</a>
<br/>
<a href="http://olabini.com/blog/2009/05/a-day-at-railswaycon/" target="_blank">Ola Bini's Erfahrungen auf der RailsWayCon - A day at RailsWayCon</a>
<br/>
<a href="http://b.lesseverything.com/2009/5/29/railswaycon-berlin-wrap-up" target="_blank">Steven Bristol Erfahrungen auf der RailsWayCon - Berlin Wrap UP</a>]]>
    </content>
</entry>

<entry>
    <title>JetBrains RubyMine veröffentlicht</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/04/jetbrains-rubymine.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1521</id>

    <published>2009-04-29T12:12:21Z</published>
    <updated>2009-05-07T06:58:46Z</updated>

    <summary>Aus der Java-Welt sind wir mit großen IDEs wie Eclipse oder IntelliJ IDEA verwöhnt - hat man doch eine große Anzahl an Funktionen, die dem Entwickler viele Standardaufgaben abnehmen und aktiv beim Programmieren unterstützen. Das geht dank der dynamischen Natur...</summary>
    <author>
        <name>Martin</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="entwicklung" label="Entwicklung" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ide" label="IDE" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jetbrains" label="JetBrains" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="Ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rubymine" label="RubyMine" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Aus der Java-Welt sind wir mit großen IDEs wie Eclipse oder IntelliJ IDEA verwöhnt - hat man doch eine große Anzahl an Funktionen, die dem Entwickler viele Standardaufgaben abnehmen und aktiv beim Programmieren unterstützen. Das geht dank der dynamischen Natur von Ruby dort nicht so einfach, es gibt aber Ansätze, zumindest Teile der erreichten  Bequemlichkeit von Java-IDEs auch für Ruby-Entwickler zur Verfügung zu stellen. So auch <a href="http://www.jetbrains.com/ruby/" target="_blank">JetBrains RubyMine 1.0</a>, das an IntelliJ anlehnt und seit gestern verfügbar ist.]]>
        <![CDATA[<h4 class="blogentry">Start</h4>
RubyMine gibt es für Windows ab Win2000, Mac OS X und Linux - die Installation erfolgte auf dem Testrechner (Vista Ultimate, 64bit) problemlos. Ein vorhandenes JRuby wurde erfolgreich erkannt und automatisch konfiguriert. 30 Tage darf RubyMine kostenlos getestet werden, benötigt aber eine Registrierung. Open-Source-Projekte können sich um eine dauerhaft kostenlose Lizenz bewerben.
<br/>
Nach dem Start findet man erwartungsgemäß eine runde, aufgeräumte Oberfläche vor. Das Auschecken eines Projektes (Git, CVS, Subversion und Perforce werden von Haus aus unterstützt) geschieht intuitiv - hier zeigte sich jedoch ein erster Schwachpunkt: Das Speichern der Zugangsdaten funktionierte für den SVN-Account nicht, was dazu führte, dass das Passwort 10 mal eingeben musste, bis das Repository geladen und das Projekt ausgecheckt war.
<br/>
<b>Update, 06.05.2009:</b>
Zum Glück gibt es hier einen Workaround: Windows-Nutzer müssen einfach die Datei <code>%RUBY_HOME%/bin/rubymine.exe.vmoptions</code> öffnen und die Zeile <code>-Dsvnkit.http.methods=Basic,Digest,NTLM</code> ergänzen, in MacOS X kann man dafür die Einstellung <code>/Applications/RubyMine 1.0.app/Contents/Info.plist</code> benutzen. Vielen Dank an den hilfreichen Support von JetBrains.
<br/>
<h4 class="blogentry">Übersicht</h4>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="rubymine_rails_navigator.jpg" src="http://www.jrubyonrails.de/2009/04/29/rubymine_rails_navigator.jpg" width="312" height="451" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /></span>
Die Fensteraufteilung entspricht der gängigen, sodass sich die meisten Entwickler sofort zurecht finden dürften: Projektnavigator links, großes Editor-Fenster in der Mitte, diverse Übersichten unten. Neben dem normalen Navigator bietet RubyMine einen Rails-Navigator an, in dem Elemente wie Actions, Helper, Views und Partials gruppiert dargestellt werden. Hilfreich sind auch Icons im Editor, um direkt zu den entsprechenden Views bzw. Actions zu springen, die man gerade bearbeitet.
<br/>
RubyMine bietet u.a. Tools zum Verwalten seiner Ruby/JRuby-Installationen inklusive gems, seiner Tests, die zur Verfügung stehenden Webserver sowie eine Übersicht über Rake-Targets mit Möglichkeit zur Ausführung an.
<br/>
Die Programmierung selbst wurde natürlich auch bedacht: Neben Standard-Features wie das automatische Beenden von If- und anderen Blöcken oder Strings oder die Komplettierung von Variablen- und Funktionsnamen gibt es innerhalb von Rails-Projekten ein weiteres Feature: Die Code-Vervollständigung schlägt bei <code>User.find_[Strg+Space]</code> z.B. auch <code>User.find_by_name</code> vor, welches ja dynamisch von Rails erzeugt wird. Mittels Warnungen sollen dem Entwickler mögliche Schwachstellen aufgezeigt werden. Im Testprojekt gab es hier allerdings mehr falsche Meldungen als echte Hinweise - eine Möglichkeit, einzelne Warnungen auszuschalten, war nicht zu finden.
<br/>
Ein sehr interessantes Feature ist der Modellgraph, der sich auf Knopfdruck erstellen lässt. Anschließend kann man die erzeugten Kästen und Pfeile für die Modellklassen verschieben, Attribute aus- und einblenden und ihn schließlich drucken.
<br/>
<h4 class="blogentry">Debugging</h4>
Der Ruby-Debugger erleichtert das Analysieren der Anwendung und verarbeitet auch Breakpoints innerhalb von RHTML-Dateien. Dafür ist das gem <code>ruby-debug-ide</code> verantwortlich. Leider gibt es auch hier seltames Verhalten - nicht immer wird so in Funktion hinein oder heraus gesprungen, wie man das als Anwender erwartet, und - vorrangig in RHTML-Dateien - es stürzt schon mal der Server ab. Da diese Probleme aber auch im Aptana RadRails auftraten, ist der Fehler hier eher beim gem oder beim Server zu suchen.
<br/>
Störend wirkt sich hier aber aus, dass der Webserver sowohl beim Absturz als auch beim manuellen Stopp nicht korrekt beendet wird und dadurch den Port blockiert. So muss hier jedes Mal der Taskmanager bemüht werden.
<br/>
<h4 class="blogentry">Fazit</h4>
JetBrains RubyMine bietet eine runde, intuitive IDE, welche einige Hilfen beim Entwickeln von Ruby- und insbesondere Rails-Anwendungen bietet. Die Version 1.0 hat noch ein paar kleine Macken, aber der Support von JetBrains ist Gold wert und so werden kommende Updates die Probleme sicher beseitigen.
<br/><br/><br/>
<b>Links</b><br/><br/>
<a href="http://www.jetbrains.com/ruby/" target="_blank">RubyMine</a><br/>
<a href="http://www.jetbrains.net/devnet/community/ruby?view=discussions" target="_blank">Developer-Forum</a><br/>]]>
    </content>
</entry>

<entry>
    <title>RailsWayCon 2009 in Berlin</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/04/railswaycon-2009-in-berlin.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1520</id>

    <published>2009-04-24T13:47:20Z</published>
    <updated>2009-05-05T07:08:22Z</updated>

    <summary>Viele von Euch haben sicherlich schon eine Ausgabe des RailsWay Magazins in den Händen gehabt und die interessanten Ruby, JRuby und Rails Artikel gelesen. Die Macher des Magazins stehen auch hinter der ersten RailsWay Konferenz. Die RailsWayCon 2009 findet vom...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Links" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="berlin" label="Berlin" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="railswaymagazin" label="RailsWay Magazin" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="railswaycon2009" label="RailsWayCon 2009" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="Ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Viele von Euch haben sicherlich schon eine Ausgabe des <a href="http://it-republik.de/railsway/" target="_blank">RailsWay Magazins</a> in den Händen gehabt und die interessanten <a href="http://www.ruby-lang.org/de/" target="_blank">Ruby</a>, <a href="http://jruby.codehaus.org/" target="_blank">JRuby</a> und <a href="http://rubyonrails.org/" target="_blank">Rails</a> Artikel gelesen.
<br/><br/>
Die Macher des Magazins stehen auch hinter der ersten RailsWay Konferenz. Die <b>RailsWayCon 2009</b> findet vom 25. - 27. Mai in Berlin statt. In der aktuellen Ausgabe des Magazins und auf <a href="http://www.railswayconference.com" target="_blank">www.railswayconference.com</a> kann man sich die beeindruckende Liste der internationalen Referenten und Vortragsthemen ansehen. Wir sind gespannt, welche Neuigkeiten und coole Erfahrungen uns dort begegnen.
<br/><br/>
<a href="http://www.railswayconference.com" target="_blank"><img src="http://it-republik.de/konferenzen/planer/images/railswaycon/railswaycon_header.png" alt="RailsWayCon 2009 in Berlin" width="660" /></a> ]]>
        
    </content>
</entry>

<entry>
    <title>Datenbankmigration im Browser</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/04/datenbankmigration-im-browser.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1519</id>

    <published>2009-04-21T17:55:29Z</published>
    <updated>2009-04-27T21:08:15Z</updated>

    <summary>Für die Verwaltung der Änderungen an der Datenbank gibt es in Rails das mächtige Konzept der Migrationsskripte. Da dies Ruby-Skripte sind, steht einem der volle Funktionsumfang von Ruby und Rails zur Verfügung. Allerdings benötigt man zum Durchführen einer Migration eine...</summary>
    <author>
        <name>Uwe</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tutorials" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="database" label="Database" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="db" label="DB" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="dbmigrate" label="db:migrate" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jrubyonrails" label="JRuby on Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="migration" label="Migration" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>Für die Verwaltung der Änderungen an der Datenbank gibt es in Rails das mächtige Konzept der <a href="http://api.rubyonrails.org/classes/ActiveRecord/Migration.html">Migrationsskripte</a>. Da dies Ruby-Skripte sind, steht einem der volle Funktionsumfang von Ruby und Rails zur Verfügung. Allerdings benötigt man zum Durchführen einer Migration eine Rails-Umgebung mit Zugriff auf die Datenbank, in der man die Migrationsskripte ausführen kann. Während der Entwicklung ist das keine Hürde, aber bereits in Test- und spätestens in Produktionsumgebungen könnte das zum Problem werden.</p>
<p>Besonders wenn man Rails mittels JRuby in eine Java-Umgebung eingeführt hat, wird in der Produktionsumgebung auf der Konsole kein Rails verfügbar sein. Viele Unternehmen reglementieren zudem den Zugriff auf die Datenbank, so dass Entwickler die Produktionsdatenbank nicht erreichen können oder die Zugangsdaten nicht kennen. Die Anwendung kann aber auf die Datenbank zugreifen - warum nicht die Migration über die Anwendung auslösen?</p>]]>
        <![CDATA[<p>Vorneweg: es gibt keine direkte API, die man verwenden könnte. Alle Beispiele basieren auf dem Code von Rails 2.2.2 und duplizieren die Funktionalität der Rake-Tasks.</p>

<h4 class="blogentry">Hello Migration</h4>
<p>Anfangen kann man mit dem Äquivalent zu <code>rake db:migrate</code>. Dazu reicht folgender Code:</p>
<pre class="brush: ruby; gutter: true">
ActiveRecord::Migrator.migrate("db/migrate/")
</pre>

<p>So einfach kann es sein.</p>

<p>Es passiert das Gleiche wie bei Rake: es werden alle noch ausstehenden Migrationen ausgeführt und die Ausgabe ist auf der Konsole zu sehen.</p>

<p>Schreibt man diesen Code in einen eigenen Controller kann man ihn bequem aus der Anwendung heraus ausführen:</p>
<pre class="brush: ruby; gutter: true">
class DatabaseController < ApplicationController
  def migrate
    ActiveRecord::Migrator.migrate("db/migrate/")
  end
end
</pre>

<p>Nachdem man einen entsprechenden View (<code>app/views/database/migrate.html.erb</code>) angelegt hat, sollte ein Aufruf der URL <code>http://localhost:3000/database/migrate</code> erfolgreich sein.</p>

<h4 class="blogentry">Ausgabe umleiten</h4>

<p>Wie erwähnt, die Ausgabe findet dabei auf der Konsole statt. Für eine Webanwendung ist das natürlich ungünstig. Es gibt allerdings keine API, über die man an die Ausgaben herankäme. Glücklicherweise schreibt <code>ActiveRecord::Migration</code> zwar mit <code>puts</code> direkt auf die Konsole, aber über eine eigene Klassenmethode namens <code>write</code>. Um die Ausgabe in die Webanwendung umzuleiten, kann man <code>write</code> überschreiben, um zum Beispiel die Ausgaben in einem Array zu sammeln und zusätzlich in das Log von Rails zu schreiben:</p>
<pre class="brush: ruby; gutter: true">
class ActiveRecord::Migration
  @@messages = []
  cattr_reader :messages
    
  # redefine method to collect and log messages
  def self.write(text="")
    messages << text
    Rails.logger.info(text)
  end
end
</pre>

<p>Im Controller muss man sich die Ausgaben jetzt noch abholen. Zur Sicherheit leert man das Array vor der Migration, in Produktion sieht man sonst unter Umständen alte Meldungen:</p>
<pre class="brush: ruby; gutter: true">
ActiveRecord::Migration.messages.clear
ActiveRecord::Migrator.migrate("db/migrate/")
@messages = ActiveRecord::Migration.messages
</pre>
<p>Nun kann migrate.html.erb angepasst werden, um die Meldungen anzuzeigen:</p>
<pre class="brush: ruby; gutter: true">
<% if @messages %>
  <% @messages.each do |message| %>
  <pre><%= h message %></pre>
  <% end %>
<% end %>
</pre>

<p>Auf diese Weise werden die wichtigsten Ausgaben eingesammelt. Der <code>ActiveRecord::Migrator</code> schreibt zusätzlich noch Zeilen der Art "Migrating to CreateUsers (2)" in das Log - egal, ob die Migration ausgeführt wird oder nicht. Er führt quasi Buch, welche Migrationen er berücksichtigt.</p>

<h4 class="blogentry">Fehler behandeln</h4>

<p>Wenn bei der Migration Fehler auftreten, möchte man diese natürlich auch entsprechend anzeigen - und zwar nicht nur die Exception (was in Produktion nur der Inhalt von <code>500.html</code> wäre).</p>
<p>Dazu fängt man die Exception, holt sich zuerst die Ausgaben der erfolgreichen Migrationen und fügt dann die Fehlermeldung an. Den Stacktrace der Exception sammelt man besser in einer getrennten Instanzvariablen, dann kann man ihn auch getrennt anzeigen (z.B. in kleinerer Schrift).</p>

<h4 class="blogentry">Ergebnis</h4>

<p>Der Controller könnte abschließend so aussehen:</p>
<pre class="brush: ruby; gutter: true">
class Admin::DatabaseController < ApplicationController

  skip_before_filter :authentication # may be required

  class ActiveRecord::Migration
    @@messages = []
    cattr_reader :messages
    
    # redefine method to collect and log messages
    def self.write(text="")
      messages << text
      Rails.logger.info(text)
    end
  end

  def db_migrate
    begin
      ActiveRecord::Migration.messages.clear
      ActiveRecord::Migrator.migrate("db/migrate/")
      @messages = ActiveRecord::Migration.messages
      flash.now[:notice] = "Database migration successful"
    rescue => e
      flash.now[:error] = "Database migration failed"
      @messages = ActiveRecord::Migration.messages
      @messages << e.message
      @backtrace = e.backtrace
      logger.error(e)
    end
  end
  
end
</pre>

<p>Im View kommt noch mal ein ähnlicher Block für den Stacktrace hinzu. Wegen besserer Übersicht mit geringerer Schriftgröße:</p>
<pre class="brush: ruby; gutter: true">
<% if @backtrace %>
  <% @backtrace.each do |message| %>
  <pre style="font-size: 8pt"><%= h message %></pre>
  <% end %>
<% end %>
</pre>

<h4 class="blogentry">Migration in Produktion</h4>

<p>Die Rails-Anwendung kann jetzt selber die Migration der Datenbank anstoßen. Für die Verwendung in einer Produktionsumgebung muss man noch sicherstellen, dass die Migrationsskripte auch mit ausgeliefert werden. In unserem Fall (<a href="http://caldersphere.rubyforge.org/warbler/">Warbler Plugin</a>) musste in <code>warble.rb</code> das Verzeichnis <code>db/migrate</code> zu <code>config.dirs</code> hinzugefügt werden.</p> 
<p>Die nächste Hürde könnten Benutzerprüfungen sein, die der <code>ApplicationController</code> durchführt. In unserem Fall gibt es den <code>before_filter :authenticate</code>, der mit <code>skip_before_filter</code> deaktiviert werden musste. Wer auf solche Prüfungen aus Sicherheitsgründen nicht verzichten möchte, sollte sich bewusst sein, dass er sich dann zumindest anmelden können muss - Änderungen an den Benutzern und allem, was die Authentifizierung betrifft, könnten den Zugriff auf die Migration vereiteln! Eine alternative Absicherung, die exklusiv für die Migration genutzt wird, ist da unter Umständen die bessere Lösung. Wir haben uns entschieden, das einfach zu halten und auf Prüfungen zu verzichten, da das <code>db:migrate</code> nur einmal etwas ausführt. So kann auch ein unberechtigter Benutzer nichts anrichten.</p>
<p>Die Idee, die Migration beim Deployment in der Produktivumgebung automatisch auszuführen, haben wir nicht umgesetzt. Ein wesentlicher Grund dafür war, dass man sich zwar den Aufruf einer URL spart, dann aber keinerlei Feedback hat. Stattdessen in ein Log sehen zu müssen wäre keine zufriedenstellende Alternative.
Wer sich dafür entscheidet, könnte das zum Beispiel über die Definition eines <a href="http://java.sun.com/products/servlet/2.3/javadoc/javax/servlet/ServletContextListener.html">ServletContextListeners</a> für die Java Servlet Engine realisieren.</p>


<h4 class="blogentry">Migration während der Entwicklung</h4>

<p>Falls man die Migration im Browser auch während der Entwicklung verwenden will, fehlt noch ein kleines Detail: Rake aktualisiert auch die Kopie des Schemas, welches in der Datei <code>schema.rb</code> abgelegt wird. Ohne diese Aktualisierung werden über kurz oder lang die Test fehlschlagen, da die Datenbank für die Testumgebung anhand der <code>schema.rb</code> aufgesetzt wird. Folgende Zeilen lösen das Problem:
<pre class="brush: ruby; gutter: true">
File.open("#{RAILS_ROOT}/db/schema.rb", "w") do |file|
  ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
end
flash.now[:notice] += "; schema dump successful"
</pre>
Wir haben die Zeilen nach der Migration eingefügt (über dem <code>rescue</code>-Block), aber man kann dafür natürlich auch eine eigene Methode spendieren und sollte dann natürlich die <code>flash</code>-Meldung anpassen.

<h4 class="blogentry">Ausblick</h4>

<p>Nachdem die Pflicht - die Migration auf den aktuellen Stand  - erfüllt ist, kann man darüber nachdenken, für die Kür eine Datenbankmigrationsschnittstelle in die Anwendung zu integrieren. Bevor man allerdings weitreichende Kontrolle über die Migrationen erlaubt, sollte man das Thema Authentifizierung und Autorisierung bedenken. Ein (vollständiges) Rollback oder partielle Migrationen wird man in der Anwendung kaum erlauben wollen, wenn man andererseits den prinzipiellen Zugriff auf die Datenbank beschränkt.</p>
<p>Zusätzlich zum Nachahmen von <code>rake db:migrate</code> könnte man auch alle anderen datenbankbezogenen Tasks nachahmen. Als Referenz sei dabei <code>databases.rake</code> empfohlen, welches die entsprechenden Tasks definiert.</p>
<p>Wir haben zum Beispiel dem <code>DatabaseController</code> auch eine <code>index</code>-Aktion spendiert, die es uns erlaubt alle vorhandenen Migrationskripte und ihren Zustand (migriert?) anzuzeigen. Zudem erscheint der Knopf zum Migrieren nur, wenn auch Migrationen ausstehen. Die Methoden, die wir dafür verwendet haben sind <code>migrations</code>, <code>migrated</code> und <code>pending_migrations</code> - alle Instanzmethoden von <code>ActiveRecord::Migrator</code> (dank eines <code>#:nodoc:</code> gibt es dafür leider keine API-Dokumentation).</p>

<div class="more_links">weiterführende Links und Quellen</div>
<a href="http://api.rubyonrails.org/classes/ActiveRecord/Migration.html" target="_blank">Rails Migration</a><br />
<a href="http://caldersphere.rubyforge.org/warbler/" target="_blank">Warbler Plugin</a><br />
<a href="http://java.sun.com/products/servlet/2.3/javadoc/javax/servlet/ServletContextListener.html" target="_blank">Java Servlet API: ServletContextListener</a><br />
<a href="http://archive.codehaus.org/lists/org.codehaus.jruby.user/msg/772d04b00902050257v547e6e0bu7e034642f3dc9289@mail.gmail.com" target="_blank">Thread in der jruby-user Mailingliste bzgl. Deployment mit JRuby on Rails</a>]]>
    </content>
</entry>

<entry>
    <title>JRuby Entwicklung jetzt mit Git</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/04/jruby-entwicklung-jetzt-mit-git.html" />
    <id>tag:www.jror.de,2009://20.1516</id>

    <published>2009-04-14T09:56:00Z</published>
    <updated>2009-04-14T10:18:07Z</updated>

    <summary>Seit gestern kann man JRuby auch bei dem in der &quot;Ruby on Rails&quot; Gemeinde weit verbreiteten und bekannten GitHub Repository herunterladen. Das wird, wie Nick Sieger in seinem Blog mitteilt (JRuby Moves to Git), durch die erfolgreiche Umstellung der JRuby...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="entwicklung" label="Entwicklung" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="git" label="Git" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="github" label="GitHub" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="migration" label="Migration" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Seit gestern kann man JRuby auch bei dem in der "Ruby on Rails" Gemeinde weit verbreiteten und bekannten <a href="http://github.com/jruby" target="_blank">GitHub Repository</a> herunterladen. Das wird, wie Nick Sieger in seinem Blog mitteilt (<a href="http://blog.headius.com/2009/04/jruby-moves-to-git.html" target="_blank">JRuby Moves to Git</a>), durch die erfolgreiche Umstellung der JRuby Entwicklung auf das freie verteilte Versionskontrollsystem <a href="http://de.wikipedia.org/wiki/Git" target="_blank">Git</a> ermöglicht. 

]]>
        
    </content>
</entry>

<entry>
    <title>Googles &apos;AppEngine&apos; - Start frei für JRuby</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/04/start-frei-fuer-jruby-on-rails-bei-googles-appengine.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1515</id>

    <published>2009-04-09T07:24:49Z</published>
    <updated>2009-05-15T08:58:13Z</updated>

    <summary>Googles Web-Hosting-Plattform &quot;AppEngine&quot; erweitert sein Sprachangebot und unterstützt jetzt Java-Anwendungen und alle Sprachen, die auf Javas virtueller Maschine laufen. Der Weg ist also frei für JRuby. Wie man seine JRuby on Rails-Anwendung auf Googles &quot;AppEngine&quot; zum Laufen bringt, zeigt Ola...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Links" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="appengine" label="AppEngine" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="google" label="Google" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="java" label="Java" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jrubyonrails" label="JRuby on Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jvm" label="JVM" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Googles Web-Hosting-Plattform <a href="http://code.google.com/intl/de/appengine/" target="_blank">"AppEngine"</a> erweitert sein Sprachangebot und unterstützt jetzt Java-Anwendungen und alle Sprachen, die auf Javas virtueller Maschine laufen. Der Weg ist also frei für <b>JRuby</b>.
<br/><br/>
Wie man seine JRuby on Rails-Anwendung auf Googles "AppEngine" zum
Laufen bringt, zeigt Ola Bini ausführlich in seinem Blogeintrag <a href="http://olabini.com/blog/2009/04/jruby-on-rails-on-google-app-engine/" target="_blank">"JRuby
on Rails on Google App Engine"</a>.
<br/>
<div class="more_links">weiterführende Links und Quellen</div>
<a href="http://www.jruby.de/articles/2009/04/08/google-app-engine-und-jruby-on-rails" target="_blank">Google App Engine und JRuby on Rails</a><br/>
<a href="http://googleappengine.blogspot.com/2009/04/seriously-this-time-new-language-on-app.html" target="_blank">Seriously this time, the new language on App Engine: Java™ </a><br/>
<a href="http://www.heise.de/developer/Google-integriert-Java-in-AppEngine--/news/meldung/135931" target="_blank">Google integriert Java in AppEngine</a>

]]>
        
    </content>
</entry>

<entry>
    <title>Performance ist relativ - JRuby gegen Ruby</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/04/performance-ist-relativ-jruby-gegen-ruby.html" />
    <id>tag:www.jror.de,2009://20.1514</id>

    <published>2009-04-06T10:09:31Z</published>
    <updated>2009-04-06T13:28:57Z</updated>

    <summary>Anhand verschiedener Ansätze zur Performanceoptimierung zeigt Charles Nutter in seinem Blog (How JRuby Makes Ruby Fast), dass Ruby und JRuby sehr wohl schnell sein können. Allerdings ist die Optimierung der Performance unter Beibehaltung der Kompatibilität deutlich schwieriger. Die mit dem...</summary>
    <author>
        <name>Uwe</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="duby" label="Duby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby12" label="JRuby 1.2" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="macruby" label="MacRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="performance" label="Performance" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="Ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Anhand verschiedener Ansätze zur Performanceoptimierung zeigt Charles Nutter in seinem Blog (<a href="http://blog.headius.com/2009/04/how-jruby-makes-ruby-fast.html" target="_blank">How JRuby Makes Ruby Fast</a>), dass Ruby und JRuby sehr wohl schnell sein können. Allerdings ist die Optimierung der Performance unter Beibehaltung der Kompatibilität deutlich schwieriger. <br />
Die mit dem relativ einfachen „tak"-Benchmark gemessenen Ergebnisse zeigen z.B. von Ruby 1.8.6 auf 1.9.1 eine Steigerung der Performance um den Faktor 5. Ein JRuby 1.3 ohne jegliche Optimierung kann allerdings 30-50% schlechter sein als Ruby 1.8.6. Nach zwei Optimierungsschritten ist es allerdings bereits besser als Ruby 1.9.1, mit leichten Einschnitten bei der Kompatibilität wird es fast dreimal so schnell.<br />
Wie erwähnt, die Zahlen gelten für „tak". Inwieweit sie in der Realität erreichbar sind, steht auf einem anderen Blatt. Mit Charles' aktueller Spielsprache <a href="http://blog.headius.com/2008/03/duby-type-inferred-ruby-like-jvm.html">Duby</a>, deren Code ähnlich wie Ruby aussieht, läuft „tak" übrigens zwei Zehnerpotenzen schneller...<br />
<br />
Anlass des Artikels war ein Post über <a href="http://antoniocangiano.com/2009/03/29/why-macruby-matters/">MacRuby</a> mit Angaben zur Performance von MacRuby 0.5. Die konstruktive Kritik wurde bereits berücksichtigt.

<div class="more_links">weiterführende Links und Quellen</div>
<a href="http://blog.headius.com/" target="_blank">Charles Nutters Blog</a><br />
<a href="http://antoniocangiano.com/" target="_blank">Antonio Cangianos Blog</a><br />
<a href="http://www.macruby.org/" target="_blank">MacRuby</a><br />]]>
        
    </content>
</entry>

<entry>
    <title>Rails-Datenbankkonfiguration auslagern</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/04/rails-db-konfiguration-auslagern.html" />
    <id>tag:www.jror.de,2009://20.1511</id>

    <published>2009-04-06T08:12:24Z</published>
    <updated>2009-04-06T08:12:10Z</updated>

    <summary>DB-Konfiguration im Team - JRuby mit JNDI Rails stellt einen einfachen Zugriff auf alle Konfigurationsdaten zur Verfügung. So stehen auch unsere Datenbank-Zugänge in der database.yml. Dies ist wunderbar, wenn man schnell ein Projekt aufsetzen will und anschließend allein mit seinem...</summary>
    <author>
        <name>Martin</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tutorials" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="database" label="Database" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="db" label="DB" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jndi" label="JNDI" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jrubyonrails" label="JRuby on Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<h4 class="blogentry">DB-Konfiguration im Team - JRuby mit JNDI</h4>
Rails stellt einen einfachen Zugriff auf alle Konfigurationsdaten zur Verfügung. So stehen auch unsere Datenbank-Zugänge in der <b>database.yml</b>. Dies ist wunderbar, wenn man schnell ein Projekt aufsetzen will und anschließend allein mit seinem eigenen Webserver entwickelt. Doch was ist, wenn ein etwas größeres Team an einer Anwendung entwickeln möchte, aber nicht jedes Mitglied ein Login-Passwort Paar der Art "test" - "test" auf seiner lokalen Test-Datenbank vergeben möchte?<br/>
Hier bietet Doug Alcorn eine elegante <a href="http://blog.lathi.net/articles/2006/03/02/config-database-yml-goodness-for-teams" target="_blank">Lösung</a>, in dem er Blöcke innerhalb der YAML-Datei verwendet: Er definiert einen Standard-Loginblock, den er dann in die jeweilige Datenbank-Konfiguration für Development, Test und Production einfließen lässt. Allerdings wird vorher noch der Inhalt einer zweiten Datei eingefügt, die jeder Entwickler in sein config-Verzeichnis legen kann. In dieser kann der Loginblock beliebig überschrieben werden.]]>
        <![CDATA[Das sieht dann in der <b>database.yml</b> so aus:
<pre class="brush: ruby; gutter: true;">
login: &amp;login
  username: defaultuser
  password: defaultpassword

<%= file = File.join(RAILS_ROOT, "config", "dblogin.yml")
    IO.read(file) if File.exist?(file) %>

development:
  adapter: mysql
  host: localhost
  database: projectdb
  <<: *login
</pre>
Die Entwicklerdatei (im Beispiel <b>dblogin.yml</b>) enthält die eigentlichen Logindaten:
<pre class="brush: ruby; gutter: true;">
login: &amp;login
  username: entwickler
  password: entwicklerpasswort
</pre>

Natürlich kann man das auf andere Einstellungen erweitern. Haben die verschiedenen Datenbanken unterschiedliche Logins, können mehrere Blöcke definiert und in der <b>dblogin.yml</b> überschrieben werden. Nutzt man dann noch die ignore-Option des Versionsverwaltungssystems seiner Wahl, hat jeder Entwickler seinen eigenen DB-Zugang, ohne ihn bei jeder Konfigurations-Änderung neu eingeben zu müssen.

<br/><br/><br/>
Verwendet man JRuby on Rails, kann die Anwendung mittels <a href="http://wiki.jruby.org/wiki/Warbler" target="_blank">Warbler</a> in eine WAR-Datei gepackt und dann einfach auf einen Webserver gelegt werden.  In unserem Beispiel ist dies ein <a href="http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html" target="_blank">Tomcat 6.0</a>.
Hier stehen wir nun schnell vor einem ähnlich gelagerten Problem: Unsere  <b>database.yml</b> liegt innerhalb der WAR-Datei und diese muss dadurch zur Build-Zeit wissen, welche Datenbank-Zugriffsdaten sie benötigt. In größeren Firmen kann das sogar schon bei Testservern problematisch sein, ganz zu schweigen von
den Produktivumgebungen, da hier nur die IT-Abteilung Zugriff hat und
die Anwendungsentwickler eher selten die Passwörter kennen. Dank JRuby heißt die Lösung hier <a href="http://de.wikipedia.org/wiki/JNDI" target="_blank">JNDI</a> ("Java Naming and Directory Interface"). Mit nur wenigen Konfigurationsänderungen machen wir unsere Anwendung und den Tomcat miteinander bekannt und überlassen die DB-Konfiguration den Server-Admins. Vier kleine Schritte müssen dafür getan werden.
<br/>
<h4 class="blogentry">1. database.yml</h4>
Der Eintrag für die Datenbank wird wesentlich kürzer. Anstatt server, login, passwort, port usw. eingeben zu müssen, benötigen wir für die jeweilige Umgebung nur noch 2 Zeilen:
<pre class="brush: ruby; gutter: true;">
production:
  adapter: jdbc
  jndi: java:comp/env/jdbc/jndiname
</pre>
Zusätzliche Einstellungen wie z.B. das Encoding können weiter genutzt werden.
<br/>
<h4 class="blogentry">2. Warbler</h4>
Die Konfiguration von Warbler muss angepasst werden (config/warble.rb). Dabei ist darauf zu achten, dass für den JNDI-Zugriff der gleiche Name wie in der database.yml verwendet wird ("jdbc/jndiname"). Außerdem benötigt man in der WAR-Datei noch das gem „activerecord-jdbc-adaper":
<pre class="brush: ruby; gutter: true;">
config.webxml.jndi = 'jdbc/jndiname'					
config.gems        << 'activerecord-jdbc-adapter'
</pre>
Datenbankspezifische gems wie „activerecord-jdbcmysql-adapter" oder „jdbc-mysql" brauchen wir eventuell noch lokal, können aber in der WAR getrost darauf verzichten, da die Anwendung gar nicht mehr weiß, auf welcher Datenbank sie arbeitet.
<br/>
<h4 class="blogentry">3. Tomcat</h4>
Anschließend müssen wir Tomcat noch beibringen, auf den JNDI-Namen zu hören. Dazu tragen wir in den entsprechenden Context (bei uns reichte der allgemeine Context in conf/context.xml) folgendes ein:
<pre class="brush: ruby; gutter: true;">
&lt;Resource name="jdbc/jndiname" 
            auth="Container"
            type="javax.sql.DataSource"
            username="..."
            password="..."
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost:3306/db_name" 
            maxActive="8"
            maxIdle="4" />
</pre>
Auch hier muss wieder der gleiche Ressourcenname wie oben eingetragen werden. Für andere Webserver sieht das natürlich ähnlich aus.
<br/>
<h4 class="blogentry">4. Datenbank-Treiber</h4>
Zu guter Letzt müssen wir noch sicherstellen, dass Tomcat den Treiber, den wir unter driverClassName angegeben hat, auch kennt. Dafür gibt's vom Datenbank-Hersteller Pakete, die im Tomcat-Verzeichnis unter /lib abgelegt werden können. Den MySQL-Treiber findet man z.B. unter diesem <a href="http://dev.mysql.com/downloads/connector/j/5.1.html" target="_blank">Link</a>.
<br/><br/>
Nun muss die WAR-Datei nicht mehr angepasst werden, falls der Datenbank-Server sich einmal ändert.
<br/><br/><br/>
<b>weitere Links</b><br/>
<a href="http://blog.lathi.net/articles/2006/03/02/config-database-yml-goodness-for-teams" target="_blank">Doug Alcorn - config/database.yml goodness for teams</a><br/>
<a href="http://de.wikipedia.org/wiki/JNDI" target="_blank">JNDI</a><br/>
<a href="http://wiki.jruby.org/wiki/Warbler" target="_blank">Warbler-Plugin</a><br/>
<a href="http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html" target="_blank">Tomcat 6.0</a><br/>
<a href="http://dev.mysql.com/downloads/connector/j/5.1.html" target="_blank">MySQL-JDBC-Treiber 5.1</a><br/>


]]>
    </content>
</entry>

<entry>
    <title>JRuby on Rails PDF Generierung</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/03/jruby-on-rails-pdf-druckdemo.html" />
    <id>tag:www.jrubyonrails.de,2009://20.1504</id>

    <published>2009-03-19T16:10:34Z</published>
    <updated>2009-05-25T12:46:04Z</updated>

    <summary><![CDATA[Viele Rails-Entwickler werden fr&uuml;her oder sp&auml;ter auch einmal PDF-Dateien aus einer Anwendung heraus erzeugen wollen. Daf&uuml;r gibt es viele denkbare Ans&auml;tze: angefangen von PDF::Writer über Prawn bis hin zu kommerziellen Produkten. (Ein Beispiel für PDF-Generierung mit Prawn findet man Ryan...]]></summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tutorials" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="flyingsaucer" label="Flying Saucer" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="itext" label="iText" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="java" label="Java" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jrubyonrails" label="JRuby on Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="pdf" label="PDF" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tutorial" label="Tutorial" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Viele Rails-Entwickler werden fr&uuml;her oder sp&auml;ter auch einmal PDF-Dateien aus einer Anwendung heraus erzeugen wollen. Daf&uuml;r gibt es viele denkbare Ans&auml;tze: angefangen von PDF::Writer über Prawn bis hin zu kommerziellen Produkten. (Ein Beispiel für PDF-Generierung mit Prawn findet man Ryan Bates <a href="http://railscasts.com/episodes/153-pdfs-with-prawn" target="_blank">Railscasts</a>). Was uns an den meisten dieser Ans&auml;tze st&ouml;rt, ist der Aufwand, der mit dem neuen Layout f&uuml;r die PDF-Datei verbunden ist. Warum kann nicht auch hier eines der Grundprinzipien von Rails gelten - DRY (<b>Don't Repeat Yourself</b>)! 
<br/>
Unser Ziel war, bestimmte Bereiche der Rails-Views als Partials zu erzeugen, um genau diese Partials auch im PDF verwenden zu k&ouml;nnen -> Don't Repeat Yourself
<br/><br/>
Dank JRuby ist die L&ouml;sung daf&uuml;r nicht schwer. In JRuby stehen uns ja neben den Ruby- und Rails-Bibliotheken auch die Vielfalt und Breite der Java Welt zur Verf&uuml;gung. In dem Artikel <a href="http://today.java.net/pub/a/today/2007/06/26/generating-pdfs-with-flying-saucer-and-itext.html" target="_blank">Generating PDFs for Fun and Profit with Flying Saucer and iText</a> wird an mehreren Beispielen sehr gut erl&auml;utert, wie man PDFs mittels Java erzeugt.
<br/><br/>
Durch die Java-Bibliothek <a href="http://www.lowagie.com/iText/" target="_blank">iText</a> und das <a href="https://xhtmlrenderer.dev.java.net/" target="_blank">"Flying Saucer"-Projekt</a> ist man in der Lage, XML und CSS zu rendern und als PDF auszugeben. iText ist eine Java Bibliothek zum "on the fly" Generieren von PDF-Dateien. Sie ben&ouml;tigt mindestens JDK 1.4 und ist frei erh&auml;ltlich. Das "Flying Saucer"-Projekt stellt einen XML/CSS Renderer zur Verf&uuml;gung, der einen XML-Input mittels CSS formatiert und daraus eine Darstellung als Bild-, PDF- oder Bildschirmausgabe erstellt.
<br/><br/>
Das Ganze muss nun also nur noch in eine Rails-Anwendung eingebettet werden. Auf geht's!
]]>
        <![CDATA[In dieser Demo soll eine einfache TODO-Liste erstellt werden, die man als PDF speichern kann. Es wird also eine Liste von Aufgaben ben&ouml;tigt, die als erledigt oder offen gekennzeichnet werden k&ouml;nnen. 
<br/><br/>
Die hier vorgestellte JRuby on Rails (JRoR) Anwendung ist vollst&auml;ndig als Quellcode vorhanden und sollte in einer bestehenden JRoR-Umgebung lauff&auml;hig sein. Zum besseren Verständnis erl&auml;uteren wir grob unsere Vorgehensweise.
<br/><br/>
<h4 class="blogentry">Vorraussetzungen:</h4>
Die Anwendung wurde bei uns unter folgenden Bedingungen ausgef&uuml;hrt:<br/>
<ul>
	<li>ein installiertes Java (mind. JDK 1.4)</li>
	<li>JRuby 1.1.6</li>
	<li>Rails 2.2 (Siehe dazu den Blogeintrag <a href="http://www.jror.de/2009/02/installation-von-jruby-on-rails.html">Installation von JRuby on Rails</a>)</li>
	<li>core-renderer.jar des "Flying Saucer" Projektes (ist im Beispiel "JRoR Projekt" enthalten)</li>
	<li>iText Bibliothek, itext-paulo-155.jar (ist im Beispiel "JRoR Projekt" enthalten)</li>
	<li>Mysql Datenbank</li>
	<li>JRuby Gems, folgende sind bei uns vorhanden:
        <ul>
         <li>actionmailer (2.2.2)</li>
         <li>actionpack (2.2.2)</li>
         <li>activerecord (2.2.2)</li>
         <li>activerecord-jdbc-adapter (0.9)</li>
         <li>activerecord-jdbcmysql-adapter (0.9)</li>
         <li>activeresource (2.2.2)</li>
         <li>activesupport (2.2.2)</li>
         <li>cgi_multipart_eof_fix (2.5.0)</li>
         <li>columnize (0.2)</li>
         <li>fastercsv (1.4.0)</li>
         <li>gem_plugin (0.2.3)</li>
         <li>htmlentities (4.0.0)</li>
         <li>jdbc-mysql (5.0.4)</li>
         <li>jruby-openssl (0.3)</li>
         <li>mongrel (1.1.5)</li>
         <li>rails (2.2.2)</li>
         <li>rake (0.8.3)</li>
         <li>ruby-debug (0.10.3)</li>
         <li>ruby-debug-base (0.10.3)</li>
         <li>ruby-debug-ide (0.4.2)</li>
         <li>sources (0.0.1)</li>
        </ul>
        </li>
</ul>
<br/><br/>
<h4 class="blogentry">Vorbereiten der Rails-Anwendung:</h4>
Mittels des Scaffold-Generators legen wir eine Klasse Task an, die als Attribute nur eine Beschreibung und einen Zustand hat.
<pre class="brush: plain; light: true;">
script/generate scaffold Task description:string finished:boolean
</pre>
Das Grundger&uuml;st des Demos steht. :-)
<br/><br/>
Damit unsere Task-Liste gleich ein paar Eintr&auml;ge hat, wurden in <b>001_create_tasks.rb</b> gleich einige eingetragen. (Die Nummerierung der Migrationsscripte folgt im Beispiel noch an dem Format vor Rails 2.2.) 
<pre class="brush: ruby; gutter: true;">
class CreateTasks &lt; ActiveRecord::Migration
  def self.up
    create_table :tasks do |t|
      t.string  :description, :limit => 250, :null => false, :default => ""
      t.boolean :finished, :null => false, :default => 0

      t.timestamps
    end
    
    data
    
  end

  def self.data
    Task.create :description=>'TODO JRuby installieren'
    Task.create :description=>'TODO Rails installieren'
    Task.create :description=>'TODO notwendige Gems holen'
    Task.create :description=>'TODO Tasks anlegen'
  end

  def self.down
    drop_table :tasks
  end
end
</pre>

In der Datei <code>database.yml</code> passen wir die Vorgaben für die 3 Datenbanken an. Als Adapter wird bei allen jdbcmysql eingetragen. Als Beispiel die Development-Datenbank:
<pre class="brush: ruby; gutter: true;">
development:
  adapter: jdbcmysql
  encoding: utf8
  database: jruby_create_pdf_demo_development
  username: root
  password:
  host: localhost
</pre>
Die Datenbanken werden mittels 
<pre class="brush: plain; light: true;">
rake db:create:all
rake db:migrate
</pre>
angelegt und initial befüllt.
<br/><br/>
Damit die Anwendung etwas freundlicher aussieht, haben wir das Layout und die Stylesheets angepasst und in der <b>application.rb</b> das Layout global festgelegt. Genauere Erläuterungen der Layout-Anpassungen würden hier den Rahmen sprengen. Wer mag, kann alle Anpassungen im Quellcode nachvollziehen.
<br/><br/>
Durch einige Anpassungen an den Dateien in <b>\apps\view\tasks</b> steht uns jetzt ein Partial zur Verfügung, das eine Tabelle mit den Aufgaben erzeugt <b>_list.html.erb</b>.
<pre class="brush: ruby; gutter: true; html-script: true;">
&lt;div class="task_list">
  &lt;table>
    &lt;caption>Aufgaben&lt;/caption>
    &lt;thead>
      &lt;tr>
        &lt;th>Beschreibung&lt;/th>
        &lt;th>Erledigt&lt;/th>
        &lt;th>&nbsp;&lt;/th>
        &lt;th>&nbsp;&lt;/th>
      &lt;/tr>
    &lt;/thead>
    &lt;tbody>
    &lt;% for task in @tasks %>
      &lt;tr class="&lt;%= cycle('row1','row2') %>">
        &lt;td>&lt;%=h task.description %>&lt;/td>
        &lt;td>&lt;%=h task.showState %>&lt;/td>
        &lt;td>&lt;%= link_to 'Editieren', edit_task_path(task) %>&lt;/td>
        &lt;td>&lt;%= link_to 'L&ouml;schen', task, :confirm => "Wollen Sie die Aufgabe wirklich l&ouml;schen?", :method => :delete %>&lt;/td>
      &lt;/tr>
    &lt;% end %>
    &lt;/tbody>
  &lt;/table>
&lt;/div>
</pre>
Die Anwendung ist nun so weit, dass wir uns dem eigentlichen Thema (der PDF-Erstellung) zuwenden können.

<h4 class="blogentry">Druck der Aufgabenliste als PDF</h4>
Der Link für die PDF-Ausgabe soll gleich unterhalb der Aufgabentabelle sein, daher wurde der entsprechende Link unterhalb des Partials in <b>views\tasks\index.html.erb</b> eingefügt.

<pre class="brush: ruby; gutter: true; html-script: true;">
&lt;p>&lt;%= link_to 'Neue Aufgabe', new_task_path %>&lt;/p>
&lt;%= render :partial=>"list"%>
&lt;% pdf_title = "PDF-Druck der angezeigten Aufgaben"
   pdf_link  = link_to(image_tag("pdf.gif", :size=> "28x16", :title=>pdf_title, 
                                 :alt=>pdf_title) + " Aufgaben als PDF drucken", 
                                 formatted_tasks_path(:pdf), :target => "_blank") 
%>
&lt;span class="tasks_actions">&lt;%= pdf_link %>&lt;/span>
</pre>

Es wird ein Link mit Bild und Text angezeigt, der eine Aktion mittels <b>formatted_tasks_path(:pdf)</b> aufruft. Daraufhin wird im <b>tasks_controller.rb</b> die  index Aktion angesprochen und zwar als PDF-Anfrage.

<pre class="brush: ruby; gutter: true;">
def index
  @tasks = Task.find(:all)

  respond_to do |format|
    format.html # index.html.erb
    format.pdf do
      index_pdf # Methode zum Erzeugen des PDFs
    end
  end
end
</pre>

Damit die Anfrage auch als PDF erkannt wird, muss man in <b>config\initializers\mime_types.rb</b> folgendes angeben.

<pre class="brush: plain; light: true;">
Mime::Type.register 'application/pdf', :pdf
</pre>

Das eigentliche Anstoßen der PDF-Erstellung wird nun in der privaten Methode <b>index_pdf</b> im <b>tasks_controller.rb</b> ausgeführt.

<pre class="brush: ruby; gutter: true;">
def index_pdf
  @tasks = Task.find(:all)
  tasktable = render :partial=>"tasks/list.html.erb", 
                     :locals => {:tasks => @tasks}
    
  #Beginn PDF Erstellung
  buf = Pdf.start_buffer
  Pdf.write_html_header(buf, false)
  buf.append("&lt;body>");
  buf.append("&lt;h2>PDF Druck Demo&lt;/h2>")     
  buf.append("&lt;p>Beispiel, wie man mittels JRuby in einer Rails Anwendung ein PDF erstellen kann. &lt;br/>http://www.jror.de &lt;/p>")     
  buf.append(tasktable)
  buf.append("&lt;/body>");
  buf.append("&lt;/html>");
    
  filename = Time.now.strftime("%Y_%m_%d")+"_jror_pdf_druck_demo.pdf"
  pdftempfile  = Pdf.create(buf, filename)
  # Ende PDF Erstellung
    
  show_pdf_with_delete_pdftempfile(pdftempfile, filename)
end
</pre>

Die Methode holt sich alle Aufgaben, rendert die Aufgabentabelle und beginnt mit dem Erzeugen des PDFs, indem Methoden aus dem Pdf-Modul aufgerufen werden. Anschließend wird ein Browserdialog zum Öffnen oder Speichern des PDFs gestartet und die temporär erzeugte Datei gelöscht.

<h4 class="blogentry">Wie funktioniert das nun genau?</h4>
An dieser Stelle kommen neben JRuby auch die beiden oben schon erwähnten Java-Bibliotheken (core-renderer.jar und itext-paulo-155.jar) zum Einsatz.
<br/><br/>
Die beiden Jar's liegen im Projekt unter lib\java.
Des Weitern gibt es unter lib eine Datei pdf.rb, welche die eigentliche Erzeugung des PDFs übernimmt. Das Pdf-Modul wird in der application.rb für die ganze Anwendung bekannt gemacht.

<pre class="brush: plain; light: true;">
 require_dependency 'pdf'
</pre>

Das Pdf-Modul ist die Schnittstelle zu Java. Es inkludiert die benötigen Java-Klassen.

<pre class="brush: ruby; gutter: true;">
require 'java'
require 'lib/java/core-renderer.jar'
require 'lib/java/itext-paulo-155.jar'

include_class 'java.io.FileOutputStream'
include_class 'java.io.ByteArrayInputStream'
include_class 'java.io.StringBufferInputStream'
include_class 'java.io.InputStreamReader'
include_class 'java.lang.StringBuffer'
include_class 'javax.xml.parsers.DocumentBuilder'
include_class 'javax.xml.parsers.DocumentBuilderFactory'
include_class 'org.w3c.dom.Document'
include_class 'org.xhtmlrenderer.pdf.ITextRenderer'
include_class 'org.xhtmlrenderer.pdf.ITextFontResolver'
include_class 'com.lowagie.text.pdf.BaseFont'
</pre>

Der Vorgang ist dann wie folgt: Es wird eine XHTML-Struktur aufgebaut, samt &lt;head&gt;- und  &lt;body&gt;-Tags. Diese Struktur wird in einem <b>java.io.StringBuffer</b> gespeichert und anschließend dem Pdf-Modul zum Parsen des HTML's und Erzeugen des PDFs übergeben. Um das Parsen kümmert sich die gleichnamige Methode.

<pre class="brush: ruby; gutter: true;">
# erstellt das PDF und legt es als Datei ab
# der Pfad zur Datei wird zurueckgegeben
def Pdf.parse(buf, file_name="demo")    
  builder = DocumentBuilderFactory.newInstance().newDocumentBuilder()
  sbis = StringBufferInputStream.new buf.toString()
  doc = builder.parse(sbis)

  i_text_renderer = ITextRenderer.new
  i_text_renderer.setDocument(doc, nil)

  file = File.join(RAILS_ROOT, TMP_FOLDER, file_name+".pdf")

  fos = FileOutputStream.new(file)
  i_text_renderer.layout()
  i_text_renderer.createPDF(fos);
  fos.close();  
   
  file
end
</pre>

Der Stringbuffer und optional ein Dateiname wird übergeben, das PDF erzeugt und der Pfad zu der erzeugten PDF-Datei zurückgeben.
<br/><br/>
Im Detail: 
Der XHTML-Renderer erstellt aus einem übergebenen String ein Dokument. Dieses Dokument wird wiederum an den <b>iText-Renderer</b> übergeben der daraus das PDF erstellt und im <b>FileOutputStream</b> ausgibt.
<br/><br/>
Das PDF liegt fertig auf der Platte. :-)
<br/><br/>
Nun muss es dem Anwender nur noch zum Öffnen oder Speichern angezeigt werden. Dazu wird die Rails-Methode <b>send_data</b> genutzt, die in der Methode 
<b>show_pdf_with_delete_pdftempfile(pdftempfile, file_name)</b> in <b>application.rb</b> aufgerufen wird.

<pre class="brush: ruby; gutter: true;">
# oeffnet den BrowserDialog zum Speichern oder Oeffnen des PDFs
# Das PDF wird anschliessend geloescht.
def show_pdf_with_delete_pdftempfile(pdftempfile, file_name)
  if (nil != pdftempfile)
    send_data(IO.read(pdftempfile), :filename => file_name, :type => "application/pdf")
    File.delete("#{pdftempfile}")
  end
end
</pre>

Und Voilà - wir haben ein PDF!
<br/><br/>
Einen Verbesserungswunsch müssen wir aber gleich noch anmerken:
<br/><br/>
Es wäre doch besser, wenn wir das PDF ohne Umweg der temporären Speicherung ausgeben könnten. Wir freuen uns über jeden Vorschlag, wie man iText dazu bringt, nicht erst ein PDF auf der Festplatte abzulegen, sondern gleich ohne Umweg die Binärdaten an send_data übergibt. 
<br/>
<div class="more_links">weiterführende Links und Quellen</div>
<a href="http://www.jror.de/download/jruby_create_pdf_demo.zip">komplette Rails-Anwendung zum Tutorial (zip ca. 2,5MB)</a><br/><br/>


<a href="http://today.java.net/pub/a/today/2007/06/26/generating-pdfs-with-flying-saucer-and-itext.html" target="_blank">Generating PDFs for Fun and Profit with Flying Saucer and iText</a><br/>
<a href="https://xhtmlrenderer.dev.java.net/guide/users-guide-r7.html#pdf" target="_blank">Flying Saucer User's Guide</a><br/>
<a href="http://www.lowagie.com/iText/" target="_blank">iText</a><br/><br/>

<b>weitere PDF-Erstellungstutorials</b><br/>
<a href="http://blogs.thewehners.net/josh/posts/406-using-itext-to-generate-pdfs-in-rails-jruby-vs-ruby-java-bridge" target="_blank">Using iText to generate PDFs in Rails</a><br/>
<a href="http://sublog.subimage.com/2007/05/29/html-css-to-pdf-using-ruby-on-rails" target="_blank">HTML / CSS to PDF using Ruby on Rails</a><br/>
<a href="http://codersifu.blogspot.com/2007/06/howto-generate-pdf-files-in-ruby-on.html" target="_blank">Howto Generate PDF files in Ruby on Rails using JRuby and iText</a><br/>
<a href="http://codersifu.blogspot.com/2007/06/tutorial-on-producing-pdf-file-using.html" target="_blank">Tutorial on producing PDF file using JRuby and IText</a><br/>
<a href="http://railstips.org/2008/10/14/how-to-generate-pdfs-in-rails-with-prawn" target="_blank">How To Generate PDFs in Rails With Prawn</a><br/>


]]>
    </content>
</entry>

<entry>
    <title>Rails API Doc elegant durchsuchen</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/03/rails-api-elegant-durchsuchen.html" />
    <id>tag:www.jror.de,2009://20.1508</id>

    <published>2009-03-18T12:04:01Z</published>
    <updated>2009-04-08T10:35:13Z</updated>

    <summary>Auf http://railsapi.com/ stellt Vladimir Kolesnikov&apos;s eine weitere sehr gut durchdachte Suchmöglichkeit der Rails API Dokumentation zur Verfügung. Mittels eines integrierten Eingabefeldes werden die Klassen und Modulen schon während der Eingabe gefiltert und erleichtern so die Suche nach der gewünschten Funktion....</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="Links" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="api" label="API" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="doc" label="Doc" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="link" label="Link" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="suche" label="Suche" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Auf <a href="http://railsapi.com/" target="_blank">http://railsapi.com/</a> stellt Vladimir Kolesnikov's eine weitere sehr gut durchdachte Suchmöglichkeit der Rails API Dokumentation zur Verfügung. Mittels eines integrierten Eingabefeldes werden die Klassen und Modulen schon während der Eingabe gefiltert und erleichtern so die Suche nach der gewünschten Funktion. 
<br/><br/>
Die Suche-Filterung ist sehr intelligent gehalten. So werden zuerst die Treffer angezeigt, die mit dem exakten Suchwort am Anfang beginnen. Anschließend folgen die Treffer, bei denen das exakte Suchwort irgendwo im Wort enthalten ist und zum Schluss findet das sogenannte "smart match" seine Anwendung. Hier werden Treffer angezeigt, bei denen die Zeichen des Suchwortes wenigsten in der richtigen Reihenfolge im Trefferwort vorhanden sind. Es können also andere Zeichen dazwischen liegen. 
<br/><br/>
Eine sehr gelungene Erleichterung beim Durchwühlen der API. Vor allem, weil man die Anwendung auch herunterladen und lokal benutzen kann.]]>
        
    </content>
</entry>

<entry>
    <title>JRuby 1.2.0 und Rails 2.3.2 erschienen</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/03/jruby-120-und-rails-232-erschienen.html" />
    <id>tag:www.jror.de,2009://20.1507</id>

    <published>2009-03-17T09:24:57Z</published>
    <updated>2009-03-22T15:57:48Z</updated>

    <summary>Die JRuby- und Rails-Welt ist zur Zeit in ständiger Bewegung. Aktuell ist die Rails-Version 2.3.2 mit vielen Neuerungen erschienen: Rack-Eingliederung ist abgeschlossen Rails-Engine wurde verbessert die Dokumentationen in den Rails-Guides wurden erweitert Ruby 1.9.1 wird unterstützt ActiveRecord, ActionControler, ActiveSupport und...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby12" label="JRuby 1.2" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jrubyonrails" label="JRuby on Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Die JRuby- und Rails-Welt ist zur Zeit in ständiger Bewegung. Aktuell ist die Rails-Version 2.3.2 mit vielen Neuerungen erschienen:<br/>
<ul>
	<li><a href="http://rack.rubyforge.org/" target="_blank">Rack</a>-Eingliederung ist abgeschlossen</li>
	<li>Rails-Engine wurde verbessert</li>
	<li>die Dokumentationen in den Rails-Guides wurden erweitert</li>
	<li><a href="http://www.ruby-lang.org/de/" target="_blank">Ruby 1.9.1</a> wird unterstützt</li>
	<li>ActiveRecord, ActionControler, ActiveSupport und ActionView wurden mit neuen coolen Features ausgestattet</li>
	<li>neu sind Rails Metal, Application Templates</li>
        <li>und vieles mehr</li>
</ul>
<br/>
Auch beim JRuby-Team ist man fleißig gewesen. Die Version 1.2.0 ist seit gestern vorhanden.
Es wurde wieder an der Performance-Schraube gedreht (Das Parsing soll bis zu 6 Mal schneller sein.), die Arbeit an der Ruby 1.9 Unterstützung ist abgeschlossen und viele viele Fehler wurden ausgebügelt.
<br/><br/>
Es wird immer besser!


<div class="more_links">weiterführende Links und Quellen</div>
<a href="http://docs.codehaus.org/display/JRUBY/2009/03/16/JRuby+1.2.0+Released" target="_blank">JRuby 1.2.0 Released</a><br/>
<a href="http://www.jruby.org/" target="_blank">JRuby</a><br/>
<a href="http://guides.rubyonrails.org/2_3_release_notes.html" target="_blank">Ruby on Rails 2.3 Release Notes</a><br/>
<a href="http://weblog.rubyonrails.org/2009/3/16/rails-2-3-templates-engines-rack-metal-much-more" target="_blank">Rails 2.3: Templates, Engines, Rack, Metal, much more!</a><br/>
<a href="http://weblog.rubyonrails.org/2008/12/17/introducing-rails-metal" target="_blank">Introducing Rails Metal</a><br/>
<a href="http://www.railsinside.com/news/256-rails-232-released.html" target="_blank">Rails Inside</a><br/>
]]>
        
    </content>
</entry>

<entry>
    <title>Michael Johann: Ruby on Rails für JEE-Experten</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/03/michael-johann-ruby-on-rails-fur-jee-experten.html" />
    <id>tag:www.jror.de,2009://20.1506</id>

    <published>2009-03-16T13:27:36Z</published>
    <updated>2009-03-23T21:54:00Z</updated>

    <summary>Warum werden immer mehr JEE-Programierer zu Rails-Anhängern? Die ersten großen Rails-Erfolge strahlen für alle gut sichtbar und der ganzheitlich agile Ansatz von Rails lockt noch zusätzlich. Da liegt es auf der Hand, für diese Zielgruppe massgeschneiderte Literatur anzubieten. Der Autor...</summary>
    <author>
        <name>Steffen</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="Bücher" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="buch" label="Buch" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="integration" label="Integration" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="java" label="Java" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="michaeljohann" label="Michael Johann" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="referenz" label="Referenz" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="review" label="Review" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rubyonrails" label="Ruby on Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>Warum werden immer mehr JEE-Programierer zu Rails-Anhängern? Die ersten großen Rails-Erfolge strahlen für alle gut sichtbar und der ganzheitlich agile Ansatz von Rails lockt noch zusätzlich. Da liegt es auf der Hand, für diese Zielgruppe massgeschneiderte Literatur anzubieten. </p>

<p>Der Autor <a href="http://www.xing.com/profile/Michael_Johann" target="_blank">Michael Johann</a> (nun wahrlich kein Unbekannter in der Java-Welt) hat seine eigenen Umstiegserfahrungen sehr umsichtig und zielgruppengerecht aufbereitet. Dabei setzt er bei den Lesern einige Grundkenntnisse zu Java und <a href="http://de.wikipedia.org/wiki/Entwurfsmuster" target="_blank">Entwurfsmustern</a> voraus. Das ist aber absolut in Ordnung, denn ganz ohne Erfahrung entscheidet sich wohl kein Programmierer für Rails.</p>]]>
        <![CDATA[<p>Wer schon Erfahrungen in größeren Java-Projekten hat, will sich nicht mit HelloWorld-Beispielen aufhalten. Offenbar gibt es aber eine Regel, alle Rails-Tutorials und -Bücher müssen ein Weblog-/Newsfeed-System als Beispiel verwenden. Zumindest kommt dieses Buch recht schnell auch zu einem anspruchsvolleren Beispiel, das dann immerhin etwa die Hälfte des Buches ausmacht.</p>

<p>Als Java-Entwickler ist man von den IDEs verwöhnt und möchte bei einem Umstieg möglichst keinerlei Komfort verlieren. Michael Johann schafft einen fundierten Rundumblick durch die Ruby-IDE-Landschaft, gibt Hinweise zur Installation auf verschiedenen Betriebssystemen und vermeidet dabei jedes Anzeichen von Glaubenskrieg. Wer unter Windows entwickeln mag, fühlt sich ebenso gut aufgehoben, wie Linux-Anhänger oder Mac-OS-Jünger.</p>

<p>Agile Entwicklung mit Rails hat ihren Preis: von uns Rails-Programmierern wird allerhand verlangt, was ja durchaus etwas Gutes ist. Und so hat natürlich auch dieses Buch eigene Kapitel zur Testgetriebenen Entwicklung und zur Versionsverwaltung (im Buch leider als Versionskontrolle bezeichnet). Überraschend war für mich (der an der Übersetzung der <a href="http://www.pragmatischprogrammieren.de/" target="_blank">Pragmatischen Bücher</a> zu <a href="http://www.pragmatischprogrammieren.de/cvs" target="_blank">CVS</a>, <a href="http://www.pragmatischprogrammieren.de/junit/" target="_blank">JUnit</a> und <a href="http://www.pragmatischprogrammieren.de/ppa/" target="_blank">Projektautomatisierung</a> beteiligt war), dass das Thema Automatisierung kein eigenes Kapitel erhalten hat. Dabei ist doch gerade in Rails so viel automatisiert, dass mancher Einsteiger eine Referenz "Was generiere ich wie" wünschen würde. Natürlich steht trotzdem genug zur Automatisierung im Buch, man muss es sich eben z.B. aus dem Einführungsbeispiel herauslesen.</p>

<p>Besonders angenehm fällt auf, dass auch die Integration von Java-Teilen eine Rolle spielt. Insbesondere für langjährige Java-Entwickler ist es wichtig, auch zukünftig auf bekannte (und bekanntermaßen solide) Lösungen zurückgreifen zu können. So bekommt <a href="http://www.jruby.org/" target="_blank">JRuby</a> immerhin ein eigenes Kapitel, aber es wird auch an anderen Stellen immer wieder darauf hingewiesen.</p>

<p>Fazit: Dieses Buch ist für Techniker. Es läßt sich gut lesen, denn der Ton ist angenehm sachlich und ohne Schnörkel. Das macht es zu einer klaren Kaufempfehlung für alle, die den Schritt von Java zu Rails gehen wollen. Aber auch wenn man exclusiv bei Java bleiben will, kann sich hier gut darüber informieren, was einem entgeht. </p>

<div class="more_links">weiterführende Links und Quellen</div>
<a href="http://www.briefcasten.com/content/railsbuch" target="_blank">Webseite zum Buch</a>]]>
    </content>
</entry>

<entry>
    <title>JRails: Rails mit JQuery</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/03/rails-mit-jquery.html" />
    <id>tag:www.jror.de,2009://20.1503</id>

    <published>2009-03-03T11:32:34Z</published>
    <updated>2009-03-23T10:14:43Z</updated>

    <summary><![CDATA[Standardm&auml;&szlig;ig wird Rails mit der Prototype Javascript-Bibliothek und der Effekt-Bibliothek Scriptaculous ausgeliefert. Das Zusammenspiel der Ajax-Rails-Methoden (z.B. link_to_remote, observe_field ...) funktioniert auch hervorragend. Doch immer &ouml;fter f&auml;llt mir die Javascript-Bibliothek JQuery auf. Sei es auf anderen Seiten oder in Tutorials,...]]></summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="Links" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tutorials" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="javascript" label="Javascript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jquery" label="JQuery" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jrails" label="JRails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tutorial" label="Tutorial" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Standardm&auml;&szlig;ig wird Rails mit der <a href="http://www.prototypejs.org/" target="_blank">Prototype</a> Javascript-Bibliothek und der Effekt-Bibliothek  <a href="http://script.aculo.us/" target="_blank">Scriptaculous</a> ausgeliefert. Das Zusammenspiel der Ajax-Rails-Methoden (z.B. link_to_remote, observe_field ...) funktioniert auch hervorragend. Doch immer &ouml;fter f&auml;llt mir die <a href="http://jquery.com/" target="_blank">Javascript-Bibliothek JQuery</a> auf. Sei es auf anderen Seiten oder in Tutorials, es kommt mir so vor, als ob JQuery so langsam die Vorreiterrolle &uuml;bernimmt. Wie kann man nun JQuery in Rails benutzen, ohne auf die hilfreichen Rails Methoden verzichten zu m&uuml;ssen.




]]>
        <![CDATA[Mittels des Rails-Plugins <a href="http://ennerchi.com/projects/jrails" target="_blank">JRails</a> ist der Umstieg auf JQuery spielend leicht zu erledigen. JRails ersetzt Prototype/Scriptaculous mit JQuery und erm&ouml;glicht es weiterhin die bekannten und in Rails enthaltenen Ajax-Methoden zu verwenden. (Eine Auflistung aller Methoden findet sich unter <a href="http://ennerchi.com/projects/jrails" target="_blank">http://ennerchi.com/projects/jrails</a>)
<br/><br/>
Die Installation ist kinderleicht. Einfach nur das Rails-Plugin installieren und die Javascript-Bibliotheken im Header der Anwendungsseite bekanntmachen.

<pre class="brush: plain; light: true;">
./script/plugin install http://ennerchi.googlecode.com/svn/trunk/plugins/jrails
</pre>

<pre class="brush: ruby; light: true;">
<script src="/javascripts/jquery.js" type="text/javascript"></script>
<script src="/javascripts/jquery-ui.js" type="text/javascript"></script>
<script src="/javascripts/jrails.js" type="text/javascript"></script>
oder
&lt;%= javascript_include_tag :defaults %&gt;
</pre>

Und schon fertig - JQuery steht bereit!

<div class="more_links">weiterführende Links und Quellen</div>
<a href="http://ennerchi.com/projects/jrails" target="_blank">JRails</a><br/>
<a href="http://jquery.com/" target="_blank">Javascript Bibliothek JQuery</a><br/>
<a href="http://www.smashingmagazine.com/2009/01/15/45-new-jquery-techniques-for-a-good-user-experience/" target="_blank">JQuery Beispiele: 45+ New jQuery Techniques For Good User Experience</a><br/>
<a href="http://www.smashingmagazine.com/2008/09/16/jquery-examples-and-best-practices/" target="_blank">Wie nutzt man Javasript richtig: jQuery and JavaScript Coding: Examples and Best Practices</a><br/>
<a href="http://www.prototypejs.org/" target="_blank">Prototype</a><br/>
<a href="http://script.aculo.us/" target="_blank">Scriptaculous</a>]]>
    </content>
</entry>

<entry>
    <title>JRuby Version 1.2.0RC1 erschienen</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/02/jruby-version-12-rc-1-erschienen.html" />
    <id>tag:www.jror.de,2009://20.1502</id>

    <published>2009-02-26T16:50:19Z</published>
    <updated>2009-02-26T17:27:26Z</updated>

    <summary><![CDATA[Am 24. Februar hat das JRuby Team die Version 1.2.0RC1 ver&ouml;ffentlicht. Die Entwickler bitten um Mithilfe beim Finden von m&ouml;glichen Fehlern. Die neue Version verbessert vor allem die Ruby 1.9 Unterst&uuml;tzung, soll die Perfomance generell verbessern und bringt eine riesige...]]></summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby12" label="JRuby 1.2" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Am 24. Februar hat das JRuby Team die Version 1.2.0RC1 ver&ouml;ffentlicht. Die Entwickler bitten um Mithilfe beim Finden von m&ouml;glichen Fehlern. Die neue Version verbessert vor allem die Ruby 1.9 Unterst&uuml;tzung, soll die Perfomance generell verbessern und bringt eine riesige Menge an Bugfixes mit. (&Uuml;ber 230 Bugs, die seit Version 1.1.6 gemeldet wurden, sind erledigt.)
<br/>
<div class="more_links">weiterführende Links und Quellen</div>
<a href="http://www.jruby.org/" target="_blank">JRuby Homepage</a><br/>
<a href="http://dist.codehaus.org/jruby/"  target="_blank">JRuby Download</a>]]>
        
    </content>
</entry>

<entry>
    <title>JRuby - Titelthema in der RailsWay 2.09</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/02/jruby-titelthema-in-der-railsway-209.html" />
    <id>tag:www.jror.de,2009://20.1501</id>

    <published>2009-02-25T20:35:51Z</published>
    <updated>2009-03-23T11:00:00Z</updated>

    <summary>Die zweite Ausgabe des RailsWay Magazin ist erschienen und was uns besonders freut auf der Titelseite prangt in großen Lettern &quot;JRuby - Am Puls der Zeit&quot;. Wir sind also nicht alleine mit unseren Erfahrungen und Empfindungen. Auch Michael Johann ermutigt...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="railsway" label="RailsWay" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rubyonrails" label="Ruby on Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Die zweite Ausgabe des <a href="http://www.railsway-magazin.de" target="_blank">RailsWay Magazin</a> ist erschienen und was uns besonders freut auf der Titelseite prangt in großen Lettern <b>"JRuby - Am Puls der Zeit"</b>. Wir sind also nicht alleine mit unseren Erfahrungen und Empfindungen. Auch <a href="http://www.rails-experts.com/" target="_blank">Michael Johann</a> ermutigt in seiner Einführung in JRuby zum Einstieg in die Welt von JRuby on Rails.
<br/><br/>
Einige Artikel in der zweiten Ausgabe:
<ul>
	<li>JRuby: Aller Anfang ist leicht - Grundlegendes und erste Schritte zu JRuby</li>
	<li>Schreib das auf! - Features von ActiveRecord</li>
	<li>Interview mit Charles Oliver Nutter - JRuby Entwickler bei Sun</li>
	<li>Die "Rubinmine" für den täglichen Bedarf - Eine IDE für Ruby/JRuby und Rails</li>
	<li>Verteilte Versionskontrolle mit Mercurial</li>
	<li>Deployment - Einrichtung eines Servers für eine Rails-Anwendung</li>
	<li>DSL -Domain Specific Languages</li>
	<li>Rack und Rails -Was die Zukunft bringt ein Blick auf die Rails 2.3 Entwicklung</li>
	<li>Automatisierte Akzeptanztests mit Cucumber</li>
	<li>Advanced JavaScript </li>
	<li>Integration eines JCR in Rails</li>
</ul>
]]>
        
    </content>
</entry>

<entry>
    <title>JRuby auf Android?</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/02/jruby-auf-android.html" />
    <id>tag:www.jror.de,2009://20.1500</id>

    <published>2009-02-24T15:46:16Z</published>
    <updated>2009-03-23T10:38:29Z</updated>

    <summary>JRuby auf der Android Plattform könnte bald Wirklichkeit werden. Vielleicht schon mit der Version 1.2? Charles Nutter zeigt jedenfalls ein kleines Codebeispiel auf seinem Blog. Domo Arigato, Mr. Ruboto # cat test.rb require java import java.lang.System class Ruboto def greet(who)...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="android" label="Android" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby12" label="JRuby 1.2" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[JRuby auf der Android Plattform könnte bald Wirklichkeit werden. Vielleicht schon mit der Version 1.2? Charles Nutter zeigt jedenfalls ein kleines Codebeispiel auf seinem Blog. <a href="http://blog.headius.com/2009/02/domo-arigato-mr-ruboto.html" target="_blank">Domo Arigato, Mr. Ruboto</a>

<pre class="brush: ruby; gutter: true;">
# cat test.rb
require java
import java.lang.System

class Ruboto
  def greet(who)
    puts "Hello, #{who}!"
  end
end

name = System.get_property('java.runtime.name')
Ruboto.new.greet(name)
</pre>

<pre class="brush: plain; light: true;">  # dalvikvm -classpath ruboto.jar org.jruby.Main -X-C test.rb
  Hello, Android Runtime!
</pre>

<div class="more_links">weiterführende Links und Quellen</div>
<a href="http://de.wikipedia.org/wiki/Android_%28Plattform%29" target="_blank">Android (Plattform)</a><br />
<a href="http://blog.headius.com/" target="_blank">Charles Nutter's Blog</a>]]>
        
    </content>
</entry>

<entry>
    <title>Rails 2.2 Neuerungen erklärt</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/02/rails-22-neuerungen-erklart.html" />
    <id>tag:www.jror.de,2009://20.1496</id>

    <published>2009-02-20T17:14:05Z</published>
    <updated>2009-02-20T17:31:00Z</updated>

    <summary>Rails 2.3 steht kurz vor dem Start doch viele Projekte beginnen erst jetzt auf die aktuelle Version 2.2 umzusteigen. Wie der Update von Rails 2.0.2 auf 2.1 und dann weiter auf 2.2 funktioniert, beschreiben Hussein Morsy und Tanja Otto auf...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="Bücher" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Links" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="activerecord" label="ActiveRecord" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="activesupport" label="ActiveSupport" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rubyonrails" label="Ruby on Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Rails 2.3 steht kurz vor dem Start doch viele Projekte beginnen erst jetzt auf die aktuelle Version 2.2 umzusteigen. Wie der Update von Rails 2.0.2 auf 2.1 und dann weiter auf 2.2 funktioniert, beschreiben Hussein Morsy und Tanja Otto auf der Webseite zum Buch <a href="http://www.railsbuch.de/" target="_blank">Ruby on Rails 2 - Das Entwickler-Handbuch</a>.<br/>
Sie haben auch mit Ihrer Artikeln <b>"Neues in Rails 2.2"</b> eine Reihe begonnen, die die Neuerung von Rails 2.2 gut beleuchtet. Aktuell sind  <a href="http://www.railsbuch.de/2009/1/18/rails-2-2-neues-in-activesupport" target="_blank">ActiveSupport</a> und <a href="http://www.railsbuch.de/2009/2/15/neues-in-rails-2-2-teil-2-activerecord" target="_blank">ActiveRecord</a> schon genauer unter die Lupe genommen worden.]]>
        
    </content>
</entry>

<entry>
    <title>Installation von JRuby on Rails</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/02/installation-von-jruby-on-rails.html" />
    <id>tag:www.jror.de,2009://20.1495</id>

    <published>2009-02-16T17:02:45Z</published>
    <updated>2009-03-23T22:03:06Z</updated>

    <summary><![CDATA[Das Tutorial gibt in wenigen Schritten eine kurze Einf&uuml;hrung zur Installation von JRuby on Rails unter Windows. Voraussetzung ist ein installiertes JDK 1.4 oder höher und dass selbiges im System-Pfad vorhanden ist. Ob die Voraussetzung erfüllt ist, kann man auf...]]></summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Links" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tutorials" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="installieren" label="Installieren" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="java" label="Java" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jrubyonrails" label="JRuby on Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="Ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rubyonrails" label="Ruby on Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tutorial" label="Tutorial" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Das Tutorial gibt in wenigen Schritten eine kurze Einf&uuml;hrung zur Installation von <b>JRuby on Rails</b> unter Windows. Voraussetzung ist ein installiertes JDK 1.4 oder höher und dass selbiges im System-Pfad vorhanden ist. Ob die Voraussetzung erfüllt ist, kann man auf der Kommandozeile mittels "java -version" testen. Wenn eine Java Version angezeigt wird, kann die Installation von JRuby on Rails beginnen.
<br/><br/>
Folgende Schritte sind n&ouml;tig:<br/>
A. Installation von JRuby<br/>
B. Installation von Rails mittels Gem]]>
        <![CDATA[<u><b>A. Installation von JRuby</b></u>
<ol>
	<li>JRuby herunterladen von <a href="http://jruby.codehaus.org">http://jruby.codehaus.org</a><br/>(aktuell JRuby 1.1.6: <a href="http://dist.codehaus.org/jruby/1.1.6">download</a>)</li>
        <li>Die Zip-Datei in den gew&uuml;nschten Ordner entpacken.</li>
        <li>Den Pfad zu JRuby als Systemvariable bekanntmachen.<br/>(in den Systemeigenschaften -> Erweitert z.B. JRUBY_HOME="C:\Programme\jruby-1.1.6" eintragen.)</li>
        <li>Die %JRUBY_HOME%\bin an die Pfad-Variablen anfügen.<br/>(Zum Test, kann in einer neuen Eingabeaufforderung "PATH" eingeben werden.)</li>
        <li>Nun sollte Folgendes ausgef&uuml;hrt werden k&ouml;nnen:<br/>
<pre class="brush: plain; light: true;">jruby -v </pre></li>
</ol>

JRuby ist erfolgreich installiert!<br/>
Um ein erstes Zusammenspiel von Ruby mit Java zu sehen, offnet man mittels jirb den interaktiven Ruby-Interpreter und gibt folgendes Kommando ein "java.lang.System::out.println("Ein erster Test")"
<pre class="brush: plain; light: true;">
jirb
irb(main):001:0> java.lang.System::out.println("Ein erster Test")
Ein erster Test
=> nil
</pre>
<br/><br/>
<u><b>B. Installation von Rails mittels Gem</b></u><br/>
In JRuby kann man genauso wie in Ruby <a href="http://de.wikipedia.org/wiki/Gems">Gems</a> installieren. Viele der Gems funktionieren einwandfrei mit JRuby.
Allerdings benutzen einige Gems C Bibliotheken für ihren Installationsprozess. Diese Gems k&ouml;nnen nicht mit JRuby arbeiten, solange es keine Java Alternative gibt.
Mittels
<pre class="brush: plain; light: true;">
jruby -S gem list --local
</pre> 
werden die lokal vorhandenen Gems angezeigt. (Der Parameter -S bewirkt, das das Script im Bin Verzeichnis oder im PATH nach den Gems sucht.)<br/>
<br/>
<b>Ein Hinweis für Installationen unter Vista:</b> Die "Benutzerkontensteuerung" verhindert gern einmal eine Installation. Deshalb sollte sie zumindest vorübergehend ausgeschaltet werden.<br/>
&nbsp;&nbsp;Systemsteuerung > Benutzerkonten > Benutzerkontensteuerung ein- oder ausschalten<br/>
bzw. <br/>
&nbsp;&nbsp;Control Panel > User Accounts > Turn User Account Control On/Off<br/>

<ol>
	<li>Da es sich bei dem Rails Framework um ein RubyGem handelt kann man es sehr einfach installieren.<br/><pre class="brush: plain; light: true;">jruby -S gem install rails --include-dependencies</pre></li>
	<li>Nachdem Rails installiert ist, kann mittels <pre class="brush: plain; light: true;">jruby -S rails ersterTest</pre> eine erste Test-Anwendung erzeugt werden.</li>
	<li>In das neue Verzeichnis wechseln.<br/><pre class="brush: plain; light: true;">cd ersterTest</pre></li>
	<li>Der integrierte Ruby WEBrick Server [http://www.webrick.org/] kann mit<br/>
        <pre class="brush: plain; light: true;">
jruby script/server
=> Booting WEBrick...
=> Rails 2.2.2 application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2009-02-16 17:30:55] INFO  WEBrick 1.3.1
[2009-02-16 17:30:55] INFO  ruby 1.8.6 (2008-12-17) [java]
[2009-02-16 17:30:55] INFO  WEBrick::HTTPServer#start: pid=5716 port=3000</pre><br/>gestartet werden
        </li>
	<li>Im Browser <a href="http://localhost:3000/">http://localhost:3000/</a> öffnen.<br/>Vola!</li>
</ol>

<div class="more_links">weiterführende Links und Quellen</div>
<a href="http://jruby.codehaus.org/">JRuby Home</a><br/>
<a href="http://java.sun.com/developer/technicalArticles/scripting/jruby/?feed=JSC">JRuby and the Java Platform - Sun Article</a><br/>
<a href="http://www.zdnet.de/anwendungsentwicklung_jruby_mit_java_und_ruby_die_entwicklungsarbeit_optimieren_story-20000201-39159723-1.htm">JRuby: Mit Java und Ruby die Entwicklungsarbeit optimieren</a><br/>
<a href="http://blog.emptyway.com/2008/04/08/120-seconds-guide-to-jruby-on-rails/">120 seconds guide to JRuby on Rails</a><br/>
<a href="http://wiki.jruby.org/wiki/Getting_Started#Installing_JRuby">QuickStart with JRuby</a><br/>
<a href="http://www.linux-magazin.de/heft_abo/ausgaben/2008/02/mischmasch">weitere ausf&uuml;hrliche Einf&uuml;hrung in JRuby on Rails</a>



]]>
    </content>
</entry>

<entry>
    <title>Neue Ruby on Rails 2.3 Guides</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/02/neue-ruby-on-rails-23-guides.html" />
    <id>tag:www.jror.de,2009://20.1493</id>

    <published>2009-02-04T18:23:25Z</published>
    <updated>2009-02-04T18:40:41Z</updated>

    <summary><![CDATA[P&uuml;nktlich zum Release Candidate für die 2.3.0 Ruby on Rails Version, hat das Rails Team um David Heinemeier Hansson die "Ruby on Rails Guides" Seite komplett für das Release 2.3 &uuml;berarbeitet. Damit der Einstieg in die zahlreichen Neuerungen des Rails...]]></summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="Links" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="rubyonrails" label="Ruby on Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tutorial" label="Tutorial" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[P&uuml;nktlich zum Release Candidate für die <a href="http://weblog.rubyonrails.org/2009/2/1/rails-2-3-0-rc1-templates-engines-rack-metal-much-more">2.3.0 Ruby on Rails Version</a>, hat das Rails Team um David Heinemeier Hansson die <a href="http://guides.rails.info/">"Ruby on Rails Guides"</a> Seite komplett für das Release 2.3 &uuml;berarbeitet.
<br/>
Damit der Einstieg in die zahlreichen Neuerungen des Rails Frameworks leichter f&auml;llt, werden die einzelnen Tutorial und Beispiele nach und nach an Rails 2.3 angepasst und laut Ank&uuml;ndigung sollen weitere hinzukommen. 

<div class="more_links">weiterf&uuml;hrende Links</div>
<a href="http://guides.rubyonrails.org/2_3_release_notes.html"> Ruby on Rails 2.3 Neuerungen</a><br/>
<a href="http://guides.rails.info/">guides.rubyonrails.org</a> ]]>
        
    </content>
</entry>

<entry>
    <title>Was ist JRuby on Rails?</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2009/02/was-ist-jruby-on-rails.html" />
    <id>tag:www.jror.de,2009://20.1492</id>

    <published>2009-02-04T12:57:35Z</published>
    <updated>2009-05-08T08:36:34Z</updated>

    <summary><![CDATA[Willkommen bei JRoRdem deutschprachigem Blog &uuml;ber Jruby on Rails! JRuby on Rails (JRoR) verbindet die Agilität der Skriptsprache Ruby mit der ausgereiften Infrastruktur und einer Unmenge an Bibliotheken der Java-Welt. Das ist eine sehr m&auml;chtige Kombination, denn die Kunden bekommen...]]></summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="JRuby" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Links" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="java" label="Java" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jrubyonrails" label="JRuby on Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="matz" label="Matz" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="Ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tomcat" label="Tomcat" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="warbler" label="Warbler" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<b>Willkommen bei JRoR</b><br/>dem deutschprachigem Blog &uuml;ber Jruby on Rails!<br/><br/>
<b>JRuby on Rails (JRoR)</b> verbindet die Agilität der Skriptsprache Ruby mit der ausgereiften Infrastruktur und einer Unmenge an Bibliotheken der Java-Welt. Das ist eine sehr m&auml;chtige Kombination, denn die Kunden bekommen eine stabile Webanwendung mit großem Funktionsumfang  f&uuml;r einen vergleichsweise geringen Aufwand. Und welcher Kunde will das nicht?
<br/><br/>
In diesem Blog werden wir Informationen rund um JRuby, Rails und Ruby zusammentragen. Neben Links zu anderen Seiten und interessanten Büchern werden wir auch eigene L&ouml;sungen vorstellen und Trends diskutieren. Wir m&ouml;chten auch andere professionelle Softwareentwickler einladen, sich zu beteiligen, und hoffen so zum Erfahrungsaustausch beizutragen.
<br/><br/>]]>
        <![CDATA[Die von <a href="http://de.wikipedia.org/wiki/Yukihiro_Matsumoto" target="_blank">Yukihiro "Matz" Matsumoto</a> entworfene Programmiersprache <a href="http://ruby-lang.org/de/" target="_blank">Ruby </a> erlangte sp&auml;testens seit dem Auftritt des Web Application Framework <a href="http://rubyonrails.org/" target="_blank">"Ruby on Rails</a>" im Jahr 2004 immer mehr an Bedeutung.
<br/>
Es begannen viele hitzige Diskussionen, ob nun Ruby oder Java besser sei. W&auml;hrend manche Ruby nur als Spielzeug betrachten und andere schon das Ende von Java herauf beschw&ouml;ren, sehen wir vor allem das Potenzial in der Zusammenarbeit von <strong>Ruby und Java</strong>. 
<br/><br/>
Der Erfolg von Rails war so enorm, dass auch Sun nicht mehr daran vorbeikam. So stellten sie die Hauptentwickler von JRuby ein, um eine vollst&auml;ndige Ruby-Implementierung für die Java-Plattform zu schaffen.
<br/><br/>
<a href="http://jruby.codehaus.org/" target="_blank">JRuby</a> erm&ouml;glicht ein besonders einfaches Zusammenspiel von Java und Ruby, und zwar in <strong>beiden</strong> Richtungen.
<ul>
	<li>Ein Ruby-Java-Bytecode-Compiler, erstellt Programme f&uuml;r die Java-VM</li>
	<li>Aus dem Ruby-Quelltext sind auf alle Java-Klassen und Bibliotheken erreichbar.</li>
</ul>
JRuby on Rails ist wiederum die Verwendung von "Ruby on Rails" auf eben dieser Java-Plattform. Die Relevanz dieses Frameworks wird dadurch unterstrichen, dass die JRuby-Entwickler die Kompatibilit&auml;t zu einem Projektziel gemacht haben. Mittels des "Warbler" Gems, das den JRuby-Interpreter nutzt, kann eine JRuby on Rails Anwendung als .war-File auf einem Java-Server (z.B. Tomcat) "deployed" werden. Die Agilität von Ruby on Rails) und die gereifte Infrastruktur von Java (Server, Bibliotheken,...) ergänzen einander hervorragend.

<div class="more_links">weiterf&uuml;hrende Links</div>
<a href="http://jruby.codehaus.org/" target="_blank">JRuby - Java powered Ruby implementation</a><br/>
<a href="http://wiki.jruby.org/wiki/Main_Page" target="_blank">JRuby - Wiki Main Page</a><br/>
<a href="http://rubyonrails.org/" target="_blank">Ruby on Rails</a><br/>
<a href="http://ruby-lang.org/de/" target="_blank">Ruby</a><br/>
<a href="http://it-republik.de/jaxenter/artikel/JRuby-1123.html" target="_blank">JRuby - Eine Ruby-Implementierung in Java</a><br/>
<a href="http://www.zdnet.de/anwendungsentwicklung_jruby_mit_java_und_ruby_die_entwicklungsarbeit_optimieren_story-20000201-39159723-1.htm" target="_blank">JRuby: Mit Java und Ruby die Entwicklungsarbeit optimieren</a><br/>
<a href="http://www.jruby.de/articles/2007/09/08/was-ist-jruby" target="_blank">Was ist JRuby?</a><br/>
<a href="http://caldersphere.rubyforge.org/warbler/" target="_blank">Warbler Gem</a>
]]>
    </content>
</entry>

</feed>
