<?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>2013-04-09T12:49:12Z</updated>
    <subtitle>Ruby on Rails ermöglicht eine unglaubliche Geschwindigkeit bei der Entwicklung von Webanwendungen, Java ist eine lange gereifte, etablierte und sehr gut skallierende Basis. JRuby (Ruby on Rails auf der Java-VM) verbindet die Vorteile beider Welten, ohne sich deren Nachteile einzuhandeln.</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.23-en</generator>

<entry>
    <title>JRubyConf EU 2013</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2013/04/jrubyconf-eu-2013.html" />
    <id>tag:www.jrubyonrails.de,2013://20.1777</id>

    <published>2013-04-09T12:41:43Z</published>
    <updated>2013-04-09T12:49:12Z</updated>

    <summary>Auch in diesem Jahr findet die JRubyConf EU 2013 im Rahmen des eurucamp 2013 statt. Dieses Jahr sogar an 2 Tagen - am 14./15. August! Der Ticketverkauf startet am 10.April....</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="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="eurucamp2013" label="eurucamp 2013" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jrubyconf" label="JRubyConf" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jrubyconfeu" label="JRubyConfEu" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>Auch in diesem Jahr findet die <a target="_blank" href="http://2013.jrubyconf.eu/">JRubyConf EU 2013</a>  im Rahmen des <a target="_blank" href="http://2013.eurucamp.org/">eurucamp 2013</a> statt.
</p>
<p>
Dieses Jahr sogar an 2 Tagen - am 14./15. August! Der Ticketverkauf startet am 10.April. 
</p> 
]]>
        
    </content>
</entry>

<entry>
    <title>Continuous Integration for Jasmine- and CasperJS Tests</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2013/03/continuous-integration-for-jasmine--and-casperjs-tests.html" />
    <id>tag:www.jrubyonrails.de,2013://20.1776</id>

    <published>2013-03-04T10:37:50Z</published>
    <updated>2013-03-07T07:03:28Z</updated>

    <summary>JavaScript Test Automation using TeamCity This article explains all steps you need to perform to setup your Continuous Integration System with TeamCity + PhantomJS + CoffeeScript (optionally) + Jasmine and/or CasperJS :) There&apos;s an increasing demand for interactive web applications...</summary>
    <author>
        <name>Jesko</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tutorials" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="automation" label="Automation" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="casperjs" label="CasperJS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ci" label="CI" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="coffeescript" label="coffeescript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="continuousintegration" label="Continuous Integration" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jasmine" label="Jasmine" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="javascript" label="Javascript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="js" label="JS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="phantomjs" label="PhantomJS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="teamcity" label="Teamcity" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="testing" label="Testing" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<h3 class="blogentry">JavaScript Test Automation using TeamCity</h3>
<p>
 This article explains all steps you need to perform to setup your Continuous Integration System with TeamCity + PhantomJS + CoffeeScript (optionally) + Jasmine and/or CasperJS  :)</p>

<p>There's an increasing demand for interactive web applications which dynamically load data using AJAX and handle user interaction with lots of fancy JavaScript stuff. That's why we have significant more Javascript code in our web apps than it was 10 years ago (you still remember how "hip" it was to use JavaScript back in 2000 as a web developer?).</p>

<p>Javascript code is essential for modern web applications. It needs to be tested. It wants to be tested. We needed a setup which allows to run our CasperJS and Jasmine test suites both locally and on our build server (TeamCity). This article covers the setup of TeamCity for local testing and especially automated headless testing of Javascript code in detail.</p>
]]>
        <![CDATA[<h4 class="blogentry">CoffeeScript</h4>
<p>Most of our Javascript tests are written in CoffeeScript. CoffeeScript provides syntactic sugar to write cleaner, more readable code which transcompiles to JavaScript. However using CoffeeScript makes the setup of the buildserver slightly more sophisticated. Not too hard though. Give it a chance! ;)</p>

<h4 class="blogentry">Jasmine</h4>
<p>A behaviour-driven JS testframework we use for writing JavaScript unit tests. It easily integrates with Ruby projects. Syntactically it looks quite similar to RSpec:</p>
<pre class="brush: ruby; gutter: true">
describe("A suite", function() {
	it("should work flawlessly", function() {
		expect(true).toBe(true);
	});
});
</pre>
The same with CoffeeScript :)
<pre class="brush: ruby; gutter: true">
describe 'A suite', ->
	it 'should work flawlessly', ->
		expect(true).toBe true
</pre>

<p>Links:
<ul>
	<li><a href="http://coffeescriptcookbook.com/chapters/testing/testing_with_jasmine">http://coffeescriptcookbook.com/chapters/testing/testing_with_jasmine</a></li>
<li><a href="http://railscasts.com/episodes/261-testing-javascript-with-jasmine-revised">http://railscasts.com/episodes/261-testing-javascript-with-jasmine-revised</a></li>
<li><a href="http://pivotal.github.com/jasmine/">http://pivotal.github.com/jasmine/</a></li>
</ul>
</p>

<b>Local execution of jasmine tests</b>
<p>After installing the gem <a href="https://github.com/bradphelan/jasminerice">jasminerice</a> in your rails app, it's really simple to execute jasmine tests locally: Simply start up your rails server and fire up http://localhost:3000/jasmine in the browser.</p> 

<h4 class="blogentry">CasperJS</h4>
<p><a href="http://casperjs.org">CasperJS</a> is a navigation scripting and testing utility used by us to navigate through our web apps, create screenshots, fill and submit forms and much more. To get started simply add the gem <a href="http://rubygems.org/gems/casperjs">casperjs</a> to your rails project.</p>

<b>Local execution of CasperJS tests</b><br/>
Add the following rake tasks to your Rakefile:
<pre class="brush: ruby; gutter: true; collapse: true">
  test_server_pid_file = "tmp/pids/test_server.pid"
  app_port             = 8787
  desc "Start Testing Server"
  task :start_test_server do
    counter = 0

    Thread.new {
      command_line = "bundle exec rails server -p #{app_port} -e test -P #{test_server_pid_file}"
      puts "Starting: #{command_line}"
      system command_line
    }

    while (not File.exist?(test_server_pid_file)) && counter < 90 do
      counter += 1
      sleep 2
    end
    if counter >= 30
      STDERR.puts "Start took too long!"
    else
      puts "Test server running ..."
    end
  end

  desc "Stop Testing Server"
  task :stop_test_server do

    puts "Stopping test server ..."
    pid = IO.read(test_server_pid_file).to_i rescue nil

    if pid.present?
      system("kill -9 #{pid}")
      FileUtils.rm(test_server_pid_file)
      puts "... Test server stopped"
    else
      STDERR.puts "Cannot stop server - no pid file found!"
    end
  end


  desc "run Casper JS Tests, starts rails server,run the tests and then stop the server "
  task :run_casper_js_tests => [:init, "db:fixtures:load", "projectname:start_test_server" ] do
    begin
      Rake::Task["projectname:start_test_server"].invoke

      spec_path = Rails.root.join("spec/javascripts/casperjs/")
      log_path  = Rails.root.join("log")
      puts "Running CasperJS Specs in #{spec_path}"
      # 1. first runs pre.js
      # 2. then runs all JS and CoffeeScript Specs in directory spec_path
      # 3. then runs post.js
      # 4. finally stores result to log/casper_spec_output.xml
      system("casperjs test \
              --testhost=http://localhost:#{app_port} \
              --save_to_xml=#{File.join(log_path, 'casper_spec_output.xml')} \
              --pre=#{File.join(spec_path, 'pre.js.coffee')} \
              --post=#{File.join(spec_path, 'post.js.coffee')} \
              --log-level=info \
              #{File.join(spec_path)}")
    ensure
      Rake::Task["projectname:stop_test_server"].invoke
    end
  end
</pre>

<p>You can then run your CasperJS tests (let it be JS- or coffeescript-tests) by running the new Raketask.</p>


<h4 class="blogentry">TeamCity Setup</h4>
<p><a href="http://www.jetbrains.com/teamcity/">TeamCity</a> is a popular Continuous Integration Server developed by JetBrains. We use it to automatically build and test our Java, Rails and iOS projects. This chapter describes how to setup TeamCity for automatic JavaScript testing of Rails projects.</p>

<a id="setup_phantomjs"><b>Setup buildagents for Jasmine Testing</b></a><br/>
<p>We use PhantomJS - the scriptable headless WebKit engine - to execute our JS tests on the build server. Therefore initially we need to install a recent version of phantomjs on all buildagents which shall run js code. Here's an example for PhantomJS v.1.8.1:
<pre class="brush: ruby; gutter: false">
ssh buildagent_1
cd /usr/local/share
wget http://phantomjs.googlecode.com/files/phantomjs-1.8.1-linux-i686.tar.bz2
tar xjf phantomjs-1.8.1-linux-i686.tar.bz2
sudo ln -s /usr/local/share/phantomjs-1.8.1-linux-i686/bin/phantomjs /usr/bin/phantomjs 
rm phantomjs-1.8.1-linux-i686.tar.bz2
</pre>
Did it work? To check type:
<i>phantomjs -v</i>
That's it for the buildagents! :)</p>

<b>Prepare project for TeamCity integration</b><br/>
<p>
For the content of the following files we got heavy inspiration from Dan's great article <a href="http://blog.danmerino.com/continuos-integration-ci-for-javascript-jasmine-and-teamcity/">http://blog.danmerino.com/continuos-integration-ci-for-javascript-jasmine-and-teamcity/</a>.<br/>Add the following files to your project:
<ul>
	<li>/script/teamcity/test_runner.js: PhantomJS script which triggers the headless execution of the JS tests
<pre class="brush: ruby; gutter: true; collapse: true">
console.log('PhantomJS started TestRunner which loads a web page with a TeamCity Reporter...');
var page = new WebPage();
var system = require('system');
var checkout_dir = system.args[1]; // pass checkout_dir parameter

//Open local teamcity_reporter.html
var url = "file://localhost" + checkout_dir + "/script/teamcity/teamcity_reporter.html";
phantom.viewportSize = {width: 800, height: 600};
//Required because PhantomJS sandboxes the website and doesn't show up the console messages form that page by default
page.onConsoleMessage = function (msg) {
    console.log(msg);   // Pass all page logs to stdout

    if (msg && msg.indexOf("##jasmine.reportRunnerResults") !== -1) {
        phantom.exit();
    }
};
//Open the website with the teamcity reporter
page.open(url, function (status) {
    //Page is loaded!
    if (status !== 'success') {
        console.log('Unable to load the address!');
    } else {
        //Using a delay to make sure the JavaScript is executed in the browser
        window.setTimeout(function () {
            page.render("output.png");
            phantom.exit();
        }, 200);
    }
});
</pre></li>

	<li>/script/teamcity/teamcity_reporter.html: HTML page which is being rendered in the PhantomJS browser. Tells Jasmine which tests it shall execute and registers TeamCity reporter with Jasmine
<pre class="brush: xml; gutter: true; collapse: true">
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
    <meta charset="utf-8" />
    <title>Console Reporter Spec</title>

    <!-- TODO it would be nice to calculate the correct jasmine paths dynamically -->
    <link rel="stylesheet" href="../../vendor/bundle/ruby/1.9.1/gems/jasminerice-0.0.10/vendor/assets/stylesheets/jasmine.css" type="text/css" />
    <script type="text/javascript" src="../../vendor/bundle/ruby/1.9.1/gems/jasminerice-0.0.10/vendor/assets/javascripts/jasmine.js"></script>
    <script type="text/javascript" src="../../vendor/bundle/ruby/1.9.1/gems/jasminerice-0.0.10/vendor/assets/javascripts/jasmine-html.js"></script>
    <script type="text/javascript" src="./jasmine.teamcity_reporter.js"></script>

    <!-- Add source files -->
    <script type="text/javascript" src="../../public/assets/application.js"></script>

    <!-- Add spec files -->
    <script type="text/javascript" src="../../spec/javascripts/assets/jasmine_spec_suite.js"></script>

</head>

<body>

    <script type="text/javascript">
        jasmine.getEnv().addReporter(new jasmine.TeamcityReporter());
        jasmine.getEnv().addReporter(new jasmine.TrivialReporter());
        jasmine.getEnv().execute();
    </script>
</body>

</html>
</pre></li>

