<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US">
  <title>Nick Sieger</title>
  <subtitle type="html">do what you love</subtitle>
  <id>tag:blog.nicksieger.com,2005:Typo</id>
  <generator uri="http://www.typosphere.org" version="4.0">Typo</generator>
  
  <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/" />
  <updated>2009-06-12T20:40:17+00:00</updated>
  <link rel="self" href="http://feeds.feedburner.com/nicksieger" type="application/atom+xml" /><entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:a3633f0f-4b90-4de2-a278-6c33c3d15aab</id>
    <published>2009-06-12T20:34:27+00:00</published>
    <updated>2009-06-12T20:40:17+00:00</updated>
    <title>Which Tool Would You Use?</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2009/06/12/which-tool-would-you-use" />
    <category term="ruby" scheme="http://blog.nicksieger.com/articles/tag/ruby" />
    <content type="html">&lt;p&gt;I started in on the twice&amp;#45;yearly task of pruning our hedges today&amp;#46; So confronted with this task:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.flickr.com/photos/nicksieger/3619672997/" title="Shearing the shrubs by nicksieger, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2458/3619672997_70636e8702.jpg" width="375" height="500" alt="Shearing the shrubs" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;p&gt;Which tool would you use?&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.flickr.com/photos/nicksieger/3620490416/" title="Which tool? by nicksieger, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3410/3620490416_2fb853899c.jpg" width="375" height="500" alt="Which tool?" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;p&gt;I used both today, but realized I enjoy using the hand trimmers much more&amp;#46; With the electric trimmers, you can buzz through a lot of hedge quickly, but sometimes this happens:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.flickr.com/photos/nicksieger/3620491260/" title="Too close by nicksieger, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3300/3620491260_3c9ddd2ab1.jpg" width="500" height="375" alt="Too close" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;p&gt;With the hand trimmers, I can take my time and make precise cuts&amp;#46; The end result may take more time, but it turns out much, much better&amp;#46;&lt;/p&gt;

&lt;p&gt;Software tools have similar feels to me&amp;#46; Java feels an awful lot like the electric trimmers&amp;#46; It&amp;#8217;s heavy and powerful, but sometimes by the time you&amp;#8217;ve finished with it, you&amp;#8217;ve cut so far in that you may have missed a simpler, lighter solution&amp;#46;&lt;/p&gt;

&lt;p&gt;Ruby feels like the hand trimmers&amp;#46; Precision, less code, more intent, and I can take my time to think through and arrive at a solution without leaving a huge trail of trimmings (code) behind me&amp;#46;&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:9a1f22f6-e5db-4cf7-a49d-79c06dbb4bf2</id>
    <published>2009-06-09T02:23:36+00:00</published>
    <updated>2009-06-09T02:23:36+00:00</updated>
    <title>Project Kenai at JavaOne</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2009/06/09/project-kenai-at-javaone" />
    <category term="kenai" scheme="http://blog.nicksieger.com/articles/tag/kenai" />
    <category term="jruby" scheme="http://blog.nicksieger.com/articles/tag/jruby" />
    <category term="rails" scheme="http://blog.nicksieger.com/articles/tag/rails" />
    <content type="html">&lt;p&gt;It&amp;#8217;s just the beginning and a small milestone, but it&amp;#8217;s a goal we set for ourselves by JavaOne last week that we reached: 10K registered users at &lt;a href="http://kenai.com/"&gt;http://kenai&amp;#46;com/&lt;/a&gt;&amp;#46; We were fortunate to be highlighted in the Tuesday afternoon keynote, which, to our collective relief, &lt;a href="http://blogs.zdnet.com/BTL/?p=19181"&gt;went off without a hitch&lt;/a&gt;&amp;#46; I also had a chance to speak a bit about Project Kenai behind the scenes in my technical session&amp;#46;&lt;/p&gt;

