<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">

<channel>
	<title>Planet Autopackage</title>
	<link>http://planet.plan99.net/</link>
	<language>en</language>
	<description>Planet Autopackage - http://planet.plan99.net/</description>

<item>
	<title>Hongli Lai: Ruby Enterprise Edition website “launched”</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/05/13/ruby-enterprise-edition-website-launched/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/05/13/ruby-enterprise-edition-website-launched/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.RubyEnterpriseEdition.com/&quot;&gt;http://www.RubyEnterpriseEdition.com/&lt;/a&gt; has been &amp;#8220;launched&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Next hint to be revealed on May 20, 2008.&lt;/p&gt;</description>
	<pubDate>Tue, 13 May 2008 21:16:29 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Rails Escapes the Ghetto, Phusion Passenger now used on Dreamhost</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/05/13/rails-escapes-the-getto/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/05/13/rails-escapes-the-getto/</link>
	<description>&lt;p&gt;Please help us with modding/digging these up. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://digg.com/programming/Passenger_makes_rails_easy_scalable_Dreamhost_confirms&quot;&gt;Passenger makes Rails easy, scalable! Dreamhost confirms!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://reddit.com/info/6j9ek/comments/&quot;&gt;Rails Escapes The Ghetto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://reddit.com/info/6j9g9/comments/&quot;&gt;Rails Escapes the Ghetto, Phusion Passenger now used on Dreamhost&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
	<pubDate>Tue, 13 May 2008 20:13:28 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Building native Linux packages for Passenger is now possible</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/05/13/building-native-linux-packages-for-passenger-is-now-possible/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/05/13/building-native-linux-packages-for-passenger-is-now-possible/</link>
	<description>&lt;p&gt;We’ve made some modifications to Passenger to make Linux packagers’ lives a bit easier. Also, we&amp;#8217;re looking for volunteers who wish to maintain packages for their distribution.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;http://blog.phusion.nl/2008/05/13/building-native-linux-packages-for-passenger-is-now-possible/&quot;&gt;http://blog.phusion.nl/2008/05/13/building-native-linux-packages-for-passenger-is-now-possible/&lt;/a&gt; for details.&lt;/p&gt;</description>
	<pubDate>Tue, 13 May 2008 17:44:42 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Passenger (mod_rails) 1.0.5 released</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/05/07/passenger-mod_rails-105-released/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/05/07/passenger-mod_rails-105-released/</link>
	<description>&lt;p&gt;Passenger 1.0.5 has just been released. Please read &lt;a href=&quot;http://blog.phusion.nl/2008/05/07/passenger-mod_rails-105-released/&quot;&gt;the Phusion corporate blog&lt;/a&gt; for the announcement and upgrade instructions.&lt;/p&gt;</description>
	<pubDate>Wed, 07 May 2008 19:22:44 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Interview by AkitaOnRails</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/05/07/interview-by-akitaonrails/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/05/07/interview-by-akitaonrails/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.akitaonrails.com/2008/5/7/chatting-with-hongli-lai-and-ninh-bui-phusion&quot;&gt;AkitaOnRails&lt;/a&gt; had recently &lt;a href=&quot;http://www.akitaonrails.com/2008/5/7/chatting-with-hongli-lai-and-ninh-bui-phusion&quot;&gt;interviewed&lt;/a&gt; us. The interview covers our company&amp;#8217;s background and information about Passenger, among other things. He asked us quite some interesting questions, so we recommend you to read the interview. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 07 May 2008 10:53:13 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Does Ruby have a distribution problem?</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/05/06/does-ruby-have-a-distribution-problem/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/05/06/does-ruby-have-a-distribution-problem/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.madstop.com/ruby/ruby_has_a_distribution_problem.html&quot;&gt;Luke Kanies wrote an article&lt;/a&gt;, in which he says that Ruby has a distribution problem. It criticizes Rails applications for vendoring a lot of stuff, and criticizes RubyGems for not being able to handle native package dependencies, among other things.&lt;/p&gt;
&lt;p&gt;I beg to disagree. The described problem is not a pure Ruby problem: it&amp;#8217;s a general software distribution problem. I&amp;#8217;m concerned that people would use this as another &amp;#8220;reason&amp;#8221; to oppose Ruby, even though it&amp;#8217;s not specific to Ruby.&lt;/p&gt;
&lt;h2&gt;My response&lt;/h2&gt;
&lt;p&gt;I posted a reply to Luke&amp;#8217;s article, and it was as follows:&lt;/p&gt;
&lt;p&gt;Luke, I don&amp;#8217;t really understand what you&amp;#8217;re expecting from the Ruby/Rails community. You&amp;#8217;re dealing with cross-platform distribution issues. That&amp;#8217;s hard by its very nature. I was a developer in the Autopackage project (&lt;a href=&quot;http://www.autopackage.org&quot;&gt;www.autopackage.org&lt;/a&gt;), a software packaging system that works across multiple Linux distributions. I&amp;#8217;m currently a developer of Passenger (&lt;a href=&quot;http://www.modrails.com&quot;&gt;www.modrails.com&lt;/a&gt;). We&amp;#8217;ve run into many of the issues that you mention here.&lt;/p&gt;
&lt;p&gt;If I understand it correctly, you&amp;#8217;re claiming that vendoring stuff is bad because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You cannot vendor everything (glibc, web browser, etc).&lt;/li&gt;
&lt;li&gt;As someone else has mentioned, vendoring stuff creates potential security issues. This is not unlike static linking in C/C++ projects.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the other hand, vendoring stuff does have benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Guaranteed compatibility. Suppose you rely on GTK 2.2. On a faithful day, GTK 2.2.5 was released, but accidentally introduced a regression, and now your application fails left and right. Uh oh. If you vendored GTK then that wouldn&amp;#8217;t have happened. This is not a theoretical possibility: GTK 2.2.15 or something actually broke AbiWord. (I&amp;#8217;m not saying that vendoring GTK is a good idea, as GTK is quite large. I&amp;#8217;m just pointing out a benefit of vendoring.)&lt;/li&gt;
&lt;li&gt;Less installation hassle. Not all platforms have good packaging systems. As far as I know, Debian-based distros are the only ones. RedHat-based YUM repositories tend to be quite small compared to Debian&amp;#8217;s APT repositories. MacOS X and Windows don&amp;#8217;t have native package management systems at all. If your app is cross-platform, then vendoring stuff is a lot easier for both the developer and the end user.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vendoring stuff is not only common in the Java world, but also in the Windows and MacOS X world. Windows apps tend to bundle all their dependencies (with the exception of obvious stuff, such as Internet Explorer). How many games have you seen that bundle DirectX? Actually I&amp;#8217;d say that not vendoring stuff is only common in Linux, and languages that have strong ties to Linux, such as Perl. Here&amp;#8217;s where Debian&amp;#8217;s package management system and huge package repositories really shine.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s almost no common ground in the world of package management. We at Autopackage had to invent our own dependency resolution mechanism (similar to APT) because there&amp;#8217;s no lowest common denominator, even amongst Linux distros. RubyGems is probably created for the same reason: not all Ruby-supported platforms have (decent) package management, so they just wrote their own. Autopackage experimented with native package management integration (i.e. being able to use the system&amp;#8217;s native package manager to resolve dependencies) but that proved to be much, much harder than initially expected, and up until today that feature still isn&amp;#8217;t finished. So I don&amp;#8217;t think you can reasonably expect the Ruby community to do something about this. It&amp;#8217;s not a pure Ruby problem: it&amp;#8217;s a general software distribution problem.&lt;/p&gt;
&lt;p&gt;As for being FHS-compliant: I can only say &amp;#8220;don&amp;#8217;t bother&amp;#8221; if your application is cross-platform. It seems that only hardcore Linux users care about that. Outside the Linux world, FHS is being criticized by pretty much everyone. Windows and OS X users complain that application files in Linux are scattered everywhere, instead of being self-contained. Scattering files isn&amp;#8217;t a problem in Linux because of package management, but it is a problem in all other platforms that don&amp;#8217;t have decent package management. I&amp;#8217;ve found that being FHS-compliant is more trouble than it&amp;#8217;s worth.&lt;/p&gt;
&lt;p&gt;So how do you solve this problem? I don&amp;#8217;t think it&amp;#8217;s possible to come up with a general silver bullet solution. So that leaves the following choices to you, the developer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a native package for every platform that you support, i.e. .deb for Ubuntu/Debian, .rpm for RedHat, another .rpm for Mandriva and SuSE because their package names are different, a .exe for Windows, .dmg for MacOS X, .tgz for Slackware, .??? for Solaris, etc.&lt;/li&gt;
&lt;li&gt;Write a cross-platform installer. Passenger/mod_rails chose this option because it&amp;#8217;s a lot easier than the first one. Passenger depends on Ruby packages (Rails, fastthread, Rake, etc.) as well as native packages (GCC, Apache, APR). It checks whether all dependencies are available, and if not, it tells the user how to install those dependencies. We&amp;#8217;ve put platform autodetection and Linux distro autodetection code in the installer. So on Debian/Ubuntu it would tell you to run &amp;#8220;apt-get install apache2-prefork-dev&amp;#8221; while on Fedora/RHEL/CentOS it would tell you to run &amp;#8220;yum install apache-devel&amp;#8221;. We&amp;#8217;ve found that this approach works extremely well.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, we at Autopackage fully recognized the pros and cons and vendoring/static linking. Autopackage recommends the following: dynamically depend on stuff that are common, but vendor/static link stuff that are uncommon. We believe that this is a good trade off between the pros and cons. Passenger follows this recommendation as well: we vendor the Boost C++ library. Few people have Boost installed, and when they have it installed it often isn&amp;#8217;t the version that Passenger requires. Installing Boost is a huge, huge pain on MacOS X. In this case, the benefits that vendoring Boost gives us outweight the cons by far.&lt;/p&gt;
&lt;p&gt;On the other hand, Apache is fairly common, and easy to install on most platforms. Rake, fastthread, etc. are also easy to install because of RubyGems. That&amp;#8217;s why we dynamically depend on those things instead of vendoring them.&lt;/p&gt;
&lt;p&gt;So it all boils down to making the right choices and correctly balancing the pros and cons of vendoring. There&amp;#8217;s no silver bullet.&lt;/p&gt;
&lt;h2&gt;Gunnar Wolf&amp;#8217;s follow-up&lt;/h2&gt;
&lt;p&gt;Luke&amp;#8217;s article was quickly followed by &lt;a href=&quot;http://gwolf.org/node/1740&quot;&gt;a blog post by Debian developer Gunnar Wolf&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;By using Ruby Gems, you dramatically increase entropy and harm your systems&amp;#8217; security.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;To this, I say nonsense. It&amp;#8217;s pretty well-known that Debian, and Linux distros in general, dislike foreign packaging systems, regardless of their merits. I see quite a lot of conversations on #rubyonrails @ irc.freenode.net that are somewhat like this:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Person A: hi, I&amp;#8217;m using Debian/Ubuntu/some-other-Debian-derived-distro. I typed &amp;#8220;gem install rails&amp;#8221;. But when I type &amp;#8220;rails foo&amp;#8221;, it says &amp;#8220;command not found&amp;#8221;. what&amp;#8217;s going on?&lt;br /&gt;
Person B: type &amp;#8220;gem update &amp;#8211;system &amp;#038;&amp;#038; gem install rails&amp;#8221;&lt;br /&gt;
Person A: wow, it worked! thank you!&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;It is painfully obvious that Debian did something to RubyGems. I was bitten by this very issue as well. Debian&amp;#8217;s RubyGems package places binaries in /var/gems (or something like that, I don&amp;#8217;t remember the exact location) instead of /usr/bin. Fine, I understand that they don&amp;#8217;t want foreign packages to pollute /usr/bin, which is a managed directly. But the &lt;em&gt;least&lt;/em&gt; they can do is adding /var/gems to $PATH by default, something which they didn&amp;#8217;t. As a result, many people who installed Rails via Debian thought that Rails is broken, when it&amp;#8217;s actually Debian who crippled RubyGems.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;#8220;Increase entropy&amp;#8221;&lt;/em&gt;? I don&amp;#8217;t even know what this is supposed to mean in the context of Ruby software distribution.&lt;br /&gt;
&lt;em&gt;&amp;#8220;Harm your systems&amp;#8217; security&amp;#8221;&lt;/em&gt;? As I&amp;#8217;ve already stated, vendoring has both pros and cons. If one dynamically depends on a library, then it means that the system administrator and library author are responsible for security updates, but it also means that a security update can potentially break the application. By vendoring stuff, the responsibility of security updates is mostly shifted to the application developer. This is a trade-off: there&amp;#8217;s nothing wrong with it, and whether it&amp;#8217;s the best thing to do depends on the situation. Gunnar however has an extremely purist view, along the lines of &amp;#8220;if you don&amp;#8217;t agree with us then you&amp;#8217;re an idiot, regardless of the circumstances&amp;#8221;.&lt;/p&gt;
&lt;p&gt;It seems more like that Gunnar&amp;#8217;s words are carefully picked, with the goal of creating knee-jerk reactions. Debian said pretty much the same thing about Autopackage in the past, and now they&amp;#8217;re doing it again with RubyGems.&lt;/p&gt;
&lt;p&gt;Luke, Gunnar, will you realize that all you&amp;#8217;re doing is ranting about a problem, without offering any solutions? And no, creating native Debian packages is not a solution, the world isn&amp;#8217;t comprised of just Debian.&lt;/p&gt;</description>
	<pubDate>Tue, 06 May 2008 20:33:26 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Wanted: Passenger testers using 64-bit OS X and 64-bit Linux</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/05/05/wanted-passenger-testers-using-64-bit-os-x-and-64-bit-linux/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/05/05/wanted-passenger-testers-using-64-bit-os-x-and-64-bit-linux/</link>
	<description>&lt;p&gt;Passenger 1.0.2 fixed MacOS X compatibility. Unfortunately, the OS X fix broke compatibility with 64-bit Linux. The 1.0.4 release was supposed to fix it for both platforms. Before we released 1.0.4, we had an OS X user test it, and the test result was positive. But soon after the release we got bug reports from people, telling us that 1.0.4 broke OS X compatibility.&lt;/p&gt;