<li>/script/teamcity/jasmine.teamcity_reporter.js: hands over spec results to TeamCity build server
<pre class="brush: javascript; gutter: true; collapse: true">
(function() {
    if (! jasmine) {
        throw new Exception("jasmine library does not exist in global namespace!");
    }

    /**
     * Basic reporter that outputs spec results to for the Teamcity build system
     *
     * Usage:
     *
     * jasmine.getEnv().addReporter(new jasmine.TeamcityReporter());
     * jasmine.getEnv().execute();
     */
    var TeamcityReporter = function() {
        this.started = false;
        this.finished = false;
    };

    TeamcityReporter.prototype = {
        reportRunnerResults: function(runner) { },

        reportRunnerStarting: function(runner) { },

        reportSpecResults: function(spec) { },

        reportSpecStarting: function(spec) { },

        reportSuiteResults: function(suite) {
            var results = suite.results();
            var path = [];
            while(suite) {
                path.unshift(suite.description);
                suite = suite.parentSuite;
            }
            var description = path.join(' ');

            this.log("##teamcity[testSuiteStarted name='" + this.escapeTeamcityString(description) + "']");

            var outerThis = this;
            var eachSpecFn = function(spec){
                if (spec.description) {
                    outerThis.log("##teamcity[testStarted name='" + outerThis.escapeTeamcityString(spec.description) + "' captureStandardOutput='true']");
                    var specResultFn = function(result){
                        if (!result.passed_) {
                            outerThis.log("##teamcity[testFailed name='" + outerThis.escapeTeamcityString(spec.description) + "' message='|[FAILED|]' details='" + outerThis.escapeTeamcityString(result.trace.stack) + "']");
                        }
                    };

                    for (var j = 0, jlen = spec.items_.length; j < jlen; j++) {
                        specResultFn(spec.items_[j]);
                    }
                    outerThis.log("##teamcity[testFinished name='" + outerThis.escapeTeamcityString(spec.description) + "']");
                }
            };
            for (var i = 0, ilen = results.items_.length; i < ilen; i++) {
                eachSpecFn(results.items_[i]);
            }

            this.log("##teamcity[testSuiteFinished name='" + outerThis.escapeTeamcityString(description) + "']");
        },

        log: function(str) {
            var console = jasmine.getGlobal().console;
            if (console && console.log) {
                console.log(str);
            }
        },

        hasGroupedConsole: function() {
            var console = jasmine.getGlobal().console;
            return console && console.info && console.warn && console.group && console.groupEnd && console.groupCollapsed;
        },

        escapeTeamcityString: function(message) {
            if(!message) {
                return "";
            }

            return message.replace(/\|/g, "||")
                .replace(/\'/g, "|'")
                .replace(/\n/g, "|n")
                .replace(/\r/g, "|r")
                .replace(/\u0085/g, "|x")
                .replace(/\u2028/g, "|l")
                .replace(/\u2029/g, "|p")
                .replace(/\[/g, "|[")
                .replace(/]/g, "|]");
        }
    };

    function suiteResults(suite) {
        console.group(suite.description);
        var specs = suite.specs();
        for (var i in specs) {
            if (specs.hasOwnProperty(i)) {
                specResults(specs[i]);
            }
        }
        var suites = suite.suites();
        for (var j in suites) {
            if (suites.hasOwnProperty(j)) {
                suiteResults(suites[j]);
            }
        }
        console.groupEnd();
    }

    function specResults(spec) {
        var results = spec.results();
        if (results.passed() && console.groupCollapsed) {
            console.groupCollapsed(spec.description);
        } else {
            console.group(spec.description);
        }
        var items = results.getItems();
        for (var k in items) {
            if (items.hasOwnProperty(k)) {
                itemResults(items[k]);
            }
        }
        console.groupEnd();
    }

    function itemResults(item) {
        if (item.passed && !item.passed()) {
            console.warn({actual:item.actual,expected: item.expected});
            item.trace.message = item.matcherName;
            console.error(item.trace);
        } else {
            console.info('Passed');
        }
    }

    // export public
    jasmine.TeamcityReporter = TeamcityReporter;
})();
</pre>
</li>


<li>/spec/javascripts/jasmine_spec_suite.js: Lists the jasmine specs which shall be tested by TeamCity
<pre class="brush: javascript; gutter: true; collapse: true">
// This is a manifest file that'll be compiled into application.js, which will include all the
// files listed below.
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts,
// vendor/assets/javascripts, or vendor/assets/javascripts of plugins,
// if any, can be referenced here using a relative path.
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
//
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE
// PROCESSED, ANY BLANK LINE SHOULD GO AFTER THE REQUIRES BELOW.
//
// add FACTORIES
//= require ./factories/dog_factory
// add SPECS
//= require fat_dog_spec
//= require_self
</pre>
</li>

<li>/Rakefile: task which compiles coffeescript files to one big js file
<pre class="brush: ruby; gutter: true; collapse: true">
  desc "Asset Precompile for Coffeescript Jasmine Tests"
  task :jasmine_asset_precompile => ["assets:precompile"] do
    # compile JS specs after creating assets
    compile_jasmine_coffeescripts
  end

  # compile all JS specs to one big js file in /spec/javascript/assets dir
  def compile_jasmine_coffeescripts
    require 'sprockets'
    output_path     = Rails.root.join("spec/javascripts/assets/")
    env             = Sprockets::Environment.new(Rails.root)
    test_suite_name = "jasmine_spec_suite.js"

    test_suite_path = Rails.root.join("spec/javascripts/")
    env.append_path(File.join(test_suite_path))

    puts "Compiling JS Test Suite '#{test_suite_name}'."
    compiler = Sprockets::StaticCompiler.new(env,
                                             File.join(output_path),
                                             [test_suite_name],
                                             :digest => nil,
                                             :manifest => false)
    compiler.compile
  end
</pre>
</li>
</ul>
</p>

<br/>
<br/>
<br/>

<p><b>Setup Teamcity for Jasmine Testing</b></p>
<ul>
	<li>Create a new build step to compile all coffeescript src files to one big application.js at the build server.<br/>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.jrubyonrails.de/assets_c/2013/03/jasmine_build_step-2.html" onclick="window.open('http://www.jrubyonrails.de/assets_c/2013/03/jasmine_build_step-2.html','popup','width=1187,height=716,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.jrubyonrails.de/assets_c/2013/03/jasmine_build_step-thumb-1187x716-2.png" width="200" height="120" alt="jasmine_build_step.png" class="mt-image-none" style="" /></a></span></p>
<br/>

New build step: Runner type: Rake<br/>
Rake task: projectname:jasmine_asset_precompile<br/>
Additional rake command line parameters: RAILS_ENV=test RAILS_GROUPS=assets
</li>
<li>New build step: JS Jasmine tests<br/>
Command executable: phantomjs<br/>
Command parameters: script/teamcity/test_runner.js teamcity.build.workingDir</li>
</ul>

<p>By passing the teamcity.build.workingDir to the test_runner.js in the build step configuration (s.a.) we can use the jasmine gem installed in our Rails app from within our TeamCity installation without the need to install a separate jasmine instance on our TeamCity server.</p>

<p>
Now for a real example. Let's quickly add a dummy test /spec/javascripts/jasmine_example_spec.js.coffee to our project to break our build:
<pre class="brush: ruby; gutter: true">
describe 'A jasmine example suite', ->
  it 'should obviously fail', ->
    expect(true).toBe false # should fail
</pre>

<p>Do not forget to add the new spec file to your jasmine meta suite /spec/javascripts/assets/jasmine_spec_suite.js and commit the changes.</p>

<p>TeamCity detects the changes and the next available build agent starts testing. Few moments later TeamCity turns red. That's what we expected!</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.jrubyonrails.de/assets_c/2013/03/Jasmine-TC-Fail-11.html" onclick="window.open('http://www.jrubyonrails.de/assets_c/2013/03/Jasmine-TC-Fail-11.html','popup','width=1395,height=186,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.jrubyonrails.de/assets_c/2013/03/Jasmine-TC-Fail-thumb-200x26-11.png" width="200" height="26" alt="Jasmine-TC-Fail.png" class="mt-image-none" style="" /></a></span></p>

<p>We don't like red builds. Let's fix it!</p>
<pre class="brush: ruby; gutter: true">
describe 'A jasmine example suite', ->
  it 'should work flawlessly', ->
    expect(true).toBe true
</pre>


<p>Commit the file, wait some moments and watch how TeamCity magically changes from red to green. Awesome! Due to the good integration of the JS test reporter you can use the statistics, test history and similiar features of TeamCity as you are used to for your JavaScript tests.</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.jrubyonrails.de/assets_c/2013/03/jasmine-TC-green-14.html" onclick="window.open('http://www.jrubyonrails.de/assets_c/2013/03/jasmine-TC-green-14.html','popup','width=1872,height=496,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.jrubyonrails.de/assets_c/2013/03/jasmine-TC-green-thumb-200x52-14.png" width="200" height="52" alt="jasmine-TC-green.png" class="mt-image-none" style="" /></a></span>
</p>

<p>We now have a working continuous integration system for jasmine tests in Rails applications on a TeamCity Server. We get detailed reports for test results - not only for classical RSpec tests but also for Jasmine specs written in plain Javascript or Coffeescript.</p>

<p>One problem still waits to be solved: If jasmine specs fail they're correctly reported as "Failed Tests". However TeamCity doesn't show a stacktrace. If you have an idea how to improve the output please leave a post.</p>

<p><b>Setup buildagents for CasperJS Testing</b></p>
Additionally to their normal setup buildagents only need PhantomJS (see <a href="#setup_phantomjs">above</a>)</p>

<p><b>Setup Teamcity for CasperJS Testing</b></p>
<ul>
	<li>Create a new build step in TeamCity to execute the Casper JS tests:<br/>
New build step: Runner type: Rake<br/>
Step name: Run CasperJS Tests<br/>
Rake task: projectname:run_casper_js_tests<br/>
Bundler: [x] bundle exec
</li>
</ul>
<p>
When TeamCity executes this Rake task it creates an XML result file in the project log dir named 'casper_spec_output.xml'. All we need to do to finish our configuration is to add a build step to our TeamCity project configuration to evaluate this file:
</p>
<p>
Build Configuration --> Build Steps --> Additional Build Features --> XML report processing --> Add build feature<br/>
Report type: Ant JUnit<br/>
Monitoring rules: log/casper_spec_output.xml<br/>
Verbose output: [x]<br/>
Further information: <a href="http://confluence.jetbrains.com/display/TCD7/XML+Report+Processing">http://confluence.jetbrains.com/display/TCD7/XML+Report+Processing</a>
</p>
<p>That's it. Let's add an example (failing) CasperJS test (written in CoffeeScript) to our project and commit it: We create a file /spec/javascripts/casperjs/dummy_spec.js.coffee which opens Google in a Browser (PhantomJS).</p>
<pre class="brush: javascript; gutter: true; collapse: false">
casper.start "http://www.google.de/", () ->
  @test.assertTitle  "Bing",                   "Google is called Bing!?" # This should fail
  @test.assertExists "form[action='/search']", "Found Google main form"

casper.run () ->
  @test.done 2
</pre>

<p>Commit it and watch your continuous integration system work for you. Our buildagents execute the CasperJS tests on commit - TeamCity reports the results and turns red!</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;">
<a href="http://www.jrubyonrails.de/assets_c/2013/03/Google-CasperJS-red-8.html" onclick="window.open('http://www.jrubyonrails.de/assets_c/2013/03/Google-CasperJS-red-8.html','popup','width=1402,height=265,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.jrubyonrails.de/assets_c/2013/03/Google-CasperJS-red-thumb-200x37-8.png" width="200" height="37" alt="Google-CasperJS-red.png" class="mt-image-none" style="" /></a></span></p>

<p>Next let's fix the test. Change the code and commit it:<br/>
<pre class="brush: javascript; gutter: true; collapse: false">
casper.start "http://www.google.de/", () ->
  @test.assertTitle  "Google",                 "Google is called Google"
  @test.assertExists "form[action='/search']", "Found Google main form"

casper.run () ->
  @test.done 2
</pre>
</p>

<p>
As always TeamCity detects the change and the next available build agent starts testing. TeamCity turns from red to green! Well done!</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.jrubyonrails.de/assets_c/2013/03/Google-CasperJS-Green-5.html" onclick="window.open('http://www.jrubyonrails.de/assets_c/2013/03/Google-CasperJS-Green-5.html','popup','width=1878,height=311,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.jrubyonrails.de/assets_c/2013/03/Google-CasperJS-Green-thumb-200x33-5.png" width="200" height="33" alt="Google-CasperJS-Green.png" class="mt-image-left" style="" /></a></span></p><br/>

<br/><br/>

<h4 class="blogentry">Conclusion</h4>
Manually executing JavaScript/CoffeeScript test suites on your local system is not enough. With CI systems like TeamCity you can fully automate the execution of tests on the build server. Initially some manual configuration is necessary but you will benefit from a reliable Continuous Integration System coupled with a whole bunch of sophisticated JavaScript test frameworks and tools using PhantomJS.

<p>Remember: You are not limited to CasperJS and Jasmine. There are <a href="https://github.com/ariya/phantomjs/wiki/Headless-Testing">so many more</a>!</p>]]>
    </content>
</entry>

<entry>
    <title>Rails installieren - Howto</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2013/02/rails-installieren---howto.html" />
    <id>tag:www.jrubyonrails.de,2013://20.1775</id>

    <published>2013-02-27T07:56:46Z</published>
    <updated>2013-02-27T09:04:25Z</updated>

    <summary> Daniel Kehoe zeigt auf seinem RailsApps Project Blog sehr ausführlich, wie man Rails 3.2 oder Rails 4 auf Mac OS X, Ubuntu oder Windows installieren kann. Ein guter Einstieg für Anfänger, aber auch eine interessante Zusammenfassung für Rails erfahrene...</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="installieren" label="Installieren" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails40" label="Rails 4.0" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>
<a target="_blank" href="https://twitter.com/rails_apps/">Daniel Kehoe</a> zeigt auf seinem <a target="_blank" href="http://railsapps.github.com/installing-rails.html">RailsApps Project Blog</a> sehr ausführlich, wie man Rails 3.2 oder Rails 4 auf Mac OS X, Ubuntu oder Windows installieren kann. Ein guter Einstieg für Anfänger, aber auch eine interessante Zusammenfassung für Rails erfahrene Leute.
</p>

]]>
        
    </content>
</entry>

<entry>
    <title>Ruby 2.0.0 und Happy Birthday Ruby</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2013/02/ruby-200-und-happy-birthday-ruby.html" />
    <id>tag:www.jrubyonrails.de,2013://20.1774</id>

    <published>2013-02-25T08:15:54Z</published>
    <updated>2013-02-25T08:43:42Z</updated>

    <summary> Gleich 2 Ereignisse passierten am Wochenende in der Ruby-Welt. Ruby 2.0.0 ist erschienen und Ruby ist 20 Jahre alt geworden. Unglaublich! Dazu auch von uns - Alles Gute und Danke dafür, dass es Ruby gibt. Die Neuerungen von Ruby...</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="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="ruby20" label="Ruby 2.0" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>
Gleich 2 Ereignisse passierten am Wochenende in der Ruby-Welt.
<a target="_blank" href="http://www.ruby-lang.org/en/news/2013/02/24/ruby-2-0-0-p0-is-released/">Ruby 2.0.0</a> ist erschienen und Ruby ist 20 Jahre alt geworden. Unglaublich!
</p>
<p>
Dazu auch von uns - Alles Gute und Danke dafür, dass es Ruby gibt.
</p>
<p>
Die Neuerungen von Ruby 2.0.0 werden auf <a target="_blank" href="http://blog.marc-andre.ca/2013/02/23/ruby-2-by-example/">http://blog.marc-andre.ca/2013/02/23/ruby-2-by-example/</a> erläutert.
</p>
<p> 
Interessant für Rails und JRuby Nutzer ist:
<ul>
	<li><a target="_blank" title="Rails 3.2.x is now compatible with Ruby 2.0.0" href="https://github.com/rails/rails/pull/9406">Rails 3.2.x ist jetzt kompatibel mit Ruby 2.0.0</a></li>
        <li>und Charls Nutter <a target="_blank" href="https://twitter.com/headius/status/305860570391920640">twitterte</a>, dass in JRuby 1.7.4 die neuen Ruby 2.0.0 Features implementiert sein sollen.</li>
</ul>]]>
        
    </content>
</entry>

<entry>
    <title>JRuby 1.7.3 mit wichtigen Security-Fixes erscheinen</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2013/02/jruby-173-mit-wichtigen-security-fixes-erscheinen.html" />
    <id>tag:www.jrubyonrails.de,2013://20.1773</id>

    <published>2013-02-24T12:49:28Z</published>
    <updated>2013-02-24T13:03:58Z</updated>

    <summary> Die neue JRuby Version 1.7.3 ist mit 2 wichtige Security Fixes und mit dem Wechsel der JRuby Lizenz von CPL zu EPL erschienen. Security fix (no CVE) for DOS using entity expansion in REXML Security fix (CVE-2013-0269) for unsafe...</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="jruby173" label="JRuby 1.7.3" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="securityfix" label="Security Fix" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="securityupdate" label="Security Update" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>
Die neue <a target="_blank" href="http://jruby.org/news">JRuby Version 1.7.3 </a>ist mit 2 wichtige Security Fixes und mit dem Wechsel der JRuby Lizenz von CPL zu <a target="_blank" href="http://de.wikipedia.org/wiki/Common_Public_License">EPL</a> erschienen.
</p>
<ul>
	<li>Security fix (no CVE) for DOS using entity expansion in REXML</li>
        <li>Security fix (CVE-2013-0269) for unsafe object creation using JSON</li>
</ul>
<p>
Herunterladen kann man sich die neue Version wie immer auf <a target="_blank" href="http://www.jruby.org/download">http://www.jruby.org/download</a>.
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Ruby - Blocks, Procs und Lambdas</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2013/02/ruby---blocks-procs-und-lambdas.html" />
    <id>tag:www.jrubyonrails.de,2013://20.1772</id>

    <published>2013-02-11T14:59:27Z</published>
    <updated>2013-02-11T15:13:12Z</updated>

    <summary>Eine gute Übersicht der Vor- und Nachteile von Blocks, Procs und Lambdas in der Programmiersprache Ruby findet man in dem Blogeintrag Ruby on Rails Study Guide: Blocks, Procs, and Lambdas...</summary>
    <author>
        <name>Sören</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="programmieren" label="Programmieren" 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[Eine gute Übersicht der Vor- und Nachteile von Blocks, Procs und Lambdas in der Programmiersprache Ruby findet man in dem Blogeintrag <a target="_blank"  href="http://net.tutsplus.com/tutorials/ruby/ruby-on-rails-study-guide-blocks-procs-and-lambdas/">Ruby on Rails Study Guide: Blocks, Procs, and Lambdas</a>]]>
        
    </content>
</entry>

<entry>
    <title>Warum Ruby on Rails?</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2013/01/warum-ruby-on-rails.html" />
    <id>tag:www.jrubyonrails.de,2013://20.1771</id>

    <published>2013-01-23T07:33:23Z</published>
    <updated>2013-01-23T08:05:50Z</updated>

    <summary> Die Entscheidung zur Nutzung und Einarbeitung in ein Frameworks muß gut überlegt sein. Warum also sollte man sich, wie wir, für Ruby on Rails als Framework entscheiden? Eine gute Aufschlüsselung der Technologie, MCV Struktur und Core Features findet sich...</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="mvc" label="MVC" 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[<p>
Die Entscheidung zur Nutzung und Einarbeitung in ein Frameworks muß gut überlegt sein. Warum also sollte man sich, wie wir, für <a target="_blank" href="http://rubyonrails.org/">Ruby on Rails</a> als Framework entscheiden?
</p>
<p>
Eine gute Aufschlüsselung der  Technologie, MCV Struktur und Core Features findet sich im Artikel <a target="_blank" href="http://net.tutsplus.com/tutorials/ruby/why-rails/">Why Rails?</a>. Auch <a arget="_blank" href="http://de.wikipedia.org/wiki/Ruby_on_Rails">Wikipedia </a>ist ein guter Einstiegspunkt.
</p>
<p>
Falls die Entscheidung gefallen ist und man tiefer einsteigen will, empfiehlt sich die Lektüre der <a target="_blank" href="http://guides.rubyonrails.org/">RailsGuides</a> und die <a target="_blank" href="http://railscasts.com/">Railscasts</a> von Ryan Bates. Auch die interaktive Webseite <a target="_blank" href="http://railsforzombies.org/">LEARN RAILS THE ZOMBIE WAY</a> ist ein guter Startpunkt.
</p>
<p>
Viel Spaß und AHA-Erlebnisse beim Programmieren!
</p>]]>
        
    </content>
</entry>

<entry>
    <title>JRuby Hackdays am 02. und 03.02.2013 in Berlin</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2013/01/jruby-hackdays-am-02-und-03022013-in-berlin.html" />
    <id>tag:www.jrubyonrails.de,2013://20.1770</id>

    <published>2013-01-11T07:31:54Z</published>
    <updated>2013-01-11T08:36:19Z</updated>

    <summary> Gestern Abend wurde auf dem monatlichen Treffen der Ruby User Group Berlin (rug_b) das Datum für die JRuby Hackdays bekannt gegeben. Wer daran interessiert ist, zusammen mit anderen JRuby besser zu machen, sollte am 02. Februar und 03. Februar...</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="berlin" label="Berlin" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="hackdays" label="Hackdays" scheme="http://www.sixapart.com/ns/types#tag" />
    <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[<p>
Gestern Abend wurde auf dem monatlichen Treffen der Ruby User Group Berlin (<a href="http://berlin.onruby.de/" target="_blank">rug_b</a>) das Datum für die <a href="https://groups.google.com/forum/?fromgroups=#!topic/jruby-users/amPU_ds1qr8" title="Help needed: Hacking JRuby in Berlin" target="_blank">JRuby Hackdays</a> bekannt gegeben.
</p>
<p>
Wer daran interessiert ist, zusammen mit anderen JRuby besser zu machen, sollte am 02. Februar und 03. Februar 2013 in die Räume des co.up Coworking Spaces in Berlin kommen.
Florian Gilcher teilte auch mit, dass sie an den Tagen so eng wie möglich mit dem JRuby Core Team zusammen arbeiten wollen. Dieses hat ja schon des öfteren um Unterstützung gebeten und dazu aufgefordert, aktiv an der Entwicklung von JRuby und dessen Biblotheken mitzuwirken.
</p>
<p>
Anmelden kann man sich unter <a target="_blank" href="http://2013.eurucamp.org/hackdays">http://2013.eurucamp.org/hackdays</a>
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Rails Security Update - 3.2.11, 3.1.10, 3.0.19 und 2.3.15</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2013/01/rails-security-update---3211-3110-3019-und-2315.html" />
    <id>tag:www.jrubyonrails.de,2013://20.1769</id>

    <published>2013-01-11T07:16:25Z</published>
    <updated>2013-01-14T08:29:19Z</updated>

    <summary> Sicherlich haben es die meisten schon mitbekommen. Dennoch möchten wir unseren Kanal noch einmal nutzen, um folgende Nachricht zu verbreiten: Diese Woche veröffentlichte das Rails-Team Security Updates und empfiehlt ein schnellstmögliches Update aller Anwendungen. Weitere Erläuterungen findet man auf...</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="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="securityupdate" label="Security Update" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>
Sicherlich haben es die meisten schon mitbekommen. Dennoch möchten wir unseren Kanal noch einmal nutzen, um folgende Nachricht zu verbreiten: Diese Woche veröffentlichte das Rails-Team <a href="http://weblog.rubyonrails.org/2013/1/8/Rails-3-2-11-3-1-10-3-0-19-and-2-3-15-have-been-released/" target="_blank" title="Rails Security Update 3.2.11, 3.1.10, 3.0.19 und 2.3.15">Security Updates</a> und empfiehlt ein schnellstmögliches Update aller Anwendungen. 
</p>
<div class="more_links">Weitere Erläuterungen findet man auf</div>
<p>
<a target="_blank" href="http://www.heise.de/newsticker/meldung/Gefahr-durch-eingeschmuggelte-Ruby-on-Rails-Objekte-1780281.html">Gefahr durch eingeschmuggelte Ruby on Rails-Objekte</a></br>
<a target="_blank" href="http://www.heise.de/newsticker/meldung/Exploit-fuer-Ruby-on-Rails-im-Umlauf-1780936.html">Exploit für Ruby on Rails im Umlauf</a></br>
<a target="_blank" href="http://railsapps.github.com/updating-rails.html">Updating Rails by Daniel Kehoe</a>


</p>]]>
        
    </content>
