<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>loopkid: Category Ruby</title>
    <link>http://loopkid.net/articles/category/ruby</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>professional procrastinator</description>
    <item>
      <title>twitter's development stack</title>
      <description>&lt;p&gt;Nachdem Twitter, einst als Rails-Anwendung gestartet, vor zwei Jahren Teile seines Backends &lt;a href="http://www.artima.com/scalazine/articles/twitter_on_scala.html"&gt;durch Scala ersetzten&lt;/a&gt; gab es einen Aufschrei in der Entwicklerszene. Viele haben das als Beweis betrachtet, dass Rails eben doch nicht für &amp;#8220;ernsthafte&amp;#8221; Anwendungen geeignet sei.  Nun hat Twitter erneut &lt;a href="http://engineering.twitter.com/2011/04/twitter-search-is-now-3x-faster_1656.html"&gt;Teile seines Backends ausgetauscht&lt;/a&gt;, diesmal ausgerechnet mit Java, eine Programmiersprache die von der Entwicklerszene in zunehmenden Maße als &amp;#8220;historische Altlast&amp;#8221; bzw. &amp;#8220;das neue Fortran&amp;#8221; betrachtet wird. Dessen ausgeprägte Verbosität wurde von den Vertretern der Rails-Szene oft als Negativbeispiel verwendet wurde um Ruby strahlen zu lassen.&lt;/p&gt;

&lt;p&gt;Was lehren uns also nun die Vorgänge bei Twitter? Ist Rails letztlich nur für Spielzeug-Websites geeignet? Sollte man Java also wieder rehabilitieren? Die Antwort ist das altbekannte Mantra: Use the right tool for the right job. Meiner Einschätzung nach sind die wesentlichen Parameter für die Entwicklung einer Webapplikation, der Umfang der initialen Spezifikation, die geplante Häufigkeit der Iteration, die vorraussichtliche Anzahl der Nutzer und die Ressourcen Zeit bzw. Geld. Wenn ich mit wenigen Ressourcen eine Web-Applikation entwickeln möchte, welche danach häufige Iterationen durchlaufen soll und auf absehbare Zeit eine überschaubare Nutzerzahl haben wird dann befindet man sich im Rails-Sweet Spot. Wenn man hingegen ausreichende Ressourcen und eine extrem große Nutzerschaft hat und seine Anwendung bereits relativ weit gediehen ist (lies: Twitter) dann ist unter Umständen Java bzw. die JVM eine bessere Wahl.&lt;/p&gt;