&lt;p&gt;The main problem lies in the file descriptor passing code. We&amp;#8217;re struggling to get it right:&lt;br /&gt;
1. The original code was copied from Ruby. Apparently that didn&amp;#8217;t work well on 64-bit MacOS X. This also means that file descriptor passing on 64-bit MacOS X Ruby is also broken, not just Passenger.&lt;br /&gt;
2. There is generally very little documentation about file descriptor passing. We found a bunch of code samples, but it turns out that all of the ones that we&amp;#8217;ve tried have portability problems. The developer man pages don&amp;#8217;t provide a lot of information on file descriptor passing.&lt;/p&gt;
&lt;p&gt;We want to get this right, but we don&amp;#8217;t have any 64-bit machines at all. &lt;b&gt;So we&amp;#8217;re looking for people who can help us with testing Passenger on 64-bit OS X and 64-bit Linux.&lt;/b&gt; We&amp;#8217;d like to have at least 3 people from both categories. If you&amp;#8217;re interested, please &lt;a href=&quot;http://groups.google.com/group/phusion-passenger&quot;&gt;send a message to our discussion board&lt;/a&gt;, or join #passenger on irc.freenode.net.&lt;/p&gt;
&lt;p&gt;Thank you.&lt;/p&gt;</description>
	<pubDate>Mon, 05 May 2008 11:19:46 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Phusion Passenger (mod_rails) version 1.0.2 released, and more</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/04/29/phusion-passenger-mod_rails-version-102-released-and-more/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/04/29/phusion-passenger-mod_rails-version-102-released-and-more/</link>
	<description>&lt;p&gt;&lt;b&gt;Passenger version 1.0.2 has been released.&lt;/b&gt; &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; We&amp;#8217;ve finally finished our corporate blog now, so &lt;a href=&quot;http://blog.phusion.nl/2008/04/29/phusion-passenger-mod_rails-version-102-released-and-more/&quot;&gt;visit http://blog.phusion.nl/&lt;/a&gt; for the release announcement, overview of changes, upgrade instructions, and more.&lt;/p&gt;
&lt;p&gt;Now that we finally have an official corporate blog, people can stop complaining about my blog template. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; Note that our corporate blog&amp;#8217;s template isn&amp;#8217;t finished yet: it still needs some polish.&lt;/p&gt;</description>
	<pubDate>Tue, 29 Apr 2008 21:43:15 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: The hidden corners of Passenger</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/04/26/the-hidden-corners-of-passenger/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/04/26/the-hidden-corners-of-passenger/</link>
	<description>&lt;p&gt;There are a few technical achievements in Passenger that we haven&amp;#8217;t actively marketed. But we&amp;#8217;d like the community to be aware of them, so we&amp;#8217;ve written this blog post. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;h2&gt;Unix domain sockets&lt;/h2&gt;
&lt;p&gt;Not too long ago, Thin announced &lt;a href=&quot;http://macournoyer.wordpress.com/2008/01/26/get-intimate-with-your-load-balancer-tonight/&quot;&gt;support for Unix domain sockets&lt;/a&gt;. This gave Thin an incredible speed boost. Switchpipe soon followed, with &lt;a href=&quot;http://groups.google.com/group/switchpipe/web/setting-up-your-own-webapps-with-switchpipe&quot;&gt;alpha support&lt;/a&gt; for Unix domain sockets.&lt;/p&gt;
&lt;p&gt;It has always surprised me that the Ruby/Rails web containers didn&amp;#8217;t support Unix domain sockets until early 2008. Unix domain sockets aren&amp;#8217;t exactly rocket science or exotic: the X Window System has used them for client-server communication on localhost for as long as I can remember. Database systems such as MySQL prefer to use Unix domain sockets on localhost as well. It&amp;#8217;s also well-known that Unix domain sockets are faster than TCP sockets.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s one down side to Unix domain sockets though: you have to remove them. Usually, server processes remove them during exit. But if the system crashes, or if those processes crash, then the socket files are never removed, and the system administrator will have to do that manually. Ouch, maintenance overhead.&lt;/p&gt;
&lt;p&gt;Passenger uses Unix sockets extensively, and has done so since the first release. But there&amp;#8217;s one difference compared to Thin and Switchpipe: Passenger uses &lt;b&gt;Unix sockets in the abstract namespace&lt;/b&gt; (as opposed to on the filesystem) whenever possible. Abstract namespace Unix sockets have filenames, just like regular Unix sockets, but they do not appear as files on the filesystem. This means that after a reboot, or if Apache crashes, no stale files will be left on the filesystem. This way, the system administrator doesn&amp;#8217;t have to manually remove stale files if something went wrong.&lt;/p&gt;
&lt;p&gt;Passenger strives for a concept that we call &amp;#8220;zero maintenance&amp;#8221;. We believe that software should Just Work(tm), and system maintenance overhead should be as low as possible. The system administrator shouldn&amp;#8217;t have to worry about stuff like stale files, if he doesn&amp;#8217;t have to. Ideally, the system administrator should be able to forget that he ever installed Passenger at all. The usage of abstract namespace Unix sockets is one of the mechanisms that we use to achieve that goal.&lt;/p&gt;
&lt;h2&gt;PID files (or the lack thereof)&lt;/h2&gt;
&lt;p&gt;Mongrel and Thin write so-called PID files to the filesystem. PID files contain the PIDs of background processes, and are used for shutting down those processes. But if the system crashes, or if those background processes crash, then the PID files will never be removed, and they become stale PID files. Early Mongrel versions refuse to start if there are stale PID files, forcing the system administrator to remove them manually. Passenger on the other hand doesn&amp;#8217;t use PID files at all. If one shuts down Apache, then all Rails processes are shut down as well.&lt;/p&gt;
&lt;p&gt;So what happens if Apache crashes? The Rails processes will exit as well. We use so-called &amp;#8220;owner pipes&amp;#8221; in Passenger, pipes that are shared between Apache and the Rails processes. Owner pipes are essentially a mechanism for reference counting processes. If Apache crashes, then the owner pipe is automatically closed. The Rails processes will detect this, and will shut down gracefully.&lt;/p&gt;</description>
	<pubDate>Sat, 26 Apr 2008 19:15:11 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Passenger (mod_rails): community response, donations, InfoQ interview</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/04/22/passenger-mod_rails-community-response-infoq-interview/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/04/22/passenger-mod_rails-community-response-infoq-interview/</link>
	<description>&lt;h2&gt;Community response: one week after the release&lt;/h2&gt;
&lt;p&gt;It has been a little more than one week since &lt;a href=&quot;http://www.modrails.com/&quot;&gt;the first public release of Passenger&lt;/a&gt;. In this one week, lots and lots of people have blogged about us, including even &lt;a href=&quot;http://www.oreillynet.com/ruby/blog/2008/04/mod_rails_for_apache_is_now_a.html&quot;&gt;O&amp;#8217;Reilly&lt;/a&gt;. The &lt;a href=&quot;http://www.railsgarden.com/2008/04/12/configurating-passenger-mod_rails-on-slicehost-with-ubuntu-710/&quot;&gt;feedback&lt;/a&gt; &lt;a href=&quot;http://blog.zerosum.org/2008/4/12/mod_rails-revealed&quot;&gt;has&lt;/a&gt; &lt;a href=&quot;http://www.hadermann.be/blog/31/mod_rails-first-impressions/&quot;&gt;been&lt;/a&gt; &lt;a href=&quot;http://keithmedlin.com/?p=28&quot;&gt;overwhelmingly&lt;/a&gt; positive! &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;A few nice quotes from the community:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;#8220;As many of you have already done, I hopped on board to see how it worked and was amazed on how easy it was to get up and going.&amp;#8221; &amp;#8212; &lt;a href=&quot;http://www.oreillynet.com/ruby/blog/2008/04/mod_rails_for_apache_is_now_a.html&quot;&gt;O&amp;#8217;Reilly&lt;/a&gt;
&lt;li&gt;&amp;#8220;So far I&amp;#8217;m happy to report that, as advertised, it&amp;#8217;s dead easy to use&amp;#8230; and the performance seems solid.&amp;#8221; &amp;#8212; &lt;a href=&quot;http://blog.zerosum.org/2008/4/12/mod_rails-revealed&quot;&gt;zerosum.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;#8220;Mod_rails seems to be a surprising stable and finished product, and this for a first public release! I’m anxious to check out their Ruby Enterprise Edition.&amp;#8221; &amp;#8212; &lt;a href=&quot;http://www.hadermann.be/blog/31/mod_rails-first-impressions/&quot;&gt;Handermann.be&lt;/a&gt;&lt;/li&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Thanks for the praise, everybody. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;h2&gt;&amp;#8220;Enterprise licenses&amp;#8221; (a.k.a. donations)&lt;/h2&gt;
&lt;p&gt;One may wonder why our &lt;a href=&quot;http://www.modrails.com/enterprise.html&quot;&gt;&amp;#8220;Enterprise&amp;#8221;/Donation page&lt;/a&gt; was taken down so soon. It&amp;#8217;s because people have been very, very generous with regard to donating to us. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; In fact, so generous that Paypal decided to block our account under the guise of &amp;#8220;anti-money laundering investigation&amp;#8221;. But everything has been cleared up now, so the donations page is &lt;a href=&quot;http://www.modrails.com/enterprise.html&quot;&gt;once again online&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;d like to help us survive the coming winters, or just want to support Passenger&amp;#8217;s development, then please consider &lt;a href=&quot;http://www.modrails.com/enterprise.html&quot;&gt;getting an &amp;#8220;enterprise&amp;#8221; license&lt;/a&gt;. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;h2&gt;InfoQ interview&lt;/h2&gt;
&lt;p&gt;We&amp;#8217;ve been &lt;a href=&quot;http://www.infoq.com/news/2008/04/phusion-passenger-mod-rails-gc&quot;&gt;interviewed by InfoQ&lt;/a&gt;. This interview elaborates some things about the name and the license. It also elaborates our upcoming memory optimizations for Passenger/Ruby, which allows them to use less memory. More information about this soon, honestly. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;On a side note, we&amp;#8217;re preparing the release of Passenger 1.0.2. It will soon be available.&lt;/p&gt;</description>
	<pubDate>Tue, 22 Apr 2008 20:45:42 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Phusion Passenger Enterprise Licensees, check your mail</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/04/16/phusion-passenger-enterprise-licensees-check-your-mail/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/04/16/phusion-passenger-enterprise-licensees-check-your-mail/</link>
	<description>&lt;p&gt;Hi there,&lt;/p&gt;
&lt;p&gt;Our apologies for the later than usual update, but things are getting really busy here at Phusion and this has been the first opportunity that we&amp;#8217;ve been able to blog about the latest developments again! First off, we&amp;#8217;d like to take the opportunity to ask all enterprise licensees to check their mail as they&amp;#8217;re bound to find something nice there &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Also, the next batch of enterprise licenses will become available very soon. We just wanted to let you guys know that we&amp;#8217;re still alive and are working around the clock on some very interesting projects for our clients. Regardless of this, we want you guys to know that we&amp;#8217;re still actively involved in the development of Phusion Passenger and Ruby Enterprise Edition and for those who want to know a bit more about Phusion Passenger and Ruby Enterprise Edition, we&amp;#8217;ve recently done a mini interview with the fine people at &lt;a href=&quot;http://www.infoq.com&quot;&gt;infoq&lt;/a&gt;, and we encourage you to go check it out over &lt;a href=&quot;http://www.infoq.com/news/2008/04/phusion-passenger-mod-rails-gc&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Even though we try to stay as actively involved as possible, we would also like to encourage the community to submit patches for the improvement of Phusion Passenger. We&amp;#8217;re confident that we can make Passenger even better together (wow, that even rhymes so it must be true right? ;-)).&lt;/p&gt;
&lt;p&gt;Also, it has come to our attention that some of you guys have expressed a concern about the memory use of Phusion Passenger and we have reason to believe that the memory wasn&amp;#8217;t always measured in an accurate way. This is for the greater part the result of a well known problem with the innacurate display of memory usage by ps and/or top.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ll try to write an article on this as soon as possible where we will address this &amp;#8216;issue&amp;#8217; with the appropriate measuring tools as well. Hopefully, this should set the record straight and take away any reluctance to try out Phusion Passenger as we&amp;#8217;re pretty confident that Phusion Passenger uses a lot less memory than some people seemed to have inferred. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;We&amp;#8217;d like to leave it at this for now, and we&amp;#8217;ll keep you guys posted and would love to &lt;a href=&quot;mailto:info@phusion.nl&quot;&gt;stay in touch with you guys&lt;/a&gt; :-).&lt;/p&gt;
&lt;p&gt;Cheers,&lt;br /&gt;
Hongli Lai&lt;br /&gt;
Ninh Bui&lt;/p&gt;</description>
	<pubDate>Wed, 16 Apr 2008 19:02:31 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: PHUSION PASSENGER (MOD_RAILS) PUBLIC RELEASE, HECK, IT’S ABOUT TIME :-)</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/04/11/phusion-passenger-mod_rails-public-release-heck-it%e2%80%99s-about-time/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/04/11/phusion-passenger-mod_rails-public-release-heck-it%e2%80%99s-about-time/</link>
	<description>&lt;p&gt;After weeks of teaching it hardcore computer science kung-fu, &lt;a href=&quot;http://www.phusion.nl/about.html&quot;&gt;we&amp;#8217;ve&lt;/a&gt; finally reached a stage in that we think &lt;a href=&quot;http://www.modrails.com&quot;&gt;our little baby&lt;/a&gt; is now all grown up. It is no longer solely dependent of our care, and from this moment on, &lt;a href=&quot;http://www.modrails.com&quot;&gt;Phusion Passenger&lt;/a&gt; is available for the masses.&lt;/p&gt;