</entry>

<entry>
    <title>JRuby Neuigkeiten, Tipps und Tricks</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2013/01/jruby-neuigkeiten-tipps-und-tricks.html" />
    <id>tag:www.jrubyonrails.de,2013://20.1768</id>

    <published>2013-01-08T08:50:45Z</published>
    <updated>2013-01-11T08:46:14Z</updated>

    <summary> Nach seeeeehr langer Zeit ohne Blogeintrag (geschuldet durch eine gut ausgelastete Projekttätigkeit), soll jetzt hier ein kleiner Überblick über die Neuigkeiten und Entwicklung von JRuby gegeben werden. Es ist einiges passiert! JRuby 1.7.2 ist erschienen Nachdem im Oktober 2012...</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="heroku" label="Heroku" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby172" label="JRuby 1.7.2" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="phussionpassenger4" label="Phussion Passenger 4" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="Ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby193" label="Ruby 1.9.3" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tipps" label="tipps" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>
Nach seeeeehr langer Zeit ohne Blogeintrag (geschuldet durch eine gut ausgelastete Projekttätigkeit), soll jetzt hier ein kleiner Überblick über die Neuigkeiten und Entwicklung von JRuby gegeben werden. Es ist einiges passiert!
</p>
<p>
<a href="http://jruby.org/2013/01/04/jruby-1-7-2.html" target="_blank">JRuby 1.7.2 ist erschienen</a> Nachdem im Oktober 2012 die Version 1.7.0 erschien, gibt es mittlerweile schon zwei weitere Versionen, in die hauptsächlich Bug- und Securityfixes integriert wurden. Außerdem wurde die Kompatibilität zu Ruby 1.9.3 verbessert. (Die <a href="http://www.ruby-lang.org/en/news/2012/12/25/ruby-1-9-3-p362-is-released/" target="_blank">Ruby Version 1.9.3-p392</a> erschien am 25.12.2012)</br>
Eine der neuen Optimierungen samt Performanceanalyse erläutert Charle Nutter in seinem Blogeintrag <a href="http://blog.headius.com/2013/01/constant-and-global-optimization-in.html" target="_blank">Constant and Global Optimization in JRuby 1.7.1 and 1.7.2</a>
</p>
<p>
Die Unterstützung und Akzeptanz von JRuby hat im letzten halben Jahr weiter zugenommen. So werden in Version 4 des <a href="http://blog.phusion.nl/2012/10/30/phusion-passenger-4-0-supports-jruby-rubinius/" target="_blank">Phussion Passenger JRuby Anwendungen</a> laufen und auch Heroku unterstützt nun nach einjähriger Beta-Phase JRuby - <a href="http://blog.heroku.com/archives/2012/12/13/run_jruby_on_heroku_right_now/" target="_blank">Run JRuby on Heroku Right Now</a>. 
</p>
<p>
Was auch sehr auffällt: JRuby ist  auf immer mehr Konferenzen ein Thema. Hier eine Liste von JRuby Vorträgen und Videos.</br>
<a href="http://de.slideshare.net/CharlesNutter/aloha-rubyconf-2012-jruby" target="_blank">Why JRuby?</a></br>
<a href="https://speakerdeck.com/headius/euruko-2012-jruby" target="_blank">Euruko 2012 - JRuby</a></br>
<a href="https://speakerdeck.com/tlossen/jruby-vs-rubinius" target="_blank">JRuby vs. Rubinius</a></br>
<a href="https://speakerdeck.com/bostonrb/introduction-to-jruby" target="_blank">Introduction to JRuby</a></br>
<a href="http://vimeo.com/44030491" target="_blank">Charles Nutter - JRuby, dudes!
EURUKO</a></br>
<a href="http://www.youtube.com/watch?feature=player_embedded&v=BOOXa06y96A" target="_blank">Invokedynamic: Changing the JVM Forever</a></br>
<a href="http://vimeo.com/38608030" target="_blank">
Deploying with JRuby - Joe Kutner</a></br>
<a href="http://www.youtube.com/watch?v=oeK2eFa5lPI" target="_blank">
JRuby on Rails - RoR's Simplicity Meets Java's Class - RubyConf India 2012</a></br>
</p>
<p>
Wer sich gern weitere JRuby-Themen ansehen will, sollte folgende Webseiten besuchen. Sie sind eine gute Anlaufstelle für Tipps und Neuigkeiten.</br>
<a href="http://blog.headius.com/" target="_blank">http://blog.headius.com</a></br>
<a href="https://github.com/jruby/jruby/wiki" target="_blank">https://github.com/jruby/jruby/wiki</a></br>
<a href="http://jrubytips.com/" target="_blank">http://jrubytips.com</a></br>
<a href="http://www.jruby.de/" target="_blank">http://www.jruby.de</a></br>
<a href="http://railscasts.com/episodes?utf8=%E2%9C%93&search=jruby" target="_blank">JRuby Railscasts</a>
</p>]]>
        
    </content>
</entry>

<entry>
    <title>JRuby User-Release 1.6.8 erschienen</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2012/09/jruby-user-release-168-erschienen.html" />
    <id>tag:www.jrubyonrails.de,2012://20.1760</id>

    <published>2012-09-20T07:17:49Z</published>
    <updated>2012-09-20T07:20:26Z</updated>

    <summary>Das JRuby Release 1.6.8 ist erschienen. Dieses Release wurde nicht vom JRuby Core Team vorangetrieben, sondern hauptsächlich von der JRuby Community....</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="168" label="1.6.8" scheme="http://www.sixapart.com/ns/types#tag" />
    <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[Das <a target="_blank" href="http://jruby.org/2012/09/18/jruby-1-6-8.html">JRuby Release 1.6.8</a> ist erschienen. Dieses Release wurde nicht vom JRuby Core Team vorangetrieben, sondern hauptsächlich von der JRuby Community.]]>
        
    </content>
</entry>

<entry>
    <title>eurucamp/JRubyConfEu 2012 - Ein Rückblick</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2012/08/eurucamp-jrubyconfeu-2012-ein-rueckblick.html" />
    <id>tag:www.jrubyonrails.de,2012://20.1757</id>

    <published>2012-08-20T19:48:18Z</published>
    <updated>2012-08-21T12:18:21Z</updated>

    <summary>Drei Tage können ganz schnell rum sein - vor allem, wenn man in einem Hotel direkt am Berliner Müggelsee ist und spannenden Vorträgen lauscht. So zum Beispiel am letzten Wochenende bei der eurucamp - zusammen mit der JRubyConfEU, die am...</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="berlin" label="Berlin" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="eurucamp" label="eurucamp" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jrubyconfeu" label="JRubyConfEu" 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" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>Drei Tage können ganz schnell rum sein - vor allem, wenn man in einem Hotel direkt am Berliner Müggelsee ist und spannenden Vorträgen lauscht. So zum Beispiel am letzten Wochenende bei der eurucamp - zusammen mit der JRubyConfEU, die am Freitag stattfand. Neben einem aktuellen Statement von <a href="http://twitter.com/tom_enebo" target="_blank" title="Tom Enebo">Tom Enebo</a> zur Entwicklung von <a href="http://jruby.org" target="_blank" title="jruby.org">JRuby</a> war für uns der Vortrag von <a href="http://twitter.com/tcrawley" target = "_blank">Toby Crawley</a> zu <a href="http://torquebox.org/" target="_blank">TorqueBox</a> das Highlight des Tages.</p>
<p>
Am Samstag gab es, passend zum Wetter, eine vierstündige Mittagspause, die viele direkt zum Sprung in den See oder zur Umrundung des selbigen mit dem Rad nutzten. Drum herum gab es viele kürzere Vorträge zu diversen technischen Themen - (J)Ruby ist mittlerweile auf Android und auf iOS nutzbar, Sinatra kann man in 8 Zeilen unterbringen -  aber auch weiter gefasste Betrachtungen wie "Love-Driven Development" (<a href="http://twitter.com/agnoster" target="_blank">Isaac Wolkerstorfer</a>) und "Development and Philosophy" (<a href="http://twitter.com/steveklabnik" target="_blank">Steve Klabnik</a>) kamen nicht zu kurz.
</p>

<p>Kurzum: Ein sehr gelungenes Wochenende, wir freuen uns auf nächstes Jahr!
</p>

<div class="more_links">Weiterführende Links und Quellen</div>
<a href="http://2012.eurucamp.org/speakers" target="_blank" title="Sprecher eurucamp">Sprecher eurucamp</a><br/>
<a href="http://jrubyconf.eu/speakers" target="_blank" title="Sprecher JRubyConf EU">Sprecher JRubyConfEU</a>
<br/>
<a href="http://lanyrd.com/2012/jrubyconfeu/coverage/" target="_blank" title="Vorträge JRubyConfEU">Vorträge JRubyConfEU</a>
<br/>
<a href="http://lanyrd.com/2012/eurucamp/coverage/" target="_blank" title="Fotos,Vorträge und Videos vom eurucamp">Fotos,Vorträge und Videos vom eurucamp</a>
]]>
        
    </content>
</entry>

<entry>
    <title>Doch noch weitere JRuby 1.6 Releases</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2012/08/doch-noch-weitere-jruby-16-releases.html" />
    <id>tag:www.jrubyonrails.de,2012://20.1756</id>

    <published>2012-08-07T06:51:17Z</published>
    <updated>2012-08-16T09:43:19Z</updated>

    <summary> Das JRuby Team hat angekündigt, dass es neben der JRuby 1.7 Entwicklung, doch noch weitere JRuby 1.6.x Releases geben wird. Interessanterweise werden diese neuen Releases (JRuby 1.6.8 und folgende) nicht vom JRuby Core Team vorangetrieben, sondern von 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="168" label="1.6.8" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="17" label="1.7" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="dev" label="Dev" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="entwicklung" label="Entwicklung" scheme="http://www.sixapart.com/ns/types#tag" />
    <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[<p>
Das JRuby Team hat angekündigt, dass es neben der <a alt="jruby 1.7" target="_blank" href="http://jruby.org/2012/05/21/jruby-1-7-0-preview1.html">JRuby 1.7 Entwicklung</a>, doch noch <a title="weitere JRuby 1.6.x Releases" target="_blank" href="https://groups.google.com/forum/#!topic/jruby-users/W9SmPC632Qo/discussion">weitere JRuby 1.6.x Releases</a> geben wird.
</p>
<p>
Interessanterweise werden diese neuen Releases (JRuby 1.6.8 und folgende) nicht vom JRuby Core Team vorangetrieben, sondern von der JRuby Community. Stichwort: <a target="_blank" title="Backporting Fixes from JRuby Master" href="https://github.com/jruby/jruby/pull/244">"Backporting Fixes from JRuby Master"</a>.
</p>
<p>
Die ersten Pull Request wurden auf GitHub schon eingereicht. <a target="_blank" title="Backport of bug fixes from master to jruby-1_6" href="https://github.com/jruby/jruby/pull/244">https://github.com/jruby/jruby/pull/244</a>
</p>


]]>
        
    </content>
</entry>

<entry>
    <title>JRubyConf EU - am 17. August in Berlin</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2012/07/jrubyconf-eu---am-17-august-in-berlin.html" />
    <id>tag:www.jrubyonrails.de,2012://20.1755</id>

    <published>2012-07-26T12:24:02Z</published>
    <updated>2012-07-26T12:55:13Z</updated>

    <summary> Im Rahmen des eurucamp 1012 findet dieses Jahr am 17. August die erste europäische JRuby Konferenz in Berlin am Müggelsee statt. Informationen zu den Sprechern, Zeitplan, Ticketkauf und alle weiteren wichtigen Dinge findet man unter http://jrubyconf.eu/. Interessant 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="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="jrubyconf" label="JRubyConf" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="konferenz" label="Konferenz" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="müggelsee" label="Müggelsee" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>
Im Rahmen des <a href="http://2012.eurucamp.org/" target="_blank">eurucamp 1012</a> findet dieses Jahr am 17. August die erste europäische JRuby Konferenz in Berlin am Müggelsee statt. Informationen zu den Sprechern, Zeitplan, Ticketkauf und alle weiteren wichtigen Dinge findet man unter <a href="http://jrubyconf.eu/" target="_blank">http://jrubyconf.eu/</a>. 
</p>
<p>
Interessant wird es allemal, da z.B. Tom Enebo (einer der JRuby Core Entwickler) die Keynote und auch Joe Kutner (Author des Buches <a target="_blank" href="http://pragprog.com/book/jkdepj/deploying-with-jruby"> Deploying with JRuby</a>) einen Vortrag über "Deploy, Scale and Sleep Better with JRuby" hält. 
</p>
<p>
Wir sind vor Ort!
</p>
]]>
        
    </content>
</entry>

<entry>
    <title>05.07.2012: RUG-Dresden: Rails 3</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2012/07/05072012-rails-3-ruby-dresden-railscast-kino.html" />
    <id>tag:www.jrubyonrails.de,2012://20.1753</id>

    <published>2012-07-02T13:30:59Z</published>
    <updated>2012-07-02T14:12:15Z</updated>

    <summary>Die Ruby UserGroup Dresden trifft sich wieder. Thema beim RailsCast-Kino ist diesmal Rails 3. Details und Anmeldung...</summary>
    <author>
        <name>Steffen</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="rubyrailsrailscastkinorugdresden" label="ruby rails railscast kino rug dresden" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>Die Ruby UserGroup Dresden trifft sich wieder. Thema beim RailsCast-Kino ist diesmal Rails 3.</p>

<p><a href="http://www.ruby-dresden.de/2012/06/13/05-07-2012-1900-rails-3/">Details und Anmeldung</a></p>]]>
        
    </content>
</entry>

<entry>
    <title>Was bedeutet das für JRuby?</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2012/05/was-bedeutet-das-fuer-jruby-core-team-wechselt-zu-red-hat.html" />
    <id>tag:www.jrubyonrails.de,2012://20.1751</id>

    <published>2012-05-25T06:43:42Z</published>
    <updated>2012-05-25T07:06:57Z</updated>

    <summary>JRuby-Core-Team wechselt zu Red Hat Seit ein paar Tagen ist die Neuigkeit bekannt: Charles Nutter und Tom Enebo bestätigten auf der JRubyConf in Minneapolis ihren Wechsel von Engine Yard zu Red Hat. Beide werden dort wahrscheinlich die Entwicklung von TorqueBox...</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="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jrubyconf" label="JRubyConf" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="redhat" label="Red Hat" 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-Core-Team wechselt zu Red Hat</h4>

<p>
Seit ein paar Tagen ist die Neuigkeit bekannt: Charles Nutter und Tom Enebo bestätigten auf der <a href="http://jrubyconf.com/" target="_blank">JRubyConf</a> in Minneapolis ihren Wechsel  von Engine Yard zu <a href="http://www.redhat.com/"  target="_blank">Red Hat</a>. Beide werden dort wahrscheinlich die Entwicklung von <a href="http://torquebox.org/"  target="_blank">TorqueBox</a> vorantreiben.
</p>
<p>
Die spannende Frage ist: Was bedeutet das für die Weiterentwicklung von JRuby?
</p>
]]>
        
    </content>
</entry>

<entry>
    <title>JRuby 1.7  - Performance Steigerung dank InvokeDynamic</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2012/05/jruby-17---performance-steigerung-dank-invokedynamic.html" />
    <id>tag:www.jrubyonrails.de,2012://20.1750</id>

    <published>2012-05-22T14:45:11Z</published>
    <updated>2012-05-22T14:56:31Z</updated>

    <summary> Die erste JRuby 1.7 Vorabversion ist erschienen. Standard ist nun die Ruby Version 1.9.3 und durch die Nutzung des &quot;InvokeDynamic&quot; Features von Java 7 sind weitere Performancesteigerungen zu erwarten. JRuby 1.7.0.preview1 Außerdem möchten wir noch auf ein weiterführendes, lesenswertes...</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="invokedynamic" label="InvokeDynamic" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="java7" label="Java 7" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby17" label="JRuby 1.7" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>
Die erste JRuby 1.7 Vorabversion ist erschienen. Standard ist nun die Ruby Version 1.9.3 und durch die Nutzung des "InvokeDynamic" Features von Java 7  sind weitere Performancesteigerungen zu erwarten.
</p>
<p>
<a href="http://www.jruby.org/2012/05/21/jruby-1-7-0-preview1" target="_blank" title="JRuby 1.7.0.preview1">JRuby 1.7.0.preview1</a>
</p>
<p>
Außerdem möchten wir noch auf ein weiterführendes, lesenswertes Interview mit Charles Oliver Nutter, einem der JRuby-Kernentwickler hinweisen:
<a href="http://rubysource.com/learning-more-about-jruby-from-charles-nutter/" target="_blank" title="Learning More About JRuby from Charles Nutter">Learning More About JRuby from Charles Nutter</a></br>
</p>
<div class="more_links">Weiterführende Links und Quellen</div>
<a href="http://www.jruby.org/download" target="_blank" title="JRuby Downloadseite">JRuby Downloadseite</a><br/>
<a href="http://it-republik.de/jaxenter/news/Java-7-Evolution-fuer-Java---Revolution-fuer-die-JVM-059978.html" target="_blank" title="Java 7: Evolution für Java - Revolution für die JVM">Java 7: Evolution für Java - Revolution für die JVM</a></br>
<a href="http://java.sun.com/developer/technicalArticles/DynTypeLang/" target="_blank" title="New JDK 7 Feature: Support for Dynamically Typed Languages in the Java Virtual Machine">New JDK 7 Feature: Support for Dynamically Typed Languages in the Java Virtual Machine</a>]]>
        
    </content>
</entry>