&lt;p&gt;&lt;a href="/TS5413_09J1_SiegerLessons.pdf"&gt;My slides are available&lt;/a&gt; and contain a decent overview of what we&amp;#8217;ve been doing&amp;#46; One slide in particular seems to have &lt;a href="http://twitter.com/olabini/status/2027466455"&gt;surprised&lt;/a&gt; some folks: our codebase metrics&amp;#46;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;12K lines of application code (everything in &lt;code&gt;app/{controllers,models,helpers}&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;10K lines of views (HTML + template code in &lt;code&gt;app/views&lt;/code&gt;) &lt;/li&gt;
&lt;li&gt;1K lines of custom Javascript (&lt;code&gt;public/javascripts&lt;/code&gt; excluding jQuery and plugins)&lt;/li&gt;
&lt;li&gt;8K lines of test code (RSpec + plain text stories) (yes, we&amp;#8217;re upgrading to &lt;a href="http://cukes.info"&gt;Cucumber&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;73&amp;#46;7% test coverage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you&amp;#8217;re doing Rails, you&amp;#8217;re probably not all that surprised by these numbers; hopefully you&amp;#8217;ve seen similar ones yourself&amp;#46; If you haven&amp;#8217;t tried Rails, consider a site like kenai&amp;#46;com and ask yourself if you could build and maintain a production site like it with these numbers in your favorite language/framework&amp;#46;&lt;/p&gt;

&lt;p&gt;Other takeaways from my talk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Java what it&amp;#8217;s good for; in this case, long&amp;#45;running server apps&amp;#46; The downtime of the JRuby/GlassFish&amp;#45;deployed Rails application has been minimal for us; the few cases where we&amp;#8217;ve had issues, they&amp;#8217;ve usually been self&amp;#45;inflicted application problems&amp;#46; Instead of running Monit with a pack of Mongrels that need to be periodically recycled, we run a few GlassFish domains per server and only recycle them when we deploy new code&amp;#46;&lt;/li&gt;
&lt;li&gt;For the Java programmers out there, don&amp;#8217;t be afraid to use stuff other than Java&amp;#46; We use Python, Django, Memcached, Perl, and anything that gets the job done&amp;#46;&lt;/li&gt;
&lt;li&gt;You can build cool stuff quickly with community Rails plugins like &lt;a href="http://github.com/technoweenie/attachment_fu/tree/master"&gt;attachment_fu&lt;/a&gt;, &lt;a href="http://geokit.rubyforge.org/"&gt;geokit&lt;/a&gt;, and &lt;a href="http://wiki.github.com/mislav/will_paginate"&gt;will_paginate&lt;/a&gt;&amp;#46; Not news to Rails programmers, but I&amp;#8217;d be interested to hear of any equivalents for Java&amp;#45;based web frameworks&amp;#46;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.jruby.org/"&gt;JRuby&lt;/a&gt; is a big win, allowing co&amp;#45;development on MRI and JRuby with deployment to GlassFish&amp;#46; JRuby&amp;#8217;s java integration also allows for neat tricks like &lt;a href="http://kenai.com/projects/image-voodoo"&gt;image_voodoo&lt;/a&gt;, a pure&amp;#45;Java imaging plugin for attachment_fu&amp;#46;&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:5784f974-c56e-4e9f-81a2-6cd7a56aa45d</id>
    <published>2009-05-13T21:21:37+00:00</published>
    <updated>2009-05-13T21:21:37+00:00</updated>
    <title>Three Years of JRuby on Rails</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2009/05/13/three-years-of-jruby-on-rails" />
    <category term="jruby" scheme="http://blog.nicksieger.com/articles/tag/jruby" />
    <category term="rails" scheme="http://blog.nicksieger.com/articles/tag/rails" />
    <category term="ruby" scheme="http://blog.nicksieger.com/articles/tag/ruby" />
    <content type="html">&lt;p&gt;Just yesterday the &lt;a href="http://headius.blogspot.com/2006/05/and-they-said-jruby-was-dead.html"&gt;3&amp;#45;year mark of JRuby running Rails passed by&lt;/a&gt;&amp;#46; In the intervening period since JRuby first started to run Rails, we&amp;#8217;ve seen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://kenai.com/projects/jruby/sources/main/revision/2fc4a1817ce86cfdbc7af416f9c8595be5b5d248"&gt;6715 commits to JRuby&lt;/a&gt; and counting (via &lt;code&gt;git-rev-list --pretty=oneline 2fc4a18..HEAD | wc -l&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jruby.markmail.org/"&gt;Over 40,000 messages to the JRuby mailing lists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jira.codehaus.org/browse/JRUBY"&gt;3645 issues opened, 3019 of those already closed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dist.codehaus.org/jruby"&gt;18 JRuby releases&lt;/a&gt; (0&amp;#46;9&amp;#46;0 to 1&amp;#46;2), with &lt;a href="http://docs.codehaus.org/display/JRUBY/2009/05/01/JRuby+1.3.0RC1+Released"&gt;1&amp;#46;3 coming soon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The birth of &lt;a href="/articles/2006/05/15/jruby-on-rails-and-activerecord-on-jdbc"&gt;activerecord&amp;#45;jdbc&lt;/a&gt;, &lt;a href="/articles/2008/05/08/introducing-jruby-rack"&gt;jruby&amp;#45;rack&lt;/a&gt;, &lt;a href="http://jetty-rails.rubyforge.org/"&gt;jetty&amp;#45;rails&lt;/a&gt;, &lt;a href="http://glassfishgem.rubyforge.org/"&gt;glassfish gem&lt;/a&gt; and many other projects to make running Rails on JRuby as seamless as possible&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kenai.com"&gt;Kenai&amp;#46;com&lt;/a&gt;, &lt;a href="http://mix.oracle.com/"&gt;Oracle Mix&lt;/a&gt;, and a &lt;a href="http://wiki.jruby.org/wiki/Success_Stories"&gt;growing list of production sites running JRuby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.headius.com/2008/10/ffi-for-ruby-now-available.html"&gt;FFI support&lt;/a&gt; allowing JRuby to interact with native code&lt;/li&gt;
&lt;li&gt;&lt;a href="http://olabini.com/blog/2009/04/jruby-on-rails-on-google-app-engine/"&gt;JRuby and Rails running on Google App Engine&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And yet, JRuby still has plenty of untapped potential and room for growth and adoption: in the existing Ruby and Rails communities where JRuby is showing promise as a stable, performant, concurrency&amp;#45;enabled, and leak&amp;#45;proof platform; and as a transformative force to capture the mindshare of a huge army of Java developers who aren&amp;#8217;t even aware that there&amp;#8217;s a language and runtime that allows them to preserve their skills and existing code while developing new applications faster and with much greater enjoyment&amp;#46;&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s looking to the future of continued growth for JRuby over the next three years&amp;#46; The best is yet to come!&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:3de43ef7-e026-4ca5-9429-0ba3b288695c</id>
    <published>2009-04-30T03:07:47+00:00</published>
    <updated>2009-05-02T05:21:46+00:00</updated>
    <title>Stand and Be Counted</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2009/04/30/stand-and-be-counted" />
    <content type="html">&lt;p&gt;From &lt;a href="http://hackety.org/2009/04/29/aSelectionOfThoughtsFromActualWomen.html"&gt;_why&amp;#8217;s constructive post entitled &amp;#8220;A Selection Of Thoughts From Actual Women&amp;#8221;&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;&lt;a href="http://afreshcup.com/2009/04/28/a-painful-decision/#comment-1004"&gt;Noirin Plunkett&lt;/a&gt;: (Regarding Mike Gunderloy’s decision to leave the Rails team&amp;#46;) It seems like so often in these things, even the “good guys” just tsk&amp;#45;tsk and shake their heads, without being willing to stand up and be counted&amp;#46; Actions speak louder than words&amp;#46;&amp;#46;&amp;#46;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I don&amp;#8217;t like to use this blog as a soapbox for non&amp;#45;technical content, but I too have been conflicted over the past week&amp;#46; So I&amp;#8217;m standing up to be counted&amp;#46; As a father of two girls who are starting to show an interest in computing, I consider it my obligation&amp;#46; If you agree with me, I hope you will do so as well by posting a brief statement on your own blogs&amp;#46; If you do, send me a link and I&amp;#8217;ll link to you from here&amp;#46; So here&amp;#8217;s my statement:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I want the Ruby, Rails, open source, and web development communities to be a dignified, respectful, inclusive, and welcoming place&amp;#46; Acts like putting questionable imagery in a conference talk are regrettable and harmful to those aims&amp;#46; We&amp;#8217;ve all been witnesses to off&amp;#45;color jokes, misogynistic back channel chatter and unnecessary, trolling comments&amp;#46; I pledge to do better to stand up and call this behavior out when I see it in conferences, online and other public settings&amp;#46; I don&amp;#8217;t expect it to go away but I&amp;#8217;m not going to tacitly condone it any longer&amp;#46;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I think we can have our cake and eat it too&amp;#46; We can have a welcoming community while still courting the creativity, edginess and even controversy that makes us who we are; we also need to actively listen and be open to alternative viewpoints&amp;#46; There&amp;#8217;s always another side to any story and we need to seek it out, especially when it&amp;#8217;s drowned out by online discussion boards run amok&amp;#46;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m looking forward to continuing the conversation at the &lt;a href="http://en.oreilly.com/rails2009/public/schedule/detail/8772"&gt;Women in Rails panel&lt;/a&gt; next week&amp;#46; I hope to see you there&amp;#46;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update: I think the individual at the source of the incident that sparked this debate has been through enough so I&amp;#8217;m following others&amp;#8217; leads and have anonymized the post&amp;#46;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nick Sieger&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Other statements (Thank you!):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.headius.com/2009/04/stand-and-be-counted.html"&gt;Charles Nutter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://evan.tiggerpalace.com/2009/04/30/on-professionalism-and-bigotry/"&gt;Evan Light&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youhhoo.com/blog/?p=107"&gt;Youssef Chaker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://manalang.com/archives/2009/04/30/im-standing-up-to-be-counted/"&gt;Rich Manalang&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://twitpic.com/4a76t"&gt;Michael Easter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.elevatedrails.com/articles/2009/04/30/standing-up-to-be-counted/"&gt;Mike Mangino&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.not404.com/content/rails-gogaruco-and-professionalism"&gt;Laurence Lee&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.majesticseacreature.com/archives/2009.04/stand_and_be_counted.html"&gt;Gregory Brown&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ryanripley.com/83-stand-and-be-counted-it-starts-the-top"&gt;Ryan Ripley&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:32ea8753-bf86-4fe8-bec2-4b2f432512fe</id>
    <published>2009-04-11T04:10:51+00:00</published>
    <updated>2009-04-11T04:10:51+00:00</updated>
    <title>JRuby on Google AppEngine: First Impressions</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2009/04/11/jruby-on-google-appengine-first-impressions" />
    <category term="jruby" scheme="http://blog.nicksieger.com/articles/tag/jruby" />
    <category term="rails" scheme="http://blog.nicksieger.com/articles/tag/rails" />
    <category term="google" scheme="http://blog.nicksieger.com/articles/tag/google" />
    <category term="appengine" scheme="http://blog.nicksieger.com/articles/tag/appengine" />
    <content type="html">&lt;p&gt;I was surprised by &lt;a href="http://googleappengine.blogspot.com/2009/04/seriously-this-time-new-language-on-app.html"&gt;Tuesday&amp;#8217;s announcements&lt;/a&gt; as much as anyone else&amp;#46; &lt;a href="http://olabini.com/blog/2009/04/jruby-on-rails-on-google-app-engine/"&gt;Ola keeps secrets well&lt;/a&gt;&amp;#46; He sent me a pull request for &lt;a href="http://jruby-rack.kenai.com/pages/Home"&gt;jruby&amp;#45;rack&lt;/a&gt; just last week mentioning &amp;#8220;some restrictive environments where you can&amp;#8217;t start threads&amp;#8221;&amp;#46; I didn&amp;#8217;t blink, and instead just merged his patch&amp;#46;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://rubyonrails.org/images/rails.png" alt="rails"/&gt;
&lt;img src="http://2.bp.blogspot.com/_dLfQMJsmsaI/SdvwPx8hz5I/AAAAAAAAACY/I_DEfn6nQjc/s320/ae_gwt_java.png" alt="java-gae"/&gt;&lt;/p&gt;

&lt;p&gt;Despite the surprise news, it turns out my timing wasn&amp;#8217;t bad&amp;#46; &lt;a href="http://twitter.com/nicksieger/status/1189629742"&gt;Just a couple of weeks ago I was experimenting&lt;/a&gt; with the Python version of AppEngine, just to see what the fuss is all about&amp;#46; Even though Google&amp;#8217;s had its &lt;a href="http://radar.oreilly.com/archives/2008/04/is-google-app-engine-a-lockin.html"&gt;share&lt;/a&gt; of &lt;a href="http://www.tbray.org/ongoing/When/200x/2008/04/09/Google-Users-API"&gt;criticism&lt;/a&gt; for building a platform that is difficult for developers to leave, the lock&amp;#45;in aspect didn&amp;#8217;t bother me&amp;#46; I&amp;#8217;m a pragmatist first, and I believe that we as developers are the only ones locking ourselves to a platform&amp;#46; We have a choice, after all&amp;#46; And look at &lt;a href="http://www.nytimes.com/2009/04/05/fashion/05iphone.html"&gt;all the developers willfully rushing&lt;/a&gt; to develop Cocoa applications for the iPhone&amp;#46; The fact that their code is not useful on any other device isn&amp;#8217;t stopping them&amp;#46;&lt;/p&gt;

&lt;p&gt;The thing with AppEngine is that it&amp;#8217;s a unique platform all unto itself&amp;#46; That may seem brutally obvious, but the point seems to be lost in all the frenzy surrounding the Run&amp;#45;Rails&amp;#45;Struts&amp;#45;Spring&amp;#45;Groovy&amp;#45;Grails&amp;#45;Lift&amp;#45;You&amp;#45;Name&amp;#45;It&amp;#45;Framework on AppEngine this week&amp;#46; I&amp;#8217;m not saying it&amp;#8217;s a bad idea to try to run Rails on AppEngine; quite the contrary&amp;#46; I&amp;#8217;m saying you need to be honest about the trade&amp;#45;offs and constraints&amp;#46; And in the case of Ruby and Rails, boy are there a bunch of them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No regular &lt;code&gt;net/http&lt;/code&gt;, &lt;code&gt;restclient&lt;/code&gt;, &lt;code&gt;ActiveResource&lt;/code&gt; usage&amp;#46; Google has a URL fetch library, and has hooked up Java&amp;#8217;s &lt;code&gt;HttpURLConnection&lt;/code&gt; to it, but none of the Ruby URL&amp;#45;fetching libraries use it&amp;#46;&lt;/li&gt;
&lt;li&gt;No ActiveRecord&amp;#46; &amp;#8216;Nuff said&amp;#46; For some folks, that&amp;#8217;s a welcome change, but wrapping your head around AppEngine&amp;#8217;s BigTable&amp;#45;backed data store takes some thought&amp;#46; You just can&amp;#8217;t view it like a SQL engine&amp;#46;&lt;/li&gt;
&lt;li&gt;No RMagick/ImageScience/attachment_fu&amp;#46; No &lt;a href="/articles/2008/03/27/imagevoodoo-0-1-released"&gt;ImageVoodoo&lt;/a&gt; even (no javax&amp;#46;image APIs)&amp;#46; Google has it&amp;#8217;s own image manipulation API&amp;#46;&lt;/li&gt;
&lt;li&gt;Startup/first request processing time is currently an issue&amp;#46; It&amp;#8217;s not clear yet how long Google keeps JVMs warm, so if your application is idle, the first few hits to it return 500 errors&amp;#46; I can only assume Google has a plan to address this&amp;#46;&lt;/li&gt;
&lt;li&gt;Crypto&amp;#46; Although java&amp;#46;security and javax&amp;#46;crypto APIs are apparently &lt;a href="http://code.google.com/appengine/docs/java/jrewhitelist.html"&gt;whitelisted&lt;/a&gt;, I haven&amp;#8217;t had time to figure out how to leverage them&amp;#46; JRuby&amp;#8217;s jruby&amp;#45;openssl gem does not work, which means things like &lt;code&gt;digest&lt;/code&gt; aren&amp;#8217;t available&amp;#46; That&amp;#8217;s currently a blocker for Rails&amp;#8217; cookie session store&amp;#46;&lt;/li&gt;
&lt;li&gt;1000&amp;#45;files limit per application&amp;#46; In order to work around this, I ended up &lt;a href="/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar"&gt;jarring up all the Rails gems&lt;/a&gt; when deploying a Rails application&amp;#46;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are just a sampling of some of the problems you&amp;#8217;re dealing with on the AppEngine frontier&amp;#46; They&amp;#8217;re all solvable; it will take a little time and BST (blood, sweat and tears)&amp;#46; The point is you can&amp;#8217;t expect a Rails application on AppEngine to behave like all the Rails applications you&amp;#8217;ve written previously&amp;#46;&lt;/p&gt;

&lt;p&gt;In return for your troubles, you get the AppEngine value proposition, which is actually attractive in a lot of ways: Google runs the platform&amp;#46; You don&amp;#8217;t have to worry about it&amp;#46; Transparent scaling, monitoring, logging, everything below your application code is taken care of&amp;#46; Single&amp;#45;step deployment, with application versioning and rollback&amp;#46; Scalable services: BigTable storage, memcached, scheduled tasks&amp;#46; My friend &lt;a href="http://googleappengine.blogspot.com/2009/02/best-buys-giftag-on-app-engine.html"&gt;Curt Thompson of Best Buy&amp;#8217;s Giftag&amp;#46;com&lt;/a&gt; talks about how they leverage AppEngine for a non&amp;#45;toy application&amp;#46; (Curt also helped me get my &lt;a href="http://nicksieger-notes.appspot.com/"&gt;Python AppEngine experiment&lt;/a&gt; up and running&amp;#46;)&lt;/p&gt;

&lt;p&gt;In the end, I&amp;#8217;m still extremely excited about the prospect of using JRuby and Rails on AppEngine, and can&amp;#8217;t wait to see what people build with these tools&amp;#46; If you want a little head start, you can check out the first Rails application I deployed, &lt;a href="http://jruby-rack.appspot.com/"&gt;jruby&amp;#45;rack&amp;#46;appspot&amp;#46;com&lt;/a&gt;&amp;#46; The &amp;#8220;application environment&amp;#8221; page is the main dynamic action in the app, which just enumerates a bunch of request and system environment properties so you can get a feel for how things are set up in the AppEngine Java environment&amp;#46; The source code for the application is linked from the front page&amp;#46; Note that the app was deployed with JRuby trunk and &lt;a href="http://kenai.com/projects/jruby-rack/lists/talk/archive/2009-04/message/0"&gt;JRuby&amp;#45;Rack 0&amp;#46;9&amp;#46;4&lt;/a&gt;; Warbler is not yet using these components but you can build them yourself, drop them in and try them&amp;#46; We&amp;#8217;ll be updating JRuby, Warbler and other tools soon to make this process more seamless soon&amp;#46; Stay tuned!&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:99db756c-66ad-4e4b-82cc-422ff2c8f161</id>
    <published>2009-03-31T01:20:49+00:00</published>
    <updated>2009-03-31T01:20:49+00:00</updated>
    <title>My JRuby Talk at Philly ETE</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2009/03/31/my-jruby-talk-at-philly-ete" />
    <category term="jruby" scheme="http://blog.nicksieger.com/articles/tag/jruby" />
    <category term="phillyete" scheme="http://blog.nicksieger.com/articles/tag/phillyete" />
    <content type="html">&lt;p&gt;Last Friday at &lt;a href="http://www.phillyemergingtech.com/"&gt;Philly ETE 2009&lt;/a&gt; I gave a talk entitled, &lt;em&gt;JRuby: Agile Glue for the Enterprise&lt;/em&gt;&amp;#46; The talk was aimed at the skeptical enterprise developer or architect that hasn&amp;#8217;t yet considered adopting a dynamic language&amp;#46; (Unfortunately, most of the folks in the room were familiar with Ruby, so the pitch may not have hit the mark&amp;#46; At least they &lt;a href="http://www.phillyemergingtech.com/abstracts.php?sessID=15"&gt;knew what they were getting into&lt;/a&gt;&amp;#46;)&lt;/p&gt;

&lt;p&gt;The thesis is pretty concise: If you&amp;#8217;re developing on a platform that doesn&amp;#8217;t make use of a dynamic language, you&amp;#8217;re limiting your development speed&amp;#46;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.flickr.com/photos/httpwwwmouthshutcomusermariner2html/3088565681/"&gt;
  &lt;img src="http://farm4.static.flickr.com/3089/3088565681_cbd2ebbc3b.jpg?v=0" border="0"/&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You&amp;#8217;re using a heavy vehicle in the parts of your application where you should be driving a bike&amp;#46; I actually don&amp;#8217;t care whether you use JRuby or Groovy or JavaScript or Jython&amp;#46; But you should use the right tool for the task at hand, and using Java to do systems integration or builds or frequently changing application logic is the jackhammer trying to hit a nail&amp;#46;&lt;/p&gt;

&lt;div class="thumbnail"&gt;&lt;a href="http://skitch.com/nicksieger/bj9h1/stable-layer"&gt;&lt;img src="http://img.skitch.com/20090331-ng88u5ai1557jju329j3ch6k2m.preview.jpg" alt="stable-layer" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;The great thing about this picture is that you can introduce a dynamic language on the slice on the right side without deploying Ruby code into your production application&amp;#46; You can ramp up Ruby (using JRuby) as a testing tool, a build tool, or a monitoring/deploy tool&amp;#46;&lt;/p&gt;

&lt;p&gt;Once you&amp;#8217;re a little more comfortable with Ruby and JRuby, you can start to embed it in non&amp;#45;critical corners of your application&amp;#46; Maybe you&amp;#8217;ll eventually feel confident enough to even try using parts or all of Rails in your application&amp;#46; And doing it in a way that preserves your existing infrastructure when you need it, or phasing it out slowly instead of &lt;a href="http://chadfowler.com/2006/12/27/the-big-rewrite"&gt;completely rewriting it&lt;/a&gt;&amp;#46;&lt;/p&gt;

&lt;p&gt;JRuby can help you with this transition&amp;#46; It&amp;#8217;s there every step of the way, bringing the best of both worlds (Ruby and Java) and bridging them in a way that makes programming on the Java platform fun again&amp;#46;&lt;/p&gt;

&lt;p&gt;You can &lt;a href="/files/jruby-ete.pdf"&gt;download the slides&lt;/a&gt; to see code examples for all these areas&amp;#46;&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:be9f41f4-147f-4efc-8aa8-e22a7baacb38</id>
    <published>2009-02-10T21:38:35+00:00</published>
    <updated>2009-02-10T21:39:49+00:00</updated>
    <title>Video of My RubyFringe Talk</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2009/02/10/video-of-my-rubyfringe-talk" />
    <category term="rubyfringe" scheme="http://blog.nicksieger.com/articles/tag/rubyfringe" />
    <content type="html">&lt;p&gt;If you follow &lt;a href="http://twitter.com/nicksieger/status/1192631443"&gt;me on Twitter&lt;/a&gt; you know that the video of my &lt;a href="/articles/2008/07/19/jazzers-and-programmers"&gt;RubyFringe talk&lt;/a&gt; has finally been &lt;a href="http://www.infoq.com/presentations/sieger-jazzers-programmers"&gt;released on InfoQ&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;If you don&amp;#8217;t, then please take &lt;a href="http://www.infoq.com/presentations/sieger-jazzers-programmers"&gt;30 minutes to check it out&lt;/a&gt; and let me know what you think&amp;#46; I had a lot of fun giving the talk, and I&amp;#8217;m grateful that it was &lt;a href="http://rethink.unspace.ca/2008/7/31/rubyfringe-what-now"&gt;well&amp;#45;received&lt;/a&gt;&amp;#46; It should be watchable by techies and non&amp;#45;techs alike&amp;#46; Enjoy!&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:924637a6-a799-47c7-be6c-986b51b86402</id>
    <published>2009-01-10T20:04:00+00:00</published>
    <updated>2009-01-10T20:09:01+00:00</updated>
    <title>JRuby 1.1.6: Gems-in-a-jar</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar" />
    <category term="jruby" scheme="http://blog.nicksieger.com/articles/tag/jruby" />
    <category term="rubygems" scheme="http://blog.nicksieger.com/articles/tag/rubygems" />
    <content type="html">&lt;p&gt;As a result of some fruitful hacking at RubyConf 2008, I was able to modify JRuby so that gems can be loaded and used without having to unpack them&amp;#46; The feature became generally available with the &lt;a href="http://docs.codehaus.org/display/JRUBY/2008/12/17/JRuby+1.1.6+Released"&gt;1&amp;#46;1&amp;#46;6 release last month&lt;/a&gt;&amp;#46; Gems in a jar!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://flickr.com/photos/splorp/36991739/" title="Gem Jar"&gt;
&lt;img src="http://farm1.static.flickr.com/26/36991739_48ab6e8fb7.jpg" alt="gemjar"/&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;div style="clear:both"&gt;&lt;/div&gt;

&lt;p&gt;&lt;span style="font-size:75%"&gt;by &lt;a href="http://flickr.com/photos/splorp"&gt;splorp on flickr&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;This opens up a couple new possibilities for running, packaging and deploying JRuby&amp;#45;based applications&amp;#46; Here are some ideas:&lt;/p&gt;

&lt;h2&gt;Run Gem&amp;#45;based applications with &lt;code&gt;jruby-complete.jar&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;JRuby has &lt;a href="http://jira.codehaus.org/browse/JRUBY-969"&gt;bundled Rake and RSpec since version 1&amp;#46;0&lt;/a&gt;&amp;#46; As of JRuby 1&amp;#46;1&amp;#46;6 the versions we bundle are Rake 0&amp;#46;8&amp;#46;3 and RSpec 1&amp;#46;1&amp;#46;11&amp;#46; With &lt;a href="http://repository.codehaus.org/org/jruby/jruby-complete/1.1.6/jruby-complete-1.1.6.jar"&gt;&lt;code&gt;jruby-complete-1.1.6.jar&lt;/code&gt;&lt;/a&gt; you can easily run these with &lt;code&gt;java -jar&lt;/code&gt;:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ java -jar jruby-complete-1.1.6.jar -S rake --help
rake [-f rakefile] {options} targets...

Options are ...

$ java -jar jruby-complete-1.1.6.jar -S spec --help
Usage: spec (FILE|DIRECTORY|GLOB)+ [options]

    -p, --pattern [PATTERN] ...&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Package gem collections into reusable jar files&lt;/h2&gt;

&lt;p&gt;One of the features I added was to enhance RubyGems to search for directories named &lt;code&gt;specifications&lt;/code&gt; on the classpath and add them to the &lt;code&gt;Gem.path&lt;/code&gt; automatically&amp;#46; This means you can package up a whole gem repository into a jar file for easy reuse and sharing of commonly used gems&amp;#46; There isn&amp;#8217;t a tool for this yet, but the process is pretty straightforward&amp;#46; (If someone plays with this and can come up with a patch to build this into JRuby, we&amp;#8217;ll gladly accept one&amp;#46;)&lt;/p&gt;

&lt;p&gt;First, create a gem repository by installing the gems you want into it&amp;#46; Let&amp;#8217;s say you want to package the natural language date/time parser &lt;code&gt;chronic&lt;/code&gt;:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ java -jar jruby-complete-1.1.6.jar -S gem install -i ./chronic chronic --no-rdoc --no-ri
Successfully installed rubyforge-1.0.2
Successfully installed rake-0.8.3
Successfully installed hoe-1.8.2
Successfully installed chronic-0.2.3
4 gems installed&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With this command, RubyGems created &lt;code&gt;chronic/bin&lt;/code&gt;, &lt;code&gt;chronic/cache&lt;/code&gt;, &lt;code&gt;chronic/gems&lt;/code&gt;, and &lt;code&gt;chronic/specifications&lt;/code&gt; directories and installed &lt;code&gt;chronic&lt;/code&gt; and its dependencies into it&amp;#46; Now, simply package those directories into a jar file:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ jar cf chronic.jar -C chronic .&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;When you inspect the contents of the jar, you&amp;#8217;ll see the gem repository structure in the root of the jar file:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ jar tf chronic.jar | head
META-INF/
META-INF/MANIFEST.MF
bin/
bin/rake
bin/rubyforge
bin/sow
cache/
cache/chronic-0.2.3.gem
cache/hoe-1.8.2.gem
cache/rake-0.8.3.gem&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Chronic is now a re&amp;#45;useable jar library that can be easily loaded, either by requiring the jar in ruby code or adding to the classpath:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ # Without chronic.jar
$ java -jar jruby-complete-1.1.6.jar -S gem list

*** LOCAL GEMS ***

rake (0.8.3)
rspec (1.1.11)
sources (0.0.1)

$ # With chronic.jar
$ java -jar jruby-complete-1.1.6.jar -rchronic.jar -S gem list

*** LOCAL GEMS ***

chronic (0.2.3)
hoe (1.8.2)
rake (0.8.3)
rspec (1.1.11)
rubyforge (1.0.2)
sources (0.0.1)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Unfortunately this technique does not yet work with gems that include Java code in embedded jar files (e&amp;#46;g&amp;#46;, hpricot, mongrel, jruby&amp;#45;openssl)&amp;#46; See &lt;a href="http://jira.codehaus.org/browse/JRUBY-3299"&gt;JRUBY&amp;#45;3299&lt;/a&gt;&amp;#46; (We&amp;#8217;d like to get this fixed for 1&amp;#46;1&amp;#46;7, but could use your help&amp;#46;)&lt;/p&gt;

&lt;h2&gt;Bundle pure&amp;#45;Ruby gem applications into an uber&amp;#45;jar&lt;/h2&gt;

&lt;p&gt;Taking a cue from the previous techniques, we can stuff the gem directories into a copy of &lt;code&gt;jruby-complete-1.1.6.jar&lt;/code&gt; rather than creating a new jar, and distribute an entire gem&amp;#45;based application in a single file&amp;#46; Imagine something like:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;$ java -jar jruby-complete-1.1.6.jar -S gem install -i ./mycoolapp mycoolapp
$ jar uf jruby-complete-1.1.6.jar -C mycoolapp .
$ mv jruby-complete-1.1.6.jar mycoolapp.jar
$ java -jar mycoolapp.jar -S mycoolapp&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Bonus points to the enterprising individual who provides a patch to make this a one&amp;#45;step process, including creating a mechanism to provide a default &lt;code&gt;-S&lt;/code&gt; script so that &lt;code&gt;java -jar mycoolapp&lt;/code&gt; is all that&amp;#8217;s needed to run the application&amp;#46;&lt;/p&gt;

&lt;p&gt;I hope you find interesting uses for this new feature&amp;#46; Let us know what you make with it!&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:e553c913-f396-4976-ad3d-89d2cf1407db</id>
    <published>2008-12-19T13:46:33+00:00</published>
    <updated>2008-12-19T13:46:33+00:00</updated>
    <title>Warbler 0.9.12 Released, Includes JRuby 1.1.6</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2008/12/19/warbler-0-9-12-released-includes-jruby-1-1-6" />
    <category term="jruby" scheme="http://blog.nicksieger.com/articles/tag/jruby" />
    <category term="warbler" scheme="http://blog.nicksieger.com/articles/tag/warbler" />
    <category term="rails" scheme="http://blog.nicksieger.com/articles/tag/rails" />
    <content type="html">&lt;p&gt;I finally got around to releasing the next version of &lt;a href="http://kenai.com/projects/warbler"&gt;Warbler&lt;/a&gt;&amp;#46; I try to keep pace with JRuby releases but 1&amp;#46;1&amp;#46;5 had some bugs that I wanted to wait out (in particular, one with Rubygems assuming &lt;code&gt;Etc&lt;/code&gt; is always available)&amp;#46;&lt;/p&gt;

&lt;p&gt;New in this release is better automatic gem detection for both Rails and Merb&amp;#46; In particular, Warbler will use the contents of Merb&amp;#8217;s &lt;code&gt;config/dependencies.rb&lt;/code&gt; file&amp;#46; As an added bonus, only runtime dependencies are loaded&amp;#46; This detection is done by running the Rails &lt;code&gt;environment&lt;/code&gt; or the Merb &lt;code&gt;merb_env&lt;/code&gt; Rake task&amp;#46; Usually, loading the application environment requires a database connection&amp;#46; If you don&amp;#8217;t want this behavior, you can manually specify dependent gems in &lt;code&gt;config/warble.rb&lt;/code&gt; and turn off the framework detection with &lt;code&gt;Warbler.framework_detection = false&lt;/code&gt;&amp;#46; See &lt;a href="http://caldersphere.rubyforge.org/warbler/"&gt;the documentation&lt;/a&gt; for details&amp;#46;&lt;/p&gt;

&lt;h3&gt;Warbler 0&amp;#46;9&amp;#46;12&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Allow framework auto&amp;#45;detection to be disabled&amp;#46; Set &lt;code&gt;Warbler.framework_detection = false&lt;/code&gt; at the top of config/warble&amp;#46;rb or uncomment the line from a newly generated config&amp;#46;&lt;/li&gt;
&lt;li&gt;Add configuration option to set manifest file (thanks Tommy McGuire)&lt;/li&gt;
&lt;li&gt;Mitigate RubyGems 1&amp;#46;3 compatibility issue (thanks Jens Norrgrann)&lt;/li&gt;
&lt;li&gt;Add experimental &lt;code&gt;war:exploded&lt;/code&gt; task&amp;#46; This allows you to deploy your application in an exploded mode, thus allowing continual development without re&amp;#45;warring and re&amp;#45;deploying&amp;#46; Feedback is appreciated if you try this feature; it may not work in all application servers and for applications other than Rails&amp;#46;&lt;/li&gt;
&lt;li&gt;Handle Rails gem dependencies better (thanks Laszlo Bacsi)&lt;/li&gt;
&lt;li&gt;Auto&amp;#45;detect Merb dependencies (Merb &gt;= 1&amp;#46;0 only)&amp;#46; Please give feedback if you try Warbler with a Merb 1&amp;#46;0 app&amp;#46;&lt;/li&gt;
&lt;li&gt;Ignore gem development dependencies&lt;/li&gt;
&lt;li&gt;Upgrade to JRuby 1&amp;#46;1&amp;#46;6 and JRuby&amp;#45;Rack 0&amp;#46;9&amp;#46;3&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:c5dabd13-4c71-4a68-9ebf-b44551764476</id>
    <published>2008-12-19T05:04:00+00:00</published>
    <updated>2008-12-19T05:06:15+00:00</updated>
    <title>My Article for Ruby Advent 2008</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2008/12/19/my-article-for-ruby-advent-2008" />
    <category term="ruby" scheme="http://blog.nicksieger.com/articles/tag/ruby" />
    <category term="rubyadvent" scheme="http://blog.nicksieger.com/articles/tag/rubyadvent" />
    <category term="jruby" scheme="http://blog.nicksieger.com/articles/tag/jruby" />
    <category term="gruff" scheme="http://blog.nicksieger.com/articles/tag/gruff" />
    <category term="jmx" scheme="http://blog.nicksieger.com/articles/tag/jmx" />
    <content type="html">&lt;p&gt;I wrote an article for &lt;a href="http://advent2008.hackruby.com/" title="Ruby Advent 2008"&gt;Ruby Advent 2008&lt;/a&gt; about using JRuby, &lt;a href="http://code.google.com/p/rmagick4j/" title="rmagick4j -  Google Code"&gt;RMagick4J&lt;/a&gt;, &lt;a href="http://nubyonrails.com/pages/gruff" title="Gruff Graphs for Ruby | Ruby on Rails for Newbies"&gt;Gruff&lt;/a&gt;, and JMX to create a simple JVM memory monitoring application&amp;#46; &lt;a href="http://advent2008.hackruby.com/past/2008/12/19/ruby_graphs_and_java_monitoring_with_jruby/"&gt;Go check it out and let me know what you think&lt;/a&gt;&amp;#46;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve also &lt;a href="http://github.com/nicksieger/advent-jruby/tree/master"&gt;posted the source for the article&lt;/a&gt;&amp;#46;&lt;/p&gt;

&lt;p&gt;Happy Holidays!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://advent2008.hackruby.com/past/2008/12/19/ruby_graphs_and_java_monitoring_with_jruby/"&gt;
&lt;img src="http://img.skitch.com/20081219-kh1h2s82sc528pcnjwa2x21rtm.jpg" alt="rubyadvent"/&gt;
&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
</feed>