&lt;p&gt;Phusion Passenger has been the result of many many many (did I say many? I mean MANY) hours of hard work by both &lt;a href=&quot;http://izumi.plan99.net/blog&quot;&gt;Hongli&lt;/a&gt; and I ( &lt;a href=&quot;http://www.ninh.nl&quot;&gt;Ninh&lt;/a&gt; ), but it couldn&amp;#8217;t have been made possible without the help of our beta testers. In particular, we&amp;#8217;d like to thank Dallas of &lt;a href=&quot;http://www.dreamhost.com&quot;&gt;Dreamhost&lt;/a&gt; for being so patient and we&amp;#8217;re looking forward to seeing Passenger being fully integrated in your hosting plans. Also, we&amp;#8217;d like to thank Alex of &lt;a href=&quot;http://www.twitter.com&quot;&gt;Twitter&lt;/a&gt; for trying his best to test Passenger in time.&lt;/p&gt;
&lt;p&gt;Also, we&amp;#8217;d like to thank the Ruby on Rails core team for their insightful feedback and support, and in particular, we&amp;#8217;d like to thank &lt;a href=&quot;http://www.loudthinking.com&quot;&gt;David Heinemeier Hansson&lt;/a&gt;, &lt;a href=&quot;http://bitsweat.net/&quot;&gt;Jeremy Kemper&lt;/a&gt; and &lt;a href=&quot;http://m.onkey.org&quot;&gt;Pratik Naik&lt;/a&gt; for this.&lt;/p&gt;
&lt;p&gt;Yukihiro Matsumoto (matz), thank you for the kind words on our project, it really kept us motivated.&lt;/p&gt;
&lt;p&gt;Ryan Bates of &lt;a href=&quot;http://www.railscasts.com&quot;&gt;Railscasts&lt;/a&gt;, thank you so much for doing the screencast on Phusion Passenger. We&amp;#8217;re looking forward to meeting you in person at Railsconf and being able to thank you properly &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; Depending on the paint we&amp;#8217;re allowed to carry with us, shaking a green hand may be involved &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://antoniocangiano.com/&quot;&gt;Antonio Cangiano&lt;/a&gt;, thanks for the coverage. It was when we saw that a technical evangelist at IBM had written about us that it truly hit us that we were doing something important.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.luckysneaks.com/blog&quot;&gt;Russel Norris&lt;/a&gt;, you really should not underestimate the importance of your great sense of humor for an open source project :-D.&lt;/p&gt;
&lt;p&gt;Since we&amp;#8217;re from the Netherlands, we&amp;#8217;d also like to thank our fellow dutchmen Stefan Fountain of &lt;a href=&quot;http://www.soocial.com&quot;&gt;Soocial&lt;/a&gt; and Thijs van der Vossen of &lt;a href=&quot;http://www.fngtps.com&quot;&gt;Fingertips&lt;/a&gt; for their support on this project.&lt;/p&gt;
&lt;p&gt;Also, thank you &lt;a href=&quot;http://www.adobe.com/communities/experts/all.html&quot;&gt;Weyert de Boer&lt;/a&gt; for being a great friend and helping us streamline the markup of our &lt;a href=&quot;http://www.modrails.com&quot;&gt;website&lt;/a&gt;. Even though we haven&amp;#8217;t been able to complete it yet, we&amp;#8217;re confident that we&amp;#8217;ll be able to finish this with your help and we thank you for this.&lt;/p&gt;
&lt;p&gt;Lastly, we&amp;#8217;d like to thank Hans Scholten of the &lt;a href=&quot;http://www.cs.utwente.nl&quot;&gt;University of Twente&lt;/a&gt; for offering to help us on writing a scientific paper on our work with Ruby Enterprise Edition and Phusion Passenger.&lt;/p&gt;
&lt;p&gt;To you the reader, we hope that you&amp;#8217;ll enjoy using Passenger and we thank you for your patience. We&amp;#8217;ll be seeing you guys at Railsconf USA 2008 &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; (and probably Apachecon USA 2008 as well! &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; )&lt;/p&gt;
&lt;p&gt;Be sure to check us out there, since we&amp;#8217;ll be doing a talk on Phusion Passenger (mod_rails) and our garbage collector optimization work on MRI. The talk material will be based on our scientific paper to be published on &lt;a href=&quot;http://www.eprints.org/&quot;&gt;eprints&lt;/a&gt;, so the tech savvy among you guys will be in for a treat :-).&lt;/p&gt;
&lt;p&gt;For science and all things pragmatic, this was Hongli Lai and Ninh Bui of Phusion, The Computer Science Company, wishing you a good weekend as we&amp;#8217;ll be seeing you guys monday again. We&amp;#8217;re going to take that well-deserved time off now ;-).&lt;/p&gt;
&lt;p&gt;P.S. Even though we&amp;#8217;re currently getting swamped with clients, that shouldn&amp;#8217;t stop you from &lt;a href=&quot;mailto:info@phusion.nl&quot;&gt;contacting us&lt;/a&gt; for business enquiries. As a matter of fact, we&amp;#8217;re planning on expanding our team, so if you&amp;#8217;re a computer scientist / developer located in the Netherlands with a lot of work experience and interested in working with us, please contact us as well &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 11 Apr 2008 19:19:47 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Phusion Passenger Screencast 2.0 (With Ryan Bates, 100% Scary Hand Free), plus something more…</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/04/11/phusion-passenger-screencast-20-with-ryan-bates-100-scary-hand-free-plus-something-more/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/04/11/phusion-passenger-screencast-20-with-ryan-bates-100-scary-hand-free-plus-something-more/</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://www.ninh.nl/&quot;&gt;Ninh&lt;/a&gt; wrote this a while ago:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;#8220;Lastly, we’d like to take the opportunity to thank Ryan Bates of &lt;a href=&quot;http://www.railscasts.com/&quot;&gt;Railscasts&lt;/a&gt; for creating an excellent screencast on Passenger, and you’ll be able to see this for yourselves &lt;strong&gt;at the public release of Passenger this week&lt;/strong&gt;. Needless to say, it totally kicks the *censored* out of our initial &lt;a href=&quot;http://www.modrails.com/&quot;&gt;screencast&lt;/a&gt; :-D&amp;#8221;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://phusion.nl/passenger.mov&quot;&gt;Are&lt;/a&gt; &lt;a href=&quot;http://www.modrails.com/videos/phusion_passenger_screencast.mov.torrent&quot;&gt;you&lt;/a&gt; &lt;a href=&quot;http://www.railsplugins.net/passenger.mov&quot;&gt;guys&lt;/a&gt; &lt;a href=&quot;http://www.modrails.com/videos/passenger.mov&quot;&gt;ready&lt;/a&gt;? &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 11 Apr 2008 14:52:47 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Phusion Passenger (mod_rails) update</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/04/08/phusion-passenger-mod_rails-update/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/04/08/phusion-passenger-mod_rails-update/</link>
	<description>&lt;p&gt;So you guys are probably still waiting for the release of &lt;a href=&quot;http://www.modrails.com&quot;&gt;Passenger&lt;/a&gt;, and I&amp;#8217;m pleased to say that we&amp;#8217;ve been able to include the test results from &lt;a href=&quot;http://www.dreamhost.com&quot;&gt;Dreamhost&lt;/a&gt; (thanks Dallas :D) in the first public release that you&amp;#8217;ll see within this week. (Hold on just a little longer guys &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; , with a bit of luck, &lt;a href=&quot;http://www.twitter.com&quot;&gt;Twitter&amp;#8217;s&lt;/a&gt; results will come in as well prior to the release of Passenger this week).&lt;/p&gt;
&lt;p&gt;Instead of writing an elaborate blog post, I&amp;#8217;ll keep it concise for the time being as we&amp;#8217;re currently getting swamped at &lt;a href=&quot;http://www.phusion.nl&quot;&gt;Phusion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Today, after planning to do this for quite a long time now, we went to go see our &lt;a href=&quot;http://wwwhome.cs.utwente.nl/~scholten/&quot;&gt;Operating Systems/Computer Architecture teacher, Ir. Hans Scholten&lt;/a&gt; to discuss the possibilities for receiving &lt;a href=&quot;http://en.wikipedia.org/wiki/European_Credit_Transfer_and_Accumulation_System&quot;&gt;ECTS&lt;/a&gt; for our work on both Passenger and Ruby Enterprise Edition (our ruby branch containing our garbage collector optimization).&lt;/p&gt;
&lt;p&gt;From this, it became clear that our work wasn&amp;#8217;t something trivial and Hans elaborated on the possibilities for publishing this work scientifically. Needless to say, we&amp;#8217;re more than thrilled about this. After all, we&amp;#8217;re &amp;#8220;Phusion, the computer science company&amp;#8221; right? &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;All kidding aside though, we do intend on taking Hans up on his offer to write a scientific paper on our work, seeing as this is just too great an opportunity to ignore. With his help, we&amp;#8217;re more than confident about the quality of its contents.&lt;/p&gt;
&lt;p&gt;Lastly, we&amp;#8217;d like to take the opportunity to thank Ryan Bates of &lt;a href=&quot;http://www.railscasts.com&quot;&gt;Railscasts&lt;/a&gt; for creating an excellent screencast on Passenger, and you&amp;#8217;ll be able to see this for yourself at the public release of Passenger this week. Needless to say, it totally kicks the *censored* out of our initial &lt;a href=&quot;http://www.modrails.com&quot;&gt;screencast&lt;/a&gt; &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:-D&quot; class=&quot;wp-smiley&quot; /&gt; .&lt;/p&gt;
&lt;p&gt;To all the people that have submitted a voice sample, we&amp;#8217;ll be crediting you on the screencast section of the Passenger as well &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; .&lt;/p&gt;
&lt;p&gt;Hang on in there for just a little longer people &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; , we&amp;#8217;re almost there!&lt;/p&gt;
&lt;p&gt;Thanks,&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://izumi.plan99.net&quot;&gt;Hongli Lai&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://ninh.nl&quot;&gt;Ninh Bui&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 08 Apr 2008 19:05:18 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Robustness comparison between Phusion Passenger, Thin, Ebb and Mongrel</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/04/07/robustness-comparison-between-phusion-passenger-thin-ebb-and-mongrel/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/04/07/robustness-comparison-between-phusion-passenger-thin-ebb-and-mongrel/</link>
	<description>&lt;p&gt;We&amp;#8217;ve written a &lt;a href=&quot;http://ninh.nl/blog/2008/04/07/robustness-comparisson-between-phusion-passenger-thin-ebb-and-mongrel/&quot;&gt;robustness comparison between Phusion Passenger (mod_rails), Thin, Ebb and Mongrel.&lt;/a&gt; See &lt;a href=&quot;http://ninh.nl/blog/2008/04/07/robustness-comparisson-between-phusion-passenger-thin-ebb-and-mongrel/&quot;&gt;Ninh&amp;#8217;s blog&lt;/a&gt; for the article.&lt;/p&gt;</description>
	<pubDate>Mon, 07 Apr 2008 09:19:29 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: The moment you’ve all been waiting for (and so have we)</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/04/04/the-moment-youve-all-been-waiting-for-and-so-did-we/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/04/04/the-moment-youve-all-been-waiting-for-and-so-did-we/</link>
	<description>&lt;p&gt;Here it is: &lt;a href=&quot;http://ninh.nl/blog/2008/04/04/the-moment-youve-probably-been-waiting-for-so-did-we/&quot;&gt;the moment you&amp;#8217;ve all been waiting for&lt;/a&gt;. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 04 Apr 2008 17:35:50 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: An update on Passenger (mod_rails) related stuff</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/04/03/an-update-on-passenger-mod_rails-related-stuff/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/04/03/an-update-on-passenger-mod_rails-related-stuff/</link>
	<description>&lt;p&gt;Since we&amp;#8217;re almost nearing the weekend, we thought we&amp;#8217;d give you guys a little heads-up on the things we&amp;#8217;re currently doing.&lt;/p&gt;
&lt;p&gt;As you may have recalled from several days ago, we&amp;#8217;ve asked for your voice in the most literal sense of the word for our new (series of) screencasts that we&amp;#8217;re planning on doing.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re pleased to say that a lot of you guys out there have been sending in your voice samples, and to our great surprise, it wasn&amp;#8217;t just guys who were sending in their voices :D. More on that later though, and for now, we&amp;#8217;d like to again take the opportunity to thank you all.&lt;/p&gt;
&lt;p&gt;Among those submissions, we&amp;#8217;ve also received one from Ryan Bates which you may already know from his excellent &lt;a href=&quot;http://www.railscasts.com&quot;&gt;Railscasts website&lt;/a&gt;. Greatly impressed by the quality of his previous work, we&amp;#8217;re pleased to announce that Ryan Bates has agreed on doing the first &amp;#8216;official&amp;#8217; screencast on &lt;a href=&quot;http://www.modrails.com&quot;&gt;Passenger&lt;/a&gt;. This screencast will be based on the latest beta that we&amp;#8217;ve provided him with: don&amp;#8217;t even bother asking him to leak it though, as he has assured us that such attempts will be in vain ;-).&lt;/p&gt;
&lt;p&gt;But what about all those submitted voice samples? Well, we&amp;#8217;re currently planning on doing a demo reel on Phusion as a company as well, and needless to say, we&amp;#8217;re going to need a voice over for this as well.&lt;/p&gt;
&lt;p&gt;It is for this reason that we&amp;#8217;ve decided to take the people who&amp;#8217;ve submitted their voice samples into consideration for this, since you all sounded more than suitable for this. Needless to say, this is only possible if you&amp;#8217;re willing to do this, and we&amp;#8217;ll be sure to contact you guys on this soon. Due to our busy schedules however, we may not be able to contact each and every one of you, and we ask for your understanding on this.&lt;/p&gt;
&lt;p&gt;Whichever the case may be, we will however be crediting each and everyone of you on the Passenger screencast site. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Regarding the demo reel, we&amp;#8217;re currently in talks with several video production companies and individuals for helping us create this, and we&amp;#8217;ll probably be able to share some more information on this with you guys soon.&lt;/p&gt;
&lt;p&gt;Concerning Passenger, we&amp;#8217;ve decided to increase our sample space by accepting some additional large Ruby on Rails hosts for beta testing, in the hopes of being able to release it to the public even sooner. If you&amp;#8217;re attending &lt;a href=&quot;http://www.railsconf.org&quot;&gt;Railsconf&lt;/a&gt; like we&amp;#8217;re planning on doing, then you&amp;#8217;ll probably be able to ask them about their findings on Passenger as well &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Also, you may have read &lt;a href=&quot;http://izumi.plan99.net/blog/index.php/2008/03/31/benchmark-passenger-mod_rails-vs-mongrel-vs-thin/&quot;&gt;our article on the performance of Passenger compared to other popular solutions out there&lt;/a&gt;. However, we haven&amp;#8217;t touched the subject of stability/robustness yet, and since Passenger was designed for this as well, we&amp;#8217;ve also tested this on the other popular solutions. We&amp;#8217;ve been able to infer some interesting results, and we&amp;#8217;ll be posting a detailed article on this as soon as we&amp;#8217;re done doing administrative work for Phusion.&lt;/p&gt;
&lt;p&gt;Lastly, even though we&amp;#8217;re getting swamped at Phusion, this shouldn&amp;#8217;t stop you from &lt;a href=&quot;mailto:info@phusion.nl&quot;&gt;contacting us&lt;/a&gt; in case of a question/fanmail ;). We&amp;#8217;d be more than happy to receive/answer them &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;With kind regards we are, your friends at &lt;a href=&quot;http://www.phusion.nl&quot;&gt;Phusion&lt;/a&gt;,&lt;br /&gt;
- &lt;a href=&quot;http://izumi.plan99.net/blog&quot;&gt;Hongli Lai&lt;/a&gt;&lt;br /&gt;
- &lt;a href=&quot;http://ninh.nl/blog&quot;&gt;Ninh Bui&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 03 Apr 2008 12:26:30 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Introducing Ruby Ain’t Hypertext Preprocessor (RAHP)</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/04/01/introducing-ruby-ain%e2%80%99t-hypertext-preprocessor-rahp/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/04/01/introducing-ruby-ain%e2%80%99t-hypertext-preprocessor-rahp/</link>
	<description>&lt;p&gt;By the time of this writing, a lot of people have been claiming that &lt;a href=&quot;http://www.modrails.com&quot;&gt;Passenger&lt;/a&gt; will cause a revolution in the Ruby on Rails community. And even though we agree with them to a certain point ( &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; ), we believe that one should always have a trump card in case all else fails. We&amp;#8217;ve been working on our trump card for quite some time now in great secrecy.&lt;/p&gt;