<entry>
    <title>Singletons demystifiziert (Oder: Was beim Caching von Übersetzungen passieren kann)</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2012/04/singletons-demystifiziert.html" />
    <id>tag:www.jrubyonrails.de,2012://20.1746</id>

    <published>2012-04-05T12:47:02Z</published>
    <updated>2012-04-05T12:53:57Z</updated>

    <summary> Was sind eigentlich Singletons in Ruby und was hat es mit der Meldung &quot;singleton can&apos;t be dumped&quot; auf sich, auf die man als Rails-Entwickler hin und wieder stößt? Zunächst einmal: Der Begriff Singleton, so wie ihn Ruby benutzt, hat...</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="rubyrailsgems" label="Ruby Rails Gems" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>
Was sind eigentlich Singletons in Ruby und was hat es mit der Meldung "singleton can't be dumped" auf sich, auf die man als Rails-Entwickler hin
und wieder stößt?
</p>
<p>
Zunächst einmal: Der Begriff Singleton, so wie ihn Ruby benutzt, hat nicht viel mit dem Design-Pattern zu tun, das man kennt.
Es geht viel mehr um Klassen, die objektspezifisch sind. Also alle Klassen, die man mit dynamischen Methoden wie <code>instance_eval</code> verändert hat.
Eine sehr gute Zusammenfassung auf englisch bietet <a target="_blank" href="http://www.devalot.com/articles/2008/09/ruby-singleton">dieser Artikel</a>,
auch wenn er schon etwas älter ist.
</p>]]>
        <![CDATA[<p>
Interessant wird diese Thematik dann, wenn man Caching mit <a href="http://memcached.org/" href="_blank">memcached</a> betreibt. Dort werden die Daten mittels <code>Marshal.dump()</code> in einen String
verwandelt. Der Trick dabei ist, dass sämtliche Informationen zu einem Objekt - also auch alle Assoziationen usw. - in diesen String einfließen.
Beim späteren Wiederherstellen des Cache-Inhalts mittels <code>Marshal.load()</code> wird aus dem String das komplette Objekt erzeugt.
Dazu muss aber klar sein, wie die Klasse aussieht. In diesem Beispiel funktioniert das nicht:
<pre class="brush: ruby; gutter: true">
obj = Object.new
def obj.own_method
  puts "test"
end
Marshal.dump(obj) # TypeError
</pre>    
<code>Marshal.load()</code> hätte später keine Chance, <code>obj</code> wieder herzustellen, da die Information über <code>own_method</code> verloren wäre.
</p>
<p>
Übrigens: Hier liegt auch ein Unterschied in <code>clone</code> und <code>dup</code>. Beide erzeugen eine "Shallow copy", in denen Instanz-Variablen
übernommen, deren Objekte aber nicht selbst kopiert werden. Während <code>clone</code> aber auch Singleton-Methoden kopiert, erzeugt <code>dup</code>
im Prinzip nur ein neues Objekt mittels seines Konstruktors. Dabei werden die Singleton-Methoden nicht übernommen.
</p>
<p>
	Leider wird man oft, wenn man auf diesen Fehler trifft, gar nicht selbst "schuld" sein, sondern muss den Fehler tiefer im Framework suchen.
	Und das kostet Zeit! Hilfreich ist es, zunächst einmal herauszufinden, was für ein Objekt die Ursache ist. 
	Hier können temporäre Logger-Ausgaben an der richtigen Stelle helfen. Anhand des Stacktraces findet man leicht die Stelle, an 
	der <code>Marshal.dump()</code> aufgerufen wird.
	Wichtig: Lokal haben wir oft mit Memory-Cache getestet, wo der Fehler nicht auftritt. Will man die Stelle finden, an der die Exception auftritt,
	muss man auch tatsächlich memcached nutzen.
<pre class="brush: ruby; gutter: true">
# in memcache-client-1.8.5/lib/memcache.rb, Zeile 357,
# in anderen Versionen ähnlich
def set(key, value, expiry = 0, raw = false)
	raise MemCacheError, "Update of readonly cache" if @readonly
	
	Rails.logger.info value.inspect # Gibt uns nähere Informationen über das Objekt
	Rails.logger.info value.singleton_methods # Falls es ein Singleton ist, 
	                                          # bekommen wir hier alle Methoden geliefert,
	                                          # die dynamisch deklariert wurden
	Rails.logger.info value.instance_variables.inspect # Zeigt Details aller Instanz-
	                                                   # Variablen an (von denen auch 
	                                                   # welche Singletons sein können).
	Rails.logger.info caller(10) # Zeigt einen Stacktrace an, 
	                             # wobei die ersten 10 Zeilen abgeschnitten werden
	value = Marshal.dump value unless raw
	...
</pre>	
</p>


<p>
<b>Beispiel:</b><br/><br/>
Wir hatten ein solches Phänomen mit dieser Infrastruktur:
<ul>
	<li>Rails 2.3.5</li>
	<li><a href="https://github.com/TylerRick/has_and_belongs_to_many_with_deferred_save/" target="_blank">has_and_belongs_to_many_with_deferred_save</a> - ein 
		Plugin, durch das HABTM-Beziehungen genau wie Attribute erst gespeichert werden, wenn man das
	Hauptobjekt speichert</li> 	
	<li><a href="https://github.com/svenfuchs/i18n" target="_blank">i18n</a> mit dem ActiveRecord-Backend und aktiviertem I18n-Cache.</li>
</ul>	

Nun haben wir folgenden einfachen Code:
<pre class="brush: ruby; gutter: true">
# in config/locales/de.yml
de:
  activerecord:
    errors:
      messages:
        blank: muss ausgefüllt werden

# in app/models/some_model.rb
class SomeModel < ActiveRecord::Base

  has_and_belongs_to_many_with_deferred_save :multi

  validate :presence_of_multi

  def presence_of_multi
    errors.add_on_blank(:multi)
  end
end

obj = SomeModel.new
obj.save # => false
obj.errors.full_messages # => TypeError: singleton can't be dumped
</pre>

Was passiert?<br/>
Rails stellt fest, dass <code>obj.multi</code> leer ist und sucht eine Fehlermeldung. Zunächst vermutet es diese aber im Scope 
"de.activerecord.errors.models.some_model.attributes.multi.blank". Dort wird es nicht fündig und arbeitet sich weiter hoch,
bis es schlussendlich die "blank"-Übersetzung am gewünschten Ort findet.
</p>
<p>
Aber sobald es die erste Übersetzung nicht findet, erzeugt Rails ein MissingTranslationData-Objekt. Und dieses wird durch den modularen Aufbau des
I18n-ChainBackends zunächst in den Cache geschrieben.
Das MissingTranslationData-Objekt enthält u.a. eine Referenz auf das zu validierende Element - unsere <code>multi</code>-Liste.
Diese ist aber nur dem Anschein nach ein Array. In Wirklichkeit ist es ein Proxy-Objekt, welches durch unser Plugin mit einigen
zusätzlichen Singleton-Methoden versehen wurde.
</p>
<p>
Um das Problem zu umgehen, gibt es einige Ansätze, aber alle sind für größere Projekte nicht umsetzbar und stellen 
eben keine richtige Lösung dar. Wirklich gelöst werden kann dies nur, indem entweder das I18n-Backend (Warum werden
Zwischenergebnisse in den Cache geschrieben?) oder das Plugin (braucht es die Singleton-Methoden?) geändert wird.
</p>
<p> Ich habe mich für letzteres entschieden und das Gem geforkt. Das neue Gem <a href="https://github.com/MartinKoerner/deferred_associations", target="_blank">deferred_associations</a>
	vermeidet Singletons, indem es ein Proxy-Array definiert, welches sich im Prinzip genauso verhält, wie die Singleton-Instanzen des alten Gems. Wie der Name vermuten lässt, funktioniert
	das Prinzip nun auch mit "has_many"-Beziehungen.
	Und zusätzlich wurde eine längst überfällige Unterstützung für Rails3 eingebaut.
</p>
<p><b>Fazit:</b> Bevor man Singleton-Methoden benutzt, sollte man sich genau überlegen, ob das notwendig ist. Insbesondere bei Objekten, die vom Anwender einer API verwendet
	werden, sollte man darauf verzichten, Objekte derart dynamisch zu ändern - man weiß nie, was der Anwender mit ihnen alles machen will.
</p>]]>
    </content>
</entry>

<entry>
    <title>Rails in Dresden - regionaler Austausch?</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2012/03/rails-in-dresden---regionaler-austausch.html" />
    <id>tag:www.jrubyonrails.de,2012://20.1745</id>

    <published>2012-03-20T13:49:31Z</published>
    <updated>2012-03-21T07:14:55Z</updated>

    <summary>Wir arbeiten nun schon einige Jahre in diversen Projekten in Dresden, aber auch überregional, mit Rails auf Basis von Ruby und JRuby und verfügen dadurch über einen großen Rails-Erfahrungsschatz. Wir sind uns sicher, dass das auch anderen Unternehmen im Raum...</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="dresden" label="Dresden" 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[Wir arbeiten nun schon einige Jahre in diversen Projekten in Dresden, aber auch überregional, mit Rails auf Basis von Ruby und JRuby und verfügen dadurch über einen großen Rails-Erfahrungsschatz.
Wir sind uns sicher, dass das auch anderen Unternehmen im Raum Dresden so geht und möchten daher gerne einen Austausch initiieren, von dem alle profitieren können.
In einem ersten Treffen laden wir am 29.03.2012 in den CoWorking-Space <a href="http://www.cofab.de">CoFab</a> ein, um ergebnisoffen über mögliche Formen eines solchen Austauschs zu diskutieren. Denkbar ist dabei alles von "RailsUserGroup Dresden" bis hin zu einem Dresdner Rails-Stammtisch.

Weitere Infos gibt es auf der Website der ObjectFab GmbH unter der Rubrik <a href="http://www.objectfab.de/news/2012/03/rails-dresden---usergroup-stammtisch.html" target="_blank">Aktuelles - Rails Dresden</a>.]]>
        
    </content>
</entry>

<entry>
    <title>JRuby Deployment - skalierbare Anwendungen auf der JVM</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2012/03/jruby-deployment---skalierbare-anwendungen-auf-der-jvm.html" />
    <id>tag:www.jrubyonrails.de,2012://20.1743</id>

    <published>2012-03-14T14:03:20Z</published>
    <updated>2012-03-28T09:07:21Z</updated>

    <summary>In der Ruby on Rails Welt ist der Phusion Passenger mittlerweile das Mittel der Wahl. Damit wird das Deployment der Anwendung in einem Apache oder Nignx Server zum Kinderspiel. In der JRuby-Welt sieht das Deployment etwas anders aus. Man benötigt...</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="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="deployment" label="Deployment" 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="jvm" label="JVM" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="trinidad" label="Trinidad" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>In der Ruby on Rails Welt ist der <a href="http://www.modrails.com/" target="_blank">Phusion Passenger</a> mittlerweile das Mittel der Wahl. Damit wird das Deployment der Anwendung in einem <a href="http://httpd.apache.org/" target="_blank">Apache</a> oder <a href="http://wiki.nginx.org/NginxDe" target="_blank">Nignx</a> Server zum Kinderspiel.
In der JRuby-Welt sieht das Deployment etwas anders aus. Man benötigt eine JVM,  in der die Anwendung laufen kann.
</p>

]]>
        <![CDATA[<p>
Lange Zeit war hier der Ansatz, mittels Warbler die komplette JRuby on Rails Anwendung in eine Container-Datei zu packen (*.war), und diese wie eine normale Java-Anwendung auf den Server (Tomcat, JBoss, Jetty, Glassfish,...) zu deployen.
</p>
<p>
Doch in letzter Zeit gibt es auch hier neue, einfachere Deployment-Möglichkeiten. So bietet z.B. das Gem <a href="https://github.com/trinidad/trinidad" target="_blank">Trinidad</a> eine einfache Möglichkeit einen Server zu starten, ohne die Anwendung erst verpacken zu müssen. Das kommt dem Deployment einer reinen Ruby-Anwendung schon näher. 
Eine Aufzählung verschiedenster JRuby-Server bietet Nick Sieger in seinem Artikel <a href="http://www.engineyard.com/blog/2011/taking-stock-jruby-web-servers/" target="_blank">Taking Stock of JRuby Web Servers</a>.
</p>
<p>
Zur weiteren Vertiefung bietet sich das bald erscheinende Buch <a href="http://pragprog.com/book/jkdepj/deploying-with-jruby" target="_blank">Deploying with JRuby: Deliver Scalable Web Apps using the JVM</a> von Joe Kutner an.
</p>
<p>Zitat:<br/>
<em><code>Deploy using the JVM's high performance while building your apps in the language you love. JRuby is a fast, scalable, and powerful JVM language with all the benefits of a traditional Ruby environment. See how to consolidate the many moving parts of an MRI-based Ruby deployment onto a single JVM process. You'll learn how to port a Rails application to JRuby, get it into production, and keep it running. Deploying with JRuby is the missing link between enjoying JRuby and using it in the real world to build high-performance, scalable applications.</code></em>
</p>
 <p>
Es erscheint im Verlag <a href="http://pragprog.com/" target="_blank">The Pragmatic Bookshelf</a>. Die Verlagsgründer haben auch den agilen Klassiker <a href="http://www.pragmatischprogrammieren.de/pragprog/index.html" target="_blank">Der Pragmatische Programmierer</a> geschrieben.
Joe Kutner beschreibt darin
</p>
<ul>
	<li>wie man eine Rails-Anwendung nach JRuby portiert</li>
	<li> und erläutert drei verschiedene Wege für das JRuby-Deployment - <a href="http://caldersphere.rubyforge.org/warbler/" target="_blank">Warbler</a>,  <a href="https://github.com/trinidad/trinidad" target="_blank">Trinidad</a> und  <a href="http://torquebox.org/" target="_blank">TorqueBox</a>
        </li>
</ul>
<p>
und zeigt in einem <a href="http://youtu.be/C2gCi5DS_I8" target="_blank">Video</a>, wie einfach das Deployment mittels Trinidad ist.
</p>
<p>
Zusätzlich werden weitere Informationen auf dem <a href="http://deployingjruby.blogspot.com/" target="_blank">Blog - Deploying with JRuby</a> gesammelt.
</p>
<p>
<b>Update:</b> Ein Vortrag zum Buch kann man sich <a href="http://deployingjruby.blogspot.com/2012/03/talkin-bout-jruby.html" target="_blank">hier</a> ansehen.
</p>
]]>
    </content>
</entry>

<entry>
    <title>JRuby bei der Java User Group Saxony</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2012/03/jruby-jug-saxony.html" />
    <id>tag:www.jrubyonrails.de,2012://20.1740</id>

    <published>2012-03-01T11:53:55Z</published>
    <updated>2012-03-15T12:50:41Z</updated>

    <summary> Beim Treffen der JUG Saxony werden wir am 15.03.2012 JRuby vorstellen. Die Vorteile der schlanken Ruby-Syntax werden dabei genauso beleuchtet wie die einfache Integration von Java-Bibliotheken. Und natürlich darf auch eine Vorstellung von Rails bei so einem Vortrag nicht...</summary>
    <author>
        <name>Martin</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
    <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="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>
Beim Treffen der JUG Saxony werden wir am 15.03.2012 JRuby vorstellen. Die Vorteile der schlanken Ruby-Syntax werden dabei genauso beleuchtet wie die einfache Integration von Java-Bibliotheken. Und natürlich darf auch eine Vorstellung von Rails bei so einem Vortrag nicht fehlen. Das alles wird auch anhand von Code-Beispielen live demonstriert.<br/>
<a href="http://www.jugsaxony.org/?p=408" target="_blank">Hier</a> gibt's mehr Infos und die Anmeldung.
</p>
<p>
<b>UPDATE:</b> Kaum angekündigt, ist der Raum schon voll. Wir freuen uns über das rege Interesse und bieten den Vortrag nocheinmal am 22.03.2012 an. Unter dem obigen Link findet man nun die Anmeldung für den neuen Termin.
</p>
<p>
<b>UPDATE:</b> Ursprünglich war im ersten Update ein falscher Termin genannt worden. Der 22.03.2012 ist nun aber richtig.
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Continuous Upgrades - Rails und JRuby</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2012/02/continuous-upgrades-rails-und-jruby.html" />
    <id>tag:www.jrubyonrails.de,2012://20.1739</id>

    <published>2012-02-23T09:50:47Z</published>
    <updated>2012-03-20T14:18:29Z</updated>

    <summary>Upgrade der ObjectTime von Rails 2.3.4 zu Rails 3.2.1, sowie JRuby 1.4.0 zu JRuby 1.6.7 Nachdem Rails in der Version 3.2 erschienen ist, haben wir uns dazu entschlossen, auch unsere mit JRuby on Rails erstellte Zeiterfassung auf den neusten technischen...</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="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby167" label="JRuby 1.6.7" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails3" label="Rails 3" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails32" label="Rails 3.2" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="update" label="Update" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="upgrade" label="Upgrade" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<h4 class="blogentry">Upgrade der <a href="http://www.objecttime.de" target="_blank">ObjectTime</a> von Rails 2.3.4 zu Rails 3.2.1, <br/>sowie JRuby 1.4.0 zu JRuby 1.6.7</h4>  
<p>
Nachdem Rails in der Version 3.2 erschienen ist, haben wir uns dazu entschlossen, auch unsere mit JRuby on Rails erstellte <a target="_blank" href="http:www.objecttime.de">Zeiterfassung</a> 
auf den neusten technischen Stand zu bringen.
Denn nur durch regelmäßige Updates aller relevanten Bibliotheken kann man dauerhaft sicherstellen, dass Rails-Anwendungen zuverlässig funktionieren und technisch auf dem neuesten Stand sind.
</p>
<p>
Und da sich gerade beim Schritt von Rails 2 zu Rails 3 im Rails-Framework einiges unter der Haube verändert hat (<a target="_blank" href="http://weblog.rubyonrails.org/2010/8/29/rails-3-0-it-s-done">Neuerungen im Rails 3</a>), z.B.
</p>
<ul>
	<li><a target="_blank" href="http://railscasts.com/episodes/205-unobtrusive-javascript">Unobtrusive JavaScript</a></li>
	<li>Verbesserte Sicherheit (<a target="_blank" href="http://yehudakatz.com/2010/02/01/safebuffers-and-rails-3-0/">XSS-Protection</a> ist nun standardmäßig aktiviert)</li>
	<li>neue Query Engine</li>
	<li>vereinfachtes Mailhandling</li>
	<li><a href="http://gembundler.com/" target="_blank">Bundler</a> - Abhängigkeitsmanagment</li>
	