&lt;p&gt;Was ich damit sagen: Die Twitter-Jungs haben es genau richtig gemacht.&lt;/p&gt;</description>
      <pubDate>Mon, 18 Apr 2011 15:39:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:8d37d4af-c31e-46b2-9960-c1a6f4b756e9</guid>
      <author>Stefan</author>
      <link>http://loopkid.net/articles/2011/04/18/twitters-development-stack</link>
      <category>Softwareentwicklung</category>
      <category>Ruby</category>
      <category>Scala</category>
      <category>Java</category>
      <trackback:ping>http://loopkid.net/articles/trackback/161710</trackback:ping>
    </item>
    <item>
      <title>server-side grand central dispatch</title>
      <description>&lt;p&gt;&lt;a href="http://www.macruby.org/"&gt;MacRuby&lt;/a&gt; unterstützt bekanntermaßen &lt;a href="http://www.macruby.org/documentation/gcd.html"&gt;Grand Central Dispatch&lt;/a&gt; und mit &lt;a href="http://www.macruby.org/blog/2010/09/20/announcing-control-tower.html"&gt;ControlTower&lt;/a&gt; gibt es nun einen GCD-fähigen Webserver.&lt;/p&gt;</description>
      <pubDate>Tue, 26 Oct 2010 15:45:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:2de2cc43-c9e3-4754-a5d8-28d8f034ee85</guid>
      <author>Stefan</author>
      <link>http://loopkid.net/articles/2010/10/26/server-side-grand-central-dispatch</link>
      <category>Mac OS X</category>
      <category>Ruby</category>
      <trackback:ping>http://loopkid.net/articles/trackback/143338</trackback:ping>
    </item>
    <item>
      <title>polyglot programmers in berlin</title>
      <description>&lt;p&gt;Hat nicht jemand Lust in Berlin eine &lt;a href="http://polyglotprogrammers.com/"&gt;Polyglot Programmers User Group&lt;/a&gt; zu starten?&lt;/p&gt;</description>
      <pubDate>Sun, 19 Sep 2010 19:02:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:2707adaa-075d-4702-9d28-4d30499c03d2</guid>
      <author>Stefan</author>
      <link>http://loopkid.net/articles/2010/09/19/polyglot-programmers-in-berlin</link>
      <category>Softwareentwicklung</category>
      <category>Ruby</category>
      <category>Berlin</category>
      <category>Scala</category>
      <category>Clojure</category>
      <trackback:ping>http://loopkid.net/articles/trackback/142070</trackback:ping>
    </item>
    <item>
      <title>diaspora code released</title>
      <description>&lt;p&gt;Ruby, Rails, MongoDB, OpenSSL und Github. Das Technologie-Potpourie von &lt;a href="http://www.joindiaspora.com/"&gt;Diaspora&lt;/a&gt; macht schonmal einen guten ersten Eindruck und auf &lt;a href="http://github.com/diaspora/diaspora"&gt;Github&lt;/a&gt; wurde das Projekt schon über dreihundert mal geforkt. Ich denke ich warte noch bis es eine Alpha-Version gibt, dann werde ich mal eine Installation auf meinem Server aufsetzen.&lt;/p&gt;</description>
      <pubDate>Fri, 17 Sep 2010 13:29:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:53a123b1-266d-44bb-8e86-a6aabcee3688</guid>
      <author>Stefan</author>
      <link>http://loopkid.net/articles/2010/09/17/diaspora-code-released</link>
      <category>Web 2.0</category>
      <category>Ruby on Rails</category>
      <category>Ruby</category>
      <category>MongoDB</category>
      <trackback:ping>http://loopkid.net/articles/trackback/142022</trackback:ping>
    </item>
    <item>
      <title>european ruby conference 2011</title>
      <description>&lt;p&gt;Die europäische Ruby-Konferenz &lt;a href="http://euruko.org/"&gt;Euruko&lt;/a&gt; kommt 2011 nach &lt;a href="http://euruko2011.org/"&gt;Berlin&lt;/a&gt;!&lt;/p&gt;</description>
      <pubDate>Fri, 06 Aug 2010 00:43:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:111c5d80-aeda-4a7a-9a30-d69485e05d41</guid>
      <author>Stefan</author>
      <link>http://loopkid.net/articles/2010/08/06/european-ruby-conference-2011</link>
      <category>Ruby</category>
      <category>Berlin</category>
      <trackback:ping>http://loopkid.net/articles/trackback/139077</trackback:ping>
    </item>
    <item>
      <title>programming language observation</title>
      <description>&lt;p&gt;Wenn &lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt; mit seinen &lt;a href="http://axman6.homeip.net/blog/axmans-haskell-io-tutorial.html"&gt;Monaden&lt;/a&gt; wie Sex mit Kondom ist und Ruby ungeschützten Geschlechtsverkehr darstellt dann ist PHP das programmierprachliche Pendant zu einer schnellen Nummer mit einer abgewrackten Cracknutte.&lt;/p&gt;</description>
      <pubDate>Sat, 26 Jun 2010 13:22:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:0097722c-0387-49c1-95db-b30a1638cd33</guid>
      <author>Stefan</author>
      <link>http://loopkid.net/articles/2010/06/26/programming-language-observation</link>
      <category>Softwareentwicklung</category>
      <category>Ruby</category>
      <category>Haskell</category>
      <category>PHP</category>
      <trackback:ping>http://loopkid.net/articles/trackback/137896</trackback:ping>
    </item>
    <item>
      <title>named groups in oniguruma</title>
      <description>&lt;p&gt;Ich habe &lt;a href="http://en.wikipedia.org/wiki/Oniguruma"&gt;Oniguruma&lt;/a&gt; bisher nur in Textmate verwendet. Darüber hinaus findet es aber auch noch bei Ruby 1.9 Verwendung. In diesem Zusammenhang machen dann auch &lt;a href="http://ruby-doc.org/ruby-1.9/classes/MatchData.html#M001118"&gt;benannte Gruppen&lt;/a&gt; Sinn. Wenn man in Ruby 1.8 Gruppen referenzieren möchte dann geht das nur über ihre Position.&lt;/p&gt;

&lt;pre&gt;&lt;code style="font-size:10px"&gt;m = /(\w+) (\w+)/.match("Kalle Anka")
puts "#{m[1]} gehört zur Familie #{m[2]}"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Das ist praktikabel, aber nicht optimal im Sinne der Lesbarkeit. Wenn man nun die Lesbarkeit verbessert, dann bläht sich der Code auf.&lt;/p&gt;