&lt;p&gt;Today, we&amp;#8217;re pleased to announce this trump card to the world: &lt;b&gt;Ruby Ain&amp;#8217;t Hypertext Preprocessor (RAHP)&lt;/b&gt;.&lt;/p&gt;
&lt;h2&gt;What is RAHP?&lt;/h2&gt;
&lt;p&gt;RAHP is a Ruby parser written in PHP, which will enable you to run all your Ruby applications within a PHP environment! This was possible due to the fact that Ruby and PHP are both &lt;a href=&quot;http://en.wikipedia.org/wiki/Turing_complete&quot;&gt;Turing Complete&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Since PHP still enjoys more support among webhosts than Ruby on Rails, we&amp;#8217;ve decided to combine the best of both worlds with RAHP. And as you may already have heard from a friend, PHP scales really well in Enterprise environments, unlike Rails applications.&lt;/p&gt;
&lt;p&gt;But wait! It doesn&amp;#8217;t end there! Using Zend optimizer we&amp;#8217;ve been able to infer a tremendous performance boost, and we think we may need to retract our previous &lt;a href=&quot;http://izumi.plan99.net/blog/index.php/2008/01/17/ruby-vs-php-performance/&quot;&gt;benchmark post on Ruby vs PHP&lt;/a&gt;. :$&lt;/p&gt;
&lt;h2&gt;Long story short:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;RAHP will enable you to run your Rails applications pretty much on every webhost out there!
&lt;/li&gt;
&lt;li&gt;Because RAHP is based on PHP, your Rails applications will be able to use the thousands of existing PHP libraries with ease!&lt;/li&gt;
&lt;li&gt;It is common knowledge that PHP is extremely scalable (unlike Rails). So by the transitive property, your Rails applications will become scalable as well, with the help RAHP on Rails!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Come to think of it, we&amp;#8217;re considering to discontinue our work on &lt;a href=&quot;http://www.modrails.com&quot;&gt;Passenger&lt;/a&gt; in favor of RAHP. We&amp;#8217;ll have to sleep on it though.&lt;/p&gt;
&lt;p&gt;Stay tuned!&lt;/p&gt;</description>
	<pubDate>Tue, 01 Apr 2008 17:58:26 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Matz on Passenger</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/04/01/matz-on-passenger/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/04/01/matz-on-passenger/</link>
	<description>&lt;p&gt;Recently, &lt;a href=&quot;http://en.wikipedia.org/wiki/Yukihiro_Matsumoto&quot;&gt;Yukihiro Matsumoto&lt;/a&gt; (a.k.a. Matz, the creator of Ruby) &lt;a href=&quot;http://www.rubyist.net/~matz/20080321.html#p04&quot;&gt;blogged&lt;/a&gt; about &lt;a href=&quot;http://www.modrails.com/&quot;&gt;Phusion Passenger (mod_rails)&lt;/a&gt; on his weblog. Since our Japanese is a bit rusty, i.e. non-existant &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_sad.gif&quot; alt=&quot;:-(&quot; class=&quot;wp-smiley&quot; /&gt; &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; , Matz was kind enough to mail us a summary in English from which we quote:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;It is often said that Rails is weak on deployment; PHP runs fairly fast just by uploading scripts.  Rails is slow on development mode, and requires restarting on production mode (and bit complex to configure).  modrails might be the answer for it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Needless to say, coming from Matz, this made us feel real warm and fuzzy from inside &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Tue, 01 Apr 2008 17:38:08 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Benchmark: Passenger (mod_rails) vs Mongrel vs Thin</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/03/31/benchmark-passenger-mod_rails-vs-mongrel-vs-thin/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/03/31/benchmark-passenger-mod_rails-vs-mongrel-vs-thin/</link>
	<description>&lt;p&gt;Since the initial release of the teaser screencast, a lot of people have asked about &lt;a href=&quot;http://www.modrails.com/&quot;&gt;Passenger&amp;#8217;s (a.k.a. mod_rails)&lt;/a&gt; performance compared to Mongrel and Thin. Here&amp;#8217;s the benchmark that you&amp;#8217;ve all been waiting for. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;In this benchmark, we compare the following software:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.modrails.com/&quot;&gt;Phusion Passenger (mod_rails), latest development version&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mongrel.rubyforge.org/&quot;&gt;Mongrel 1.1.4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.macournoyer.com/thin/&quot;&gt;Thin 0.7.1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;System specification:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intel Core 2 Duo, T5300 @ 1.73GHz&lt;/li&gt;
&lt;li&gt;2 GB RAM&lt;/li&gt;
&lt;li&gt;Ubuntu Linux 7.10&lt;/li&gt;
&lt;li&gt;Apache 2.2.4 (Ubuntu package)&lt;/li&gt;
&lt;li&gt;Ruby 1.8.6 (Ubuntu package)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Test applications:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.typosphere.org/&quot;&gt;Typo 5.0.3&lt;/a&gt;. This is an out-of-the-box setup with only a hello world post. Uses semi-static caching.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tw-commons.rubyforge.org/svn/petstore/trunk/&quot;&gt;Petstore revision 360&lt;/a&gt;, an application that the JRuby guys use for benchmarking. At first it wouldn&amp;#8217;t start in Passenger because of a bug Petstore: they forgot to add &lt;code&gt;require 'forwardable'&lt;/code&gt; in app/models/cart_items.rb. I added this line myself.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://almosteffortless.com/eldorado/&quot;&gt;Eldorado 0.9.1&lt;/a&gt;. This is an out-of-the-box setup with only a single forum and a single post added.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Typo and Eldorado both use SQLite 3. Petstore uses MySQL, because for some reason Petstore performs very badly when SQLite 3 is used.&lt;/p&gt;
&lt;p&gt;People have also recommended &lt;a href=&quot;http://lovdbyless.com/&quot;&gt;Lovd By Less&lt;/a&gt; as test application, but I couldn&amp;#8217;t get it working (database setup failed).&lt;/p&gt;
&lt;p&gt;The applications, when served by Passenger, are setup at the following test domains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;http://typo.test/&lt;/li&gt;
&lt;li&gt;http://petstore.test/&lt;/li&gt;
&lt;li&gt;http://eldorado.test/&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both the Mongrel cluster and the Thin cluster are setup at http://mongrel_cluster.test/. (Only either Mongrel or Thin is running during the benchmark, not both at the same time.)&lt;/p&gt;
&lt;p&gt;And of course, we always use the &lt;b&gt;production&lt;/b&gt; environment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Backend configuration:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Default Apache configuration, as provided by Ubuntu.&lt;/li&gt;
&lt;li&gt;Passenger: &lt;tt&gt;RailsMaxPoolSize&lt;/tt&gt; is set to 10. This means that Passenger will never spawn more than 10 Rails application instances. Note that Passenger is compiled &lt;b&gt;without&lt;/b&gt; optimizations, so if you install Passenger yourself and benchmark it, you might find that Passenger is slightly faster.&lt;/li&gt;
&lt;li&gt;Mongrel cluster: a cluster of 10 servers for each test application, behind mod_proxy_balancer, using default settings:
&lt;pre&gt;ProxyPass / balancer://mongrel_cluster/
ProxyPassReverse / balancer://mongrel_cluster/
&amp;lt;Proxy balancer://mongrel_cluster&amp;gt;
	BalancerMember http://127.0.0.1:3000
	BalancerMember http://127.0.0.1:3001
	BalancerMember http://127.0.0.1:3002
	BalancerMember http://127.0.0.1:3003
	BalancerMember http://127.0.0.1:3004
	BalancerMember http://127.0.0.1:3005
	BalancerMember http://127.0.0.1:3006
	BalancerMember http://127.0.0.1:3007
	BalancerMember http://127.0.0.1:3008
	BalancerMember http://127.0.0.1:3009