</ul>
<p>
dokumentieren wir hier kurz die beim Upgrade von uns vollzogenen Schritte sowie relevante Stolperfallen.
</p>]]>
        <![CDATA[<h4 class="blogentry">Aktualisierung von JRuby</h4>
<p>
Erster Schritt war die Aktualisierung von JRuby, einfach die neue Version 1.6.7 auf <a href="http://jruby.org/download" target="_blank">jruby.org</a> herunterladen und 
mit dem beiden Gems <code>jruby-openssl</code> und <code>bundler</code> installieren. Easy!
</p>
<h4 class="blogentry">Aktualisierung von Rails</h4>
<p>
Danach erfolgt die Aktualisierung von Rails in drei Schritten.</br> (Hinweis: Es kann nicht schaden, vorher einen Tag in der Versionskontrolle zu setzen!)
</p>
</br>
<p>
<b>1. Von Rails 2.3.4 zu <a target="_blank" href="http://guides.rubyonrails.org/3_0_release_notes.html">Rails 3.0</a></b></br>
Hier kann man sich gut an die 3 Railscasts #255 halten: <a href="http://railscasts.com/episodes/225-upgrading-to-rails-3-part-1" target="_blank">Teil 1</a>, <a href="http://railscasts.com/episodes/225-upgrading-to-rails-3-part-2" target="_blank">Teil 2</a>, <a href="http://railscasts.com/episodes/225-upgrading-to-rails-3-part-3" target="_blank">Teil3</a>
</br>
Kurz zusammengefasst: Mittels des Plugins <a target="_blank" href="https://github.com/rails/rails_upgrade">rails_upgrade</a> überprüft man was angepasst wird und kann sich ein Backup von anzupassenden Dateien erstellen lassen.
</br>
Nachdem im Projektverzeichnis ein Gemfile mit <code>gem 'rails', '3.0.0'</code> vorhanden ist, kann man mit Hilfe von <code>bundle install</code> Rails 3 in die Anwendung bringen.
</br>
Um jetzt den Quellcode auf Rails3 umzustellen führt man folgenden Befehl aus: <code>rails new . -J -d mysql</code>.
Damit erstellt man im aktuellen Projekt ein neues Rails-Projekt auf Basis von Rails 3. Der Parameter -J sorgt dafür, dass kein Prototype installiert wird, 
da wir anschließend in unserem Projekt auf jQuery umsteigen möchten. Der Installer fragt bei jeder vorhandenen Datei nach ob er diese ersetzen darf. 
Man kann sich also spätestens auch jetzt noch bei Bedarf eine Sicherung der Datei anlegen.
</p>	
<p>
Jetzt beginnt der Spaß. Viele der in Rails 2 benutzen Plugins und Gems funktionieren nicht unter Rails 3 und müssen daher ebenfalls aktualisiert werden.
Hier muss man je nach Projekt individuell sehen, ob es eine neue Version gibt oder ob man doch etwas mehr Aufwand zum Umschreiben seines Codes aufwenden muss.
</br>(Hinweis: In Rails 4 werden Plugins nicht mehr unterstützt. Daher ist es jetzt schon ratsam auf Gems umzusteigen.)
</p>
<p>
Außerdem wollen wir ja nun jQuery anstatt Prototyp als Javascript Bibliothek nutzen. Dafür muss man das Gem <a href="https://github.com/rails/jquery-rails" target="_blank">jquery-rails</a> 
im Gemfile eintragen, um jQuery automatisch mit Rails 3 nutzen zu können. Durch die Änderung der Javascript Bibliothek stehen natürlich die Prototyp-Helper in den <code>.rjs</code> 
Templates nicht mehr zur Verfügung. Mit JQuery schreibt man dann eher 
<pre class="brush: javascript; gutter: true">
$('#foo').html("<%= escape_javascript(render "bar") %>"); 	
</pre> in z.B. <code>.js.erb</code> Templates.
<p>
<p>
Damit die Rails Anwendung auch mit JRuby läuft muss man im Gemfile noch folgende Gems eintragen
<pre class="brush: ruby; gutter: true">
# Auszug
source 'http://rubygems.org'

gem 'rails', '3.0.0'

gem 'jruby-openssl',                  '= 0.7.5'
gem 'activerecord-jdbcmysql-adapter', '= 1.2.2'
... 	
</pre>
Rails 3 kommt natürlich mit einer neueren I18n Version. Seit der Version 0.4.0 ist die Syntax der Interpolationen geändert worden. Aus <code>{{}}</code> wird <code>%{}</code>.
</p>
</br>
<p>
<b>2. Von Rails 3.0 zu <a target="_blank" href="http://guides.rubyonrails.org/3_1_release_notes.html">Rails 3.1</a></b></br>
Neu in Rails 3.1 ist die <a target="_blank" href="http://guides.rubyonrails.org/asset_pipeline.html">Asset Pipeline</a> - ein Framework um CSS- und Javascript-Dateien verkleinert, komprimiert und zusammengefügt auszuliefern.
Außerdem kann man in den Assets CoffeScript, Sass oder Erb nutzen.
</p>		
Da es hierzu schon unzählige Tutorials, wird für das Upgrade nur auf einige verweisen:
<p>
<ul>
	<li><a target="_blank" href="http://railscasts.com/episodes/282-upgrading-to-rails-3-1">Railscasts - Upgrading to Rails 3.1</a></li>
	<li><a target="_blank" href="http://webtempest.com/upgrade-rails-3-to-3-1/">Upgrade Rails 3 to 3.1</a></li>
</ul>
<p>
Bei der Asset-Pipeline sind wir dann auf ein Problem gestoßen. Unsere App läuft unter einem context_path z.b. <code>/demo</code>. Wenn man in ein <code>style.css.scss.erb</code> auf ein Bild als <code>background-image</code>
 zugreifen will, soll man nun folgendes schreiben:
<pre class="brush: css; gutter: true">
.css-class {
  background-image: url('<%= asset_path 'bg.png' %>');
 }	
</pre>	
Das liefert nun aber nicht wie erwartet <code>/demo/assets/bg.png</code> sondern <code>/assets/bg.png</code>!
Es scheint ein Problem bei der Erstellung der Rails Assets mittels <code>rake assets::precompile</code> zu sein.<br/>
Die Lösung wird <a href="http://stackoverflow.com/questions/8791862/rails-asset-pipeline-sub-uri-deployment-with-path-prefix-image-tag" target="_blank">hier</a> beschrieben.
Bei <code>rake assets::precompile</code> einfach den context_path mittels <code>RAILS_RELATIVE_URL_ROOT=/demo</code> mitgeben.
</p>
</br>
<p>	
<b>3. Von Rails 3.1 zu <a target="_blank" href="http://guides.rubyonrails.org/3_2_release_notes.html">Rails 3.2</a></b></br>
Die Umstellung auf Rails 3.2 ist nun schnell erledigt. Lediglich im Gemfile, in der development.rb und test.rb sind kleine Anpassungen zu machen.
Welche Neuerungen in der Version enthalten sind, findet man auch in diesem <a href="http://railscasts.com/episodes/318-upgrading-to-rails-3-2" target="_blank">Railscast - Upgrading to Rails 3.2</a>. 
</p>	
</br>
<h4 class="blogentry">Fazit</h4>
<p>
Das JRuby-Upgrade gestaltete sich sehr erfreulicherweise sehr einfach und auch das Zusammenspiel der neuen JRuby-Version mit Rails 3.2.1 klappt hervorragend.
Man sollte nur versuchen seine Anwendungen in kürzeren Zyklen zu aktualisieren, um sie so nah wie möglich auf den neusten Technischen Stand zu halten.</br>
Stichwort: Continuous Upgrades!
</p>]]>
    </content>
</entry>

<entry>
    <title>Laufen Eure JRuby Apps schon mit Ruby 1.9?</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2012/02/laufen-eure-jruby-apps-schon-mit-ruby-19.html" />
    <id>tag:www.jrubyonrails.de,2012://20.1738</id>

    <published>2012-02-09T12:35:05Z</published>
    <updated>2012-02-14T07:57:44Z</updated>

    <summary> Die JRuby Entwicklung geht zügig voran. Das Hauptziel der 1.6.x Serie - der Ruby 1.9 Support - scheint fast vollständig erreicht zu sein. Laut Aussage des Entwicklerteams ist JRuby 1.6.6 das letzte Release der 1.6er-Reihe. Ab Version 1.7 wird...</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="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jruby166" label="JRuby 1.6.6" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby17" label="JRuby 1.7" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby19" label="Ruby 1.9" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>
Die JRuby Entwicklung geht zügig voran. Das Hauptziel der 1.6.x Serie - der Ruby 1.9 Support - scheint fast vollständig erreicht zu sein. Laut Aussage des Entwicklerteams ist <a href="http://www.jruby.org/2012/01/30/jruby-1-6-6.html" target="_blank">JRuby 1.6.6</a> das letzte Release der 1.6er-Reihe.
</p>
<p>
Ab Version 1.7 wird JRuby standardmäßig mit Ruby 1.9 ausgeführt. Also Grund genug, die Anwendungen schrittweise auf Ruby 1.9 umzustellen.
<br/>
Wie sieht es bei Euch mit der Umstellung auf Ruby 1.9 aus?
</p>
<br/>
<p>
Hier noch ein Tipp am Rande: Wer schon immer genauer wissen wollte, wie JRuby die Ruby Funktionalität intern umsetzt, sollte sich diesen Artikel ansehen.
<a href="http://patshaughnessy.net/2012/2/7/journey-to-the-center-of-jruby" target="_blank">Journey to the center of JRuby</a><br/>
Beispielhaft wird die JRuby-Implementierung der String-Klasse, samt der Kompilierung der Java-Klasse gezeigt.
</p>
<p>
<b>Update:</b><br/>
Laut <a href="https://twitter.com/#!/headius/status/169184419389784064" target="_blank">Charles Nutter's Tweet</a> gibt es nun doch noch ein JRuby 1.6.7.
</p>


]]>
        
    </content>
</entry>

<entry>
    <title>Runder Geburtstag</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2012/01/10-jahre-jruby.html" />
    <id>tag:www.jrubyonrails.de,2012://20.1737</id>

    <published>2012-01-26T15:43:26Z</published>
    <updated>2012-01-31T15:56:40Z</updated>

    <summary>10 Jahre ist es nun schon her, dass mit JRuby ein alternativer Interpreter bekannt wurde, der die Einfachheit von Ruby mit der Vielfalt von Java verknüpfte. Grund genug, um es zur Sprache des Monats zu küren, denn in diesen 10...</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="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="java7" label="Java 7" scheme="http://www.sixapart.com/ns/types#tag" />
    <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[<p>10 Jahre ist es nun schon her, dass mit JRuby ein alternativer Interpreter bekannt wurde, der die Einfachheit von Ruby mit der Vielfalt von Java verknüpfte.
Grund genug, um es zur <a href='http://drdobbs.com/jvm/232400456' target='_blank'>Sprache des Monats</a> zu küren, denn in diesen 10 Jahren hat sich viel getan. 
<br/>
Mittlerweile ist JRuby genauso leistungsfähig wie die MRI (oder sogar noch <a href='http://programmingzen.com/2008/12/09/the-great-ruby-shootout-december-2008/' target='_blank'>leistungsfähiger</a>?), unterstützt alle Funktionen, die man als Rails-Entwickler benötigt und hält mit der Entwicklung schritt - JRuby 1.7 unterstützt unter Anderem "InvokeDynamik", welches mit Java 7 in die VM integriert wurde, um Scriptsprachen dynamische Typisierung zu ermöglichen. Dies steigert die Perfomance <a href='http://blog.headius.com/2011/08/jruby-and-java-7-what-to-expect.html' target='_blank'>spürbar</a>.
</p>
<p>
Am 15.03. stellen wir JRuby im Rahmen einer Veranstaltung der <a href='http://www.jugsaxony.org/?p=408' target='_blank'>JUG Saxony</a> vor. Dazu laden wir herzlich in unsere <a href='http://www.cofab.de' target='_blank'>Räume der CoFab</a> ein.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Java schneller als C</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2012/01/java-schneller-als-c.html" />
    <id>tag:www.jrubyonrails.de,2012://20.1735</id>

    <published>2012-01-11T09:58:25Z</published>
    <updated>2012-01-12T15:03:44Z</updated>

    <summary>Ein kleiner Performancetest von Charles Oliver Nutter zeigt Java kann doch mehr als mancher erwartet. Zitat: &quot;Don&apos;t let anyone ever tell you Java is not or cannot be as fast or faster than C.&quot;...</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="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="c" label="C" 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" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Ein kleiner Performancetest von Charles Oliver Nutter zeigt Java kann doch mehr als mancher erwartet.
<br/>
<a href="https://gist.github.com/1590875" target="_blank" title="Don't let anyone ever tell you Java is not or cannot be as fast or faster than C">Zitat: "Don't let anyone ever tell you Java is not or cannot be as fast or faster than C."</a>]]>
        
    </content>
</entry>

<entry>
    <title>JRuby Jam Session</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2011/09/jruby-jam-session.html" />
    <id>tag:www.jrubyonrails.de,2011://20.1731</id>

    <published>2011-09-30T11:14:50Z</published>
    <updated>2011-12-04T16:31:42Z</updated>

    <summary>Für alle Interessierten hier die Links zu einem sehenswerten JRuby Vortrag von Charles Nutter und Nick Sieger - Video (ca. 1h) und die Vortragsfolien. Und einen Blick in die Zukunft von JRuby mit Java 7 kann man hier bekommen 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="Java" 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="ruby" label="Ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="slides" label="Slides" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="video" label="Video" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="vortrag" label="Vortrag" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>Für alle Interessierten hier die Links zu einem sehenswerten JRuby Vortrag von Charles Nutter und  Nick Sieger - <a href="http://vimeo.com/29346522" target="_blank" title="JRuby Jam Session Video">Video</a> (ca. 1h) und die <a href="http://www.slideshare.net/engine_yard/jruby-jam-session" target="_blank" title="JRuby Jam Session Slides">Vortragsfolien</a>.
</p> 
<p>Und einen Blick in die Zukunft von JRuby mit Java 7 kann man hier bekommen 
<a href="http://blog.headius.com/2011/08/jruby-and-java-7-what-to-expect.html" target="_blank" title="JRuby and Java 7: What to Expect ">JRuby and Java 7: What to Expect </a>.
</p> ]]>
        
    </content>
</entry>

<entry>
    <title>Reversible Migrations mit Rails 3.1</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2011/09/reversible-migrations-mit-rails-31.html" />
    <id>tag:www.jrubyonrails.de,2011://20.1729</id>

    <published>2011-09-14T16:30:57Z</published>
    <updated>2011-12-04T16:34:01Z</updated>

    <summary>Wohl jeder Rails-Entwickler wird sich schon einmal darüber geärgert haben, bei Trivial-Migrationen neben dem up auch noch manuell ein down implementieren zu müssen - insbesondere dann, wenn das down nicht mehr macht als ein einfaches remove_column oder rename_table. Rails 3.1...</summary>
    <author>
        <name>Jesko</name>
        <uri>http://www.objectfab.de</uri>
    </author>
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="migrationen" label="Migrationen" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails31" label="Rails 3.1" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>Wohl jeder Rails-Entwickler wird sich schon einmal darüber geärgert haben, bei Trivial-Migrationen neben dem <code>up</code> auch noch manuell ein <code>down</code> implementieren zu müssen - insbesondere dann, wenn das <code>down</code> nicht mehr macht als ein einfaches <code>remove_column</code> oder <code>rename_table</code>.</p>
<p>Rails 3.1 befreit uns von dieser Last.</p>]]>
        <![CDATA[Bei Migrationen, die automatisch umkehrbar sind, muss man nicht mehr manuell das <code>down</code> ausimplementieren. Rails kümmert sich um das Rollback, wenn man in der Migration einfach ein <code>change</code> schreibt:</p>

<pre class="brush: ruby; gutter: true">
class CreateDogs < ActiveRecord::Migration
  def change
    create_table :dogs do |t|
      t.string :name
      t.string :colour
      t.timestamps
    end
  end
end
</pre>

<p>Im obigen Beispiel löscht Rails beim <code>db:rollback</code> automatisch die zuvor angelegte Tabelle <code>dogs</code>.</p>

<p>Lässt sich das <code>down</code> nicht automatisch berechnen, wird beim <code>db:rollback</code> eine IrreversibleMigration geworfen. Die Verwendung von <code>change</code> befreit uns also nicht von der Pflicht, auch das Rollback unserer Migrationen zu testen.</p>]]>
    </content>
</entry>

<entry>
    <title>JRuby - bereit für Rails 3.1?</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2011/09/jruby-bereit-fuer-rails-3-1.html" />
    <id>tag:www.jrubyonrails.de,2011://20.1728</id>

    <published>2011-09-06T08:39:57Z</published>
    <updated>2011-09-09T13:51:05Z</updated>

    <summary>In unseren letzten Projekten konnten wir mit Ruby on Rails 3 wiederholt positive Erfahrungen sammeln. Kürzlich schickten wir dann unser erstes Rails-3-Projekt mit JRuby-1.6.3 auf den Weg. Ein Erfahrungsbericht......</summary>
    <author>
        <name>Jesko</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="activerecord" label="ActiveRecord" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jdbcadapter" label="JDBC-Adapter" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby163" label="JRuby 1.6.3" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails30" label="Rails 3.0" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails31" label="Rails 3.1" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>In unseren letzten Projekten konnten wir mit Ruby on Rails 3 wiederholt positive Erfahrungen sammeln. Kürzlich schickten wir dann unser erstes Rails-3-Projekt mit JRuby-1.6.3 auf den Weg. Ein Erfahrungsbericht...