&lt;pre&gt;&lt;code style="font-size:10px"&gt;m = /(\w+) (\w+)/.match("Kalle Anka")
vorname = m[1]
nachname = m[2]
puts "#{vorname} gehört zur Familie #{nachname}"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Durch Oniguruma In Ruby 1.9 läßt sich das ganze relativ elegant ausdrücken.&lt;/p&gt;

&lt;pre&gt;&lt;code style="font-size:10px"&gt;m = /(?&amp;lt;Vorname&amp;gt;\w+) (?&amp;lt;Nachname&amp;gt;\w+)/.match("Kalle Anka")
puts "#{m["Vorname"]} gehört zur Familie #{m["Nachname"]}"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Aus meiner Perspektive erhöht sich nicht nur Lesbarkeit der Ausgabezeile sondern auch die Wartbarkeit des regulären Ausdrucks. Jeder der schonmal einen umfangreicheren regulären Ausdruck erstellt hat und zwei Jahre später nochmal damit in Kontakt gekommen ist, der weiß wie unintuitiv komplexe reguläre Ausdrück sind. Ich denke benannte Gruppen können hier einen sinnvollen Beitrag zur besseren Wartbarkeit liefern. Eine andere Sache ist, dass sich bei mehreren Vergleichen schnell ein Wildwuchs an Variablen ergibt.&lt;/p&gt;

&lt;pre&gt;&lt;code style="font-size:10px"&gt;var1 = /(?&amp;lt;Vorname&amp;gt;\w+) (?&amp;lt;Nachname&amp;gt;\w+)/.match("Kalle Anka")
var2 = /(?&amp;lt;Strasse&amp;gt;\w+) (?&amp;lt;Hausnummer&amp;gt;\w+)/.match("Entenstrasse 13")
var3 = /(?&amp;lt;Postleitzahl&amp;gt;) (?&amp;lt;Ortschaft&amp;gt;\w+)/.match("368 Ankeborg")
puts("#{var1["Vorname"]} wohnt in der #{var2["Strasse"]} in #{var3["Ortschaft"]}")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dem läßt sich begegnen indem man die MatchData-Klasse um eine Methode zur Konvertierung in einen Hash erweitertet.&lt;/p&gt;

&lt;pre&gt;&lt;code style="font-size:10px"&gt;class MatchData
  def to_h
    Hash[*self.names.zip(self.captures).flatten]
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dann kommt man mit einer Variable aus.&lt;/p&gt;

&lt;pre&gt;&lt;code style="font-size:10px"&gt;h = (/(?&amp;lt;Vorname&amp;gt;\w+) (?&amp;lt;Nachname&amp;gt;\w+)/.match("Kalle Anka").to_h) 
h.merge!(/(?&amp;lt;Strasse&amp;gt;\w+) (?&amp;lt;Hausnummer&amp;gt;\w+)/.match("Entenstrasse 13").to_h)
h.merge!(/(?&amp;lt;Postleitzahl&amp;gt;\w+) (?&amp;lt;Ortschaft&amp;gt;\w+)/.match("368 Ankeborg").to_h)
puts("#{h["Vorname"]} wohnt in der #{h["Strasse"]} in #{h["Ortschaft"]}")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dafür wird das ganze jetzt aber etwas verbose. Wäre es nicht prima, wenn die Hash-Klasse einen Push-Operator besäße?&lt;/p&gt;

&lt;pre&gt;&lt;code style="font-size:10px"&gt;class Hash
  def &amp;lt;&amp;lt;(other_hash)
    merge!(other_hash)
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Okay, ich denke so kann man das stehen lassen.&lt;/p&gt;

&lt;pre&gt;&lt;code style="font-size:10px"&gt;h = /(?&amp;lt;Vorname&amp;gt;\w+) (?&amp;lt;Nachname&amp;gt;\w+)/.match("Kalle Anka").to_h
h &amp;lt;&amp;lt; /(?&amp;lt;Strasse&amp;gt;\w+) (?&amp;lt;Hausnummer&amp;gt;\w+)/.match("Entenstrasse 13").to_h
h &amp;lt;&amp;lt; /(?&amp;lt;Postleitzahl&amp;gt;) (?&amp;lt;Ortschaft&amp;gt;\w+)/.match("368 Ankeborg").to_h
puts("#{h["Vorname"]} wohnt in der #{h["Strasse"]} in #{h["Ortschaft"]}")
&lt;/code&gt;&lt;/pre&gt;</description>
      <pubDate>Wed, 16 Jun 2010 22:56:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:fed75b90-21cc-431e-b350-2d4fb055b08e</guid>
      <author>Stefan</author>
      <link>http://loopkid.net/articles/2010/06/16/named-groups-in-oniguruma</link>
      <category>Ruby</category>
      <trackback:ping>http://loopkid.net/articles/trackback/137711</trackback:ping>
    </item>
    <item>
      <title>ruby's class method going social</title>
      <description>&lt;pre&gt;&lt;code&gt;class Buerger
  attr_reader :name, :einkommen
  def initialize(name, einkommen)
    @name = name
    @einkommen = einkommen
  end
  def class
    case
      when einkommen &amp;gt; 1844
        return "Oberschicht"
      when (einkommen &amp;gt;= 860 and einkommen &amp;lt;= 1844)
        return "Mittelschicht"
      when einkommen &amp;lt; 860
        return "Unterschicht"
    end
  end