&amp;lt;/Proxy&amp;gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Thin cluster: same configuration as Mongrel cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Benchmark: Mongrel clusters&lt;/h2&gt;
&lt;p&gt;First we benchmark &lt;strong&gt;Typo&lt;/strong&gt; served by Mongrel clusters. Because the actual application code is loaded by Mongrel during the first request, we do not want to count the first request&amp;#8217;s time. So we run the following command to &amp;#8220;warm up&amp;#8221; the Mongrels, and discard its result:&lt;/p&gt;
&lt;pre&gt;ab -n 1000 -c 100 http://mongrel_cluster.test/&lt;/pre&gt;
&lt;p&gt;Next, we test 10,000 requests with 100 concurrent users:&lt;/p&gt;
&lt;pre&gt;ab -n 10000 -c 100 http://mongrel_cluster.test/&lt;/pre&gt;
&lt;p&gt;Result:&lt;/p&gt;
&lt;pre&gt;Concurrency Level:      100
Time taken for tests:   32.628480 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      54890000 bytes
HTML transferred:       51480000 bytes
Requests per second:    306.48 [#/sec] (mean)
Time per request:       326.285 [ms] (mean)
Time per request:       3.263 [ms] (mean, across all concurrent requests)
Transfer rate:          1642.83 [Kbytes/sec] received&lt;/pre&gt;
&lt;p&gt;We repeat these steps Petstore and Eldorado.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Petstore:&lt;/strong&gt;&lt;br /&gt;
(for Petstore we benchmark the URI &amp;#8220;/shop/viewCategory.shtml?category=DOGS&amp;#8221; because it&amp;#8217;s written in the INSTALL file)&lt;/p&gt;
&lt;pre&gt;Concurrency Level:      100
Time taken for tests:   109.786026 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      40750000 bytes
HTML transferred:       37680000 bytes
Requests per second:    91.09 [#/sec] (mean)
Time per request:       1097.860 [ms] (mean)
Time per request:       10.979 [ms] (mean, across all concurrent requests)
Transfer rate:          362.47 [Kbytes/sec] received&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Eldorado:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;Concurrency Level:      100
Time taken for tests:   70.889388 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      41130000 bytes
HTML transferred:       35530000 bytes
Requests per second:    141.06 [#/sec] (mean)
Time per request:       708.894 [ms] (mean)
Time per request:       7.089 [ms] (mean, across all concurrent requests)
Transfer rate:          566.60 [Kbytes/sec] received&lt;/pre&gt;
&lt;h2&gt;Benchmark: Thin clusters&lt;/h2&gt;
&lt;p&gt;The benchmarking steps for Thin are the same.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Typo:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;Concurrency Level:      100
Time taken for tests:   25.795470 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      54910000 bytes
HTML transferred:       51480000 bytes
Requests per second:    387.66 [#/sec] (mean)
Time per request:       257.955 [ms] (mean)
Time per request:       2.580 [ms] (mean, across all concurrent requests)
Transfer rate:          2078.78 [Kbytes/sec] received&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Petstore:&lt;/strong&gt;&lt;br /&gt;
(for Petstore we benchmark the URI &amp;#8220;/shop/viewCategory.shtml?category=DOGS&amp;#8221; because it&amp;#8217;s written in the INSTALL file)&lt;/p&gt;
&lt;pre&gt;Concurrency Level:      100
Time taken for tests:   96.874308 seconds
Complete requests:      10000
Failed requests:        42
   (Connect: 0, Length: 42, Exceptions: 0)
Write errors:           0
Non-2xx responses:      42
Total transferred:      40630350 bytes
HTML transferred:       37547028 bytes
Requests per second:    103.23 [#/sec] (mean)
Time per request:       968.743 [ms] (mean)
Time per request:       9.687 [ms] (mean, across all concurrent requests)
Transfer rate:          409.58 [Kbytes/sec] received&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Eldorado:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;Concurrency Level:      100
Time taken for tests:   71.311031 seconds
Complete requests:      10000
Failed requests:        5
   (Connect: 0, Length: 5, Exceptions: 0)
Write errors:           0
Non-2xx responses:      5
Total transferred:      41137070 bytes
HTML transferred:       35518568 bytes
Requests per second:    140.23 [#/sec] (mean)
Time per request:       713.110 [ms] (mean)
Time per request:       7.131 [ms] (mean, across all concurrent requests)
Transfer rate:          563.34 [Kbytes/sec] received&lt;/pre&gt;
&lt;h2&gt;Benchmark: Passenger&lt;/h2&gt;
&lt;p&gt;The benchmarking steps for Passenger are the same.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Typo:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;Concurrency Level:      100
Time taken for tests:   25.131980 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      55200000 bytes
HTML transferred:       51260000 bytes
Requests per second:    397.90 [#/sec] (mean)
Time per request:       251.320 [ms] (mean)
Time per request:       2.513 [ms] (mean, across all concurrent requests)
Transfer rate:          2144.92 [Kbytes/sec] received&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Petstore:&lt;/strong&gt;&lt;br /&gt;
(for Petstore we benchmark the URI &amp;#8220;/shop/viewCategory.shtml?category=DOGS&amp;#8221; because it&amp;#8217;s written in the INSTALL file)&lt;/p&gt;
&lt;pre&gt;Concurrency Level:      100
Time taken for tests:   104.428742 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      40300000 bytes
HTML transferred:       36700000 bytes
Requests per second:    95.76 [#/sec] (mean)
Time per request:       1044.287 [ms] (mean)
Time per request:       10.443 [ms] (mean, across all concurrent requests)
Transfer rate:          376.86 [Kbytes/sec] received&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Eldorado:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;Concurrency Level:      100
Time taken for tests:   72.587018 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      41660000 bytes
HTML transferred:       35530000 bytes
Requests per second:    137.77 [#/sec] (mean)
Time per request:       725.870 [ms] (mean)
Time per request:       7.259 [ms] (mean, across all concurrent requests)
Transfer rate:          560.47 [Kbytes/sec] received&lt;/pre&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;Here&amp;#8217;s a nice summary of the requests per second, in a table and in a graph:&lt;/p&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Typo&lt;/th&gt;
&lt;th&gt;Petstore&lt;/th&gt;
&lt;th&gt;Eldorado&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mongrel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;306.48&lt;/td&gt;
&lt;td&gt;91.09&lt;/td&gt;
&lt;td&gt;141.06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Thin&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;387.66&lt;/td&gt;
&lt;td&gt;103.23&lt;/td&gt;
&lt;td&gt;140.23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Passenger&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;397.90&lt;/td&gt;
&lt;td&gt;95.60&lt;/td&gt;
&lt;td&gt;139.27&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src=&quot;http://izumi.plan99.net/blog/wp-content/uploads/2008/03/passenger_mongrel_thin_benchmark.png&quot; alt=&quot;passenger_mongrel_thin_benchmark.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I was pleasently surprised by the results. During Passenger&amp;#8217;s development, our performance baseline was Mongrel behind mod_proxy. According to earlier (simple and naive) tests, Passenger performed similar to Mongrel. I expected Thin to be a bit faster than Passenger. These new benchmarks however suggest Passenger is faster than Mongrel, and is on par with Thin. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;But you know what they say: there are lies, damn lies, and statistics. Your hardware and software is different, so if you benchmark it yourself, you&amp;#8217;re likely to get (slightly?) different results.&lt;/p&gt;</description>
	<pubDate>Mon, 31 Mar 2008 14:04:51 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Wanted: native English speaker for Passenger (mod_rails) screencast</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/03/29/wanted-native-english-speaker-for-passenger-mod_rails-screencast/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/03/29/wanted-native-english-speaker-for-passenger-mod_rails-screencast/</link>
	<description>&lt;p&gt;I have good news and bad news.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s start with the good news. &lt;a href=&quot;http://www.modrails.com/&quot;&gt;Passenger (mod_rails)&lt;/a&gt; is almost ready for release. The code is as good as done (actually, it has been as good as done for well over a week now). The website is almost done. We&amp;#8217;re just awaiting final test results from remaining beta testers.&lt;/p&gt;
&lt;p&gt;The bad news: lots of people have commented about our current screencast, in particular about the now-infamous &amp;#8220;scary green hand&amp;#8221;. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; Being the perfectionists that we are, we&amp;#8217;d like to redo the screencast before we release Passenger. Neither Ninh nor I are native English speakers, so we&amp;#8217;re looking for a native English speaker who can help us with the voice-over part of the screencast. Preferably, someone with enough &amp;#8216;gravitas&amp;#8217; in their voice, or in the case of a female voice, the &amp;#8216;kindness&amp;#8217; should come out dripping from out of our audio speakers. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Would you like to volunteer? If so, please provide us with an audio sample. You can do this by either replying in this post, or by emailing us at &amp;#8220;hongli at plan99 dot net&amp;#8221; or &amp;#8220;ninh dot bui at gmail dot com&amp;#8221;! Thanks in advance.&lt;/p&gt;</description>
	<pubDate>Sat, 29 Mar 2008 16:32:51 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Good Rails app for benchmarking?</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/03/28/good-rails-app-for-benchmarking/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/03/28/good-rails-app-for-benchmarking/</link>
	<description>&lt;p&gt;Does anyone know a good Ruby on Rails app that I can use for benchmarking &lt;a href=&quot;http://www.modrails.com/&quot;&gt;Passenger (mod_rails)&lt;/a&gt;? I don&amp;#8217;t have any apps that I&amp;#8217;m allowed to use for this purpose. Mephisto and Typo are out because they both use page caching, which would make the benchmark pointless.&lt;/p&gt;</description>
	<pubDate>Fri, 28 Mar 2008 00:52:48 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Passenger and other Ruby frameworks</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/03/27/passenger-and-other-ruby-frameworks/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/03/27/passenger-and-other-ruby-frameworks/</link>
	<description>&lt;p&gt;Traffic for our &lt;a href=&quot;http://www.modrails.com/&quot;&gt;Passenger (mod_rails) preview site&lt;/a&gt; has increased three fold ever since &lt;a href=&quot;http://railsenvy.com/2008/3/26/rails-envy-podcast-episode-024-03-26-2008&quot;&gt;RailsEnvy&lt;/a&gt; and &lt;a href=&quot;http://weblog.rubyonrails.org/2008/3/26/mod_rails-is-on-the-way&quot;&gt;weblog.rubyonrails.org&lt;/a&gt; (thanks David) linked to us. We&amp;#8217;ve received quite some emails from interested people. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; One of the questions that we receive most is:&lt;/p&gt;
&lt;h2&gt;&amp;#8220;What about other Ruby frameworks, like Merb, Camping, etc?&amp;#8221;&lt;/h2&gt;
&lt;p&gt;There is the following saying: jack of all trades, master of none. At the moment, our goal is to make Passenger a great deployment system for Ruby on Rails, one that is matched by none in terms of ease of use and low maintenance overhead.&lt;/p&gt;
&lt;p&gt;But some people ask:&lt;/p&gt;
&lt;h2&gt;&amp;#8220;What&amp;#8217;s wrong with mod_ruby?&amp;#8221;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;For one, &lt;a href=&quot;http://www.modruby.net/en/&quot;&gt;look at its website&lt;/a&gt;. Last release was from 2006. I&amp;#8217;m not sure whether it&amp;#8217;s still maintained anymore.&lt;/li&gt;
&lt;li&gt;Nobody (or almost nobody) uses it in production. This fact alone says a lot.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;http://wiki.rubyonrails.org/rails/pages/mod_ruby&quot;&gt;Rails wiki page for mod_ruby&lt;/a&gt; lists a pretty bad limitation:&lt;br /&gt;
&lt;blockquote&gt;&lt;p&gt;mod_ruby uses a shared interpreter per Apache process, which means that multiple Rails applications on the same Apache setup with mod_ruby would share the framework classes. This doesn’t work well with the Rails model of using class-level configuration attributes, &lt;b&gt;so it’s considered unsafe to use mod_ruby and Rails with more than one application running per Apache setup&lt;/b&gt;, because different applications may start sharing the classes.&lt;/p&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Granted, these are implementation problems and not conceptual problems, so they can be fixed. So some people ask:&lt;/p&gt;
&lt;h2&gt;&amp;#8220;Why didn&amp;#8217;t you just make a solid mod_ruby implementation?&amp;#8221;&lt;/h2&gt;
&lt;p&gt;First, we must agree on the premise that Rails is a more popular framework than other Ruby frameworks. Wait, hold your flame thrower, this is not the reason. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Next, try thinking from the point of view of a new Rails developer. He&amp;#8217;s introduced to lala-land: Don&amp;#8217;t-Repeat-Yourself, convention over configuration, stuff that&amp;#8217;s supposed to Just Work(tm).&lt;/p&gt;
&lt;p&gt;Then he deploys his Rails app and finds out that he has to setup a Mongrel cluster (1 command but usually with 3 or 4 options that he&amp;#8217;ll have to look up), configure Apache to proxy to the cluster (about 5 or 6 lines that he&amp;#8217;ll have to setup), configure init.d/daemon tools/monit/god/whatever so that his Mongrel cluster is started at system startup, etc.&lt;/p&gt;
&lt;p&gt;Oh, and you need to repeat this for every single Rails app.&lt;/p&gt;
&lt;p&gt;Ouch, is this the proper Rails experience? I don&amp;#8217;t think so. &lt;b&gt;This&lt;/b&gt; is Passenger&amp;#8217;s philosophy: deployment should be in line with the Rails philosophy. In other words, it should be brain-dead simple. Just imagine the money that you&amp;#8217;ll save on health care for your system administrator if he doesn&amp;#8217;t have to worry about all that stuff anymore. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Of course, the Rails philosophy doesn&amp;#8217;t prevent deployment of other Ruby framework apps from being easy. So what&amp;#8217;s holding us back? Well, here&amp;#8217;s a few things that Passenger does but mod_ruby doesn&amp;#8217;t:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remember the &lt;a href=&quot;http://www.modrails.com/&quot;&gt;screencast&lt;/a&gt; that we showed you? You can deploy a Rails app to a virtual host without any Ruby-specific or Rails-specific configuration! From this fact one can deduce that Passenger somehow automatically detects Rails applications (and yes, this autodetection can be disabled). Autodetection heuristics are framework-dependent. We&amp;#8217;ll need different heuristics for each framework.&lt;/li&gt;
&lt;li&gt;Passenger preloads framework code and application code in order to reduce startup time and to reduce memory usage. Preloading logic is framework-dependent.&lt;/li&gt;
&lt;li&gt;Look at &lt;a href=&quot;http://wiki.rubyonrails.org/rails/pages/mod_ruby&quot;&gt;Troubleshooting obscure errors with mod_ruby&lt;/a&gt;. Notice the word &amp;#8220;obscure errors&amp;#8221; - errors should never be obscure or hard to track!
&lt;p&gt;We&amp;#8217;ve seen many people failing to deploy Rails apps because of errors during application startup. Lighttpd&amp;#8217;s FastCGI implementation redirects those errors to /dev/null. Not good, this fact bit me 2 years ago &amp;#8212; when I was deploying my first Rails app &amp;#8212; and made me wonder why the thing wouldn&amp;#8217;t work. Mongrel prints errors either to stderr or to its log file. But people who are new to Rails deployment don&amp;#8217;t know that they should be looking in the log files (or that there are log files in the first place). Plus, looking into the log file is yet-another-step. Wouldn&amp;#8217;t it be great if you can see startup errors right in the browser?&lt;/p&gt;
&lt;p&gt;Passenger provides user-friendly error pages. If a Rails app failed to start, then Passenger will tell you what happened. A few possible error pages are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Whether a (specific version of a) system-wide Rails framework failed to load. Passenger will even tell you the correct command to (re)install it.&lt;/li&gt;
&lt;li&gt;Whether a vendor&amp;#8217;ed Rails framework failed to load.&lt;/li&gt;
&lt;li&gt;Whether the app failed to start because of a syntax error, or a missing gem. Passenger will suggest solutions.&lt;/li&gt;
&lt;li&gt;Whether a database error occured during startup. Passenger will tell you to check your database.yml and to run &amp;#8216;rake db:migrate&amp;#8217;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are previews of typical error pages:&lt;br /&gt;
&lt;a href=&quot;http://izumi.plan99.net/blog/wp-content/uploads/2008/03/database_error.html&quot; title=&quot;database_error.html&quot;&gt;&lt;img src=&quot;http://izumi.plan99.net/blog/wp-content/uploads/2008/03/error_page.jpg&quot; alt=&quot;error_page.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://izumi.plan99.net/blog/wp-content/uploads/2008/03/framework_init_error.html&quot; title=&quot;framework_init_error.html&quot;&gt;&lt;img src=&quot;http://izumi.plan99.net/blog/wp-content/uploads/2008/03/error_page_2.jpg&quot; alt=&quot;error_page_2.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As you can see, a lot of these error pages are framework-dependent.
&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;As you may have noticed by now, we&amp;#8217;ve put &lt;b&gt;a lot&lt;/b&gt; of work into making sure that deployment is dead-easy. This is only possible if Passenger has knowledge about the frameworks themselves. We have a tight schedule and we only have 2 developers working on Passenger. Rails is more popular so it has more priority. We&amp;#8217;re working around the clock to get this thing released.&lt;/p&gt;
&lt;p&gt;Or we can get rid of the autodetection/preloading logic and just provide generic configuration options. But would you really want that? By no means should we &lt;b&gt;force&lt;/b&gt; the system administrator to configure things. By default, stuff should Just Work(tm) out-of-the-box.&lt;/p&gt;
&lt;p&gt;Hope this clears things up.&lt;/p&gt;</description>
	<pubDate>Thu, 27 Mar 2008 11:11:48 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: What’s the story morning glory?</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/03/26/what%e2%80%99s-the-story-morning-glory/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/03/26/what%e2%80%99s-the-story-morning-glory/</link>
	<description>&lt;p&gt;Thought I&amp;#8217;d give you guys a little update on where we currently stand (yeah, we&amp;#8217;re still alive ;)). As you may have already know, we&amp;#8217;ve announced &lt;a href=&quot;http://www.modrails.com&quot;&gt;Phusion Passenger (a.k.a. mod_rails)&lt;/a&gt; last week and the reaction has been overwhelmingly positive!&lt;/p&gt;
&lt;p&gt;Our beta testers now not only include several of the Ruby on Rails core team, but also some of the largest Ruby on Rails webhosts you may know of. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:D&quot; class=&quot;wp-smiley&quot; /&gt; Needless to say, we&amp;#8217;re very thrilled about this, and in particular, we&amp;#8217;d like to thank &lt;a href=&quot;http://m.onkey.org&quot;&gt;Pratik Naik&lt;/a&gt;, &lt;a href=&quot;http://www.loudthinking.com&quot; target=&quot;_blank&quot;&gt;David Heinemeier Hansson&lt;/a&gt; and &lt;a href=&quot;http://www.derekperez.com&quot; target=&quot;_blank&quot;&gt;Derek Perez&lt;/a&gt; for their insightful feedback and support. Also, we&amp;#8217;d like to thank community members such as &lt;a href=&quot;http://luckysneaks.com&quot; target=&quot;_blank&quot;&gt;Russel Norris&lt;/a&gt; for keeping the conversations fun. With this kind of support, we&amp;#8217;re convinced of the quality of Passenger, since a lot of love has gone into making this.&lt;/p&gt;
&lt;p&gt;Again, we&amp;#8217;d like to express our gratitude to all for supporting us on this. It&amp;#8217;s important to note that for an open source project, it&amp;#8217;s things like these that keep developers like us going on.&lt;/p&gt;
&lt;p&gt;And while we&amp;#8217;re on the subject of &amp;#8216;going on&amp;#8217;: we&amp;#8217;ve been working around the clock the past few days to get things done as fast as we can. While Passenger is nearing completion and its website still needs a bit of work, it still remains uncertain if we&amp;#8217;re able to obtain a preview/announcement slot at &lt;a href=&quot;http://www.railsconf.org&quot; target=&quot;_blank&quot;&gt;Railsconf&lt;/a&gt; . We&amp;#8217;d like to let you guys know however, that we&amp;#8217;re putting a lot of effort into making this happen, since we really believe that Passenger has the potential to set of a revolution in the Rubyverse by possibly allowing more people to enjoy Ruby on Rails.&lt;/p&gt;
&lt;p&gt;For now we ask you for your patience and we&amp;#8217;ll try to keep you guys posted on a regular basis regarding our activity.&lt;/p&gt;
&lt;p&gt;With kind regards we are,&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://izumi.plan99.net/blog&quot; target=&quot;_blank&quot;&gt;Hongli Lai&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://ninh.nl&quot; target=&quot;_blank&quot;&gt;Ninh Bui&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- &lt;a href=&quot;http://www.phusion.nl&quot; target=&quot;_blank&quot;&gt;Phusion.nl &lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 26 Mar 2008 20:55:54 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Making PStore reaaaally fast (and stable)</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/03/26/making-pstore-reaaaally-fast/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/03/26/making-pstore-reaaaally-fast/</link>
	<description>&lt;p&gt;PStore is a library in Ruby that &amp;#8220;implements a file based persistance mechanism based on a Hash&amp;#8221;. Ruby on Rails up until version 1.2 uses PStore as the default mechanism for storing sessions. But it&amp;#8217;s pretty well-known that PStore &amp;#8220;sucks&amp;#8221;: people say that it&amp;#8217;s slow, causes file corruptions, etc. This is one of the reasons why Rails 2.0 uses the &lt;a href=&quot;http://izumi.plan99.net/blog/index.php/2007/11/25/rails-20-cookie-session-store-and-security/&quot;&gt;cookie session store&lt;/a&gt; by default: it&amp;#8217;s faster and needs less maintenance at the cost of a few (easy-to-avoid) caveats.&lt;/p&gt;
&lt;p&gt;If you look at the &lt;a href=&quot;http://mongrel.rubyforge.org/wiki/FAQ&quot;&gt;Mongrel FAQ&lt;/a&gt;, then you&amp;#8217;ll see that 3 items are devoted to telling you that PStore is the work of satan and that any sane web developer should ritually burn it. But this particular sentence caught my eye:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;#8220;Other things that can cause big pauses are:&lt;br /&gt;
- &amp;#8230;&lt;br /&gt;
- Locking files wrong. Multiple processes locking files is a delicate thing to do. &amp;#8220;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Locking files wrong? How can that possibly be? File locking, just like mutex locking, isn&amp;#8217;t really rocket science.&lt;/p&gt;
&lt;p&gt;Note that PStore&amp;#8217;s RDoc advertises itself as transactional:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;#8220;# The transactional behavior ensures that any changes succeed or fail together.&lt;br /&gt;
# This can be used to ensure that the data store is not left in a transitory&lt;br /&gt;
# state, where some values were upated but others were not.&amp;#8221;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I decided to take a look at its source code. What possibly could have gone wrong?&lt;/p&gt;
&lt;p&gt;Well, I&amp;#8217;m not sure what is wrong with it, but the relevant code, PStore#transaction, is a bit messy. I had a hard figuring out what it is exactly doing and why, but I figured that it does these things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It locks the file.&lt;/li&gt;
&lt;li&gt;It reads and unmarshals the file.&lt;/li&gt;
&lt;li&gt;It generates an MD5 checksum of the file.&lt;/li&gt;
&lt;li&gt;It runs the transaction block, then generates an MD5 checksum of the new contents of the file. The file is only written to if the MD5 checksum or the size of the new content doesn&amp;#8217;t match that of the original file.&lt;/li&gt;
&lt;li&gt;It writes new data to a temp file, then renames that to the original file (or at least, I &lt;em&gt;think&lt;/em&gt; that&amp;#8217;s what it does; it seems to use 2 temp files files). File renames are atomic on Unix but not Windows. This is why on Windows, one needs to implement &lt;a href=&quot;http://blogs.msdn.com/adioltean/archive/2005/12/28/507866.aspx&quot;&gt;file recovery&lt;/a&gt; as well. PStore &lt;em&gt;seems&lt;/em&gt; to have some code for recovery, but it&amp;#8217;s unclear how well that works. It doesn&amp;#8217;t match the algorithm given on MSDN.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&amp;#8217;s not clear whether PStore has locked everything correctly. Oh, and PStore isn&amp;#8217;t thread-safe (though it is reentrant).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PStore is usually used for writing small amounts of data, so calculating an MD5 is definitely not worth it - just write the file already!&lt;/li&gt;
&lt;li&gt;Writing to a temp file ensures atomicity on Unix, but it adds another system call, and system calls are expensive. If one is able to open the file for writing-and-appending, then writing to it shouldn&amp;#8217;t raise any errors except in rare conditions, such as out-of-disk-space conditions or hardware errors. Furthermore, I&amp;#8217;ve never seen anybody using PStore for anything other than for session data and other not-so-important stuff, so performance is more important.&lt;/li&gt;
&lt;li&gt;Aah, Windows&amp;#8230;. All the recovery code just to work around the fact that Windows doesn&amp;#8217;t support atomic file renames, cause a lot of performance loss.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I rewrote PStore. The code is now easier to read and is faster. And as far as I know, everything is locked correctly so there shouldn&amp;#8217;t be any concurrent issues.&lt;/p&gt;
&lt;p&gt;By default, it doesn&amp;#8217;t try as hard to ensure file integrity because harddisk I/O errors are very rare, but if file integrity is really an issue, then you can set &lt;code&gt;pstore.ultra_safe_transactions = true&lt;/code&gt; to enable it. This option only has effect on Unix though: as of now, I haven&amp;#8217;t bothered writing complex recovery code for Windows.&lt;/p&gt;
&lt;p&gt;This is the benchmark program that I used:&lt;br /&gt;
&lt;a href=&quot;http://pastebin.com/f163702f2&quot;&gt;http://pastie.org/170997&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The results are as follows:&lt;br /&gt;
&lt;a href=&quot;http://izumi.plan99.net/blog/wp-content/uploads/2008/03/benchmark.png&quot; title=&quot;benchmark.png&quot;&gt;&lt;img src=&quot;http://izumi.plan99.net/blog/wp-content/uploads/2008/03/benchmark.png&quot; alt=&quot;benchmark.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As you can see, PStore has become 2 times of even 3 times faster, depending on whether is ultra_safe_transactions is enabled! But let&amp;#8217;s see what kind of effect it has on a dummy Rails 2.0 app that uses the PStore session store:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dummy Rails 2.0 app, using original PStore library: 170.22 requests/sec&lt;/li&gt;
&lt;li&gt;Dummy Rails 2.0 app, using my PStore library: 196.72 requests/sec&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A small performance increase. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; (Though the cookie session store is still faster: 221.74 requests/sec.)&lt;/p&gt;
&lt;p&gt;You can download it here:&lt;br /&gt;
&lt;a href=&quot;http://pastebin.com/f163702f2&quot;&gt;http://pastebin.com/f163702f2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you want your Rails app to make use of it, simply save it as &amp;#8220;lib/pstore.rb&amp;#8221;. For maximum stability, Rails&amp;#8217;s PStore handler should be modified to ignore any errors encountered during unmarshalling.&lt;/p&gt;
&lt;p&gt;One of these days I&amp;#8217;ll send a patch to ruby-core so that this can be merged back upstream. But for now &lt;a href=&quot;http://www.modrails.com/&quot;&gt;Passenger (a.k.a. mod_rails)&lt;/a&gt; has priority.&lt;/p&gt;</description>
	<pubDate>Wed, 26 Mar 2008 18:04:08 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Rails deployment a solved problem? Just upload &amp; it works?</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/03/20/rails-deployment-a-solved-problem-just-upload-it-works/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/03/20/rails-deployment-a-solved-problem-just-upload-it-works/</link>
	<description>&lt;p&gt;A video says more than a thousand words, so just click on the video link below. &lt;img src=&quot;http://izumi.plan99.net/blog/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.modrails.com/&quot;&gt;http://www.modrails.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.modrails.com/&quot;&gt;&lt;img src=&quot;http://izumi.plan99.net/blog/wp-content/uploads/2008/03/passengerscreencastpreview.jpg&quot; alt=&quot;passengerscreencastpreview.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Is this for real?&lt;/h2&gt;
&lt;p&gt;Yes people, this is real! We at &lt;a href=&quot;http://www.phusion.nl/&quot;&gt;Phusion&lt;/a&gt; have been developing this for a while now, and it&amp;#8217;s almost done. Currently we&amp;#8217;re in private beta testing phase. Our beta testers include several &lt;b&gt;Ruby on Rails core developers&lt;/b&gt;, and so far the feedback from our testers is overwhelmingly positive.&lt;/p&gt;
&lt;p&gt;Stay tuned for more news!&lt;/p&gt;</description>
	<pubDate>Thu, 20 Mar 2008 20:55:12 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Memory usage comparison: Rails 1.2.6 vs 2.0.2</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/03/19/memory-usage-comparison-rails-126-vs-202/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/03/19/memory-usage-comparison-rails-126-vs-202/</link>
	<description>&lt;div&gt;
&lt;div&gt;Featured post&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;http://izumi.plan99.net/blog/index.php/2008/03/20/rails-deployment-a-solved-problem-just-upload-it-works/&quot;&gt;&lt;img src=&quot;http://izumi.plan99.net/blog/wp-content/uploads/2008/03/passengerscreencastpreview-small.jpg&quot; alt=&quot;passengerscreencastpreview-small.jpg&quot; /&gt;&lt;/a&gt;
&lt;div&gt;&lt;a href=&quot;http://izumi.plan99.net/blog/index.php/2008/03/20/rails-deployment-a-solved-problem-just-upload-it-works/&quot;&gt;Is Rails deployment now a solved problem? Has it become as easy as just uploading files, and it works?&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;I &lt;a href=&quot;http://izumi.plan99.net/blog/index.php/2008/03/18/performance-comparison-rails-126-vs-202/&quot;&gt;benchmarked Rails 1.2 vs 2.0&lt;/a&gt; in my last blog post, and Rails 2.0 turned out to be 30%-50% faster. Then Eric Allam said:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;#8220;Hmm, another benchmark that completely ignores memory use and memory usage growth.&amp;#8221;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Okay, let&amp;#8217;s give it a try.&lt;/p&gt;
&lt;h2&gt;Wait, hold your horses!&lt;/h2&gt;
&lt;p&gt;When measuring memory, people usually measure the wrong thing. There are 3 things that one can measure:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;b&gt;1. Virtual memory size&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;All modern operating systems - probably including yours - use virtual memory. The memory that an application sees is not the same as your physical memory. Even if you only have 256 MB RAM installed, all applications on your system still see 4 GB RAM, and can use more than 256 MB RAM (on x86, that is). See &lt;a href=&quot;http://en.wikipedia.org/wiki/Virtual_memory&quot;&gt;the Wikipedia entry&lt;/a&gt;.&lt;/dd&gt;&lt;/dl&gt;
&lt;p&gt;Even if you only have 256 MB RAM, the virtual memory size reported by a process can still be 4 GB! This is because processes can map files, hardware and other resources into its memory address space, without really loading them into physical memory. This is complicated by the fact that processes can share memory with each other. The VM size is quite meaningless when measuring real memory usage.&lt;/p&gt;
&lt;dt&gt;&lt;b&gt;2. Resident Set Size (RSS)&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;This is the amount of the process&amp;#8217;s memory that&amp;#8217;s currently in physical memory. At first, this seems to be a good candidate for measuring real memory usage. But parts of the process may be swapped to the hard disk. The RSS also seems to include things like shared memory, which we clearly don&amp;#8217;t want to measure. It&amp;#8217;s unclear whether the RSS also contains kernel buffers and caches, which we also don&amp;#8217;t want to measure.&lt;/dd&gt;
&lt;dt&gt;&lt;b&gt;3. Private dirty memory&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;This is the best measurement. It does not count shared memory. &lt;a href=&quot;http://bmaurer.blogspot.com/2006/05/breaking-news-g-s-m-now-gives-useful.html&quot;&gt;This blog post&lt;/a&gt; explains it all. The private dirty memory is easy to measure on Linux (I&amp;#8217;m using Ubuntu 7.10), but I&amp;#8217;m not sure how to do it on other operating systems.&lt;/dd&gt;
&lt;dt&gt;&lt;b&gt;4. Ruby heap information&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;3 is usually the best measurement - but not for Ruby! In the past I&amp;#8217;ve &lt;a href=&quot;http://izumi.plan99.net/blog/index.php/2007/10/12/how-the-ruby-heap-is-implemented/&quot;&gt;explained how Ruby&amp;#8217;s heap is implemented.&lt;/a&gt; Ruby allocates several heaps, and the heaps contain equally-sized slots in which Ruby objects are stored. If we measure the private dirty memory (that is, assuming &lt;code&gt;fork()&lt;/code&gt; is never called), we&amp;#8217;ll be effectively measuring the total heap size, including any free heap slots. Free heap slots are reused by Ruby, so they really shouldn&amp;#8217;t be counted.&lt;/dd&gt;
&lt;p&gt;We want to count the number of used heap slots. Usually, there&amp;#8217;s no way to do this. But I maintain a private Ruby branch (which will be released soon) with statistics information. We&amp;#8217;ll use that for memory measurement. (My GC patch also provides statistics information, though the version I&amp;#8217;m working on provides more accurate statistics.)&lt;/p&gt;

&lt;p&gt;People interested in details should read a good book about operating systems. I recommend &lt;a href=&quot;http://codex.cs.yale.edu/avi/os-book/os7/&quot;&gt;&amp;#8220;Operating System Concepts&amp;#8221; by Silberschatz et al&lt;/a&gt;. My &amp;#8220;Operating Systems&amp;#8221; classes professor has &lt;a href=&quot;http://wwwhome.cs.utwente.nl/~schoute/211045/college6_memorymanagement.pdf&quot;&gt;Dutch slides&lt;/a&gt; on the subject.&lt;/p&gt;
&lt;h2&gt;The measurement&lt;/h2&gt;
&lt;p&gt;After a cold start with Mongrel 1.1.3, the private dirty memories were as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rails 1.2.6: 25.5 MB&lt;/li&gt;
&lt;li&gt;Rails 2.0.2: 19.7 MB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nice! A 6 MB memory reduction after a cold boot!&lt;/p&gt;
&lt;p&gt;Though, as I&amp;#8217;ve said earlier, these numbers don&amp;#8217;t really mean much. The application code (i.e. controller and model code) haven&amp;#8217;t been loaded into memory yet. And Ruby doesn&amp;#8217;t garbage collect until its heap is full. So let&amp;#8217;s find out what happens after 3000 requests and a garbage collection run. I added these actions to PostsController:&lt;/p&gt;
&lt;pre&gt;def gc
    headers[&quot;Content-Type&quot;] = &quot;text/plain&quot;
    GC.start
    render :text =&gt; ObjectSpace.statistics
end&lt;/pre&gt;
&lt;p&gt;And this route:&lt;/p&gt;
&lt;pre&gt;map.connect '/gc', :controller =&gt; &quot;posts&quot;, :action =&gt; 'gc'&lt;/pre&gt;
&lt;p&gt;Then I ran, for both apps:&lt;/p&gt;
&lt;pre&gt;ab -n 3000 http://localhost:3000/
links http://localhost:3000/gc&lt;/pre&gt;
&lt;p&gt;The memory usages were:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;b&gt;Rails 1.2.6&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;Private dirty memory:28.1 MB&lt;br /&gt;
Total heap size: 14,702 KB&lt;br /&gt;
Free heap space: 7,789 KB&lt;/dd&gt;&lt;/dl&gt;
&lt;dt&gt;&lt;b&gt;Rails 2.0.2&lt;/b&gt;&lt;/dt&gt;
&lt;dd&gt;Private dirty memory: 20.9 MB&lt;br /&gt;
Total heap size: 8,059 KB&lt;br /&gt;
Free heap space: 2,098 KB&lt;/dd&gt;

&lt;p&gt;Nice! I didn&amp;#8217;t expect this, but apparently Rails 2.0 uses a lot less memory!&lt;/p&gt;
&lt;p&gt;[EDIT: Some people have contributed a chart. Thanks.]&lt;br /&gt;
&lt;img src=&quot;http://izumi.plan99.net/blog/wp-content/uploads/2008/03/chart.png&quot; alt=&quot;chart.png&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 19 Mar 2008 10:08:27 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Performance comparison: Rails 1.2.6 vs 2.0.2</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/03/18/performance-comparison-rails-126-vs-202/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/03/18/performance-comparison-rails-126-vs-202/</link>
	<description>&lt;div&gt;
&lt;div&gt;Featured post&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;http://izumi.plan99.net/blog/index.php/2008/03/20/rails-deployment-a-solved-problem-just-upload-it-works/&quot;&gt;&lt;img src=&quot;http://izumi.plan99.net/blog/wp-content/uploads/2008/03/passengerscreencastpreview-small.jpg&quot; alt=&quot;passengerscreencastpreview-small.jpg&quot; /&gt;&lt;/a&gt;
&lt;div&gt;&lt;a href=&quot;http://izumi.plan99.net/blog/index.php/2008/03/20/rails-deployment-a-solved-problem-just-upload-it-works/&quot;&gt;Is Rails deployment now a solved problem? Has it become as easy as just uploading files, and it works?&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;There&amp;#8217;s still a lot of misinformation about Rails on the Internet. People are still claiming that Rails doesn&amp;#8217;t scale, is too slow, etc. Rails 2.0 has been released for a while now, and a year ago someone blished a benchmark, in which it is claimed that Rails edge (what is now 2.0) is slower than 1.2. I&amp;#8217;ve decided to benchmark Rails 1.2 and 2.0.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve written two dummy applications, one for 1.2 and one for 2.0. The reason why I&amp;#8217;m not just running the same app under 2.0 is because Rails 2.0 introduced a new cookie session store, among other things. It is claimed that this session store is much faster than the old default PStore cookie store.&lt;/p&gt;
&lt;p&gt;So first I create a Rails 2.0 application:&lt;/p&gt;
&lt;pre&gt;mkdir bench
rails 2.0
cd 2.0
./script/generate scaffold Post title:string content:text created_on:timestamp updated_on:timestamp
rake db:migrate RAILS_ENV=production&lt;/pre&gt;
&lt;p&gt;Note that scaffolding in Rails 2.0 is no longer dynamic. The scaffold generator now generates a database schema and some static HTML and code. This is equivalent to Rails 1.2&amp;#8217;s scaffold_resource.&lt;/p&gt;
&lt;p&gt;I also modified routes.rb so that the root URL is mapped to the &amp;#8216;posts&amp;#8217; controller. And of course, I delete &amp;#8216;public/index.html&amp;#8217;.&lt;/p&gt;
&lt;p&gt;Next, I create a Rails 1.2 application:&lt;/p&gt;
&lt;pre&gt;cd ..
rails _1.2.6_ 1.2            # This is a nice RubyGems trick. It allows me to specify which Rails version I want to use.
cd 1.2
./script/generate scaffold_resource Post title:string content:text created_on:timestamp updated_on:timestamp
cp ../2.0/config/database.yml config/    # We want to use SQLite, just like Rails 2.0.
rake db:migrate RAILS_ENV=production&lt;/pre&gt;
&lt;p&gt;I also modified routes.rb so that the root URL is mapped to the &amp;#8216;posts&amp;#8217; controller, and deleted &amp;#8216;public/index.html&amp;#8217;.&lt;/p&gt;
&lt;p&gt;I ran both applications in Mongrel (with the &amp;#8216;production&amp;#8217; environment). The results of &amp;#8216;ab -n 5000 http://localhost:3000/&amp;#8217; are as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rails 1.2.6: 141.19 requests/sec&lt;/li&gt;
&lt;li&gt;Rails 2.0.2: 214.76 requests/sec&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wow, what a difference! Rails 2.0 is 50% faster in a dummy application!&lt;/p&gt;
&lt;p&gt;In Rails 1.2, a lot of time is spent in the session store. Let&amp;#8217;s see what happens if we specify &amp;#8220;session :off&amp;#8221; in both applications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rails 1.2.6: 189.51 requests/sec&lt;/li&gt;
&lt;li&gt;Rails 2.0.2: 246.69 requests/sec&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wow! Even with sessions off, Rails 2.0 is still 30% faster! So the cookie session store isn&amp;#8217;t the only thing responsible for the performance improvement!&lt;/p&gt;
&lt;p&gt;Edge Rails has even more performance improvements. Things are definitely going the right direction.&lt;/p&gt;</description>
	<pubDate>Tue, 18 Mar 2008 18:52:14 +0000</pubDate>
</item>
<item>
	<title>Mike Hearn: moving to wordpress.com</title>
	<guid>http://mikehearn.wordpress.com/2008/03/12/moving-to-wordpresscom/</guid>
	<link>http://mikehearn.wordpress.com/2008/03/12/moving-to-wordpresscom/</link>
	<description>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;I moved my blog to mikehearn.wordpress.com - I got tired of having to maintain it myself. If you notice any problems let me know.&lt;/p&gt;
&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/categories/mikehearn.wordpress.com/113/&quot; /&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/tags/mikehearn.wordpress.com/113/&quot; /&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/mikehearn.wordpress.com/113/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mikehearn.wordpress.com/113/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/mikehearn.wordpress.com/113/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mikehearn.wordpress.com/113/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/mikehearn.wordpress.com/113/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mikehearn.wordpress.com/113/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/mikehearn.wordpress.com/113/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mikehearn.wordpress.com/113/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/mikehearn.wordpress.com/113/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mikehearn.wordpress.com/113/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mikehearn.wordpress.com&amp;amp;blog=180663&amp;amp;post=113&amp;amp;subd=mikehearn&amp;amp;ref=&amp;amp;feed=1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Wed, 12 Mar 2008 18:26:44 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: RSpec patches</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/02/29/rspec-patches/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/02/29/rspec-patches/</link>
	<description>&lt;p&gt;I totally fell in love with &lt;a href=&quot;http://rspec.info/&quot;&gt;RSpec&lt;/a&gt;. Although I&amp;#8217;m not really into BDD, I&amp;#8217;ve found that RSpec makes my  tests easier to read and easier to organize.&lt;/p&gt;
&lt;p&gt;But their website really is a problem. Its navigation is pretty confusing. At first, I didn&amp;#8217;t know that there are 3 more levels of pages under &amp;#8220;Documentation&amp;#8221; - I thought that the first page I see under &amp;#8220;Documentation&amp;#8221; is the only documentation available. This is because the navigation bar changes in ways that I think people would typically not expect. And their RDoc documentation looks horrible because it uses the default RDoc template.&lt;/p&gt;
&lt;p&gt;Because they&amp;#8217;re experimenting with Git since today, I decided to check out their sources and see whether I can contribute. I&amp;#8217;ve redesigned their menu bar, and although it&amp;#8217;s not perfect, it should be better than it currently is. Compare &lt;a href=&quot;http://rspec.info/documentation/rails/writing/views.html&quot;&gt;the current navigation&lt;/a&gt; with &lt;a href=&quot;http://rspec.lighthouseapp.com/attachments/13495/rspec-website-navigation.jpg&quot;&gt;my redesign&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve also submitted a patch for generating the RDoc documentation with my &amp;#8220;Horo&amp;#8221; RDoc template (which is based on the &lt;a href=&quot;http://weblog.jamisbuck.org/2005/4/8/rdoc-template&quot;&gt;Jamis RDoc template&lt;/a&gt;). A sample can be found at: &lt;a href=&quot;http://izumi.plan99.net/rspec-horo/&quot;&gt;http://izumi.plan99.net/rspec-horo/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hopefully these patches will get accepted.&lt;/p&gt;</description>
	<pubDate>Thu, 28 Feb 2008 23:39:28 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Using custom RDoc templates in Ruby gems</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/02/25/using-custom-rdoc-templates-in-ruby-gems/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/02/25/using-custom-rdoc-templates-in-ruby-gems/</link>
	<description>&lt;p&gt;I think that the &lt;a href=&quot;http://rspec.info/rdoc/&quot;&gt;default RDoc template&lt;/a&gt; looks horrible. The colors are not good at all, and the top frames waste a lot of space. On the other hand, &lt;a href=&quot;http://weblog.jamisbuck.org/2005/4/8/rdoc-template&quot;&gt;the Jamis RDoc template&lt;/a&gt; looks a lot better.&lt;/p&gt;
&lt;p&gt;Today I ran into a problem: RubyGems can generate RDoc documentation for projects, but how do I force it to use the right template? The Jamis template installation instructions don&amp;#8217;t work with the Rake RubyGems task. Eventually I found out that I had to do this:&lt;/p&gt;
&lt;pre&gt;Rake::RDocTask.new do |rd|
	...
	rd.template = &quot;./doc/template/jamis&quot;
	...
end&lt;/pre&gt;
&lt;p&gt;And put &amp;#8216;jamis.rb&amp;#8217; into the folder ./doc/template/&lt;/p&gt;</description>
	<pubDate>Mon, 25 Feb 2008 19:40:21 +0000</pubDate>
</item>
<item>
	<title>Mike Hearn: singularity: part 3</title>
	<guid>http://plan99.net/~mike/blog/?p=113</guid>
	<link>http://mikehearn.wordpress.com/2008/02/12/singularity-part-3/</link>
	<description>&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;Last time, I talked about the basics of Singularity: SIPs, manifests, connections, and software isolation. Let&amp;#8217;s have a look at how this applies to driver development.&lt;/p&gt;
&lt;p&gt;Drivers are a Big Deal for us, because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;About 85% of all Windows crashes are caused by bad drivers&lt;/li&gt;
&lt;li&gt;An analysis of Linux showed that driver code is 7 times more likely to contain bugs than the rest of the kernel&lt;/li&gt;
&lt;li&gt;When drivers crash, they take the whole system with them, thus losing the users work and - by extension - users trust.&lt;/li&gt;
&lt;li&gt;When drivers contain bugs, they can sometimes be used for privilege escalation. It only takes one privilege escalation for the bad guys to win.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So getting drivers right would be a huge win, both for reliability, and for building a foundation on which we can get security right too.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;drivers in singularity&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Because Singularity is a type system based micro-kernel, a driver is simply a set of Sing# classes (Sing# is C# with extra bits), shipped as verifiable MSIL bytecode images. It runs as a SIP, like any other program does. Obviously, using C# instantly solves a large class of common bugs - pretty much any exploit with &amp;#8220;overflow&amp;#8221; in its name is solved by using these languages.&lt;/p&gt;
&lt;p&gt;You can&amp;#8217;t represent the specialized instructions needed to control hardware in safe MSIL, so we need a workaround. This comes in the form of an unsafe DLL which provides objects abstracting the hardware control instructions. This DLL (Singularity.DriverRuntime) is a part of what Microsoft Research call the &amp;#8220;trusted computing base&amp;#8221;, but that makes it sound like it&amp;#8217;s to do with Palladium and DRM, which it isn&amp;#8217;t. It&amp;#8217;s easier to think of this DLL just as logically part of the kernel, even though it doesn&amp;#8217;t run in the context of the main kernel program. These classes have names like IoPortRange, IoIrqRange and so on, and provide a simple OO interface to programming hardware.&lt;/p&gt;
&lt;p&gt;Singularity won&amp;#8217;t let you construct objects of these types yourself, you have to use a set of special static method calls. And you can&amp;#8217;t invoke them directly either. It seems we&amp;#8217;re stuck - how do we get a reference to such an object, if we can&amp;#8217;t construct them ourselves? And what&amp;#8217;s the point of being so awkward?&lt;/p&gt;
&lt;p&gt;The answer is that Singularity requires you to annotate your code with metadata, describing what hardware your driver is for and what resources it needs. This is done in the usual .NET fashion, with attributes that decorate your classes and fields. At install time, this metadata is used to build an XML manifest, describing what resources your code needs, and is input to a &lt;i&gt;compile time transform&lt;/i&gt;, which fills out an empty method you provide. This transform is itself a part of the kernel, and is applied when you install the driver - it is what adds the protected call to the hardware abstraction DLL. &lt;/p&gt;
&lt;p&gt;In this way, Singularity ensures that it has accurate declarative metadata on what exactly the driver needs. Because you can&amp;#8217;t get hold of the relevant objects and thus program the hardware unless you define accurate metadata (and this is enforced by the system), the metadata is guaranteed to be accurate. That, in turn, makes it easy to solve problems like avoiding driver conflicts and figuring out the order in which drivers should be loaded at bootup.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;the hole in the plan&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;This would all be fine and dandy, if it weren&amp;#8217;t for The Catch (why is there always a catch?). The catch is this - any driver that can access a DMA capable device can subvert the type system by overwriting arbitrary areas of physical memory.&lt;/p&gt;
&lt;p&gt;Direct Memory Access is an optimisation that lets hardware devices directly write data into RAM, bypassing the CPU. It&amp;#8217;s very useful and speeds things up a lot, especially when moving lots of data around like with graphics cards, hard disks, network cards and so on. Unfortunately, DMA not only bypasses the CPU but also the MMU, thus a driver that can control a DMA capable piece of hardware can control the contents of memory. In a regular operating system that doesn&amp;#8217;t matter, because such drivers are running in kernel mode anyway and are fully trusted. But for Singularity it&amp;#8217;s a problem.&lt;/p&gt;
&lt;p&gt;Fortunately for us, DRM comes to the rescue! Yes, I&amp;#8217;m serious. Newer CPU architectures being developed by Intel and AMD feature something called, appropriately enough, an IOMMU. This does for hardware devices what the regular MMU does for the CPU - regulates memory access by mapping DMA read/writes through a set of page tables. By configuring the IOMMU, you can stop hardware from fiddling with memory. This feature was originally intended to stop people breaking into kernel space by plugging in physical pieces of hardware, which apart from the obvious downsides for DRM manufacturers can also be used to do things like unlock screens. And of course it protects computers from buggy hardware, which is not such an uncommon thing.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s also mighty handy for us, because it closes the hole that would mean DMA-aware drivers could break out of their type-verified jail.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;how it helps security&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Before you can make something secure, you need a threat model. What exactly do we want to stop?&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m going to skip over that here and mumble something about stopping malware and viruses. It&amp;#8217;s vague and not that useful, but it&amp;#8217;ll help illustrate these examples.&lt;/p&gt;
&lt;p&gt;Back in 2001 the idea of Microsoft restricting what software you could put on your system seemed grotesque. They were just coming to the tail end of the the browser wars, broadband was just beginning its rollout and the general problem of botnets had not yet reared its ugly head. The potential for abuse seemed way too high, the benefits way too low. Despite that, drivers were known to be such huge reliability problems that a signing program was instigated &amp;#8230;. Microsoft would provide you with a unit test suite, and if it passed, that suite would sign the driver for you. The test suite checked for many common problems and didn&amp;#8217;t require anybody to hand over their code to Microsoft. Seemed like a good idea, right?&lt;/p&gt;
&lt;p&gt;Well, of course it was controversial. Worse, it didn&amp;#8217;t necessarily work. Rather than pass the tests, &lt;a title=&quot;some manufacturers cheated&quot; href=&quot;http://blogs.msdn.com/oldnewthing/archive/2004/03/05/84469.aspx&quot; id=&quot;l&quot;&gt;some manufacturers cheated&lt;/a&gt;. Rather than risk a schedule slip, or pay the $250 verification cost, some moved the mouse and clicked OK on the unsigned driver warning for you. D&amp;#8217;oh.&lt;/p&gt;
&lt;p&gt;If we&amp;#8217;re willing to be a bit despotic and require signing that cannot be disabled for some things, can we do better? Yes, but it would suck to require &lt;i&gt;every&lt;/i&gt; driver to be signed. We can avoid this in the most common cases.&lt;/p&gt;
&lt;p&gt;For instance, thanks to the declarative metadata, we can now statically inspect a driver and say, well, gee, this driver will only be activated for devices of class &amp;#8220;sound card&amp;#8221;, and it doesn&amp;#8217;t use DMA, and it doesn&amp;#8217;t read or write any files (we know this because we can statically verify that it can&amp;#8217;t get any connections to the filesystem server). What can this driver do, except mess up the sound card? Not a whole lot, actually. It could still hose the box by misprogramming the hardware, but such bugs are rare. But it can&amp;#8217;t blue-screen us, because it&amp;#8217;s not running in the actual kernel. If it crashes, the worst that happens is audio is interrupted until the driver restarts and programs re-establish their connections (assuming we write software to handle driver crashes of course - more on that later).&lt;/p&gt;
&lt;p&gt;Generally, we can define some set of privileges (in Singularity this is equivalent to defining some set of connections a SIP can access) which might be dangerous, and only require signing for those drivers. What might trigger such a requirement? Accessing system files or configuration is an obvious case. Being a network driver is another case (how to DoS a target without falling foul of the firewall? Become a network driver). Fortunately, i&lt;br /&gt;
t&amp;#8217;s rare that drivers need access to anything other than the hardware and their own configuration data, and network drivers are typically uninteresting enough that the default drivers suffice for most people. Thus the majority of drivers can be safely written, distributed and installed without Microsoft ever needing to be involved whilst preserving the security of the system.&lt;/p&gt;
&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/categories/mikehearn.wordpress.com/112/&quot; /&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/tags/mikehearn.wordpress.com/112/&quot; /&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/mikehearn.wordpress.com/112/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/mikehearn.wordpress.com/112/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/mikehearn.wordpress.com/112/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/mikehearn.wordpress.com/112/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/mikehearn.wordpress.com/112/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/mikehearn.wordpress.com/112/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/mikehearn.wordpress.com/112/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/mikehearn.wordpress.com/112/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/mikehearn.wordpress.com/112/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/mikehearn.wordpress.com/112/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=mikehearn.wordpress.com&amp;amp;blog=180663&amp;amp;post=112&amp;amp;subd=mikehearn&amp;amp;ref=&amp;amp;feed=1&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Tue, 12 Feb 2008 19:45:06 +0000</pubDate>
</item>
<item>
	<title>Isak Savo: Sweet new tool</title>
	<guid>http://isak.livejournal.com/26176.html</guid>
	<link>http://isak.livejournal.com/26176.html</link>
	<description>&lt;img alt=&quot;Launchy Screenshot&quot; src=&quot;http://www.launchy.net/images/screenshot_sheep2.png&quot; /&gt;
Most experienced computer users will agree with me when I say that typing something is often quicker and easier than navigating a deep menu structure.  I hate the standard windows start menu with a passion, which means I was quite happy when I found the nice open source tool called &lt;a href=&quot;http://www.launchy.net/&quot;&gt;Launchy&lt;/a&gt;. Now just a quick &amp;lt;alt&amp;gt;+&amp;lt;space&amp;gt; away, I can search an indexed db of my launchers. That's on windows...

&lt;p&gt;On Linux, I've been using a combination of terminal (requires you to know the binary name, plus tab completion only matches beginning of strings in bash), panel launchers and the &lt;a href=&quot;http://raphael.slinckx.net/deskbar/&quot;&gt;deskbar applet&lt;/a&gt;.&lt;/p&gt; 
&lt;img alt=&quot;Deskbar Screenshot&quot; src=&quot;http://raphael.slinckx.net/deskbar/images/deskbar-applet-10.png&quot; /&gt;
&lt;p&gt;Unfortunately, the deskbar applet lacks the sex appeal of Launchy, and it's always crowded with results I seldom want (yeah, I know I can configure it and add/remove plugins and what-not, but it still lacks sex appeal ;-) ). &lt;/p&gt;

&lt;img alt=&quot;Gnome DO screenshot&quot; src=&quot;http://farm3.static.flickr.com/2065/2064071215_3a9772083d_d.jpg&quot; /&gt;&lt;p&gt;Via planet gnome the other day, I found a new player in town - &lt;a href=&quot;http://do.davebsd.com/&quot;&gt;Gnome DO&lt;/a&gt;! It's a slick little app, very similar to Launchy on Windows, but slightly on stereoids. By default, you just type something and it'll run it for you when you hit enter. But for things which has multiple actions, there's also an &quot;action&quot; section which can be reached by hitting &amp;lt;tab&amp;gt;. So if I type &lt;i&gt;&quot;movie&quot;&lt;/i&gt;, it will display an icon showing my movie folder with default action to open it in nautilus. But right now, I don't want to do that so I hit &amp;lt;tab&amp;gt; and enter &quot;terminal&quot; giving me the option to open a gnome-terminal in that folder. &lt;b&gt;Slick.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Now if someone could add SnagIt capabilities to the screenshot tool, I'd be an even happier Linux user. :-)&lt;/p&gt;</description>
	<pubDate>Mon, 28 Jan 2008 20:10:32 +0000</pubDate>
</item>
<item>
	<title>Hongli Lai: Rails deployment: wouldn't it be great if it worked like this?</title>
	<guid>http://izumi.plan99.net/blog/index.php/2008/01/27/rails-deployment-wouldnt-it-be-great-if-it-worked-like-this/</guid>
	<link>http://izumi.plan99.net/blog/index.php/2008/01/27/rails-deployment-wouldnt-it-be-great-if-it-worked-like-this/</link>
	<description>&lt;p&gt;Unless you&amp;#8217;ve been living under a rock (or if you never read Ruby on Rails blogs), you should know that there has been &lt;a href=&quot;http://blog.dreamhost.com/2008/01/07/how-ruby-on-rails-could-be-much-better/&quot;&gt;a lot&lt;/a&gt; of &lt;a href=&quot;http://www.loudthinking.com/posts/21-the-deal-with-shared-hosts&quot;&gt;complaints&lt;/a&gt; about &lt;a href=&quot;http://www.rubyinside.com/no-true-mod_ruby-is-damaging-rubys-viability-on-the-web-693.html&quot;&gt;Rails deployment&lt;/a&gt; in the past few weeks. Heck, it&amp;#8217;s &lt;a href=&quot;http://townx.org/blog/elliot/rails_shared_hosting_application_error&quot;&gt;not just the past few weeks&lt;/a&gt;, this issue has existed for far longer. Rails deployment is - so people say - too hard.&lt;/p&gt;
&lt;p&gt;The first question that appeared in my head when I read all that, is: &amp;#8220;what do they mean by &amp;#8216;hard&amp;#8217;?&amp;#8221; I read their posts more carefully. I read the comments. I also &lt;a href=&quot;http://izumi.plan99.net/blog/index.php/2008/01/14/what-is-so-hard-about-rails-deployment/&quot;&gt;asked around on my blog&lt;/a&gt; and &lt;a href=&quot;http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/ee85851025930f66/9bed5246cde66de5?lnk=gst&amp;#038;q=hard+about+deployment#9bed5246cde66de5&quot;&gt;the Ruby on Rails mailing list&lt;/a&gt;. As with most questions in life, there is not a single answer, but multiple.&lt;/p&gt;
&lt;h2&gt;How is Rails deployment typically done?&lt;/h2&gt;
&lt;p&gt;Before we dive into the answers, one should understand how Rails deployment currently works.&lt;/p&gt;
&lt;p&gt;With PHP, it is straightforward:
&lt;ol&gt;
&lt;li&gt;Upload the source files to a directory accessible by the web server.&lt;/li&gt;
&lt;li&gt;There is no step 2.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(I&amp;#8217;ve conveniently left out the steps in which the user must edit config files and setup the database; this is application-dependent and is not a core part of PHP.)&lt;br /&gt;
PHP web servers typically run Apache, which has mod_php. The number of concurrent requests that a PHP application can handle, is equal to the number of worker threads/processes that Apache is running (see the Apache MPM documentation for more information).&lt;/p&gt;
&lt;p&gt;There are several ways to deploy Rails. The most common one at the moment is as follows:
&lt;ol&gt;
&lt;li&gt;Upload the Rails app to the web server.&lt;/li&gt;
&lt;li&gt;Configure the Mongrel application server on the web server (or configure a cluster of Mongrel, i.e. multiple Mongrel servers) and start it.&lt;/li&gt;
&lt;li&gt;Configure the web server (which is usually Lighttpd, Apache or Nginx) to proxy HTTP requests to Mongrel (or to one of the Mongrel instances in the cluster).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Since each Mongrel instance can only handle 1 HTTP request at the same time, the number of concurrent requests that your Rails application can handle, is equal to the number of Mongrel servers that you have running. This number is independent of the number of worker threads/processes that Apache is running.&lt;/p&gt;
&lt;p&gt;This is not the only way though. It is possible bypass step 2 and 3, by running the Rails application as a CGI process. Of course, nobody does this because it&amp;#8217;s insanely slow. On Dreamhost, it seems to take several seconds to load the Rails framework itself. If the web server has to start the Rails application from scratch every time there is an HTTP request, the website will grind to a halt. This is the reason why an application server is needed: it keeps the Rails application running.&lt;/p&gt;
&lt;p&gt;There is another method: running a web server that supports FastCGI. FastCGI is like CGI, but it removes the startup overhead by keeping processes persistent. Lighttpd has FastCGI support by default. I&amp;#8217;m not sure whether Nginx has FastCGI support by default, but it does have a FastCGI module. Apache has a (third party) FastCGI module as well.&lt;br /&gt;
Both Apache and Lighttpd support auto-starting FastCGI processes. That is, when an HTTP request is received, the web server will automatically start a FastCGI process if it hasn&amp;#8217;t done that already. It can start more processes (up to a specified maximum) if it notices that the current number of processes can&amp;#8217;t handle the current number of concurrent HTTP requests. It will automatically shutdown some processes after a certain idle period, to free memory. Shared hosts seem to typically use Apache with the FastCGI module.&lt;/p&gt;
&lt;p&gt;However, there are several big catches with using FastCGI method. Apache&amp;#8217;s FastCGI module has a very bad reputation. Many people have reported that it&amp;#8217;s very unstable. FastCGI itself seems to be unmaintained in the past few years.&lt;/p&gt;
&lt;h2&gt;What are the complaints about Rails deployment?&lt;/h2&gt;
&lt;p&gt;These are the most important reasons why Rails deployment is either hard or perceived to be hard:
&lt;ol&gt;
&lt;li&gt;Support on shared hosts. Rails apps don&amp;#8217;t seem to play well on shared hosts like Dreamhost. Dreamhost said that their Rails app regularly make Apache choke, and uses too much system resources. Many people who uploaded their Rails app to a shared host find out that their app either doesn&amp;#8217;t work, or is unstable.&lt;/li&gt;
&lt;li&gt;Deployment involves multiple steps. Many people seem to come from a PHP background, where they are used to the upload-and-go style of deployment. This is not possible with Rails, at least not in the same way as PHP. Setting up Mongrel is an extra step for them - they don&amp;#8217;t want to think about application servers or clusters because they don&amp;#8217;t have to with PHP.&lt;/li&gt;
&lt;li&gt;The need to do port administration if one runs Mongrel clusters. One has to remember which ports are reserved for which apps, in order to avoid conflicts in the future. As the number of hosted applications grows, this quickly becomes a serious pain in the ***.&lt;/li&gt;
&lt;li&gt;The installation of dependencies (gems). A J2EE developer pointed out that Java deployment is &amp;#8220;easy&amp;#8221; because it is the norm that all dependencies are bundled with the application itself. If a Ruby on Rails application depends on third party gems, those will have to be installed on the deployment server as well. Even though gems are easy to install (one command), the installation usually requires root privileges, something that is not always available.&lt;/li&gt;
&lt;li&gt;Perceived performance problems. It&amp;#8217;s pretty well-known that Rails is not thread-safe and thus can handle only one request at the same time. Some people think that all Rails sites can only handle one request at the same time. This is of course not true: that&amp;#8217;s the whole point of running a Mongrel cluster with multiple Mongrel instances: to be able to handle multiple concurrent requests. The number of Mongrel instances to run should be fine-tuned to the web server&amp;#8217;s load. Nevertheless, the fact the Mongrel cluster has to be manually configured, gives people the (false) impression that PHP can (architecturally) handle more concurrent requests than Rails, even though the dispatching mechanism used by mod_php is conceptually not much different.&lt;/li&gt;
&lt;li&gt;Perceived &amp;#8220;deployment risk&amp;#8221; (whatever this is supposed to mean). Someone has pointed out that, because of the need to manually configure Mongrels, the &amp;#8220;deployment risk&amp;#8221; is higher than PHP.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As you can see, there are legitimate complaints (1-4) as well as superstition (5 and 6).&lt;/p&gt;
&lt;p&gt;Point (1) is particularly interesting. Shared hosts are not able to run Mongrel clusters because they have to host so many websites. Suppose a shared hoster&amp;#8217;s web server hosts 100 websites, and suppose that the typical Rails application uses 25 MB memory. Then they&amp;#8217;ll need 2500 MB of memory if each website is reserved only 1 Mongrel instance. Ouch. So instead, shared hosts typically use Apache with FastCGI. This is the main source of stability problems that people are complaining about.&lt;/p&gt;
&lt;p&gt;A common answer to this is that shared hosts should not use Apache, but use Lighttpd instead (Nginx doesn&amp;#8217;t support auto-starting FastCGI processes so they can&amp;#8217;t use that). Dreamhost&amp;#8217;s answer to this is as follows:&lt;br /&gt;
Dreamhost has already standardized on Apache. A lot of their infrastructure depends on Apache. Switching to lighttpd is therefore non-trivial. Dreamhost also says that Apache is the defacto standard, and considers anything non-Apache as &amp;#8220;bleeding edge technology&amp;#8221;. I suspect that a lot of shared hosters are like this as well.&lt;br /&gt;
While Dreamhost&amp;#8217;s response may come over like whining, &lt;a href=&quot;http://merubyyoujane.com/past/2006/11/18/ruby-s-and-ror-s-problem-a-sysadmins-perspective/&quot;&gt;Jon Gretar&lt;/a&gt; has formulated the point perfectly:&lt;br /&gt;
&lt;blockquote&gt;&amp;#8220;Although I like using Litespeed [another web server which can run Rails with FastCGI] at home I just don&amp;#8217;t have that