</p>]]>
        <![CDATA[
<p>
 Da die Veröffentlichung von Rails 3.1 in's Haus stand, starteten wir unser Projekt mit dem neuesten Releasekandidaten Rails 3.1.0-rc6, um dann zeitnah auf die finale Version wechseln zu können.</p>
<p>
Gleich zu Beginn stellte sich jedoch heraus, dass der activerecord-jdbcmysql-adapter in der neuesten Version 1.1.3 noch nicht mit Rails 3.1 kompatibel ist. Ein korrektes Handling von Arel::InsertManager-Instanzen bei SQL-Inserts musste durch einen MonkeyPatch erwirkt werden. Nach der Behebung dieses Problems warf ActiveRecord einen ArgumentError, der offensichtlich spezifisch beim Zusammenspiel von activerecord-3.1.0 und activerecord-jdbc-adapter-1.1.3 auftritt.
</p>
<p>
An diesem Punkt entschieden wir uns kurzfristig, auf die stabile Version von Rails 3.0 zu wechseln. Diese Entscheidung erwies sich als richtig, da auf dieser Basis das Grundgerüst unserer Anwendung in kürzester Zeit stand und die Anwendungsentwicklung zügig Fahrt aufnehmen konnte. Die Einbindung unserer MySql-Datenbanken auf Entwicklungs- und Testservern funktionierte problemlos und auch die Konfiguration des Bundlers auf unserem Linux-BuildServer verlief erfolgreich.
</p>
<p>
Am 31.08.2011 ist nun Rails 3.1 veröffentlicht worden. Unsere jüngsten JRuby-Projekte werden wir auf diese Version updaten, sobald eine für Rails 3.1 angepasste Version vom activerecord-jdbc-adapter vorliegt.
</p>
<p>
Wir halten Euch auf dem Laufenden!
</p>

<div class="more_links">Weiterführende Links und Quellen</div>
<a href="http://www.jruby.org/download" target="_blank" title="JRuby Downloadseite">JRuby Downloadseite</a><br/>
<a href="https://github.com/nicksieger/activerecord-jdbc-adapter/issues/86" target="_blank" title="activerecord-jdbc-adapter Bugreport">activerecord-jdbc-adapter Bugreport #86</a><br/>
<a href="http://guides.rubyonrails.org/3_1_release_notes.html" target="_blank" title="Rails 3.1 Release Notes">Rails 3.1 Release Notes</a><br/>]]>
    </content>
</entry>

<entry>
    <title>JRuby 1.6.3 erschienen</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2011/07/jruby-163-erschienen.html" />
    <id>tag:www.jrubyonrails.de,2011://20.1727</id>

    <published>2011-07-11T06:43:05Z</published>
    <updated>2011-09-06T08:52:29Z</updated>

    <summary>Seit dem 7. Juli gibt es JRuby in der Version 1.6.3. Die neue Version erhöht erneut die Kompatibilität zu Ruby 1.9 und die Performance bei der Ruby-Objekt-Konstruktion. Weiterhin wurden die Windows-Unterstützung verbessert und 39 weitere Probleme behoben (siehe Release Notes)....</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="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jruby163" label="JRuby 1.6.3" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="Ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby19" label="Ruby 1.9" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="windows" label="Windows" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>Seit dem 7. Juli gibt es JRuby in der Version 1.6.3. Die neue Version erhöht erneut die Kompatibilität zu Ruby 1.9 und die Performance bei der Ruby-Objekt-Konstruktion. 
Weiterhin wurden die Windows-Unterstützung verbessert und 39 weitere Probleme behoben (siehe Release Notes).</p>
<div class="more_links">Weiterführende Links und Quellen</div>
<a href="http://www.jruby.org/download" target="_blank" title="JRuby Downloadseite">JRuby Downloadseite</a><br/>
<a href="http://jruby.org/2011/07/07/jruby-1-6-3.html" target="_blank" title="JRuby 1.6.3 ">Release Notes von JRuby 1.6.3 </a>]]>
        
    </content>
</entry>

<entry>
    <title>JRuby 1.6 ist da</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2011/03/jruby-16-ist-da.html" />
    <id>tag:www.jrubyonrails.de,2011://20.1718</id>

    <published>2011-03-16T20:51:29Z</published>
    <updated>2011-03-17T09:09:19Z</updated>

    <summary>Nun ist es soweit JRuby 1.6 ist da. Nach etwas mehr als einem Dreivierteljahr ist das nach Aussage der Entwickler &quot;größten JRuby-Release aller Zeiten&quot; mit über 2500 Commits und 420 Issues seit JRuby 1.5 fertig gestellt. Die Neuerungen wurden ja...</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="jruby16" label="JRuby 1.6" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="profiling" label="Profiling" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby19" label="Ruby 1.9" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="windows" label="Windows" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<p>Nun ist es soweit JRuby 1.6 ist da. Nach etwas mehr als einem Dreivierteljahr ist das nach Aussage der Entwickler "größten JRuby-Release aller Zeiten" mit über 2500 Commits und 420 Issues seit JRuby 1.5 fertig gestellt.
</p>
<p>
Die Neuerungen wurden ja schon im letzten Artikel <a href="http://www.jrubyonrails.de/2011/03/jruby-160.html" title="JRuby 1.6.0 kommt">JRuby 1.6.0 kommt</a> erläutert.
</p>
<p>
Von Stillstand in der JRuby Entwicklung kann aber nach diesem Release nicht die Rede sein. Einen interessanten Ausblick auf die weitere JRuby Entwicklung (JRuby 1.7) gibt Charles Oliver Nutter in seinem Blogeintrag <a href="http://www.engineyard.com/blog/2011/jruby-1-6-released-now-what/" target="_blank" title="JRuby 1.6 Released...Now What?">JRuby 1.6 Released...Now What?</a>
</p>
<div class="more_links">Weiterführende Links und Quellen</div>
<a href="http://www.jruby.org/download" target="_blank" title="JRuby Downloadseite">JRuby Downloadseite</a><br/>
<a href="http://jruby.org/2011/03/15/jruby-1-6-0.html" target="_blank" title="JRuby 1.6.0 ">Release Notes von JRuby 1.6.0 </a>]]>
        
    </content>
</entry>

<entry>
    <title>JRuby 1.6.0 kommt</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2011/03/jruby-160.html" />
    <id>tag:www.jrubyonrails.de,2011://20.1716</id>

    <published>2011-03-08T13:19:51Z</published>
    <updated>2011-03-09T15:42:59Z</updated>

    <summary>Soeben hat das JRuby-Team mit JRuby 1.6.0.RC3 den dritten und letzten Releasekandidaten von JRuby 1.6.0 veröffentlicht. Das Entwicklerteam spricht von dem &quot;größten JRuby-Release aller Zeiten&quot;....</summary>
    <author>
        <name>Jesko</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="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="jruby16" label="JRuby 1.6" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="profiling" label="Profiling" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rc3" label="RC3" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="releasecandidate" label="Release Candidate" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby19" label="Ruby 1.9" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="windows" label="Windows" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        Soeben hat das JRuby-Team mit JRuby 1.6.0.RC3 den dritten und letzten Releasekandidaten von JRuby 1.6.0 veröffentlicht. Das Entwicklerteam spricht von dem &quot;größten JRuby-Release aller Zeiten&quot;.
        <![CDATA[<h3>Das gibt's Neues</h3>
Als wesentliche Neuerung ist zunächst die nun fast vollständige Unterstützung von Ruby 1.9.2 zu nennen, der aktuellsten stabilen Ruby-Version.  Zum Umschalten muss das Kompatibilitäts-Flag mit <code>jruby --1.9</code> gesetzt werden. Damit können JRuby-Entwickler jetzt von allen Vorteilen profitieren, die Ruby 1.9 mit sich bringt, u.A. dem Unicode-Support für internationalisierte Anwendungen und der Unterstützung für IPv6.
<br/><br/>
Mit den letzten drei Release-Kandidaten auf dem Weg zu JRuby 1.6.0 ist zudem die Performanz und Stabilität von Ruby-Methodenaufrufen weiter verbessert worden. Ein Blick in die <a href="http://jruby.org/2011/03/08/jruby-1-6-0-rc3" target="_blank" title="JRuby 1.6.0 RC3 Release Notes">Release Notes von JRuby 1.6.0 RC3</a> zeigt, wie viele neue Features und Issue Fixes alleine seit dem RC2 implementiert wurden.

<h3>Verbessertes Memory Profiling</h3>
Bei JRuby-basierten Projekten profitieren Entwickler ja grundsätzlich davon, auf die gesamte Palette verfügbarer JVM Tools zurückgreifen zu können, so auch auf bestehende Java Profiler. So konnten wir beispielsweise den von einem unserer Kollegen entwickelten <a href="http://www.jb2works.com/" target="_blank" title="Java Reference Scanner">Java Reference Scanner</a> problemlos einsetzen, um Speicheranalysen unserer JRuby-Anwendungen durchzuführen und Memory Leaks vorzubeugen. Mit JRuby 1.5.6 wurden JRuby-Objekte dabei jedoch nur als Instanzen der Klasse <code>org.jruby.RubyObject</code> ausgewiesen.
<br/><br/>
Richtig aussagekräftig ist das Profiling jetzt mit JRuby 1.6 geworden: Per Flag <code>-J-Djruby.reify.classes=true</code> kann JRuby nun angewiesen werden, für die Ruby-Klassen gleichnamige JVM Klassen anzulegen. Haben wir bspw. eine Ruby-Klasse <code>User</code> angelegt, erscheint diese im Profiler nicht mehr länger als <code>org.jruby.RubyObject</code>, sondern als <code>ruby.User</code>. So machen Speicheranalysen Spaß!
<br/><br/>
Auch in puncto Kommandozeilen-Profiling hat sich etwas getan. Seit der Version 1.5.6 bietet JRuby bereits einen "flat profiler", um ein einfaches Profiling der Code-Ausführzeiten durchzuführen. Mit JRuby 1.6 kommt ein neuer "graph profiler" hinzu, der eine detailliertere Aufschlüsselung von Ausführzeiten nach Methodenaufrufen ermöglicht - ebenfalls direkt auf der Kommandozeile.

<h3>Willkommen Windows-Welt!</h3>
Wer plattformübergreifende Anwendungen entwickelt, sollte mit den entsprechenden Zielplattformen vertraut sein und die Anwendungen auf allen relevanten Plattformen testen. Aber auch die Anwendungsentwicklung in heterogenen Entwicklungsumgebungen hat sich bewährt. So kommen in unserem Team neben verschiedenen Linux Distributionen und Mac OS X auch die unterschiedlichsten Windows Betriebssysteme zum Einsatz. 
<br/><br/>
Mit der Version 1.6 erheben nun auch die JRuby-Entwickler Windows zur "primary supported platform", mit dem Ziel, zum Release einen grünen Ampelstatus auf dem Continuous Integration Server für das JRuby-Windows-Projekt sicherzustellen. Den aktuellen Ampelstatus von JRuby kann man übrigens unter <a href="http://ci.jruby.org/" target="_blank" title="Jenkins Continuous Integration Server">ci.jruby.org</a> einsehen. Windows-Nutzer werden außerdem mit einem <a href="http://www.jruby.org/download/" title="JRuby Windows-Installer" target="_blank">Installer für JRuby</a> verwöhnt, der im Zuge der Installation auch den JRuby-PATH korrekt setzt und ggf. eine JVM installiert.

<h3>Weitere Neuerungen</h3>
Mit dem neuen JRuby-Release gibt es nun auch experimentelle Unterstützung für C Erweiterungen auf Basis von Rubys C API. Weiterhin wurde <code>RubyGems</code> aktualisiert und es gab einige gem-Anpassungen, bspw. werden <code>rspec</code> und <code>ruby-debug</code> nicht mehr im Bundle ausgeliefert. Letztere können jetzt bei Bedarf separat als gems installiert werden.
<br/><br/>
Alles in Allem ist JRuby 1.6 ein großer Schritt nach vorn. Wir freuen uns schon jetzt auf unsere ersten Projekte mit dem anstehenden 1.6er-Release.
<br/><br/>
<div class="more_links">Weiterführende Links und Quellen</div>
<a href="http://www.jruby.org/download" target="_blank" title="JRuby Downloadseite">JRuby Downloadseite</a><br/>
<a href="http://jruby.org/2011/03/08/jruby-1-6-0-rc3" target="_blank" title="JRuby 1.6.0 RC3 Release Notes">Release Notes von JRuby 1.6.0 RC3</a><br/>
<a href="http://blog.headius.com/2011/01/flat-and-graph-profiles-for-jruby-16.html" target="_blank" title="Flat and Graph Profiles for JRuby 1.6">Flat and Graph Profiles for JRuby 1.6</a>]]>
    </content>
</entry>

<entry>
    <title>save ist nicht kaputt!</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2010/09/save-ist-nicht-kaputt.html" />
    <id>tag:www.jrubyonrails.de,2010://20.1707</id>

    <published>2010-09-17T08:45:04Z</published>
    <updated>2010-09-24T05:35:44Z</updated>

    <summary>Wenn man seit mehreren Jahren mit Rails entwickelt, denkt man irgendwann, das Framework auch in Details zu kennen. Umso erstaunter waren wir, als wir in einem Test auf ein merkwürdiges Problem stießen, welches uns einige Stunden Fehlersuche beschert hat. Ziemlich...</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="activerecord" label="ActiveRecord" 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[Wenn man seit mehreren Jahren mit Rails entwickelt, denkt man irgendwann, das Framework auch in Details zu kennen.
Umso erstaunter waren wir, als wir in einem Test auf ein merkwürdiges Problem stießen, welches uns einige Stunden Fehlersuche beschert hat. Ziemlich schnell merkten wir: <code>save</code> von <code>ActiveRecord</code> funktionierte nicht so, wie erwartet. ]]>
        <![CDATA[Nach anfänglichem Unglauben (fühlten wir uns doch an 'Select Isn't Broken' aus dem <a href='http://pragprog.com/the-pragmatic-programmer/extracts/tips' target='_blank'>Pragmatischen Programmierer</a> erinnert) konnten wir es auf folgenden minimalen Spec runterbrechen:
<pre class="brush: ruby; gutter: true">
describe "FailingExample" do
  class Person &lt; ActiveRecord::Base
    belongs_to :address
  end
 
  class Address < ActiveRecord::Base
  end

  it 'should save object or id' do
    address = Adress.create
    person  = Person.create
    person.address = address
    person.save!
    person.address_id.should == address.id

    new_address = Adress.create
    person.address_id = new_address.id
    person.save!
      
    person.address_id.should == new_address.id # this will fail
  end
end
</pre>
Der Haken liegt in der gleichzeitigen Verwendung der Id- und Objekt-Setter.
Beim Speichern fragt Rails alle <code>belongs_to</code>-Beziehungen ab, ob sie sich geändert haben. Haben Sie sich geändert, wird ihre Id in das Objekt geschrieben. Falls man die Id selbst geändert hat, wird die eigene Änderung so wieder rückgängig gemacht.
Das Problem ist nun, dass auch beim zweiten <code>save!</code>-Aufruf noch <code>person.address.updated? == true</code> gilt, wodurch die <code>address.id</code> wieder nach <code>person.address_id</code> geschrieben wird.
<br/><br/>
Interessanterweise tritt dieser Fall offensichtlich sehr selten in Rails-Anwendungen auf, sonst wären wir ja schon früher darauf gestoßen. Entweder möchte man ein Objekt möglichst generisch mit Formular-Daten befüllen und nutzt <code>person.attributes = {...address_id => 42...}</code>, oder man hat eigene Anwendungslogik, die die Objekt-Setter benutzt. Man nutzt aber selten beide Varianten gleichzeitig in einem Request.
Genau das passiert nun aber häufig in Tests/Specs. Wir nutzen <a href='http://github.com/thoughtbot/factory_girl' target='_blank'>FactoryGirl</a>, um uns Testobjekte inkl. Objekt-Geflecht aufzubauen. Hier ist es schnell passiert, dass man in der Factory Objekte setzt und direkt im Test Ids benutzt.
<br/><br/>
Die prinzipielle Lösung ist einfach: Ein <code>person.reload</code> hinter das erste <code>person.save!</code> bewirkt Wunder. 
<br/><br/>
Nun wollen wir uns als Entwickler nicht zumuten, uns an Regeln zu halten wie "Wann immer du einen Objekt-Setter benutzt und anschließend speicherst, musst du einen reload machen". Zumal es in vielen Fällen offensichtlich nicht benötigt wird. Ein Versuch, uns stattdessen automatisch darauf hinweisen zu lassen, wenn man zwei konkurrierende Änderungen gemacht hat, ist folgender before_filter:
<pre class="brush: ruby; gutter: true">
module ActiveRecord
  class Base
    # has to run before all other filters
    before_save :ensure_association_consistency
    def ensure_association_consistency
      reflections = self.class.reflections
      reflections.each do |name, reflection|
        if reflection.macro == :belongs_to
          association = self.send(name)
          prim_key    = reflection.primary_key_name.to_s
          if self.changes.include?(prim_key) && (association.present? && association.updated?)
            if association.id!=self.send(prim_key)
              raise "Association #{name} was set with #{prim_key}=#{self.changes[prim_key][1]} and #{name}.id=#{association.send :id} on object #{self}"
            end
          end
        end
      end if reflections.present?

      true
    end
  end
end
</pre>

Er überprüft bei jedem Save, ob sich die Id einer <code>belongs-to</code>-Beziehung geändert hat. Wenn dem so ist und die Assoziation sich ebenfalls geändert hat, wird eine Exception geworfen. So bekommt man wenigstens im Test mit, dass hier ein Sonderfall vorliegt.
<br/><br/>
Diese Überprüfung hat uns zumindest in unseren Specs, die mit FactoryGirl arbeiten, einige Schwachpunkte aufgezeigt. Perfekt ist sie allerdings nicht. Folgender Spec läuft durch, obwohl man eine konkurrierende Änderung macht:
<pre class="brush: ruby; gutter: true">
  it 'should delete instance' do
    person = Person.find_first_with_existing_address
    person.address_id = 99 # other address_id
    person.address = nil
    person.save!
    person.address_id.should be_nil # object getter will win
  end
</pre>
Der <code>nil</code>-Setter setzt die Id sofort selbst um und die Assoziation selbst ist nicht mehr vorhanden.
<br/><br/>
Dieses "Feature" ist übrigens schon seit <a href='https://rails.lighthouseapp.com/projects/8994/tickets/142-patch-belongs_to-association-not-updated-when-assigning-to-foreign-key' target='_blank'>längerem</a> bekannt. Eine Behebung klingt zunächst ziemlich simpel, weswegen sich auch schon einige Entwickler daran versucht haben. Bedenkt man aber, dass eine <code>belongs_to</code>-Beziehung auch in einer
<code>has_many :through</code>-Beziehung verwendet werden kann und Änderungen an Ids/Objekten dann über diese Beziehungen verstreut werden müssten, bekommt man schnell Kopfschmerzen. <br/>
Ein kurzer Test zeigte leider, dass das Verhalten auch im vor kurzem erschienenen <a href='http://weblog.rubyonrails.org/2010/8/29/rails-3-0-it-s-done' target='_blank'>Rails 3.0.0</a> nachzustellen ist.]]>
    </content>
</entry>

<entry>
    <title>DNS Probleme bei RubyForge.org</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2010/06/dns-probleme-bei-rubyforgeorg.html" />
    <id>tag:www.jrubyonrails.de,2010://20.1704</id>

    <published>2010-06-09T08:08:02Z</published>
    <updated>2010-06-09T08:16:06Z</updated>

    <summary>Jeder Rails Entwickler kennt RubyForge - und jeder der gerade Gems installieren möchte, wird folgendes Problem festgestellt haben: ERROR: While executing gem ... (Gem::RemoteSourceException) Error fetching remote gem cache: SocketError: getaddrinfo: no address associated with hostname. (http://gems.rubyforge.org/yaml)...</summary>
    <author>
        <name>Paul</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="gems" label="Gems" 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" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[Jeder Rails Entwickler kennt RubyForge - und jeder der gerade Gems installieren möchte, wird folgendes Problem festgestellt haben:

<pre class="brush: text; gutter: true">
ERROR:  While executing gem ... (Gem::RemoteSourceException)
Error fetching remote gem cache: SocketError: getaddrinfo: no address associated with hostname. (http://gems.rubyforge.org/yaml)
</pre>]]>
        <![CDATA[Ursache hierfür sind offensichtlich DNS Probleme bei <a href="http://rubyforge.org">http://rubyforge.org</a>, die mittlerweile jedoch gelöst scheinen. Allerdings kann es unter Umständen etwas dauern, bis alle beteiligten Nameserver wieder auf dem aktuellsten Stand sind. 

Bei uns hat unter Windows folgende Zeile geholfen:

<pre class="brush: text; gutter: true">
ipconfig.exe /flushdns
</pre>

Sollte damit keine Abhilfe geschaffen werden können, so empfehlen wir die korrekten IP-Adressen in die hosts Datei einzutragen (Linux: <em>/etc/hosts</em>, Windows: <em>c:\Windows\System32\Drivers\etc\hosts</em>):

<pre class="brush: text; gutter: true">
72.4.120.124    rubygems.org
207.171.181.231 production.s3.rubygems.org
216.137.45.24   production.cf.rubygems.org
</pre>

Nicht vergessen, diese wieder rauszunehmen, sobald die Probleme verschwunden sind.]]>
    </content>
</entry>

<entry>
    <title>JRuby 1.5.1 erschienen</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2010/06/jruby-151-erschienen.html" />
    <id>tag:www.jrubyonrails.de,2010://20.1703</id>

    <published>2010-06-08T17:21:18Z</published>
    <updated>2010-06-08T17:29:21Z</updated>

    <summary>Nach dem Major-Release 1.5 erschien nun ein kleineres Bugfix Release. JRuby 1.5.1 behebt einige Fehler, wie z.B. die Classpath-Probleme mit JDBC-Treibern. Alle Bugfixes findet man auf der JRuby Seite zu 1.5.1 weiterführende Links und Quellen JRuby.org Homepage JRuby Downloadseite...</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="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby151" label="JRuby 1.5.1" 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[Nach dem Major-Release 1.5 erschien nun ein kleineres Bugfix Release. JRuby 1.5.1 behebt einige Fehler, wie z.B. die Classpath-Probleme mit JDBC-Treibern. Alle Bugfixes findet man auf der <a title="JRuby 1.5.1 Release" href="http://www.jruby.org/2010/06/07/jruby-1-5-1">JRuby Seite zu 1.5.1</a>
<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 Downloadseite</a>]]>
        
    </content>
