<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7021366107946724064</id><updated>2012-01-24T03:55:24.653-08:00</updated><category term='visualization'/><category term='scala'/><category term='javascript'/><category term='java'/><category term='ec2'/><category term='apple'/><category term='restful'/><category term='ruby 1.9'/><category term='elasticsearch'/><category term='search engine'/><category term='gwt'/><category term='lucene'/><category term='lift'/><category term='osx'/><category term='gauge'/><category term='routes'/><category term='rest'/><category term='daemon'/><category term='mod_xsendfile'/><category term='ruby on rails'/><category term='amazon'/><category term='ppc'/><category term='mongrel'/><category term='mac'/><category term='cruisecontrol'/><category term='soap4r'/><category term='d3.js'/><category term='safe-html'/><category term='xss'/><category term='performance'/><category term='eclipse'/><category term='liftweb'/><category term='google'/><title type='text'>Tomer Doron's Technology Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tomerdoron.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tomerdoron.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tomer Doron</name><uri>https://profiles.google.com/110226495703777331469</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-sMgg30tLj_c/AAAAAAAAAAI/AAAAAAAAcsM/jb1-tT2HvcE/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7021366107946724064.post-1700707398963550193</id><published>2011-12-19T15:37:00.000-08:00</published><updated>2011-12-19T16:37:44.337-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='d3.js'/><category scheme='http://www.blogger.com/atom/ns#' term='visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='gauge'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>google style gauges using d3.js</title><content type='html'>I’ve been playing lately with SVG visualization using the excellent &lt;a href="http://mbostock.github.com/d3/"&gt;d3.js&lt;/a&gt; library. I've originally chosen d3.js because I needed to create highly customized visualizations and d3.js is a great tool for dealing with lower level visualization. &lt;br/&gt;&lt;br/&gt;some of the visualizations included gauges. In many of my products I use &lt;a href="http://code.google.com/apis/chart/interactive/docs/gallery/gauge.html"&gt;google's gauges&lt;/a&gt;, but in this case I  needed to support offline mode, and google's charts require an internet connection. so I decided to go ahead and rebuild it using d3.js.&lt;br/&gt;&lt;br/&gt;below are links to the code and example&lt;br/&gt;&lt;br/&gt;&lt;a href="http://bl.ocks.org/1499279"&gt;http://bl.ocks.org/1499279&lt;/a&gt;&lt;br/&gt;&lt;a href="https://gist.github.com/1499279"&gt;https://gist.github.com/1499279&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;note: the transition effect of the "pointer" still needs love, feel free to fork or otherwise contribute.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7021366107946724064-1700707398963550193?l=tomerdoron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomerdoron.blogspot.com/feeds/1700707398963550193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomerdoron.blogspot.com/2011/12/google-style-gauges-using-d3js.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/1700707398963550193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/1700707398963550193'/><link rel='alternate' type='text/html' href='http://tomerdoron.blogspot.com/2011/12/google-style-gauges-using-d3js.html' title='google style gauges using d3.js'/><author><name>Tomer Doron</name><uri>https://profiles.google.com/110226495703777331469</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-sMgg30tLj_c/AAAAAAAAAAI/AAAAAAAAcsM/jb1-tT2HvcE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7021366107946724064.post-5898361980181151467</id><published>2011-03-03T21:35:00.000-08:00</published><updated>2011-12-19T15:44:14.073-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='safe-html'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='xss'/><title type='text'>a less simple safe-html sanitizer</title><content type='html'>Safe-html has been promoted by google and others as a solution for xss, specifically when dealing with user generated content. Unfortunately GWT provides a rather naive implementation of an html sanitizer named &lt;a href="http://code.google.com/webtoolkit/doc/trunk/DevGuideSecuritySafeHtml.html"&gt;SimpleHtmlSanitizer&lt;/a&gt; which I found too simple for even simple use cases. Relying on the GWT framework and modeled after the SimpleHtmlSanitizer, here is what I came up with &lt;a href="https://gist.github.com/1499453"&gt;https://gist.github.com/1499453&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7021366107946724064-5898361980181151467?l=tomerdoron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomerdoron.blogspot.com/feeds/5898361980181151467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomerdoron.blogspot.com/2011/03/less-simple-safe-html-sanitizer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/5898361980181151467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/5898361980181151467'/><link rel='alternate' type='text/html' href='http://tomerdoron.blogspot.com/2011/03/less-simple-safe-html-sanitizer.html' title='a less simple safe-html sanitizer'/><author><name>Tomer Doron</name><uri>https://profiles.google.com/110226495703777331469</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-sMgg30tLj_c/AAAAAAAAAAI/AAAAAAAAcsM/jb1-tT2HvcE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7021366107946724064.post-3287474556851711851</id><published>2011-02-05T20:28:00.000-08:00</published><updated>2011-02-06T12:09:51.257-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='ppc'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>fun with PPC</title><content type='html'>I recently received an old Apple G5. Even after a decade its dual 64bit PPC CPUs and 8GB of RAM make it quite a capable machine. So when I sent my primary box to the lab, I decided to spend a day on setting it up as a development workstation. &lt;br /&gt;&lt;br /&gt;With Apple not supporting the PPC processors line since Snow Leopard, I decided to go with a Linux setup. I tested a few alternatives: Fedora 12, Yellow Dog, Ubuntu and Debian Lenny and Squeeze. Eventually choosing Squeeze as it offered good hardware support and a more minimalist UI. Too bad CrunchBang does not support PPC, it is by far my favorite distribution for a desktop. Overall, installation of Squeeze was a breeze, more info can be found &lt;a href="http://www.debian.org/ports/powerpc/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My primary programming languages these days are Scala for the back end and GWT for the front end, so the next step was getting them to work. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scala&lt;/b&gt;&lt;br /&gt;The latest Scala package on debian repositories is 2.7.7, so you will need to download the latest from Scala's site and configure appropriately. So far so good, but a simple test yields bad news, Scala was super slow. After further digging I learnt  that the root cause was the JVM:  Squeeze comes pre-packaged with OpenJDK which is extremely slow to the point of unusable on PPCs as it is running in interpreted mode. Luckily, there is a simple solution, installing IBM JDK found &lt;a href="http://www.ibm.com/developerworks/java/jdk/linux/download.html"&gt;here&lt;/a&gt;. Make sure to download the 32-bit if you are using a G5 and that libstdc++5 and libgtk1.2 packages are installed&lt;br /&gt;&lt;br /&gt;&lt;b&gt;GWT&lt;/b&gt;&lt;br /&gt;To develop for GWT you need to have Eclipse with the GWT plugin installed. This part is easy, just make sure you download the 32bit version of Eclipse if you are using a G5. The troubles begin when you are finally ready to debug: GWT debugging is dependent on a browser plugin that unfortunately is not supported on PPC Linux. Luckily, the GWT code is open, so with jumping a few hoops, you can make it work using the following steps:&lt;br /&gt;&lt;br /&gt;1. make sure xulrunner and xulrunner-devel packages are installed&lt;br /&gt;&lt;br /&gt;2. download GWT source:&lt;br /&gt;$ svn checkout http://google-web-toolkit.googlecode.com/svn/trunk/ trunk&lt;br /&gt;$ svn checkout http://google-web-toolkit.googlecode.com/svn/plugin-sdks/ plugin-sdks&lt;br /&gt;&lt;br /&gt;3. copy the plugin SDKs from the x86 version as a PPC version:&lt;br /&gt;$ cp -R plugin-sdks/gecko-skds/gecko-1.9.1/Linux_x86-gcc3 plugin-sdks/gecko-skds/gecko-1.9.1/Linux_ppc-gcc3&lt;br /&gt;$ cp -R plugin-sdks/gecko-skds/gecko-1.9.1/Linux_x86_64-gcc3 plugin-sdks/gecko-skds/gecko-1.9.1/Linux_ppc64-gcc3&lt;br /&gt;&lt;br /&gt;Note that gecko-1.9.1 maps to firefox 3.5, so if you are attempting to compile for a different version you will need to change the path accordingly. Read the make file for the complete version numbers mapping.&lt;br /&gt;&lt;br /&gt;4. Replace all the files in Linux_ppc-gcc3/lib,  Linux_ppc-gcc3/bin, Linux_ppc64-gcc3/lib,  Linux_ppc64-gcc3/bin with the "real" ones from your system, they are all found either in /usr/lib/xurlrunner-devel-1.9.1/sdk/lib or in /usr/lib. &lt;br /&gt;&lt;br /&gt;This assumes you running xulrunner version 1.9.1, otherwise, your path may differ.&lt;br /&gt;&lt;br /&gt;5. prepare to compile:&lt;br /&gt;$ cd trunk/plugins/xpcom&lt;br /&gt;$ export BROWSER=ff35&lt;br /&gt;$ export DEFAULT_FIREFOX_LIBS=/usr/lib/xulrunner-devel-1.9.1/sdk/lib/&lt;br /&gt;&lt;br /&gt;Again, this assumes you are running xulrunner version 1.9.1 and trying to compile for Firefox 3.5, you will need to changes these if you system is running different versions.&lt;br /&gt;&lt;br /&gt;6. edit the install-template.rdf file, adding an entry for Linux PPC after the other platform entries:&lt;br /&gt;&amp;lt;em:targetPlatform&amp;gt;Linux_ppc-gcc3&amp;lt;/em:targetPlatform&amp;gt;&lt;br /&gt;&lt;br /&gt;7. finally, compile GWT from source&lt;br /&gt;$ make clean&lt;br /&gt;$ make&lt;br /&gt;&lt;br /&gt;This will create a Firefox plugin named "gwt-dev-plugin.xpi" in the prebuild directory, install it using Firefox.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7021366107946724064-3287474556851711851?l=tomerdoron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomerdoron.blogspot.com/feeds/3287474556851711851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomerdoron.blogspot.com/2011/02/fun-with-ppc.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/3287474556851711851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/3287474556851711851'/><link rel='alternate' type='text/html' href='http://tomerdoron.blogspot.com/2011/02/fun-with-ppc.html' title='fun with PPC'/><author><name>Tomer Doron</name><uri>https://profiles.google.com/110226495703777331469</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-sMgg30tLj_c/AAAAAAAAAAI/AAAAAAAAcsM/jb1-tT2HvcE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7021366107946724064.post-8355174776948105218</id><published>2010-11-06T03:02:00.000-07:00</published><updated>2010-11-06T03:05:47.089-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lift'/><category scheme='http://www.blogger.com/atom/ns#' term='lucene'/><category scheme='http://www.blogger.com/atom/ns#' term='liftweb'/><category scheme='http://www.blogger.com/atom/ns#' term='elasticsearch'/><category scheme='http://www.blogger.com/atom/ns#' term='search engine'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>integrating elasticsearch and lift</title><content type='html'>I recently came across &lt;a href="http://www.elasticsearch.com/"&gt;elasticsearch&lt;/a&gt; and was waiting for a good opportunity to try it out. The opportunity came in the shape a the new project I am working on which requires a lucene grade search engine and is in lift/sacala which lends itself well as I could use the java elasticsearch client api.&lt;br /&gt;&lt;br /&gt;Elasticsearch is quite new, and I could not find real documentation on how to integrate it, however, going over the java source code and high level documentation on the web site, I was able to come up with the following simple integration:&lt;br /&gt;&lt;br /&gt;First define a search engine abstraction:&lt;br /&gt;&lt;br /&gt;&lt;pre class="scala" name="code"&gt;object SearchEngine extends Logger&lt;br /&gt;{&lt;br /&gt; private var _node:Node = null&lt;br /&gt; private var _client:Client = null&lt;br /&gt; &lt;br /&gt; def startup()&lt;br /&gt; {&lt;br /&gt;  if (!enabled)&lt;br /&gt;  {&lt;br /&gt;   warn("search engine is disabled. if this is not intentional, please change the configuration file accordingly")&lt;br /&gt;   return&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  _node = nodeBuilder().client(true).node&lt;br /&gt;  if (null == _node) return&lt;br /&gt;  _client = _node.client&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; def shutdown()&lt;br /&gt; {&lt;br /&gt;  if (null != _node) _node.close();&lt;br /&gt;  _client = null&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; def enabled:Boolean = "true" == (Props.get("search.enabled") openOr "false")&lt;br /&gt; &lt;br /&gt; def connected:Boolean = null != _client&lt;br /&gt; &lt;br /&gt; def index(indexName:String, typeName:String, identifier:String, json:JValue)&lt;br /&gt; {&lt;br /&gt;  if (null == indexName) throw new Exception("invalid (null) index")&lt;br /&gt;  if (null == typeName) throw new Exception("invalid (null) type")&lt;br /&gt;  if (null == identifier) throw new Exception("invalid (null) identifier")&lt;br /&gt;  if (null == json) throw new Exception("invalid (null) json")&lt;br /&gt;  &lt;br /&gt;  if (!enabled) return&lt;br /&gt;  confirmConnection&lt;br /&gt;  &lt;br /&gt;  val request:IndexRequestBuilder = _client.prepareIndex(indexName, typeName, identifier)&lt;br /&gt;  request.setSource(pretty(render(json)))&lt;br /&gt;  val response:IndexResponse = request.execute().actionGet() &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; def delete(indexName:String, typeName:String, identifier:String)&lt;br /&gt; {&lt;br /&gt;  if (null == indexName) throw new Exception("invalid (null) index")&lt;br /&gt;  if (null == typeName) throw new Exception("invalid (null) type")&lt;br /&gt;  if (null == identifier) throw new Exception("invalid (null) identifier")&lt;br /&gt;  &lt;br /&gt;  if (!enabled) return&lt;br /&gt;  confirmConnection&lt;br /&gt;  &lt;br /&gt;  val request:DeleteRequestBuilder = _client.prepareDelete(indexName, typeName, identifier)&lt;br /&gt;  val response:DeleteResponse = request.execute().actionGet()&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; def search(indexName:String, query:XContentQueryBuilder, from:Integer, size:Integer, explain:Boolean=false):SearchHits =&lt;br /&gt; {&lt;br /&gt;  if (null == indexName) throw new Exception("invalid (null) index")&lt;br /&gt;  if (null == query) throw new Exception("invalid (null) query")&lt;br /&gt; &lt;br /&gt;  if (!enabled) return null&lt;br /&gt;  confirmConnection&lt;br /&gt; &lt;br /&gt;  val request:SearchRequestBuilder = _client.prepareSearch(indexName)&lt;br /&gt;  request.setSearchType(SearchType.QUERY_THEN_FETCH) &lt;br /&gt;  request.setQuery(query) &lt;br /&gt;  request.setFrom(from.intValue) &lt;br /&gt;  request.setSize(size.intValue) &lt;br /&gt;  request.setExplain(explain) &lt;br /&gt; &lt;br /&gt;  val response:SearchResponse = request.execute().actionGet()&lt;br /&gt;  return response.hits&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt; private def confirmConnection&lt;br /&gt; {&lt;br /&gt;  if (!connected) startup&lt;br /&gt;  if (!connected) throw new Exception("cannot connect to search engine, perhaps it needs to be disabled?")&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Naturally, the next step is to add a call into "SearchEngine.startup" from your Boot.scala so the app connects to the search server on startup.&lt;br /&gt;&lt;br /&gt;Next define a pair of model &amp; companion traits to hide the integration details from the domain objects:&lt;br /&gt;&lt;br /&gt;&lt;pre class="scala" name="code"&gt;trait SearchableModelMeta[T &lt;: SearchableModel[T]] extends BaseModelMeta[T]&lt;br /&gt;{&lt;br /&gt; self: T  with SearchableModelMeta[T] with BaseModelMeta[T] =&gt;&lt;br /&gt; &lt;br /&gt; private def searchIndexName:String = this.pluralXmlName&lt;br /&gt; &lt;br /&gt; private def searchTypeName:String = this.xmlName&lt;br /&gt; &lt;br /&gt; override def beforeSave = updateSearchIndexDate _ :: super.beforeSave&lt;br /&gt;&lt;br /&gt; override def afterSave = storeInSearchIndex _ :: super.afterSave&lt;br /&gt; &lt;br /&gt; override def afterDelete = deleteFromSearchIndex _ :: super.afterSave&lt;br /&gt; &lt;br /&gt; def reindexAll()&lt;br /&gt; {&lt;br /&gt;  findAll.foreach((instance:T) =&gt; { storeInSearchIndex(instance) })&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; def search(query:XContentQueryBuilder, from:Integer=0, size:Integer=100):SearchHits =&lt;br /&gt; {&lt;br /&gt;  SearchEngine.search(this.searchIndexName, query, from, size)&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private def updateSearchIndexDate(instance:T)&lt;br /&gt; {&lt;br /&gt;  instance.indexedAt(Helpers.now)&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private def storeInSearchIndex(instance:T)&lt;br /&gt; {&lt;br /&gt;  SearchEngine.index(this.searchIndexName, this.searchTypeName, instance.id.toString, instance.toJson("search"))&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private def deleteFromSearchIndex(instance:T)&lt;br /&gt; {&lt;br /&gt;  SearchEngine.delete(this.searchIndexName, this.searchTypeName, instance.id.toString)&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;trait SearchableModel[T &lt;: BaseModel[T]] extends BaseModel[T]&lt;br /&gt;{&lt;br /&gt; self: T =&gt;&lt;br /&gt; &lt;br /&gt; /*&lt;br /&gt; *** columns&lt;br /&gt; */&lt;br /&gt; &lt;br /&gt; object indexedAt extends MappedDateTime(this.asInstanceOf[T])&lt;br /&gt; {&lt;br /&gt;  override def dbColumnName = "indexed_at"&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note this example uses a custom base model class, which is not super important to what I am trying to show here (it facilitates dynamic json assembly and naming conventions, but those are pretty straight forward). however, it is important to note that that base model mixes in  LongKeyedMapper and IdPk. headers for the class &amp; companion below.&lt;br /&gt;&lt;br /&gt;&lt;pre class="scala" name="code"&gt;trait BaseModelMeta[T &lt;: BaseModel[T]] extends LongKeyedMetaMapper[T]&lt;br /&gt;&lt;br /&gt;trait BaseModel[T &lt;: LongKeyedMapper[T]] extends LongKeyedMapper[T] with IdPK&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Last mixin the SearchableMode traits with the domain model so you can do things like:&lt;br /&gt;&lt;br /&gt;Employee.search(...)&lt;br /&gt;&lt;br /&gt;This of course if a very basic example which uses a handful of the available features elasticsearch and lucene offer, however, this should give anyone trying to integrate elasticsearch with lift a good head start.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7021366107946724064-8355174776948105218?l=tomerdoron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomerdoron.blogspot.com/feeds/8355174776948105218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomerdoron.blogspot.com/2010/11/integration-elasticsearch-and-lift.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/8355174776948105218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/8355174776948105218'/><link rel='alternate' type='text/html' href='http://tomerdoron.blogspot.com/2010/11/integration-elasticsearch-and-lift.html' title='integrating elasticsearch and lift'/><author><name>Tomer Doron</name><uri>https://profiles.google.com/110226495703777331469</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-sMgg30tLj_c/AAAAAAAAAAI/AAAAAAAAcsM/jb1-tT2HvcE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7021366107946724064.post-1003442914049590500</id><published>2010-11-04T17:00:00.000-07:00</published><updated>2010-11-06T03:16:29.816-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='restful'/><category scheme='http://www.blogger.com/atom/ns#' term='lift'/><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><category scheme='http://www.blogger.com/atom/ns#' term='liftweb'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='routes'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>ruby on rails style routes with lift</title><content type='html'>In my latest project i am using lift/scala for restful services. spending the last couple of years using ruby on rails for such, the first thing i was looking for was a convenient way to define my generic restful routes. here is what i cam up with:&lt;br /&gt;&lt;br /&gt;&lt;pre class="scala" name="code"&gt;object Routes extends RestHelper with Logger&lt;br /&gt;{      &lt;br /&gt; // response builder&lt;br /&gt; implicit def cvt:JxCvtPF[ResponseItem] = &lt;br /&gt; { &lt;br /&gt;  case (XmlSelect, response, request) =&gt; response.toXml &lt;br /&gt;  case (JsonSelect, response, request) =&gt; response.toJson&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private val PREFIX:String = "api"&lt;br /&gt; &lt;br /&gt; private var _services:mutable.ListMap[String, BaseService] = null&lt;br /&gt;    &lt;br /&gt; def registerService(service:BaseService, alias:String=null)&lt;br /&gt; {&lt;br /&gt;  if (null == _services) _services = new mutable.ListMap[String, BaseService]()&lt;br /&gt;  val key:String = if (null != alias) alias else service.getClass.getName.split("\\.").toList.last.replace("Service$", "")&lt;br /&gt;  _services += key -&gt; service&lt;br /&gt; }  &lt;br /&gt;   &lt;br /&gt; /* &lt;br /&gt; *** standard restful routes&lt;br /&gt; */  &lt;br /&gt;   &lt;br /&gt; serveJx&lt;br /&gt; {&lt;br /&gt;  // GET /api/service/index.{xml|json}&lt;br /&gt;  case Get(PREFIX :: StringValue(service) :: "index" :: Nil, _) =&gt; invokeApi(service, "index")   &lt;br /&gt; }&lt;br /&gt; serveJx&lt;br /&gt; { &lt;br /&gt;  // GET /api/service/1.{xml|json}&lt;br /&gt;  case Get(PREFIX :: StringValue(service) :: LongValue(id) :: Nil, _) =&gt; invokeApi(service, "get", id)&lt;br /&gt; }&lt;br /&gt; serveJx&lt;br /&gt; { &lt;br /&gt;  // GET /api/service/api.{xml|json}&lt;br /&gt;  case Get(PREFIX :: StringValue(service) :: StringValue(api) :: Nil, _) =&gt; invokeApi(service, api)&lt;br /&gt; }&lt;br /&gt; serveJx&lt;br /&gt; { &lt;br /&gt;  // GET /api/service/api/1.{xml|json}&lt;br /&gt;  case Get(PREFIX :: StringValue(service) :: StringValue(api) :: LongValue(id) :: Nil, _) =&gt; invokeApi(service, api, id)&lt;br /&gt; }  &lt;br /&gt; serveJx&lt;br /&gt; { &lt;br /&gt;  // POST /api/service.{xml|json}&lt;br /&gt;  case Post(PREFIX :: StringValue(service) :: Nil, _) =&gt; invokeApi(service, "create")&lt;br /&gt; }&lt;br /&gt; serveJx&lt;br /&gt; { &lt;br /&gt;  // POST /api/service/api.{xml|json}&lt;br /&gt;  case Post(PREFIX :: StringValue(service) :: StringValue(api) :: Nil, _) =&gt; invokeApi(service, api)&lt;br /&gt; }&lt;br /&gt; serveJx&lt;br /&gt; { &lt;br /&gt;  // POST /api/service/api/1.{xml|json}&lt;br /&gt;  case Post(PREFIX :: StringValue(service) :: StringValue(api) :: LongValue(id) :: Nil, _) =&gt; invokeApi(service, api, id)&lt;br /&gt; }  &lt;br /&gt; serveJx&lt;br /&gt; { &lt;br /&gt;  // PUT /api/service/1.{xml|json}&lt;br /&gt;  case Put(PREFIX :: StringValue(service) :: LongValue(id) :: Nil, _) =&gt; invokeApi(service, "update", id)&lt;br /&gt; }&lt;br /&gt; serveJx&lt;br /&gt; { &lt;br /&gt;  // DELETE /api/service/1.{xml|json}&lt;br /&gt;  case Delete(PREFIX :: StringValue(service) :: LongValue(id) :: Nil, _) =&gt; invokeApi(service, "delete", id)&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private def invokeApi(service:String, api:String, id:Long=0):Box[ResponseItem] =&lt;br /&gt; {&lt;br /&gt;  val serviceName:String = StringHelpers.camelify(service)&lt;br /&gt;  val methodName:String = StringHelpers.camelifyMethod(api)&lt;br /&gt;  &lt;br /&gt;  info("processing api " + service + ":" + api + " as " + serviceName + "[Service]:" + methodName)&lt;br /&gt;     &lt;br /&gt;  if (!_services.contains(serviceName)) return Full(Failed("unknown service " + service))&lt;br /&gt;  &lt;br /&gt;  _services(serviceName) match&lt;br /&gt;  {&lt;br /&gt;   case serviceHandler:BaseService =&gt;&lt;br /&gt;   {     &lt;br /&gt;    serviceHandler.getClass.getMethods.foreach((method:Method) =&gt;&lt;br /&gt;    {      &lt;br /&gt;     if (methodName == method.getName)&lt;br /&gt;     {      &lt;br /&gt;      val result:Object = if (0 == id) method.invoke(serviceHandler) else method.invoke(serviceHandler, id.asInstanceOf[AnyRef])       &lt;br /&gt;      result match&lt;br /&gt;      {&lt;br /&gt;       case response:ResponseItem =&gt; return Full(response) &lt;br /&gt;       case _ =&gt; return Empty&lt;br /&gt;      }&lt;br /&gt;     }&lt;br /&gt;    })&lt;br /&gt;    return Full(Failed("unknown API " + service + ":" + api)) &lt;br /&gt;   }&lt;br /&gt;   case _ =&gt; Full(Failed("invalid API configuration, service is not a BaseService"))&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Once the routes handler (above) is define, you need to register the service implementation(s) to the routes handler and register the routes handler to Lift's dispatch table, this is done in lift's boot sequence, typically defined in Boot.scala. for example:&lt;br /&gt;&lt;br /&gt;&lt;pre class="scala" name="code"&gt;Routes.registerService(SessionService)&lt;br /&gt;Routes.registerService(UserService)&lt;br /&gt;.    &lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;LiftRules.dispatch.append(Routes)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Naturally, you can extend this rest handler to handle custom restful routes, using the serveJx or serve directives, this is explained in more details &lt;a href="http://www.assembla.com/wiki/show/liftweb/REST_Web_Services"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Please note that a &lt;a href="https://lampsvn.epfl.ch/trac/scala/ticket/1133"&gt;bug&lt;/a&gt; in scala is preventing from bundling all those serveJx case statements together, thus, the DRYlessness.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7021366107946724064-1003442914049590500?l=tomerdoron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomerdoron.blogspot.com/feeds/1003442914049590500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomerdoron.blogspot.com/2010/11/ruby-on-rails-style-routes-with-lift.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/1003442914049590500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/1003442914049590500'/><link rel='alternate' type='text/html' href='http://tomerdoron.blogspot.com/2010/11/ruby-on-rails-style-routes-with-lift.html' title='ruby on rails style routes with lift'/><author><name>Tomer Doron</name><uri>https://profiles.google.com/110226495703777331469</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-sMgg30tLj_c/AAAAAAAAAAI/AAAAAAAAcsM/jb1-tT2HvcE/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7021366107946724064.post-4707800942382622361</id><published>2009-12-08T16:01:00.000-08:00</published><updated>2009-12-20T17:18:44.194-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby 1.9'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='ec2'/><title type='text'>comparing ruby 1.9 performance on ec2</title><content type='html'>benchmarked using ruby's benchmarking suite. all machine are brand new fedora 8 basic instances, not running any additional services. all tests done on ruby 1.9.1p376 (2009-12-07 revision 26041) [i686-linux] compiled from source with --enable-shared flag. benchmarks performed twice on 2 separate instances.&lt;br /&gt;&lt;br /&gt;results speak for themselves, don't forget to compare ec2 pricing ;)&lt;br /&gt;&lt;br /&gt;&lt;style&gt;&lt;!--table {}.style0 {text-align:general; vertical-align:bottom; white-space:nowrap; color:windowtext; font-size:10.0pt; font-weight:400; font-style:normal; text-decoration:none; font-family:Verdana; border:none;}td {padding-top:1px; padding-right:1px; padding-left:1px; color:windowtext; font-size:10.0pt; font-weight:400; font-style:normal; text-decoration:none; font-family:Verdana; text-align:general; vertical-align:bottom; border:none; white-space:nowrap;}.xl24 {border:.5pt solid windowtext;}.xl25 {border:.5pt solid windowtext; background:#CCFFFF;}.xl26 {border:.5pt solid windowtext; background:#CCFFCC;}.xl27 {font-weight:700; text-align:center; vertical-align:middle; border-top:.5pt solid windowtext; border-right:none; border-bottom:.5pt solid windowtext; border-left:.5pt solid windowtext; background:#FFFF99;}.xl28 {font-weight:700; text-align:center; vertical-align:middle; border-top:.5pt solid windowtext; border-right:none; border-bottom:.5pt solid windowtext; border-left:none; background:#FFFF99;}.xl29 {text-align:center; vertical-align:middle; border-top:.5pt solid windowtext; border-right:.5pt solid windowtext; border-bottom:.5pt solid windowtext; border-left:none; background:#FFFF99;}.xl30 {font-weight:700; text-align:center; border-top:.5pt solid windowtext; border-right:none; border-bottom:.5pt solid windowtext; border-left:.5pt solid windowtext; background:#FFFF99;}.xl31 {font-weight:700; text-align:center; border-top:.5pt solid windowtext; border-right:none; border-bottom:.5pt solid windowtext; border-left:none; background:#FFFF99;}.xl32 {text-align:center; border-top:.5pt solid windowtext; border-right:.5pt solid windowtext; border-bottom:.5pt solid windowtext; border-left:none; background:#FFFF99;}.xl33 {border-top:.5pt solid windowtext; border-right:.5pt solid windowtext; border-bottom:.5pt solid windowtext; border-left:none; background:#FFFF99;}.xl34 {font-weight:700; text-align:center; border:.5pt solid windowtext; background:#FFFF99;}.xl35 {font-weight:700; border:.5pt solid windowtext; background:#FFFF99;}.xl36 {border:.5pt solid windowtext; background:#FFCC99;}ruby {ruby-align:left;}rt {color:windowtext; font-size:8.0pt; font-weight:400; font-style:normal; text-decoration:none; font-family:Verdana; display:none;}--&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border=0 cellpadding=0 cellspacing=0 width=634 style='border-collapse: collapse;table-layout:fixed'&gt;&lt;col width=19&gt;  &lt;col width=150&gt;  &lt;col width=56 span=2&gt;  &lt;col width=63&gt;  &lt;col width=49 span=2&gt;  &lt;col width=56&gt;  &lt;col width=49&gt;  &lt;col width=49&gt;  &lt;col width=56&gt;&lt;tr height=13&gt;   &lt;td height=13 width=19&gt;&lt;/td&gt;   &lt;td width=150&gt;&lt;/td&gt;   &lt;td width=56&gt;&lt;/td&gt;   &lt;td width=56&gt;&lt;/td&gt;   &lt;td width=63&gt;&lt;/td&gt;   &lt;td width=49&gt;&lt;/td&gt;   &lt;td width=49&gt;&lt;/td&gt;   &lt;td width=56&gt;&lt;/td&gt;   &lt;td width=49&gt;&lt;/td&gt;   &lt;td width=49&gt;&lt;/td&gt;   &lt;td width=56&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;&amp;nbsp;&lt;/td&gt;   &lt;td colspan=3 class=xl27 style='border-right:.5pt solid black'&gt;small 32 bit&lt;/td&gt;   &lt;td colspan=3 class=xl30 style='border-right:.5pt solid black'&gt;medium 32 bit&lt;/td&gt;   &lt;td colspan=3 class=xl30 style='border-right:.5pt solid black'&gt;large 64 bit&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl35&gt;test&lt;/td&gt;   &lt;td class=xl34&gt;run 1&lt;/td&gt;   &lt;td class=xl34&gt;run 2&lt;/td&gt;   &lt;td class=xl34&gt;avg&lt;/td&gt;   &lt;td class=xl34&gt;run 1&lt;/td&gt;   &lt;td class=xl34&gt;run 2&lt;/td&gt;   &lt;td class=xl34&gt;avg&lt;/td&gt;   &lt;td class=xl34&gt;run 1&lt;/td&gt;   &lt;td class=xl34&gt;run 2&lt;/td&gt;   &lt;td class=xl34&gt;avg&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;app_answer&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.251&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.263&lt;/td&gt;   &lt;td class=xl36 align=right&gt;0.257&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.113&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.118&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.1155&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.087&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.111&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.099&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;app_erb&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.926&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.911&lt;/td&gt;   &lt;td class=xl36 align=right&gt;2.9185&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.2&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.24&lt;/td&gt;   &lt;td class=xl25 align=right&gt;1.22&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.178&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.184&lt;/td&gt;   &lt;td class=xl26 align=right&gt;1.181&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;app_factorial&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.425&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.435&lt;/td&gt;   &lt;td class=xl36 align=right&gt;1.43&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.573&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.574&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.5735&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.445&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.459&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.452&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;app_fib&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.935&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.071&lt;/td&gt;   &lt;td class=xl36 align=right&gt;3.003&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.248&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.291&lt;/td&gt;   &lt;td class=xl25 align=right&gt;1.2695&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.137&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.158&lt;/td&gt;   &lt;td class=xl26 align=right&gt;1.1475&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;app_mandelbrot&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.343&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.348&lt;/td&gt;   &lt;td class=xl36 align=right&gt;1.3455&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.566&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.569&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.5675&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.545&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.561&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.553&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;app_pentomino&lt;/td&gt;   &lt;td class=xl24 align=right&gt;99.62&lt;/td&gt;   &lt;td class=xl24 align=right&gt;99.227&lt;/td&gt;   &lt;td class=xl36 align=right&gt;99.4235&lt;/td&gt;   &lt;td class=xl24 align=right&gt;41.587&lt;/td&gt;   &lt;td class=xl24 align=right&gt;41.832&lt;/td&gt;   &lt;td class=xl25 align=right&gt;41.7095&lt;/td&gt;   &lt;td class=xl24 align=right&gt;38.587&lt;/td&gt;   &lt;td class=xl24 align=right&gt;38.976&lt;/td&gt;   &lt;td class=xl26 align=right&gt;38.7815&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;app_raise&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.155&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.087&lt;/td&gt;   &lt;td class=xl36 align=right&gt;3.121&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.309&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.326&lt;/td&gt;   &lt;td class=xl26 align=right&gt;1.3175&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.488&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.521&lt;/td&gt;   &lt;td class=xl25 align=right&gt;1.5045&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;app_strconcat&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.714&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.754&lt;/td&gt;   &lt;td class=xl36 align=right&gt;2.734&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.173&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.189&lt;/td&gt;   &lt;td class=xl25 align=right&gt;1.181&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.001&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.07&lt;/td&gt;   &lt;td class=xl26 align=right&gt;1.0355&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;app_tak&lt;/td&gt;   &lt;td class=xl24 align=right&gt;4.161&lt;/td&gt;   &lt;td class=xl24 align=right&gt;4.174&lt;/td&gt;   &lt;td class=xl36 align=right&gt;4.1675&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.743&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.756&lt;/td&gt;   &lt;td class=xl25 align=right&gt;1.7495&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.52&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.57&lt;/td&gt;   &lt;td class=xl26 align=right&gt;1.545&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;app_tarai&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.194&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.164&lt;/td&gt;   &lt;td class=xl36 align=right&gt;3.179&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.364&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.392&lt;/td&gt;   &lt;td class=xl25 align=right&gt;1.378&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.23&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.281&lt;/td&gt;   &lt;td class=xl26 align=right&gt;1.2555&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;app_uri&lt;/td&gt;   &lt;td class=xl24 align=right&gt;5.652&lt;/td&gt;   &lt;td class=xl24 align=right&gt;5.657&lt;/td&gt;   &lt;td class=xl36 align=right&gt;5.6545&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.372&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.381&lt;/td&gt;   &lt;td class=xl26 align=right&gt;2.3765&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.456&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.412&lt;/td&gt;   &lt;td class=xl25 align=right&gt;2.434&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;io_file_create&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.345&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.351&lt;/td&gt;   &lt;td class=xl36 align=right&gt;1.348&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.579&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.569&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.574&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.872&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.891&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.8815&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;io_file_read&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.379&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.372&lt;/td&gt;   &lt;td class=xl36 align=right&gt;1.3755&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.652&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.678&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.665&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.757&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.737&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.747&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;io_file_write&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.086&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.124&lt;/td&gt;   &lt;td class=xl36 align=right&gt;1.105&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.503&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.514&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.5085&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.394&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.413&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.4035&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;loop_for&lt;/td&gt;   &lt;td class=xl24 align=right&gt;8.137&lt;/td&gt;   &lt;td class=xl24 align=right&gt;8.393&lt;/td&gt;   &lt;td class=xl36 align=right&gt;8.265&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.485&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.685&lt;/td&gt;   &lt;td class=xl25 align=right&gt;3.585&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.924&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.924&lt;/td&gt;   &lt;td class=xl26 align=right&gt;2.924&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;loop_generator&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.993&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.061&lt;/td&gt;   &lt;td class=xl36 align=right&gt;3.027&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.301&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.305&lt;/td&gt;   &lt;td class=xl25 align=right&gt;1.303&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.274&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.278&lt;/td&gt;   &lt;td class=xl26 align=right&gt;1.276&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;loop_times&lt;/td&gt;   &lt;td class=xl24 align=right&gt;7.592&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.963&lt;/td&gt;   &lt;td class=xl36 align=right&gt;7.2775&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.423&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.857&lt;/td&gt;   &lt;td class=xl25 align=right&gt;3.14&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.614&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.657&lt;/td&gt;   &lt;td class=xl26 align=right&gt;2.6355&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;loop_whileloop&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.335&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.449&lt;/td&gt;   &lt;td class=xl36 align=right&gt;3.392&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.463&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.476&lt;/td&gt;   &lt;td class=xl25 align=right&gt;1.4695&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.067&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.059&lt;/td&gt;   &lt;td class=xl26 align=right&gt;1.063&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;loop_whileloop2&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.7&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.725&lt;/td&gt;   &lt;td class=xl36 align=right&gt;0.7125&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.33&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.327&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.3285&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.23&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.227&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.2285&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_ackermann&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.488&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.431&lt;/td&gt;   &lt;td class=xl36 align=right&gt;3.4595&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.459&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.479&lt;/td&gt;   &lt;td class=xl25 align=right&gt;1.469&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.321&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.336&lt;/td&gt;   &lt;td class=xl26 align=right&gt;1.3285&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_array&lt;/td&gt;   &lt;td class=xl24 align=right&gt;8.03&lt;/td&gt;   &lt;td class=xl24 align=right&gt;8.002&lt;/td&gt;   &lt;td class=xl36 align=right&gt;8.016&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.445&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.477&lt;/td&gt;   &lt;td class=xl25 align=right&gt;3.461&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.015&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.077&lt;/td&gt;   &lt;td class=xl26 align=right&gt;3.046&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_binary_trees&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.21&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.157&lt;/td&gt;   &lt;td class=xl36 align=right&gt;2.1835&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.892&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.905&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.8985&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.853&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.864&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.8585&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_concatenate&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.426&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.334&lt;/td&gt;   &lt;td class=xl36 align=right&gt;2.38&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.004&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.026&lt;/td&gt;   &lt;td class=xl25 align=right&gt;1.015&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.862&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.86&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.861&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_count_words&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.534&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.583&lt;/td&gt;   &lt;td class=xl36 align=right&gt;1.5585&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.682&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.698&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.69&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.631&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.628&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.6295&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_exception&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.177&lt;/td&gt;   &lt;td class=xl24 align=right&gt;5.951&lt;/td&gt;   &lt;td class=xl36 align=right&gt;6.064&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.483&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.473&lt;/td&gt;   &lt;td class=xl26 align=right&gt;2.478&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.754&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.712&lt;/td&gt;   &lt;td class=xl25 align=right&gt;2.733&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_fannkuch&lt;/td&gt;   &lt;td class=xl24 align=right&gt;122.375&lt;/td&gt;   &lt;td class=xl24 align=right&gt;122.345&lt;/td&gt;   &lt;td class=xl36 align=right&gt;122.36&lt;/td&gt;   &lt;td class=xl24 align=right&gt;51.535&lt;/td&gt;   &lt;td class=xl24 align=right&gt;51.816&lt;/td&gt;   &lt;td class=xl26 align=right&gt;51.6755&lt;/td&gt;   &lt;td class=xl24 align=right&gt;54.612&lt;/td&gt;   &lt;td class=xl24 align=right&gt;55.241&lt;/td&gt;   &lt;td class=xl25 align=right&gt;54.9265&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_fasta&lt;/td&gt;   &lt;td class=xl24 align=right&gt;16.102&lt;/td&gt;   &lt;td class=xl24 align=right&gt;15.909&lt;/td&gt;   &lt;td class=xl36 align=right&gt;16.0055&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.739&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.653&lt;/td&gt;   &lt;td class=xl25 align=right&gt;6.696&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.712&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.567&lt;/td&gt;   &lt;td class=xl26 align=right&gt;6.6395&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_k_nucleotide&lt;/td&gt;   &lt;td class=xl24 align=right&gt;9.231&lt;/td&gt;   &lt;td class=xl24 align=right&gt;9.204&lt;/td&gt;   &lt;td class=xl36 align=right&gt;9.2175&lt;/td&gt;   &lt;td class=xl24 align=right&gt;4.021&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.972&lt;/td&gt;   &lt;td class=xl25 align=right&gt;3.9965&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.861&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.895&lt;/td&gt;   &lt;td class=xl26 align=right&gt;3.878&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_lists&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.851&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.996&lt;/td&gt;   &lt;td class=xl36 align=right&gt;1.9235&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.855&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.845&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.85&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.782&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.778&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.78&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_mandelbrot&lt;/td&gt;   &lt;td class=xl24 align=right&gt;49.539&lt;/td&gt;   &lt;td class=xl24 align=right&gt;49.33&lt;/td&gt;   &lt;td class=xl36 align=right&gt;49.4345&lt;/td&gt;   &lt;td class=xl24 align=right&gt;20.966&lt;/td&gt;   &lt;td class=xl24 align=right&gt;21.093&lt;/td&gt;   &lt;td class=xl25 align=right&gt;21.0295&lt;/td&gt;   &lt;td class=xl24 align=right&gt;19.441&lt;/td&gt;   &lt;td class=xl24 align=right&gt;19.679&lt;/td&gt;   &lt;td class=xl26 align=right&gt;19.56&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_matrix&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.18&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.234&lt;/td&gt;   &lt;td class=xl36 align=right&gt;2.207&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.945&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.978&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.9615&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.819&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.858&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.8385&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_meteor_contest&lt;/td&gt;   &lt;td class=xl24 align=right&gt;31.53&lt;/td&gt;   &lt;td class=xl24 align=right&gt;31.425&lt;/td&gt;   &lt;td class=xl36 align=right&gt;31.4775&lt;/td&gt;   &lt;td class=xl24 align=right&gt;13.338&lt;/td&gt;   &lt;td class=xl24 align=right&gt;13.479&lt;/td&gt;   &lt;td class=xl25 align=right&gt;13.4085&lt;/td&gt;   &lt;td class=xl24 align=right&gt;12.317&lt;/td&gt;   &lt;td class=xl24 align=right&gt;12.254&lt;/td&gt;   &lt;td class=xl26 align=right&gt;12.2855&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_nbody&lt;/td&gt;   &lt;td class=xl24 align=right&gt;43.097&lt;/td&gt;   &lt;td class=xl24 align=right&gt;42.141&lt;/td&gt;   &lt;td class=xl36 align=right&gt;42.619&lt;/td&gt;   &lt;td class=xl24 align=right&gt;18.029&lt;/td&gt;   &lt;td class=xl24 align=right&gt;18.12&lt;/td&gt;   &lt;td class=xl26 align=right&gt;18.0745&lt;/td&gt;   &lt;td class=xl24 align=right&gt;18.64&lt;/td&gt;   &lt;td class=xl24 align=right&gt;18.931&lt;/td&gt;   &lt;td class=xl25 align=right&gt;18.7855&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_nested_loop&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.564&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.656&lt;/td&gt;   &lt;td class=xl36 align=right&gt;6.61&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.668&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.796&lt;/td&gt;   &lt;td class=xl25 align=right&gt;2.732&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.219&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.275&lt;/td&gt;   &lt;td class=xl26 align=right&gt;2.247&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_nsieve&lt;/td&gt;   &lt;td class=xl24 align=right&gt;15.524&lt;/td&gt;   &lt;td class=xl24 align=right&gt;15.361&lt;/td&gt;   &lt;td class=xl36 align=right&gt;15.4425&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.54&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.718&lt;/td&gt;   &lt;td class=xl25 align=right&gt;6.629&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.526&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.544&lt;/td&gt;   &lt;td class=xl26 align=right&gt;6.535&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_nsieve_bits&lt;/td&gt;   &lt;td class=xl24 align=right&gt;20.059&lt;/td&gt;   &lt;td class=xl24 align=right&gt;20.106&lt;/td&gt;   &lt;td class=xl36 align=right&gt;20.0825&lt;/td&gt;   &lt;td class=xl24 align=right&gt;8.496&lt;/td&gt;   &lt;td class=xl24 align=right&gt;8.534&lt;/td&gt;   &lt;td class=xl25 align=right&gt;8.515&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.785&lt;/td&gt;   &lt;td class=xl24 align=right&gt;7.031&lt;/td&gt;   &lt;td class=xl26 align=right&gt;6.908&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_object&lt;/td&gt;   &lt;td class=xl24 align=right&gt;4.818&lt;/td&gt;   &lt;td class=xl24 align=right&gt;4.795&lt;/td&gt;   &lt;td class=xl36 align=right&gt;4.8065&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.066&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.068&lt;/td&gt;   &lt;td class=xl25 align=right&gt;2.067&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.844&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.825&lt;/td&gt;   &lt;td class=xl26 align=right&gt;1.8345&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_partial_sums&lt;/td&gt;   &lt;td class=xl24 align=right&gt;56.984&lt;/td&gt;   &lt;td class=xl24 align=right&gt;57.449&lt;/td&gt;   &lt;td class=xl36 align=right&gt;57.2165&lt;/td&gt;   &lt;td class=xl24 align=right&gt;24.446&lt;/td&gt;   &lt;td class=xl24 align=right&gt;24.164&lt;/td&gt;   &lt;td class=xl26 align=right&gt;24.305&lt;/td&gt;   &lt;td class=xl24 align=right&gt;24.598&lt;/td&gt;   &lt;td class=xl24 align=right&gt;24.707&lt;/td&gt;   &lt;td class=xl25 align=right&gt;24.6525&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_pidigits&lt;/td&gt;   &lt;td class=xl24 align=right&gt;9.494&lt;/td&gt;   &lt;td class=xl24 align=right&gt;9.554&lt;/td&gt;   &lt;td class=xl36 align=right&gt;9.524&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.944&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.925&lt;/td&gt;   &lt;td class=xl25 align=right&gt;3.9345&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.865&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.846&lt;/td&gt;   &lt;td class=xl26 align=right&gt;2.8555&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_random&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.318&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.349&lt;/td&gt;   &lt;td class=xl36 align=right&gt;2.3335&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.992&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.016&lt;/td&gt;   &lt;td class=xl25 align=right&gt;1.004&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.915&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.941&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.928&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_reverse_complement&lt;/td&gt;   &lt;td class=xl24 align=right&gt;26.634&lt;/td&gt;   &lt;td class=xl24 align=right&gt;31.414&lt;/td&gt;   &lt;td class=xl36 align=right&gt;29.024&lt;/td&gt;   &lt;td class=xl24 align=right&gt;11.043&lt;/td&gt;   &lt;td class=xl24 align=right&gt;11.656&lt;/td&gt;   &lt;td class=xl26 align=right&gt;11.3495&lt;/td&gt;   &lt;td class=xl24 align=right&gt;12.476&lt;/td&gt;   &lt;td class=xl24 align=right&gt;12.484&lt;/td&gt;   &lt;td class=xl25 align=right&gt;12.48&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_sieve&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.428&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.452&lt;/td&gt;   &lt;td class=xl36 align=right&gt;0.44&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.21&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.227&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.2185&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.135&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.169&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.152&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;so_spectralnorm&lt;/td&gt;   &lt;td class=xl24 align=right&gt;22.134&lt;/td&gt;   &lt;td class=xl24 align=right&gt;22.296&lt;/td&gt;   &lt;td class=xl36 align=right&gt;22.215&lt;/td&gt;   &lt;td class=xl24 align=right&gt;9.6&lt;/td&gt;   &lt;td class=xl24 align=right&gt;9.451&lt;/td&gt;   &lt;td class=xl25 align=right&gt;9.5255&lt;/td&gt;   &lt;td class=xl24 align=right&gt;8.536&lt;/td&gt;   &lt;td class=xl24 align=right&gt;8.462&lt;/td&gt;   &lt;td class=xl26 align=right&gt;8.499&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm1_block*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;7.212&lt;/td&gt;   &lt;td class=xl24 align=right&gt;7.208&lt;/td&gt;   &lt;td class=xl36 align=right&gt;7.21&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.409&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.134&lt;/td&gt;   &lt;td class=xl25 align=right&gt;3.2715&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.769&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.819&lt;/td&gt;   &lt;td class=xl26 align=right&gt;2.794&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm1_const*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.143&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.988&lt;/td&gt;   &lt;td class=xl36 align=right&gt;2.0655&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.296&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.872&lt;/td&gt;   &lt;td class=xl25 align=right&gt;1.084&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.661&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.672&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.6665&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm1_ensure*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.385&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.368&lt;/td&gt;   &lt;td class=xl36 align=right&gt;0.3765&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.15&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.168&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.159&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.143&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.153&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.148&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13 style='page-break-before:always'&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm1_ivar*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;7.196&lt;/td&gt;   &lt;td class=xl24 align=right&gt;7.12&lt;/td&gt;   &lt;td class=xl36 align=right&gt;7.158&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.989&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.004&lt;/td&gt;   &lt;td class=xl25 align=right&gt;2.9965&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.735&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.741&lt;/td&gt;   &lt;td class=xl26 align=right&gt;2.738&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm1_ivar_set*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;7.063&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.819&lt;/td&gt;   &lt;td class=xl36 align=right&gt;6.941&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.803&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.974&lt;/td&gt;   &lt;td class=xl25 align=right&gt;2.8885&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.492&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.502&lt;/td&gt;   &lt;td class=xl26 align=right&gt;2.497&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm1_length*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.93&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.694&lt;/td&gt;   &lt;td class=xl36 align=right&gt;3.812&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.638&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.678&lt;/td&gt;   &lt;td class=xl25 align=right&gt;1.658&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.124&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.159&lt;/td&gt;   &lt;td class=xl26 align=right&gt;1.1415&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm1_neq*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.814&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.818&lt;/td&gt;   &lt;td class=xl36 align=right&gt;2.816&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.221&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.236&lt;/td&gt;   &lt;td class=xl25 align=right&gt;1.2285&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.887&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.888&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.8875&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm1_not*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.531&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.526&lt;/td&gt;   &lt;td class=xl36 align=right&gt;1.5285&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.651&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.702&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.6765&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.519&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.547&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.533&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm1_rescue*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.324&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.208&lt;/td&gt;   &lt;td class=xl36 align=right&gt;0.266&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.133&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.153&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.143&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.112&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.144&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.128&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm1_simplereturn*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;4.372&lt;/td&gt;   &lt;td class=xl24 align=right&gt;5.532&lt;/td&gt;   &lt;td class=xl36 align=right&gt;4.952&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.929&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.352&lt;/td&gt;   &lt;td class=xl25 align=right&gt;2.1405&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.731&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.661&lt;/td&gt;   &lt;td class=xl26 align=right&gt;1.696&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm1_swap*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.714&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.631&lt;/td&gt;   &lt;td class=xl36 align=right&gt;1.6725&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.73&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.724&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.727&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.484&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.522&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.503&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm2_array*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.747&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.719&lt;/td&gt;   &lt;td class=xl36 align=right&gt;2.733&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.164&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.142&lt;/td&gt;   &lt;td class=xl25 align=right&gt;1.153&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.034&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.04&lt;/td&gt;   &lt;td class=xl26 align=right&gt;1.037&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm2_case*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.591&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.6&lt;/td&gt;   &lt;td class=xl36 align=right&gt;0.5955&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.254&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.259&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.2565&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.256&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.275&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.2655&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm2_eval*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;102.12&lt;/td&gt;   &lt;td class=xl24 align=right&gt;104.003&lt;/td&gt;   &lt;td class=xl36 align=right&gt;103.0615&lt;/td&gt;   &lt;td class=xl24 align=right&gt;42.756&lt;/td&gt;   &lt;td class=xl24 align=right&gt;42.905&lt;/td&gt;   &lt;td class=xl26 align=right&gt;42.8305&lt;/td&gt;   &lt;td class=xl24 align=right&gt;42.582&lt;/td&gt;   &lt;td class=xl24 align=right&gt;43.292&lt;/td&gt;   &lt;td class=xl25 align=right&gt;42.937&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm2_method*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.839&lt;/td&gt;   &lt;td class=xl24 align=right&gt;7.739&lt;/td&gt;   &lt;td class=xl36 align=right&gt;7.289&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.926&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.914&lt;/td&gt;   &lt;td class=xl25 align=right&gt;2.92&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.515&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.531&lt;/td&gt;   &lt;td class=xl26 align=right&gt;2.523&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm2_mutex*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.675&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.75&lt;/td&gt;   &lt;td class=xl36 align=right&gt;6.7125&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.827&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.857&lt;/td&gt;   &lt;td class=xl25 align=right&gt;2.842&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.435&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.381&lt;/td&gt;   &lt;td class=xl26 align=right&gt;2.408&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm2_poly_method*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;10.517&lt;/td&gt;   &lt;td class=xl24 align=right&gt;10.217&lt;/td&gt;   &lt;td class=xl36 align=right&gt;10.367&lt;/td&gt;   &lt;td class=xl24 align=right&gt;4.385&lt;/td&gt;   &lt;td class=xl24 align=right&gt;4.578&lt;/td&gt;   &lt;td class=xl25 align=right&gt;4.4815&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.747&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.577&lt;/td&gt;   &lt;td class=xl26 align=right&gt;3.662&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm2_poly_method_ov*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.905&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.821&lt;/td&gt;   &lt;td class=xl36 align=right&gt;0.863&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.357&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.408&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.3825&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.385&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.412&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.3985&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm2_proc*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.923&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.917&lt;/td&gt;   &lt;td class=xl36 align=right&gt;2.92&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.31&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.219&lt;/td&gt;   &lt;td class=xl25 align=right&gt;1.2645&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.118&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.115&lt;/td&gt;   &lt;td class=xl26 align=right&gt;1.1165&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm2_regexp*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;7.88&lt;/td&gt;   &lt;td class=xl24 align=right&gt;7.773&lt;/td&gt;   &lt;td class=xl36 align=right&gt;7.8265&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.438&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.377&lt;/td&gt;   &lt;td class=xl25 align=right&gt;3.4075&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.713&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.722&lt;/td&gt;   &lt;td class=xl26 align=right&gt;2.7175&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm2_send*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.066&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.085&lt;/td&gt;   &lt;td class=xl36 align=right&gt;1.0755&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.463&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.463&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.463&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.427&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.428&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.4275&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm2_super*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.866&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.87&lt;/td&gt;   &lt;td class=xl36 align=right&gt;1.868&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.788&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.869&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.8285&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.696&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.735&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.7155&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm2_unif1*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.845&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.884&lt;/td&gt;   &lt;td class=xl36 align=right&gt;0.8645&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.41&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.415&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.4125&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.343&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.368&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.3555&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm2_zsuper*&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.937&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.042&lt;/td&gt;   &lt;td class=xl36 align=right&gt;1.9895&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.821&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.849&lt;/td&gt;   &lt;td class=xl25 align=right&gt;0.835&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.742&lt;/td&gt;   &lt;td class=xl24 align=right&gt;0.777&lt;/td&gt;   &lt;td class=xl26 align=right&gt;0.7595&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm3_gc&lt;/td&gt;   &lt;td class=xl24 align=right&gt;5.348&lt;/td&gt;   &lt;td class=xl24 align=right&gt;5.301&lt;/td&gt;   &lt;td class=xl36 align=right&gt;5.3245&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.234&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.251&lt;/td&gt;   &lt;td class=xl26 align=right&gt;2.2425&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.357&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.366&lt;/td&gt;   &lt;td class=xl25 align=right&gt;2.3615&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm3_thread_create_join&lt;/td&gt;   &lt;td class=xl24 align=right&gt;5.113&lt;/td&gt;   &lt;td class=xl24 align=right&gt;5.263&lt;/td&gt;   &lt;td class=xl36 align=right&gt;5.188&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.353&lt;/td&gt;   &lt;td class=xl24 align=right&gt;2.289&lt;/td&gt;   &lt;td class=xl25 align=right&gt;2.321&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.317&lt;/td&gt;   &lt;td class=xl24 align=right&gt;3.288&lt;/td&gt;   &lt;td class=xl26 align=right&gt;3.3025&lt;/td&gt;  &lt;/tr&gt;&lt;tr height=13&gt;   &lt;td height=13&gt;&lt;/td&gt;   &lt;td class=xl24&gt;vm3_thread_mutex&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.818&lt;/td&gt;   &lt;td class=xl24 align=right&gt;1.862&lt;/td&gt;   &lt;td class=xl26 align=right&gt;1.84&lt;/td&gt;   &lt;td class=xl24 align=right&gt;32.556&lt;/td&gt;   &lt;td class=xl24 align=right&gt;35.779&lt;/td&gt;   &lt;td class=xl36 align=right&gt;34.1675&lt;/td&gt;   &lt;td class=xl24 align=right&gt;4.661&lt;/td&gt;   &lt;td class=xl24 align=right&gt;6.225&lt;/td&gt;   &lt;td class=xl25 align=right&gt;5.443&lt;/td&gt;  &lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7021366107946724064-4707800942382622361?l=tomerdoron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomerdoron.blogspot.com/feeds/4707800942382622361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomerdoron.blogspot.com/2009/12/comparing-ruby-191-performance-on-ec2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/4707800942382622361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/4707800942382622361'/><link rel='alternate' type='text/html' href='http://tomerdoron.blogspot.com/2009/12/comparing-ruby-191-performance-on-ec2.html' title='comparing ruby 1.9 performance on ec2'/><author><name>Tomer Doron</name><uri>https://profiles.google.com/110226495703777331469</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-sMgg30tLj_c/AAAAAAAAAAI/AAAAAAAAcsM/jb1-tT2HvcE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7021366107946724064.post-8372798944375164572</id><published>2009-12-08T01:46:00.000-08:00</published><updated>2010-04-20T15:29:59.086-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby 1.9'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='ec2'/><title type='text'>rails on ruby 1.9.1 on ec2</title><content type='html'>amazon ec2 currently offers fedora servers preinstalled with ruby 1.8.6 which is used by its ami tools. while this is a good basic configuration, one may want to upgrade to ruby 1.9.1 which offers many improvements, performance being the key one.&lt;br /&gt;&lt;br /&gt;upgrading to ruby 1.9.1 on an ec2 fedora server, and running a rails application on top of it is a multi step process but a straight forward one. below are the steps I took to get my amazon ec2 hosted production environment migrated to ruby 1.9.1&lt;br /&gt;&lt;br /&gt;&lt;b&gt;step I: launch your ec2 instance&lt;/b&gt;&lt;br /&gt;this post assumes you know how to launch an ec2 instance, in my case i used ec2's 64bit basic fedora ami, i found the 32bit unusable due to stability issues i experienced with the original kernel. more details on this are logged &lt;a href="http://redmine.ruby-lang.org/issues/show/2295"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;step II: install ruby 1.9.1&lt;/b&gt;&lt;br /&gt;first we want to get the dependancies out of the way, in my case i needed to install several libraries that will be later used by my rails app, you may have a smaller or larger dependencies list depending on the gems you need to run.&lt;br /&gt;&lt;br /&gt;&lt;pre class="bash" name="code"&gt;yum update&lt;br /&gt;yum install httpd httpd-devel mysql mysql-devel libxml2 libxml2-devel gcc-c++&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;now lets install ruby 1.9.1, I choose to install in in my /opt directory, but you may choose elsewhere. we will be suffixing ruby with the "19" suffix so that we can run ruby 1.9.1 side by side with the existing ec2's ruby 1.8.6&lt;br /&gt;&lt;br /&gt;&lt;pre class="bash" name="code"&gt;cd /opt&lt;br /&gt;wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p376.tar.gz&lt;br /&gt;tar xvfz ruby-1.9.1-p376.tar.gz&lt;br /&gt;cd ruby-1.9.1-p376&lt;br /&gt;./configure --enable-shared --program-suffix=191&lt;br /&gt;make&lt;br /&gt;make install&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;now that we have ruby 1.9 compiled and installed, it's time to do some renaming and symbolic linking so that the system uses ruby 1.9.1 by default while overcoming ec2's hard-wired ruby 1.8.6 installation&lt;br /&gt;&lt;br /&gt;&lt;pre class="bash" name="code"&gt;mv /usr/bin/ruby /usr/bin/ruby186&lt;br /&gt;mv /usr/bin/irb /usr/bin/irb186&lt;br /&gt;mv /usr/bin/erb /usr/bin/erb186&lt;br /&gt;mv /usr/bin/testrb /usr/bin/testrb186&lt;br /&gt;mv /usr/bin/gem /usr/bin/gem186&lt;br /&gt;mv /usr/bin/rake /usr/bin/rake186&lt;br /&gt;mv /usr/bin/ri /usr/bin/ri186&lt;br /&gt;mv /usr/bin/rdoc /usr/bin/rdoc186&lt;br /&gt;&lt;br /&gt;ln -s /usr/local/bin/ruby191 /usr/bin/ruby&lt;br /&gt;ln -s /usr/local/bin/rake191 /usr/bin/rake  &lt;br /&gt;ln -s /usr/local/bin/gem191 /usr/bin/gem  &lt;br /&gt;ln -s /usr/local/bin/irb191 /usr/bin/irb  &lt;br /&gt;ln -s /usr/local/bin/erb191 /usr/bin/erb  &lt;br /&gt;ln -s /usr/local/bin/ri191 /usr/bin/ri  &lt;br /&gt;ln -s /usr/local/bin/rdoc191 /usr/bin/rdoc  &lt;br /&gt;ln -s /usr/local/bin/testrb191 /usr/bin/testrb  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To confirm you are running the correct ruby version, run&lt;br /&gt;&gt;&gt; ruby -v&lt;br /&gt;you should see (assuming you download same revision as i did)&lt;br /&gt;ruby 1.9.1p376 (2009-12-07 revision 26041) [i686-linux]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;step III: installing rails&lt;/b&gt;&lt;br /&gt;this step can prove to be more involved than others, depending on the gems you need to run. I have a detailed post on this &lt;a href="http://tomerdoron.blogspot.com/2009/10/running-ruby-on-rails-over-ruby-19-on.html"&gt;here&lt;/a&gt;. the original post was written for OSX, but with the minor differences in ruby's location is perfectly correct any *nix.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;step IV: bundling your custom AMI&lt;/b&gt;&lt;br /&gt;now that we are done setting up the server, the next natural step is to bundle it as a custom ami so we can reuse it.&lt;br /&gt;&lt;br /&gt;an issue we run into is that ec2's ruby based ami tools are not ruby 1.9 compatible, more specifically the ec2_upload_bundle tool which we need to use in order to bundle. luckily, we installed ruby 1.9.1 side by side to the original 1.8.6, so we have an easy way out: simply use ruby 1.8.6 to run the tools. to do so, change ec2 wrapper scripts in /usr/local to use ruby18 instead of ruby. for example change /usr/local/bin/ec2-bundle-vol from &lt;br /&gt;&lt;br /&gt;&lt;pre class="bash" name="code"&gt;#!/bin/bash&lt;br /&gt;ruby /usr/lib/site_ruby/ec2/amitools/bundlevol.rb $*&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;to &lt;br /&gt;&lt;br /&gt;&lt;pre class="bash" name="code"&gt;#!/bin/bash&lt;br /&gt;ruby186 /usr/lib/site_ruby/ec2/amitools/bundlevol.rb $*&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;apply the same principle to the rest of the ec2 wrapper scripts in /usr/local&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7021366107946724064-8372798944375164572?l=tomerdoron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomerdoron.blogspot.com/feeds/8372798944375164572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomerdoron.blogspot.com/2009/12/rails-on-ruby-191-on-amazon-ec2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/8372798944375164572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/8372798944375164572'/><link rel='alternate' type='text/html' href='http://tomerdoron.blogspot.com/2009/12/rails-on-ruby-191-on-amazon-ec2.html' title='rails on ruby 1.9.1 on ec2'/><author><name>Tomer Doron</name><uri>https://profiles.google.com/110226495703777331469</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-sMgg30tLj_c/AAAAAAAAAAI/AAAAAAAAcsM/jb1-tT2HvcE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7021366107946724064.post-3020864490572449248</id><published>2009-10-07T13:05:00.000-07:00</published><updated>2009-10-07T15:56:48.965-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='soap4r'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby 1.9'/><title type='text'>Fixing soap4r for ruby 1.9</title><content type='html'>soap4r 1.5.8 is broken on ruby 1.9, below are the steps I took to fix it. Please note I have not attempted to fix soap4r completely, and that this fix does not go beyond the purposes of my usage, there are likely to be areas that are still broken under 1.9.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;lib/soap/baseData.rb&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;replace &lt;br /&gt;&lt;pre class="ruby" name="code"&gt;TypeParseRegexp = Regexp.new('^(.+)\[([\d,]*)\]$', nil, 'NONE')&lt;/pre&gt;&lt;br /&gt;with &lt;br /&gt;&lt;pre class="ruby" name="code"&gt;TypeParseRegexp = Regexp.new('^(.+)\[([\d,]*)\]$')&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;lib/soap/generator.rb&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;replace &lt;br /&gt;&lt;pre class="ruby" name="code"&gt;Regexp.new("[#{EncodeMap.keys.join}]", nil, XSD::Charset.encoding)&lt;/pre&gt;&lt;br /&gt;with&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;Regexp.new("[#{EncodeMap.keys.join}]")&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;lib/soap/property.rb&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;replace &lt;br /&gt;&lt;pre class="ruby" name="code"&gt;COMMENT_REGEXP = Regexp.new('^(?:#.*|)$', nil, 'u')&lt;br /&gt;CATDEF_REGEXP = Regexp.new("^\\[\\s*#{KEY_REGSRC}\\s*\\]$", nil, 'u')&lt;br /&gt;LINE_REGEXP = Regexp.new("^#{DEF_REGSRC}$", nil, 'u')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;with&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;COMMENT_REGEXP = Regexp.new("^(?:#.*|)$")&lt;br /&gt;CATDEF_REGEXP = Regexp.new("^\\[\\s*#{KEY_REGSRC}\\s*\\]$")&lt;br /&gt;LINE_REGEXP = Regexp.new("^#{DEF_REGSRC}$")&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;remove / comment out&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;# for ruby/1.6.&lt;br /&gt;unless Enumerable.instance_methods.include?('inject')&lt;br /&gt;  module Enumerable&lt;br /&gt;    def inject(init)&lt;br /&gt;      result = init&lt;br /&gt;      each do |item|&lt;br /&gt;       result = yield(result, item)&lt;br /&gt;      end&lt;br /&gt;      result&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;lib/soap/rpc/element.rb&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;replace&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;type_qname = TypeMap.index(mapped_class)&lt;/pre&gt;&lt;br /&gt;with&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;type_qname = TypeMap.key(mapped_class)&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;lib/xsd/charset.rb&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;replace&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;@internal_encoding = $KCODE&lt;/pre&gt;&lt;br /&gt;with&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;@internal_encoding = "UTF8"&lt;/pre&gt;&lt;br /&gt;replace&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;USASCIIRegexp = Regexp.new("\\A#{us_ascii}*\\z", nil, 'NONE')&lt;/pre&gt;&lt;br /&gt;with&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;USASCIIRegexp = Regexp.new("\\A#{us_ascii}*\\z")&lt;/pre&gt;&lt;br /&gt;replace&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;EUCRegexp = Regexp.new("\\A#{character_euc}*\\z", nil, 'NONE')&lt;/pre&gt;&lt;br /&gt;with&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;EUCRegexp = Regexp.new("\\A#{character_euc}*\\z", nil, 'n')&lt;/pre&gt;&lt;br /&gt;replace&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;SJISRegexp = Regexp.new("\\A#{character_sjis}*\\z", nil, 'NONE')&lt;/pre&gt;&lt;br /&gt;with&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;SJISRegexp = Regexp.new("\\A#{character_sjis}*\\z", nil, 'n')&lt;/pre&gt;&lt;br /&gt;replace&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;character_utf8 =&lt;br /&gt;"(?:#{us_ascii}|#{twobytes_utf8}|#{threebytes_utf8}|#{fourbytes_utf8})"&lt;br /&gt;UTF8Regexp = Regexp.new("\\A#{character_utf8}*\\z", nil, 'NONE')&lt;/pre&gt;&lt;br /&gt;with&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;character_utf8 = "(?:#{us_ascii}|#{twobytes_utf8}|#{threebytes_utf8}|#{fourbytes_utf8})"&lt;br /&gt;UTF8Regexp = Regexp.new("\\A#{character_utf8}*\\z", nil, 'n')&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;lib/xsd/ns.rb&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;replace&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;ParseRegexp = Regexp.new('\A([^:]+)(?::(.+))?\z', nil, 'NONE')&lt;/pre&gt;&lt;br /&gt;with&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;ParseRegexp = Regexp.new('\A([^:]+)(?::(.+))?\z')&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;lib/xsd/xmlparser.rb&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;replace&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;NSParseRegexp = Regexp.new('^xmlns:?(.*)$', nil, 'NONE')&lt;/pre&gt;&lt;br /&gt;with&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;NSParseRegexp = Regexp.new("^xmlns:?(.*)$")&lt;/pre&gt;&lt;br /&gt;replace&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;raise LoadError unless XSD::XMLParser.constants.find { |c| c.downcase == name }&lt;/pre&gt;&lt;br /&gt;with&lt;br /&gt;&lt;pre class="ruby" name="code"&gt;raise LoadError unless XSD::XMLParser.constants.find { |c| c.to_s.downcase == name.downcase }&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7021366107946724064-3020864490572449248?l=tomerdoron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomerdoron.blogspot.com/feeds/3020864490572449248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomerdoron.blogspot.com/2009/10/fixing-soap4r-for-ruby-19.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/3020864490572449248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/3020864490572449248'/><link rel='alternate' type='text/html' href='http://tomerdoron.blogspot.com/2009/10/fixing-soap4r-for-ruby-19.html' title='Fixing soap4r for ruby 1.9'/><author><name>Tomer Doron</name><uri>https://profiles.google.com/110226495703777331469</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-sMgg30tLj_c/AAAAAAAAAAI/AAAAAAAAcsM/jb1-tT2HvcE/s512-c/photo.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7021366107946724064.post-2702304175887459496</id><published>2009-10-02T22:30:00.000-07:00</published><updated>2009-12-18T19:08:39.844-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby 1.9'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Running a Ruby on Rails Application on OSX with Ruby 1.9</title><content type='html'>&lt;h3&gt;General&lt;/h3&gt;OSX comes preinstalled with ruby 1.87, however, ruby 1.9 has out there for quite a while now and does offer improvements in many areas, including performance, which is always a good trigger for an upgrade. A deeper overview can be found &lt;a href="http://blog.pluron.com/2009/05/ruby-19-performance.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Ruby 1.9&lt;/h3&gt;You can use MacPorts, Fink or compile from source. Hivelogic has a good post on how to install ruby on OSX &lt;a href="http://hivelogic.com/articles/ruby-rails-leopard"&gt;here&lt;/a&gt;. I have chosen to use MacPorts as I use it for other ports:&lt;br /&gt;&lt;br /&gt;$ sudo port install ruby1.9&lt;br /&gt;&lt;br /&gt;If you are doing a side by side installation (i.e keeping you original ruby installation in place), you may want to do some symbolic linking to make sure the ruby, irb, gems, rake, ri and rdoc are pointing the 1.9 version. If you choose to skip this step, remember to use the ruby1.9, irb1.9, etc command instead.&lt;br /&gt;&lt;br /&gt;Disclaimer: Please be careful with the below, the order and locations matter and one installation (yours) can be different than other (mine), if you are not familiar with OSX, bash  and symbolic linking I suggest you do some readying before continuing with this step or just stick to using the 1.9 command namespace (See above).&lt;br /&gt;&lt;br /&gt;The example below assume you ruby 1.9 is installed at /opt/local/bin/ruby1.9 (MacPort default location) and that your original ruby installation was a /System/Library/Frameworks/Ruby.framework/Versions/1.8 (OSX default location). &lt;br /&gt;&lt;br /&gt;$ cd /System/Library/Frameworks/Ruby.framework/Versions&lt;br /&gt;$ mkdir 1.9.1&lt;br /&gt;$ mkdir 1.9.1/usr&lt;br /&gt;$ mkdir 1.9.1/usr/bin&lt;br /&gt;&lt;br /&gt;$ cd 1.9.1/usr/bin&lt;br /&gt;$ ln -s /opt/local/bin/ruby1.9 ruby&lt;br /&gt;$ ln -s /opt/local/bin/rake1.9 rake&lt;br /&gt;$ ln -s /opt/local/bin/gem1.9 gem&lt;br /&gt;$ ln -s /opt/local/bin/irb1.9 irb&lt;br /&gt;$ ln -s /opt/local/bin/erb1.9 erb&lt;br /&gt;$ ln -s /opt/local/bin/ri1.9 ri&lt;br /&gt;$ ln -s /opt/local/bin/rdoc1.9 rdoc&lt;br /&gt;$ ln -s /opt/local/bin/testrb1.9 testrb&lt;br /&gt;&lt;br /&gt;$ cd /System/Library/Frameworks/Ruby.framework/Versions&lt;br /&gt;$ rm Current&lt;br /&gt;$ ln -s 1.9.1 Current&lt;br /&gt;&lt;br /&gt;$ cd /usr/bin&lt;br /&gt;#for some reason apple is linking directly to the v. 1.8 folder instead of the current directory, we will "fix" that.&lt;br /&gt;$ mv gem gem1.8&lt;br /&gt;$ ln -s /System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/gem&lt;br /&gt;#for some reason apple has put the rake executable in /usr/bin instead of in the current; directory, we will "fix" that.&lt;br /&gt;$ mv rake rake1.8 &lt;br /&gt;$ ln -s /System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/rake&lt;br /&gt;&lt;br /&gt;To confirm you are running the correct ruby version:&lt;br /&gt;$ ruby -v&lt;br /&gt;$ gem env&lt;br /&gt;$ irb&lt;br /&gt;&gt;&gt; RUBY_VERSION&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Rails&lt;/h3&gt;As you are installing a new ruby, you also need to reinstall all of you gems, as this artical is focused on ruby on rails, we will start with the rails gem. There is nothing exciting here, simply run the standard rails installation command&lt;br /&gt;&lt;br /&gt;$ gem update --system&lt;br /&gt;$ gem install rails&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Other Gems&lt;/h3&gt;For the purposes of my application, I have installed the follwing gems:&lt;br /&gt;actionmailer (2.3.4, 2.3.3)&lt;br /&gt;actionpack (2.3.4, 2.3.3)&lt;br /&gt;activerecord (2.3.4, 2.3.3)&lt;br /&gt;activeresource (2.3.4, 2.3.3)&lt;br /&gt;activesupport (2.3.4, 2.3.3)&lt;br /&gt;builder (2.1.2)&lt;br /&gt;cgi_multipart_eof_fix (2.5.0)&lt;br /&gt;daemons (1.0.10)&lt;br /&gt;fast_xs (0.7.3)&lt;br /&gt;fastthread (1.0.7)&lt;br /&gt;gem_plugin (0.2.3)&lt;br /&gt;httpclient (2.1.5.2)&lt;br /&gt;libxml-ruby (1.1.3)&lt;br /&gt;macaddr (1.0.0)&lt;br /&gt;mongrel (1.1.6)&lt;br /&gt;mongrel_cluster (1.0.5)&lt;br /&gt;mysql (2.8.1)&lt;br /&gt;rack (1.0.0)&lt;br /&gt;rails (2.3.4, 2.3.3)&lt;br /&gt;rake (0.8.7)&lt;br /&gt;rubygems-update (1.3.5)&lt;br /&gt;rubyzip (0.9.1)&lt;br /&gt;soap4r (1.5.8)&lt;br /&gt;uuid (2.0.2)&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Hacks&lt;/h3&gt;This is where the fun begins, some of the gems and rails modules are not fully baked for ruby 1.9, below are a list of hacks that I had to plug in to make my rails app work. Naturally, your case may be different, a good reference to gems under 1.9 can be found &lt;a href="http://isitruby19.com"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;mongrel gem&lt;/b&gt;&lt;br /&gt;The 1.1.5 mongrel gem does not install over ruby 1.9. You may choose to fix it manually or install 1.1.6 from gems.rubyinstaller.org:&lt;br /&gt;&lt;br /&gt;$ gem install mongrel --source http://gems.rubyinstaller.org&lt;br /&gt;&lt;br /&gt;More info on this can be found &lt;a href="http://isitruby19.com/mongrel"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;mongrel cluster&lt;/b&gt;&lt;br /&gt;Needs a small syntax patch, fix the case statement at the end of the mongrel_cluster_ctl by replacing ":" with "then".&lt;br /&gt;&lt;br /&gt;&lt;b&gt;restful_authentication plugin&lt;/b&gt;&lt;br /&gt;If you are using restful_authentication plugin you are likely to crash as soon as the plugin attempts to read data from cookies. This is due to a bug in active_support module. There is a documented patch &lt;a href="https://rails.lighthouseapp.com/projects/8994/tickets/3144/a/261015/0001-ruby-1.9-friendly-secure_compare.patch"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;uploading&lt;/b&gt;&lt;br /&gt;Most applications use some sort of uploading, mine does too. Rack 1.0.0 on 1.9 crashes does to unicode issues. There is a documented patch &lt;a href="http://github.com/rack/rack/commit/44ed4640f077504a49b7f1cabf8d6ad7a13f6441"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ftools&lt;/b&gt;&lt;br /&gt;ftools has been deprecated in 1.9, if your code is dependent on it, move to fileutils.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;rubyzip gem&lt;/b&gt;&lt;br /&gt;Uses ftools, you will need to remove the dependency. There is a documented patch &lt;a href="http://sourceforge.net/tracker/?func=detail&amp;aid=2731184&amp;group_id=43107&amp;atid=435172"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;libxml-ruby gem&lt;/b&gt;&lt;br /&gt;I found this gem to be unstable on 1.9, throwing many memory allocation errors. The solution was to update the libxml libs and then install the gem against the updated sources:&lt;br /&gt;&lt;br /&gt;$ port install libxml2&lt;br /&gt;$ gem install libxml-ruby -- --with-xml2-include=/opt/local/include/libxml2&lt;br /&gt;&lt;br /&gt;More info on this can be found &lt;a href="http://www.elctech.com/articles/installing-libxml-bindings-for-ruby-1-9-1"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;soap4r&lt;/b&gt;&lt;br /&gt;Broken, I monkey patched locally which was enough for my usage, but not a compelte solution. More info &lt;a href="http://tomerdoron.blogspot.com/2009/10/fixing-soap4r-for-ruby-19.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;These steps got my app on its feet, however, I am still testing stability and performance under the new setup. I will update this post if and when new problems or solutions come up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7021366107946724064-2702304175887459496?l=tomerdoron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomerdoron.blogspot.com/feeds/2702304175887459496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomerdoron.blogspot.com/2009/10/running-ruby-on-rails-over-ruby-19-on.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/2702304175887459496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/2702304175887459496'/><link rel='alternate' type='text/html' href='http://tomerdoron.blogspot.com/2009/10/running-ruby-on-rails-over-ruby-19-on.html' title='Running a Ruby on Rails Application on OSX with Ruby 1.9'/><author><name>Tomer Doron</name><uri>https://profiles.google.com/110226495703777331469</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-sMgg30tLj_c/AAAAAAAAAAI/AAAAAAAAcsM/jb1-tT2HvcE/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7021366107946724064.post-2990193133362259764</id><published>2009-10-01T19:55:00.000-07:00</published><updated>2009-12-18T19:09:48.868-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='mongrel'/><category scheme='http://www.blogger.com/atom/ns#' term='mod_xsendfile'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Compiling mod_xsendfile on OSX</title><content type='html'>mod_xsendfile is an apache2 module which come handy when you need to serve static files through a secondary application layer or a proxied web server, both tend to serve static files slower and less efficiently than apache does. In such cases you want to delegate the request (file path) to apache so that the secondary layer/proxied web server are freed to move on and process other requests. A common example is a php download handler that needs to go to the db to fetch the file path, check permissions, etc but don't want to deal with the actual file transfer, another common example is a ruby on rails proxied web server such as mongrel which is slow in serving static files under stress due it's concurrency model and can quickly become a bottle neck. For more information on mod_xsendfile and how to configure it go &lt;a href="http://tn123.ath.cx/mod_xsendfile/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The above information well known, however mod_xsendfile installation documentation states the following:&lt;br /&gt;&lt;br /&gt;1. Grab the source.&lt;br /&gt;2. Compile and install:&lt;br /&gt;&gt;&gt; apxs -cia mod_xsendfile.c&lt;br /&gt;3. Restart apache&lt;br /&gt;4. That's all.&lt;br /&gt;&lt;br /&gt;If you try this on OSX the compilation step will fail due to missing architecture flags, hence, use the following instead:&lt;br /&gt;&lt;br /&gt;&gt;&gt; apxs -cia -Wc,"-arch x86_64 -arch ppc -arch i386 -arch ppc64" -Wl,"-arch x86_64 -arch ppc -arch i386 -arch ppc64" mod_xsendfile.c&lt;br /&gt;&lt;br /&gt;This will compile mod_xsendfile in all 4 OSX flavors, which should cover your case. Naturally, you can change the architecture flag to just the one that is relevant to your hardware. More info &lt;a href="http://www.zarqman.com/posting/2008/04/compiling_mod_xsendfile_for_mac_os_x"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7021366107946724064-2990193133362259764?l=tomerdoron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomerdoron.blogspot.com/feeds/2990193133362259764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomerdoron.blogspot.com/2009/10/compiling-modxsendfile-on-osx.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/2990193133362259764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/2990193133362259764'/><link rel='alternate' type='text/html' href='http://tomerdoron.blogspot.com/2009/10/compiling-modxsendfile-on-osx.html' title='Compiling mod_xsendfile on OSX'/><author><name>Tomer Doron</name><uri>https://profiles.google.com/110226495703777331469</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-sMgg30tLj_c/AAAAAAAAAAI/AAAAAAAAcsM/jb1-tT2HvcE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7021366107946724064.post-1701919518514192749</id><published>2009-09-30T19:31:00.000-07:00</published><updated>2009-12-18T19:10:54.424-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='daemon'/><category scheme='http://www.blogger.com/atom/ns#' term='cruisecontrol'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Configuring CruiseControl as an OSX Startup Daemon</title><content type='html'>&lt;h3&gt;General&lt;/h3&gt;&lt;br /&gt;The purpose of this post is to describe how to configure a startup daemon for cruisecontrol on  OSX. While CruiseControl ships with a startup script (cruisecontrol.sh), one would like CruiseControl to automatically start after system startup to avoid the manual step of starting it.&lt;br /&gt;&lt;br /&gt;This post assumes previous knowledge with OSX, bash, and CruiseControl and does not attempt to cover how to install or generally configure CruiseControl on OSX. There are several articles covering the latter, while the topic of configuring CruiseControl startup daemon is only partially&amp;nbsp;covered.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Creating the Daemon&lt;/h3&gt;&lt;br /&gt;• Navigate to the startup daemons folder&lt;br /&gt;&lt;br /&gt;$ cd /Library/LaunchDaemons&lt;br /&gt;&lt;br /&gt;• Create a new plist file named org.sourceforge.cruisecontrol.plist, the plist file will look something along these lines:&lt;br /&gt;&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&amp;gt;&lt;br /&gt;&amp;lt;plist version="1.0"&amp;gt;&lt;br /&gt; &amp;lt;dict&amp;gt;&lt;br /&gt;         &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;&lt;br /&gt;         &amp;lt;string&amp;gt;org.sourceforge.cruisecontrol&amp;lt;/string&amp;gt;&lt;br /&gt;         &amp;lt;key&amp;gt;WorkingDirectory&amp;lt;/key&amp;gt;&lt;br /&gt;         &amp;lt;string&amp;gt;/usr/local/cruisecontrol&amp;lt;/string&amp;gt;&lt;br /&gt;         &amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt;&lt;br /&gt;         &amp;lt;array&amp;gt;&lt;br /&gt;                 &amp;lt;string&amp;gt;/System/Library/Frameworks/JavaVM.framework/Home/bin/java&amp;lt;/string&amp;gt;&lt;br /&gt;                 &amp;lt;string&amp;gt;-Xms128m&amp;lt;/string&amp;gt;&lt;br /&gt;                 &amp;lt;string&amp;gt;-Xmx256m&amp;lt;/string&amp;gt;&lt;br /&gt;                 &amp;lt;string&amp;gt;-Djavax.management.builder.initial=mx4j.server.MX4JMBeanServerBuilder&amp;lt;/string&amp;gt;&lt;br /&gt;                 &amp;lt;string&amp;gt;-Dcc.library.dir=/usr/local/cruisecontrol/lib&amp;lt;/string&amp;gt;&lt;br /&gt;                 &amp;lt;string&amp;gt;-Djetty.logs=/usr/local/cruisecontrol/logs&amp;lt;/string&amp;gt;&lt;br /&gt;                 &amp;lt;string&amp;gt;-jar&amp;lt;/string&amp;gt;&lt;br /&gt;                 &amp;lt;string&amp;gt;/usr/local/cruisecontrol/lib/cruisecontrol-launcher.jar&amp;lt;/string&amp;gt;&lt;br /&gt;                 &amp;lt;string&amp;gt;-jmxport&amp;lt;/string&amp;gt;&lt;br /&gt;                 &amp;lt;string&amp;gt;8000&amp;lt;/string&amp;gt;&lt;br /&gt;                 &amp;lt;string&amp;gt;-webport&amp;lt;/string&amp;gt;&lt;br /&gt;                 &amp;lt;string&amp;gt;8080&amp;lt;/string&amp;gt;&lt;br /&gt;                 &amp;lt;string&amp;gt;-rmiport&amp;lt;/string&amp;gt;&lt;br /&gt;                 &amp;lt;string&amp;gt;1099&amp;lt;/string&amp;gt;&lt;br /&gt;         &amp;lt;/array&amp;gt;&lt;br /&gt;         &amp;lt;key&amp;gt;EnvironmentVariables&amp;lt;/key&amp;gt;&lt;br /&gt;         &amp;lt;dict&amp;gt;&lt;br /&gt;         &amp;lt;/dict&amp;gt;&lt;br /&gt;         &amp;lt;key&amp;gt;RunAtLoad&amp;lt;/key&amp;gt;&lt;br /&gt;         &amp;lt;true/&amp;gt;&lt;br /&gt;         &amp;lt;key&amp;gt;Uses&amp;lt;/key&amp;gt;&lt;br /&gt;         &amp;lt;array&amp;gt;&lt;br /&gt;                 &amp;lt;string&amp;gt;Network&amp;lt;/string&amp;gt;&lt;br /&gt;                 &amp;lt;string&amp;gt;Resolver&amp;lt;/string&amp;gt;&lt;br /&gt;         &amp;lt;/array&amp;gt;&lt;br /&gt; &amp;lt;/dict&amp;gt;&lt;br /&gt;&amp;lt;/plist&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Whats in the plist file?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt;&lt;/span&gt;• Label =&amp;gt; Name of daemon, set to org.sourceforge.cruisecontrol&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt;&lt;/span&gt;• WorkingDirectory =&amp;gt; Location of the CruiseControl installation&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt;&lt;/span&gt;• ProgramArguments =&amp;gt; Java calls to cruisecontrol-launcher jar including configuration for CruiseControl port numbers, libs and log location. Add additional parameters as you see fit&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt;&lt;/span&gt;• RunAtLoad =&amp;gt; Run at startup, set to true&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="white-space: pre;"&gt;&lt;/span&gt;• Uses =&amp;gt; Dependency on other services, in our case networking and resolver&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Testing the Daemon&lt;/h3&gt;&lt;br /&gt;•  Loading:&lt;br /&gt;&lt;br /&gt;$ launchctl load org.sourceforge.cruisecontrol.plist&lt;br /&gt;&lt;br /&gt;Use the above command to load the daemon. The system will do the same upon reboot, so this is only required when you are testing the daemon.&lt;br /&gt;&lt;br /&gt;• Unloading:&lt;br /&gt;&lt;br /&gt;$ launchctl unload org.sourceforge.cruisecontrol.plist&lt;br /&gt;&lt;br /&gt;Use the above command to unload the daemon if and when it fails and you need to reload it again.&lt;br /&gt;&lt;br /&gt;• Testing to see that the daemon is actually loaded&lt;br /&gt;&lt;br /&gt;$ launchctl list&lt;br /&gt;&lt;br /&gt;If everything went well, you should see you daemon listed (org.sourceforge.cruisecontrol) with a valid pid.&lt;br /&gt;&lt;br /&gt;You can also monitor the startup process on cruiscontrol.log, or if you access to he UI, through the system's console.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7021366107946724064-1701919518514192749?l=tomerdoron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomerdoron.blogspot.com/feeds/1701919518514192749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://tomerdoron.blogspot.com/2009/09/configuring-cruisecontrol-as-osx.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/1701919518514192749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7021366107946724064/posts/default/1701919518514192749'/><link rel='alternate' type='text/html' href='http://tomerdoron.blogspot.com/2009/09/configuring-cruisecontrol-as-osx.html' title='Configuring CruiseControl as an OSX Startup Daemon'/><author><name>Tomer Doron</name><uri>https://profiles.google.com/110226495703777331469</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-sMgg30tLj_c/AAAAAAAAAAI/AAAAAAAAcsM/jb1-tT2HvcE/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