end

buerger = Array.new
buerger &amp;lt;&amp;lt; Buerger.new("Maximilian", 5200)
buerger &amp;lt;&amp;lt; Buerger.new("Sabine", 1500)
buerger &amp;lt;&amp;lt; Buerger.new("Jacqueline", 670)

buerger.each do |buerger|
  puts "#{buerger.name} verdient #{buerger.einkommen} Euro"
  puts "#{buerger.name} ist #{buerger.class}"
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Siehe hierzu &lt;a href="http://www.diw.de/documents/publikationen/73/diw_01.c.357505.de/10-24-1.pdf"&gt;die Studie&lt;/a&gt; des Deutschen Instituts für Wirtschaftsforschung.&lt;/p&gt;</description>
      <pubDate>Tue, 15 Jun 2010 14:50:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:ae648a72-488e-4874-b646-4c5c112d71a7</guid>
      <author>Stefan</author>
      <link>http://loopkid.net/articles/2010/06/15/ruby%27s-class-method-going-social</link>
      <category>Gesellschaft</category>
      <category>Ruby</category>
      <trackback:ping>http://loopkid.net/articles/trackback/137688</trackback:ping>
    </item>
    <item>
      <title>best web development language</title>
      <description>&lt;p&gt;Durch &lt;a href="http://www.google.de/search?q=best+web+development+language"&gt;hochwissenschaftliche Untersuchungen&lt;/a&gt; komme ich zu folgendem Ranking:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ruby  (Platz  9)&lt;/li&gt;
&lt;li&gt;Python (Platz 12)&lt;/li&gt;
&lt;li&gt;PHP (Platz 35)&lt;/li&gt;
&lt;li&gt;Perl (Platz 39)&lt;/li&gt;
&lt;li&gt;Java  (Platz 55)&lt;/li&gt;
&lt;li&gt;Scala (Platz 124)*&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;*Hierbei handelt es sich offensichtlich um einen Messfehler, meine Messmethode ist also noch optimierungsbedürftig!&lt;/p&gt;</description>
      <pubDate>Wed, 12 May 2010 00:16:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:8554e4ff-ac24-4b11-a2b6-0ea25894ef74</guid>
      <author>Stefan</author>
      <link>http://loopkid.net/articles/2010/05/12/best-web-development-language</link>
      <category>Webentwicklung</category>
      <category>Albernheiten</category>
      <category>Ruby</category>
      <category>Scala</category>
      <trackback:ping>http://loopkid.net/articles/trackback/136879</trackback:ping>
    </item>
    <item>
      <title>lighttpd ruby cgi script debugging</title>
      <description>&lt;p&gt;Those who call a cgi script with &lt;a href="http://www.lighttpd.net/"&gt;lighttpd&lt;/a&gt; and get a&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;500 - Internal Server Error
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;message but find no error in the logfile should check if the script puts out a proper MIME-type. If the script doesn&amp;#8217;t generate a well-formed MIME-type then lighttpd will throw the aforementioned error but there will be no related entry in the error logfile. PHP generates a proper MIME-type automatically when you call &lt;code&gt;php-cgi&lt;/code&gt; but when you for instance call Ruby you have to do it explicitly. This can be done by using the cgi class.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require 'cgi'
cgi = CGI.new
puts cgi.header
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or you get your hands dirty and do it manually.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;puts "Content-type: text/html\n\n"
&lt;/code&gt;&lt;/pre&gt;</description>
      <pubDate>Sun, 04 Apr 2010 22:27:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:717e7772-86c5-441a-9cc4-8fdfb4715e0e</guid>
      <author>Stefan</author>
      <link>http://loopkid.net/articles/2010/04/04/lighttpd-ruby-cgi-script-debugging</link>
      <category>English</category>
      <category>Ruby</category>
      <trackback:ping>http://loopkid.net/articles/trackback/135866</trackback:ping>
    </item>
  </channel>
</rss>