</entry>

<entry>
    <title>RailsWayCon 2010 - Tag 3</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2010/06/railswaycon-2010-tag-3.html" />
    <id>tag:www.jrubyonrails.de,2010://20.1701</id>

    <published>2010-06-02T07:14:45Z</published>
    <updated>2011-12-04T16:37:26Z</updated>

    <summary>Tag 3 - 02.06.2010 Der letzte Konferenztag ist angebrochen. Heute stehen noch einige interesante Vorträge auf der Agenda. Hier schon mal die Auflistung aller heutigen RailsWayCon Vorträge. &quot;Establishing an integrated JRuby/Rails - Stack in a Legacy environment&quot; - Rubén Parés-Selders...</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="konferenz" label="Konferenz" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="railsway" label="RailsWay" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="railswaycon2010" label="RailsWayCon 2010" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<h4 class="blogentry">Tag 3 - 02.06.2010</h4>
Der letzte Konferenztag ist angebrochen. Heute stehen noch einige interesante Vorträge auf der Agenda. Hier schon mal die Auflistung aller heutigen RailsWayCon Vorträge.
<br/><br/>
<b>"Establishing an integrated JRuby/Rails - Stack in a Legacy environment"</b> - Rubén Parés-Selders

<br/><br/>
<b>"The State of RESTful Rails"</b> - Stefan Tilkov

<br/><br/>
<b>"Rails/Ruby Coding Dojo"</b> - Jens-Christian Fischer, Michael Mahlberg

<br/><br/>
<b>"Ruby and Redis - Simple meets Awesome"</b> - Mathias Meyer

<br/><br/>
<b>"Holy Code. Holy Shit! - Designer-Developer-Hölle"</b> - Gerrit van Aaken, Daniela Feuersinger, Stefan Nitzsche

<br/><br/>
<b>"Using jQuery with Rails"</b> - Yehuda Katz<br/>
Endlich! Rails 3 nutzt Markups zur Kommunikation mit Javascript. Dadurch entfällt der in Rails 2.X generierte JS Quellcode in den html Dateien. 

<pre class="brush: ruby; gutter: true">
# HTML Aufruf
&lt;a href="/posts/1" data-remote="true"&gt;Update&lt;/a&gt;

# JS-Driver Function
$("a[data-remote]").live("click, function () {
  $.get($this).attr("href"));
});
</pre>

Yehuda erläuterte auch, wie einfach das Wechseln der Javascript Libs in Rails 3 wird. Prototyp ist nicht mehr festverankert, sondern man nutzt JS-Driver. Den JQuery-Driver findet man unter <a title="jquery-ujs" href="http://github.com/rails/jquery-ujs">jquery-ujs</a> 

<br/><br/>
<b>"Deliver Software with MacRuby"</b> - Thilo Utke

<br/><br/>
<b>"The Anatomy of Ruby I18n: Overview of the Gem's architecture and advanced features"</b> - Sven Fuchs<br/>
Cool in der Version 0.4.0 von I18n kann man sein Backend mühelos auswechseln oder sogar per Chainbackend mehrere definieren. In seinem Vortrag erläuterte Sven sehr gut die Neuerungen und Ansätze von I18n, wie Pluralization, Fallbacks, Gettext, Cache und Chained backend.

<br/><br/>
<b>Slides:</b><br/>
von Mathias Meyer: <a title="Ruby and Redis - Simple meets Awesome" href="http://redis-railswaycon2010.heroku.com/">Ruby and Redis - Simple meets Awesome</a>
<br/>
von Stefan Tilkov: <a title="The State of RESTful Rails" href="http://www.innoq.com/blog/st/presentations/2010/2010-06-02-REST-Rails--RailsWayCon.pdf">The State of RESTful Rails</a>
<br/>
von Jens-Christian Fischer und Michael Mahlberg: <a title="Rails/Ruby Coding Dojo" href="http://github.com/jcfischer/RwcCodingDojo">Rails/Ruby Coding Dojo</a>
<br/>
von Thilo Utke: <a title="Deliver Software with MacRuby" href="http://www.slideshare.net/freaklikeme/mac-ruby-deployment">Deliver Software with MacRuby</a>
<br/><br/>
<b>Websites:</b><br/>
von Rubén Parés-Selders: <a title="Establishing an integrated JRuby/Rails - Stack in a Legacy environment" href="http://www.innoq.com/blog/rps/">Establishing an integrated JRuby/Rails - Stack in a Legacy environment</a>
<br/>
von Yehuda Katz: <a title="http://yehudakatz.com/" href="http://yehudakatz.com/">http://yehudakatz.com/</a>
<br/>
von Sven Fuchs: <a title="http://svenfuchs.com/" href="http://svenfuchs.com/">The Anatomy of Ruby I18n</a>]]>
        
    </content>
</entry>

<entry>
    <title>RailsWayCon 2010 - Tag 2</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2010/06/railswaycon-2010-tag-2.html" />
    <id>tag:www.jrubyonrails.de,2010://20.1700</id>

    <published>2010-06-01T09:05:10Z</published>
    <updated>2010-06-08T18:58:27Z</updated>

    <summary>Tag 2 - 01.06.2010 Der Tag began mit einem super Vortrag &quot;Rails 3: Dashing to the Finish&quot; von Yehuda Katz über Rails 3 und die Anpassungen zu Rails 2.3.X. Da kann man sich schon auf das nächste Projekt mit Rails...</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="konferenz" label="Konferenz" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="railsway" label="RailsWay" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="railswaycon2010" label="RailsWayCon 2010" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<h4 class="blogentry">Tag 2 - 01.06.2010</h4>
Der Tag began mit einem super Vortrag <b>"Rails 3: Dashing to the Finish"</b> von <a title="http://yehudakatz.com/" href="http://yehudakatz.com/">Yehuda Katz</a> über <a title="Rails 3 Release Notes" href="http://guides.rails.info/3_0_release_notes.html">Rails 3</a> und die Anpassungen zu Rails 2.3.X. Da kann man sich schon auf das nächste Projekt mit Rails 3 freuen.
<br/><br/>
<a title="" href="http://upstre.am">Thilo Utke</a> berichtete über seine Erfahrungen beim Schreiben von gutem Testcode <b>"A Testing Survival Guide"</b>
Beispiele für gutes Testen. Seine wichtiger Grundsatz "Haltet die Tests einfach!" trifft sich mit gut mit unserem Motto <b>"simple is beautiful"</b>.  Desweiteren nannte er einige Tools, die ihn beim Testen unterstützen: Spork, <a title="Bundler" href="http://gembundler.com/">Bundler</a>, Factories (Machinist, Factory Girl), Hydra/Parallel Spec, <a title="Capybara" href="http://upstre.am/2010/04/26/capybara-mix-and-match-acceptance-testing/">Capybara</a>, Webmocks/SHAM_RACK
<br/><br/>
<b>"Rails in the Cloud - Lessons learned from building a platform on EC2"</b> war das heutige Thema von Jonathan Weiss. Die Folien des Vortrages sind unten verlinkt.
<br/><br/>
Ein sehr cooler Vortrag war <b>"10 fun projects to improve your coding skills"</b>" von Jan Krutisch. Er stellte 10 Fun-Projekte vor, welche uns etwas von der täglichen Arbeit ablenken sollen, aber trotzdem unsere Skills fördern und verbessern können. Mehr auch auf seiner Webseite <a title="Ten fun projects" href="http://jan.krutisch.de/en/fun_projects/">Ten fun projects</a>
<br/><br/>
Oleg Shpynov und Dennis Ushakov von JetBrains stellten in Ihrem Vortrag Neuigkeiten der RubyMine IDE vor - <b>"Productive Rails development with RubyMine"</b>.
<br/><br/>
<b>"Evolutionary programming with Ruby"</b> - Julian Fischer
<br/><br/>
<b>"Improved performance with client side optimization"</b> - Patrick Hüsler
<br/><br/>
<b>"Culerity: Full stack Rails testing with Cucumber and Celerity"</b> - Patrick Hüsler
<br/><br/>
<b>"SOLID Rails, SOLID Ruby - practical patterns applied"</b> - Jens-Christian Fischer, Michael Mahlberg

<br/><br/>
<b>Slides:</b><br/>
von Jonathan Weiss: <a title="Rails in the Cloud" href="http://www.slideshare.net/jweiss/rails-in-the-cloud-experiences-from-running-on-ec2">Rails in the Cloud - Lessons learned from building a platform on EC2</a>
<br/>
von Yehuda Katz: <a title="Rails 3: Dashing to the Finish" href="http://www.slideshare.net/wycats/rails-3-dashing-to-the-finish">Rails 3: Dashing to the Finish</a>
<br/>
von Oleg Shpynov, Dennis Ushakov(JetBrains): <a title="Productive Rails development with RubyMine" href="http://www.slideshare.net/wycats/rails-3-dashing-to-the-finish">Productive Rails development with RubyMine</a>
<br/>
von Thilo Utke: <a title="A Testing Survival Guide" href="http://www.slideshare.net/freaklikeme/testing-survival-small">A Testing Survival Guide</a>
<br/>
von Jan Krutisch: <a title="10 fun projects to improve your coding skills" href="http://www.slideshare.net/jan_mindmatters/10-fun-projects-to-improve-your-coding-skills">10 fun projects to improve your coding skills</a>
<br/>
von Jens-Christian Fischer, Michael Mahlberg: <a title="SOLID Rails, SOLID Ruby - practical patterns applied" href="http://github.com/MichaelMahlberg/RailsWayCon2010">SOLID Rails, SOLID Ruby - practical patterns applied</a>]]>
        
    </content>
</entry>

<entry>
    <title>RailsWayCon 2010 - Tag 1</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2010/05/railswaycon-2010---tag-1.html" />
    <id>tag:www.jrubyonrails.de,2010://20.1699</id>

    <published>2010-05-31T17:00:00Z</published>
    <updated>2010-06-04T05:58:48Z</updated>

    <summary>Tag 1 - 31.05.2010 Der erste Konferenz-Tag ist vorüber und die ersten Eindrücke sind verarbeitet. Neben dem Treffen mit alten Bekannten waren wir auch wieder aktiv beim Besuchen der Vorträge. Da wir aktuell zu dritt auf der RailsWayCon unterwegs sind,...</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="konferenz" label="Konferenz" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="railsway" label="RailsWay" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="railswaycon2010" label="RailsWayCon 2010" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<h4 class="blogentry">Tag 1 - 31.05.2010</h4>
Der erste Konferenz-Tag ist vorüber und die ersten Eindrücke sind verarbeitet. Neben dem Treffen mit alten Bekannten waren wir auch wieder aktiv beim Besuchen der Vorträge. Da wir aktuell zu dritt auf der RailsWayCon unterwegs sind, konnten wir auch alle Vorträge besuchen.
<br/><br/>
<b>"Dynamic Language VMs: Ruby 1.9"</b> und <b>"Command your Domain"</b> (beide von Lourens Naudé) bildeten den Start- und Endpunkt des heutigen Tages.
<br/><br/>
<a title="http://blog.innerewut.de/"  href="http://blog.innerewut.de/">Jonathan Weiss</a> und <a title="http://jan.krutisch.de/" href="http://jan.krutisch.de/">Jan Krutisch</a> berichteten beide von Ihren Erfahrungen mit <a title="" href="http://de.wikipedia.org/wiki/Dokumentenorientierte_Datenbank">dokumentenorientierte Datenbanken</a> und Rails. Jonathan von <a title="http://couchdb.apache.org/" href="http://couchdb.apache.org/">CouchDB</a> und Jan von <a title="http://www.mongodb.org/" href="http://www.mongodb.org/">MongoDB</a>.
<br/><br/>
<a title="" href="http://www.yes-no-cancel.co.uk/contact/">Martin Kleppmann</a> berichtete über <b>"Cross-browser testing in the real world"</b>. Techniken wie <a title="Selenium" href="http://seleniumhq.org/">Selenium</a>, <a title="Webdriver" href="http://seleniumhq.org/docs/09_webdriver.html">Webdriver</a>, <a title="Cucumber" href="http://cukes.info/">Cucumber</a>/<a title="RSpec" href="http://rspec.info/">RSpec</a>, <a title="Culerity" href="http://github.com/langalex/culerity">Culerity</a> und <a title="Celerity" href="http://celerity.rubyforge.org/">Celerity</a> wurden genannt und an einigen Beispielen erläutert. Sehr interessant war seine Top 10 der Dinge, die beim Cross-browser Testing zu beachten sind.
<br/><br/>
<b>"Push it to the limit - An intro to Websockets and Rails applications"</b> und <b>"Be Authentic - Get into LDAP, Users and Roles"</b> waren die Themen von Michael Johann.
<br/><br/>
<b>"Ruby on Rails Security Updated"</b> - Heiko Webers zeigte die Rails 3 Security Anpassungen. Viele Infos findet man auch auf seinem <a title="Ruby on Rails Security Project" href="http://www.rorsecurity.info/">Blog "Ruby on Rails Security Project"</a>
<br/><br/>
<b>"Small is Sexy - We need Components in Rails!"</b> - Nick Sutterer berichtete von seinem <a title="" href="http://cells.rubyforge.org/">Cell-Gem und Apotomo - Widgets</a> in Rails. Beides waren auch schon Themen im RailsWay Magazin.
<br/><br/>
Wir sind gespannt wie weitergeht und hoffen das in den morgigen Konferenzräumen mehr Sitzplätze vorhanden sind. Ok, enges Beisamenstehen fördert auch die Kommunikation.
<br/><br/>
<b>Slides:</b><br/>
von Martin Kleppmann: <a title="crossbrowser-testing-in-the-real-world" href="http://www.slideshare.net/martinkleppmann/crossbrowser-testing-in-the-real-world">Cross-browser testing in the real world</a>
<br/>
von Jonathan Weiss: <a title="couchdb-on-rails-railswaycon-2010" href="http://www.slideshare.net/jweiss/couchdb-on-rails-railswaycon-2010">CouchDB</a>
<br/>
von Lourens Naudé: <a title="Dynamic Language VMs" href="http://www.slideshare.net/methodmissing/railswaycon-2010-dynamic-language-vms">Dynamic Language VMs</a>&nbsp;<a title="Dynamic Language VMs" href="http://www.slideshare.net/methodmissing/railswaycon-2010-command-your-domain">Command your Domain</a>
<br/>
von Jan Krutisch: <a title="mongodb and mongomapper 4 real!" href="http://www.slideshare.net/jan_mindmatters/mongodb-mongomapper-4-real">mongodb and mongomapper 4 real!</a>]]>
        
    </content>
</entry>

<entry>
    <title>RailsWayCon 2010 hat begonnen</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2010/05/railswaycon-2010-hat-begonnen.html" />
    <id>tag:www.jrubyonrails.de,2010://20.1698</id>

    <published>2010-05-31T07:15:01Z</published>
    <updated>2010-06-02T06:13:01Z</updated>

    <summary> Der Startschuß ist gefallen. Zum zweiten Mal treffen sich auf der RailsWayCon in Berlin (J)Ruby on Rails Experten und Enthusiasten zum Erfahrungsaustausch. Wir sind mit vor Ort und berichten!...</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="konferenz" label="Konferenz" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="railsway" label="RailsWay" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="railswaycon2010" label="RailsWayCon 2010" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://www.jrubyonrails.de/">
        <![CDATA[<span class="clearfix">
<img alt="RailsWayConf 2010" src="/images/railswaycon2010.gif" class="float-left"/>Der Startschuß ist gefallen. Zum zweiten Mal treffen sich auf der <a title="RailsWayCon in Berlin" href="http://it-republik.de/conferences/railswaycon2010/">RailsWayCon</a> in Berlin (J)Ruby on Rails Experten und Enthusiasten zum Erfahrungsaustausch. 
<br/>
Wir sind mit vor Ort und berichten!
</span>]]>
        
    </content>
</entry>

<entry>
    <title>JRuby 1.5.0 Release ist fertig</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2010/05/jruby-1-5-0-release-ist-fertig.html" />
    <id>tag:www.jrubyonrails.de,2010://20.1696</id>

    <published>2010-05-17T06:32:35Z</published>
    <updated>2010-05-17T06:53:51Z</updated>

    <summary>Die JRuby-Version 1.5.0 ist erschienen. Die Entwicklung hat diesmal etwas länger gedauert, dafür sollen auch viel mehr Bugs gefixt und Features eingebaut worden sein. Einige Neuerungen sind der Native-Launcher für UNIX-basierte Plattformen, die Unterstützung des Ant Build-Systems, Updates für RubyGems,...</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="jruby15" label="JRuby 1.5" 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.5.0 ist erschienen. Die Entwicklung hat diesmal etwas länger gedauert, dafür sollen auch viel mehr Bugs gefixt und Features eingebaut worden sein. Einige Neuerungen sind der Native-Launcher für UNIX-basierte Plattformen, die Unterstützung des Ant Build-Systems, Updates für RubyGems, RubyDebug und RSpec, erneute Verbesserungen beim Windows-Support, Performance-Verbesserungen, viele Fixes für Rails 3, Verbesserung der Startzeit und vieles mehr. Eine genaue Auflistung findet man unter <a href="http://jruby.org/2010/05/12/jruby-1-5-0.html" target="_blank" title="JRuby 1.5.0 Released">JRuby 1.5.0 Released</a>

<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 Downloadseite</a>]]>
        
    </content>
</entry>

<entry>
    <title>PDF und HTML mit acts_as_flying_saucer</title>
    <link rel="alternate" type="text/html" href="http://www.jrubyonrails.de/2010/03/pdf-und-html-mit-acts-as-flying-saucer.html" />
    <id>tag:www.jrubyonrails.de,2010://20.1687</id>

    <published>2010-03-15T14:13:39Z</published>
    <updated>2011-03-09T12:57:34Z</updated>

    <summary>Nutzer lieben Webanwendungen, die PDF-Dateien erzeugen. PDFs sind wie sauber ausgefüllte Papierformulare und Nutzer können sie ausdrucken, abheften, mit in ein Meeting nehmen, ... Kurz: Nutzer können weiter so arbeiten wie vor der Webanwendung, nur irgendwie moderner. Und genau das...</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="Java" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tutorials" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="acts_as_flying_saucer" label="acts_as_flying_saucer" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="css" label="CSS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="flyingsaucer" label="Flying Saucer" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jruby" label="JRuby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="pdf" label="PDF" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="print" label="print" 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[Nutzer lieben Webanwendungen, die PDF-Dateien erzeugen. PDFs
sind wie sauber ausgefüllte Papierformulare und Nutzer können
sie ausdrucken, abheften, mit in ein Meeting nehmen, ...
Kurz: Nutzer können weiter so arbeiten wie vor der Webanwendung,
nur irgendwie moderner. Und genau das lieben sie.
<br/><br/>
Entwickler lieben Einfachheit und wollen Aufwände gern gering
halten. Mit CSS muss man sich ja in jedem Falle auseinandersetzen.
Wie wäre es, auch PDFs über CSS zu gestalten, nur eben mit
Seitenzahlen, Kopf- und Fusszeile, ...
<br/><br/>
In unserem Artikel <a href="http://www.jrubyonrails.de/2009/03/jruby-on-rails-pdf-druckdemo.html">JRuby on Rails PDF Generierung</a> haben wir schon vorgestellt, wie man einzelne Partials in PDFs bringen kann.
Nun zeigen wir, wie eine normale Rails-Action einfach statt Anwendungs-HTML eine PDF-Datei erzeugt.


]]>
        <![CDATA[Nehmen wir einmal an, wir haben eine Liste von Nutzern. Vereinfacht haben wir dafür folgenden Quellcode
<pre class="brush: ruby; gutter: true">
# in app/controllers/users_controller.rb
class UsersController &lt; ApplicationController
&nbsp;
&nbsp; def  index
&nbsp;   @users = User.all
&nbsp;
&nbsp;   respond_to do |format|
&nbsp;     format.html {} # index.html.erb
&nbsp;     format.xml { render :xml => @users}
&nbsp;   end
&nbsp;end
end
</pre>
<pre class="brush: ruby; gutter: true">
# in app/views/users/index.html.erb
&lt;h1> Nutzerliste&lt;/h1>
&nbsp;
&lt;table>
&nbsp;
  #... Nutzerliste ...
&lt;/table>
</pre>

<h3>Wie bekommen wir diese Ansicht in eine PDF? </h3>
Zunächst einmal installieren wir uns das Plugin <a href="http://github.com/dagi3d/acts_as_flying_saucer" target="_blank">acts_as_flying_saucer</a>.
Einmal installiert, mussten wir noch die benötigten Bibliotheken einbinden. Das ist notwendig, weil wir im JRuby die Java-Bibliothek direkt verwenden und nicht (wie in Ruby) auf ein externes Java zugreifen.
<pre class="brush: ruby; gutter: true">
require 'java'
require File.expand_path(File.dirname(__FILE__) + '/java/jar/core-renderer.jar')
require File.expand_path(File.dirname(__FILE__) + '/java/jar/itext-paulo-155.jar')
&nbsp;
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>

Entweder man macht das direkt in der Plugin-Datei <code>vendor/plugins/acts_as_flying_saucer/lib/xhtml2pdf.rb</code> oder schafft sich ein Library-Datei, die man an entsprechender Stelle einbindet.
<br/><br/>
Ist das geschehen, müssen wir unserem Controller nur noch sagen, dass er PDF-Dateien erzeugen kann:
<pre class="brush: ruby; gutter: true; ">
# in app/controllers/users_controller.rb
class UsersController &lt; ApplicationController
&nbsp; acts_as_flying_saucer
&nbsp;
&nbsp; def  index
&nbsp;   @users = User.all
&nbsp;
&nbsp;   respond_to do |format|
&nbsp;     format.html {} # index.html.erb
&nbsp;     format.xml { render :xml => @users }
&nbsp;     format.pdf { render_pdf :template => "users/index", 
&nbsp;                                 :send_file => {:filename => "users_list.pdf"},
&nbsp;                                 :layout => "pdf.html.erb" }
&nbsp;   end
&nbsp; end
end
</pre>
Nur zwei Zeilen waren nötig: <code>acts_as_flying_saucer</code> macht den Controller PDF-fähig und mit <code>render_pdf</code> sagen wir ihm, welches Template er unter welchem Namen ausgeben soll. Wie man sieht, wird hier tatsächlich das gleiche Template genutzt wie bei der HTML-Erzeugung. Zusätzlich geben wir ihm noch ein eigenes Layout mit, welches weiter unten beschrieben wird.<br/>
Damit dieses Code-Beispiel funktioniert, muss man Rails noch den Mime-Type bekannt machen. Dazu reicht eine Zeile Zeile
<pre class="brush: ruby; gutter: true; toolbar: false ">
# in config/initializers/mime_types.rb
Mime::Type.register "application/pdf", :pdf
</pre>

Diese Vorgehensweise bietet den Vorteil, dass man in seinen HTML-Ansichten leicht einen PDF-Link für die aktuelle Seite unterbringen kann:
<pre class="brush: ruby; gutter: true; toolbar: false ">
&lt;%= link_to "Aktuelle Seite als PDF", url(:format => :pdf) %>
</pre>
<br/>
Wichtig zu wissen ist, dass Flying Saucer nur valides HTML akzeptiert und bei Fehlern mit wenig hilfreichen Exception-Meldungen aufwartet. Es muss also im Layout auf ein korrektes <code>DOCTYPE</code> geachtet und sich dann daran gehalten werden.
<br/><br/>
Um eine technische Trennung zu erreichen, kann man natürlich auch von einem eigenen Controller für alle PDFs ausgehen:
<pre class="brush: ruby; gutter: true">
# in app/controllers/pdf_controller.rb
class PdfController &lt; ApplicationController
&nbsp; acts_as_flying_saurcer
&nbsp;
&nbsp; layout "pdf.html.erb"
&nbsp;
&nbsp; def index
&nbsp;   @users = User.all
&nbsp;        
&nbsp;   render_pdf :template => "users/index", 
&nbsp;                :send_file => {:filename =>"users_list.pdf"}
&nbsp; end
end
</pre>
Da sich hier tendenziell aber der Controller-Code verdoppelt, ist diese Form eher geeignet, wenn man spezielle Zusammenstellungen hat, die gar nicht als eigene Anwendungsansicht existieren. Man muss so genau abwägen, welche dieser Möglichkeiten für den aktuellen Fall besser passt.

<h3> CSS-Definition </h3>
Einen besonderen Augenmerk muss man auf die Verwendung von CSS-Dateien legen. Wir haben in allen CSS-Dateien den Mediatyp "all" angegeben und sie auch mit diesem Typ ins HTML eingebunden. So haben wir unser Anwendungslayout prinzipiell auch in den PDF-Dateien zur Verfügung. Zusätzlich wird dann noch die "print.css" eingebunden, in denen die Ausnahmefälle verarbeitet werden.
Da Flying Saucer zuerst die komplette HTML-Seite erstellt, speichert und diese dann unabhängig komplett in ein PDF verwandelt, müssen alle CSS-Dateien mit einem absoluten Pfad versehen werden. Dazu haben wir uns einen kleinen Helper definiert:

<pre class="brush: ruby; gutter: true">
# in /app/controllers/application_controller.rb
&nbsp;
helper_method :path_with_host
def path_with_host    
&nbsp; File.join((request.protocol + request.host_with_port), relative_url_root || "")
end
</pre>
<pre class="brush: html; gutter: true">
# in views/layouts/pdf.html.erb

&lt;link href="<%= path_with_host%>/stylesheets/content.css" 
&nbsp;      media="all" rel="stylesheet" type="text/css"/>
...
&lt;!-- alle CSS-Dateien in dieser Form einbringen --&gt;
...
&lt;link href="<%= path_with_host%>/stylesheets/print.css"
&nbsp;      media="print" rel="stylesheet" type="text/css"/>
</pre>

<h3>PDF-spezifische Header und Footer </h3>
Ein in PDF-Dateien wichtiges Feature sind Header- und Footer-Bereiche, die sich auf jeder Seite wiederholen. Flying Saucer unterstützt hier die entsprechenden <a href="http://www.w3.org/TR/css3-page/#margin-boxes" target="_blank">CSS3</a>-Eigenschaften.
<pre class="brush: css; gutter: true">
@page {
&nbsp; @bottom-right {content: "Seite " counter(page) " von " counter(pages))
&nbsp; @top-left { padding-top: 1cm; vertical-align: top; content: element(pdf_top_left) }
}
&nbsp;
#pdf_top_left { position: running(pdf_top_left) }
</pre>
Dieses Stück CSS-Code setzt den Inhalt von zwei sogenannten Margin Boxes. Das sind Bereiche auf der PDF, die zwischen dem normalen Content-Bereich und dem eigentlichen Seitenrand liegen. Rechts unten wird direkt der gegebene <code>content</code> angezeigt. Dabei sind <code>counter(page)</code> und <code>counter(pages)</code> spezielle CSS-Befehle, die die aktuelle und die maximale Seitenanzahl zeigen. Durch die Verwendung dieser Befehle kann man den Inhalt nicht in ein eigenes Div auslagern, sondern muss ihn direkt in das CSS setzen. Deshalb empfiehlt es sich, diesen Bereich als Inline-CSS direkt in die Layout-Datei zu bringen. So kann man den Text auch mit Rails erzeugen (und bspw. übersetzen lassen) und man bringt nicht unnötig Inhaltselemente ins CSS.<br/>
Für den Header gehen wir einen anderen Weg, um Style und Inhalt besser zu trennen. Hier wird im Bereich <code>@top-left</code> bestimmt, dass ein Element mit dem Namen <code>pdf_top_left</code> angezeigt werden soll.
Das zugehörige Element <code>#pdf_top_left</code> bekommt dann in seiner Positionsangabe mitgeteilt, dass es in den Header kommt. Wichtig ist, dass die Bezeichnungen innerhalb von <code>element()</code> und <code>running()</code> übereinstimmen. 
<br/><br/>
Wie kommt nun der Inhalt in den Header? Wir definieren uns ein DIV innerhalb der Layoutdatei:
<pre class="brush: ruby; gutter: true; toolbar:false">
# in views/layouts/pdf.html.erb
&lt;div id="pdf_top_left"&gt;
  &lt;%= yield :pdf_header %&gt;
&lt;/div>
</pre>

Die genaue Position innerhalb der Datei ist dabei irrelevant, da das div durch die CSS-Positionsangabe in den Header geschoben wird.
In der View wird dieses Div befüllt, wenn sie für die PDFs generiert wird. Dafür erweitern wir unsere Nutzerliste:
<pre class="brush: ruby; gutter: true">
# in app/views/users/index.html.erb
&nbsp;
&lt;% if @pdf_mode %&gt;
&nbsp; &lt;% content_for :pdf_header do %&gt;
&nbsp;   Titel für Nutzerlisten-PDF
&nbsp; &lt;% end %&gt;
&lt;% end %&gt;
&nbsp;
&lt;h1&gt; Nutzerliste&lt;/h1&gt;
&nbsp;
&lt;table>
&nbsp; #... Nutzerliste ...
&lt;/table>
</pre>

<h3> Tabellen-Header </h3>
Nun wird man recht bald auf einen weiteren Wunsch stoßen: Wenn in der PDF Tabellen erstellt werden, sollte der Header (und bei Bedarf auch der Footer) der Tabelle auf jeder Seite erscheinen.
In HTML 4 wurden dafür die Elemente <code>thead</code>, <code>tbody</code> und <code>tfoot</code> eingeführt. Leider reicht das für Flying Saucer nicht aus. Es kennt aber einige andere Flags, die man in den CSS-Eigenschaften angeben kann:
<pre class="brush: ruby; gutter: true; toolbar:false">
table {
  -fs-table-paginate: paginate;
}
</pre>
Eine Übersicht über die möglichen Schalter findet man in der aktuellen <a href="http://pigeonholdings.com/projects/flyingsaucer/R8/doc/guide/users-guide-R8.pdf" target="_blank">Doku (PDF)</a> im Kapitel „Flying Saucer Extensions to the CSS 2.1 Specification"

<h3> ... und dann noch aufräumen </h3>
Bei jeder erstellten PDF entstehen eine HTML- und eine PDF-Datei im Projekteigenen <code>tmp</code>-Ordner. In einer produktiven Anwendung können das sehr viele Dateien werden. Es empfiehlt sich also, einen Mechanismus zu bauen, der diese Dateien löscht. Es wäre zum Beispiel möglich, einen Cron-Job zu definieren, der alle Dateien mit einem gewissen Alter löscht.

<h3>Fazit:</h3>

Die PDF-Erstellung mit Flying Saucer und dem Rails-Plugin <code>acts_as_flying_saucer</code> macht Spaß, weil:
<ul>
  <li>alle normalen Listen und Detailseiten gleichzeitig für HTML und PDF verwendet werden können</li>
  <li>druckspezifische Features trotzdem leicht in die Anzeige integriert werden können</li>
  <li>PDF-Dateien, die nicht in der Anwendung direkt vorkommen, trotzdem mit HTML so gestaltet werden, dass man sich als Entwickler von Webanwendungen zu Hause fühlt</li>
</ul>

<br/>
<br/>
<b>weiterführende Links und Quellen</b><br/>
<a href="http://www.w3.org/TR/css3-page/#margin-boxes" target="_blank">CSS3 Margin Boxes</a><br/>
<a href="http://github.com/dagi3d/acts_as_flying_saucer" target="_blank">Plugin acts_as_flying_saucer</a><br/>
<a href="http://pigeonholdings.com/projects/flyingsaucer/R8/doc/guide/users-guide-R8.pdf" target="_blank">Dokumentation von Flying Saucer (PDF)</a><br/>]]>
    </content>
</entry>

<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>2010-03-22T07:52:58Z</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>2012-11-08T22:08:51Z</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>
