<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <title>Too-biased - Home</title>
  <id>tag:blog.leetsoft.com,2010:mephisto/</id>
  <generator version="0.7.3" uri="http://mephistoblog.com">Mephisto Noh-Varr</generator>
  
  <link href="http://blog.leetsoft.com/" rel="alternate" type="text/html" />
  <updated>2010-02-03T14:34:22Z</updated>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/too-biased/xml" /><feedburner:info uri="too-biased/xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><entry xml:base="http://blog.leetsoft.com/">
    <author>
      <name>tobi</name>
    </author>
    <id>tag:blog.leetsoft.com,2010-02-03:4719</id>
    <published>2010-02-03T14:31:00Z</published>
    <updated>2010-02-03T14:34:22Z</updated>
    <link href="http://feedproxy.google.com/~r/too-biased/xml/~3/o9No-f4gWwk/shopify-100k-contest-in-nytimes" rel="alternate" type="text/html" />
    <title>Shopify &amp; 100k contest in NYTimes</title>
<content type="html">
            &lt;p&gt;&lt;a href="http://boss.blogs.nytimes.com/2010/02/02/shopify-gains-customers-with-a-competition/"&gt;&lt;img src="http://www.storecontest.com/images/graphics/contest-flow.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://boss.blogs.nytimes.com/2010/02/02/shopify-gains-customers-with-a-competition/"&gt;Article&lt;/a&gt;&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/too-biased/xml/~4/o9No-f4gWwk" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.leetsoft.com/2010/2/3/shopify-100k-contest-in-nytimes</feedburner:origLink></entry>
  <entry xml:base="http://blog.leetsoft.com/">
    <author>
      <name>tobi</name>
    </author>
    <id>tag:blog.leetsoft.com,2009-12-06:4708</id>
    <published>2009-12-06T20:00:00Z</published>
    <updated>2009-12-06T20:36:42Z</updated>
    <category term="Code" />
    <category term="clarity" />
    <category term="log" />
    <link href="http://feedproxy.google.com/~r/too-biased/xml/~3/mwo3t1s2G_4/clarity-in-log-files" rel="alternate" type="text/html" />
    <title>Clarity in log files.</title>
<content type="html">
            &lt;p&gt;&lt;strong&gt;Log files&lt;/strong&gt; are one of the most important aspects of any web service. A webapp with a well designed logging strategy will allow you to essentially go back in time to track down even the most obscure bug. Unit tests have diminished the importance of log files somewhat but how do you write a unit test for a bug that only happens on server 2 around 2am in the morning when user fred is logged in?&lt;/p&gt;


	&lt;p&gt;Most of us run exception notification services such as exception_logger, hoptoad, exceptional or simply  but log exceptions to a DB table ( MySQL protip: make that table MyISAM, otherwise exceptions that are added during a transaction will be removed when that transaction rolls back – duh ). Those exception notifications are great but they never provide a lot of context for how the user got to the point.&lt;/p&gt;


	&lt;p&gt;Lastly there is also the role that log files play in customer support. Have you ever gotten a complaint about data disappearing from your service? With good logging you can tell your customer in a matter of minutes that employee Bob went on data rampage friday evening before handing in his resignation.&lt;/p&gt;


	&lt;p&gt;At Shopify we use &lt;a href="http://www.balabit.com/network-security/syslog-ng/opensource-logging-system/"&gt;syslog-ng&lt;/a&gt; to have a centralized logging server which collects all the logs from the various machines in our cluster and combines the log files together. We used to give everyone access to this box for log analysis but as we grew this became a bit impractical. To solve this, we created &lt;a href="http://github.com/tobi/clarity"&gt;Clarity&lt;/a&gt;, which provides a very nice web interface for the two staple tools of log analysis: grep and tail -f.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://github.com/tobi/clarity"&gt;&lt;img src="http://blog.leetsoft.com/assets/2009/12/6/claritypic.png?1260130051" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://github.com/tobi/clarity"&gt;Clarity&lt;/a&gt; is very lightweight and only requires a few dependencies such as eventmachine and json. It’s completely evented which means that you can have many different greps and tails running at the same time on a single instance (as much as the server can handle). It even stops the grep utility on the server when you hit stop in your browser.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
  ~  $ sudo gem install clarity 
  Password:
  Successfully installed clarity-0.9.8
  1 gem installed
  Installing ri documentation for clarity-0.9.8...
  Installing RDoc documentation for clarity-0.9.8...
  Could not find main page README.rdoc # anyone know how to get rid of this?!
  Could not find main page README.rdoc
  Could not find main page README.rdoc
  Could not find main page README.rdoc

  ~  $ clarity /var/log --include '*/**'
  Clarity 0.9.8 starting up.
   * listening on 0.0.0.0:8080
   * Log mask(s): */**

&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Additional command line parameters are:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
~  $ clarity --help
Usage:  clarity [options] directory

Specific options:
    -p, --port=PORT                  Port to listen on
    -b, --address=ADDRESS            Address to bind to (default 0.0.0.0)
        --include=MASK               File mask of logs to add (default: **/*.log*)
        --user=USER                  User to run as

Password protection:
        --username=USER              Enable httpauth username
        --password=PASS              Enable httpauth password

Misc:
    -h, --help                       Show this message.

&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;&lt;a href="http://github.com/tobi/clarity"&gt;Clarity&lt;/a&gt; is now used by our support staff on a daily basis. It’s been so successful internally that we decided to release it as open source. You can read more about it on the &lt;a href="http://github.com/tobi/clarity"&gt;github page&lt;/a&gt;. The &lt;span class="caps"&gt;URL&lt;/span&gt; structure of Clarity is pretty simple so it’s easy to add links to your internal admin area that directly open log files with the appropriate terms prefilled. You can for example add a link to a search that shows you all the &lt;span class="caps"&gt;DELETE&lt;/span&gt; requests of a certain store directly to your support system. This means that blaming Bob will only take one click in the future.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/too-biased/xml/~4/mwo3t1s2G_4" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.leetsoft.com/2009/12/6/clarity-in-log-files</feedburner:origLink></entry>
  <entry xml:base="http://blog.leetsoft.com/">
    <author>
      <name>tobi</name>
    </author>
    <id>tag:blog.leetsoft.com,2009-06-13:4683</id>
    <published>2009-06-13T23:48:00Z</published>
    <updated>2009-11-02T22:18:38Z</updated>
    <link href="http://feedproxy.google.com/~r/too-biased/xml/~3/FS5pB2LAZzM/build-and-deploy-a-shopify-app-in-8-minutes" rel="alternate" type="text/html" />
    <title>Build and deploy a Shopify app in 8 minutes</title>
<content type="html">
            &lt;p&gt;Enjoy the screencast:&lt;/p&gt;


&amp;lt;object height="385" width="480"&gt;&amp;lt;param&gt;&amp;lt;/param&gt;&amp;lt;param&gt;&amp;lt;/param&gt;&amp;lt;param&gt;&amp;lt;/param&gt;&amp;lt;embed src="http://www.youtube.com/v/OvzmAi3VhDQ&amp;amp;#38;hl=en&amp;amp;#38;fs=1&amp;amp;#38;hd=1" height="385" width="480"&gt;&amp;lt;/embed&gt;&amp;lt;/object&gt;
          &lt;img src="http://feeds.feedburner.com/~r/too-biased/xml/~4/FS5pB2LAZzM" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.leetsoft.com/2009/6/13/build-and-deploy-a-shopify-app-in-8-minutes</feedburner:origLink></entry>
  <entry xml:base="http://blog.leetsoft.com/">
    <author>
      <name>tobi</name>
    </author>
    <id>tag:blog.leetsoft.com,2009-06-02:4676</id>
    <published>2009-06-02T16:51:00Z</published>
    <updated>2009-06-02T21:46:43Z</updated>
    <link href="http://feedproxy.google.com/~r/too-biased/xml/~3/ctk5IvxYn-s/so-about-this-shopify-platform" rel="alternate" type="text/html" />
    <title>So, about this Shopify Platform</title>
<content type="html">
            &lt;p&gt;Today marks two events.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://apps.shopify.com"&gt;&lt;img src="http://blog.leetsoft.com/assets/2009/6/2/THUMB-dimitri3.jpg.jpeg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;First, Shopify was launched exactly 3 years ago. I started hacking on it more than 5 years ago, originally just for myself so that I could sell snowboards online, free from the tyranny of horrible online store software such as Yahoo Stores, but it quickly grew into something much larger. Now we are a profitable multi-million dollar company with one of the best teams in the industry. It’s been an amazing ride, at times a bumpy road but never less than exhilarating.&lt;/p&gt;


	&lt;p&gt;The other event is the launch of something I’m infinitely excited about: the &lt;a href="http://www.shopify.com/developers/"&gt;Shopify Platform&lt;/a&gt;. Let me explain. E-commerce is one of those software areas where individualization matters. This has been clear from day one of running Snowdevil and selling our first snowboard. If you build a store on the Internet you are providing a customer experience that is not unlike walking into any physical store in the downtown area of the town you live in. If the floorboards squeak, the wall colors don’t match, if the service is slow or the lighting is off, you will not like the experience. You won’t be back. There will probably be no sale. This goes for online stores as well. An online store must look good because you are building a brand of trust with your client. Poor design begets poor customers and poor customers lead to unsustainable margins. This is the reason I wrote liquid, which allows you to build &lt;a href="http://www.shopify.com/screenshots/"&gt;awesome looking stores on Shopify&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;However, there are a lot of common elements to every e-commerce store. There is this small nucleus of core functionality that all software has to provide (and most do). These are things like inventory management, order processing, payment processing, shipping support and so on. Shopify excels at all these things—our customer satisfaction rate is north of 90%. However after you are done with all those features something funny happens. The next feature everyone wants is different for each store. Some people want live auctions, some people want a wholesale area, some people want community forums, license key generation, digital delivery, integrations with MS Commerce Server, Oracle Inventory, international tax form printers, etc.&lt;/p&gt;


	&lt;p&gt;None of these features is particularly hard to implement. The problem is that they fail our basic test which we use to determine whether we should implement a feature or not: Implement &lt;strong&gt;what most people need most of the time&lt;/strong&gt;.&lt;/p&gt;


	&lt;p&gt;There is no cheating. Digital delivery is only needed by some people most of the time and international tax form printing is only needed by some people some of the time.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://blog.leetsoft.com/assets/2009/6/2/THUMB-dimitri1.jpg.jpeg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;The trouble is, if we were to add all these features to Shopify, we would simply end up with software like the others on the market; filled to the brim with features that only some people need some of the time. I’m a firm believer that every time you add a feature to you are diminishing all other features. Adding features and especially adding elements to a user interface is not something to take lightly.&lt;/p&gt;


	&lt;p&gt;So that is the solution. Facebook and Salesforce showed us the way and this is what we are bringing to e-commerce: We are turning Shopify into a development platform and our merchants can supplement the pristine Shopify core with only the additional features they need. E-commerce à la carte.&lt;/p&gt;


	&lt;p&gt;The Shopify platform allows any programmer to create applications that integrate natively with the administration interface or storefront. These applications can be written in any language and communicate with Shopify using our &lt;a href="http://api.shopify.com/product.html"&gt;handcrafted &lt;span class="caps"&gt;REST API&lt;/span&gt;&lt;/a&gt;. We even provide some amazing &lt;a href="http://github.com/Shopify/shopify_app/tree/master"&gt;rails generators&lt;/a&gt; to get started quickly.&lt;/p&gt;


	&lt;p&gt;Obviously we need developers to make this happen. Reasons why you should develop for the Shopify Platform:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Super fast start with the Shopify App rails generator&lt;/li&gt;
		&lt;li&gt;Automatic marketing through the &lt;a href="http://apps.shopify.com"&gt;Shopify Application Store&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;Soon we will launch the monetization system that allows you to bill merchants for using your applications directly through Shopify’s monthly billing system. We will deposit the money to you via Paypal.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;The sum total is that Shopify is now as extensible as any self hosted Wordpress system but still hosted on a world-class server farm. It’s the best of both worlds and surely will be the way a lot of hosted apps will develop in the coming years.&lt;/p&gt;


	&lt;p&gt;Exciting times.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/too-biased/xml/~4/ctk5IvxYn-s" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.leetsoft.com/2009/6/2/so-about-this-shopify-platform</feedburner:origLink></entry>
  <entry xml:base="http://blog.leetsoft.com/">
    <author>
      <name>tobi</name>
    </author>
    <id>tag:blog.leetsoft.com,2009-05-27:4674</id>
    <published>2009-05-27T14:28:00Z</published>
    <updated>2009-05-27T14:43:31Z</updated>
    <link href="http://feedproxy.google.com/~r/too-biased/xml/~3/XzXNhsZhblE/future-ruby" rel="alternate" type="text/html" />
    <title>Future Ruby</title>
<content type="html">
            &lt;p&gt;My friends from unspace are putting together &lt;strong&gt;&lt;a href="http://futureruby.com/"&gt;FutureRuby&lt;/a&gt;&lt;/strong&gt;, the spiritual successor to Rubyfringe which turned out to be one of the best conferences of last year.&lt;/p&gt;


	&lt;p&gt;The theme of the conference is obviously the future of ruby but one thing that is clear from the lineup is that the event doesn’t forget that ruby is part of a greater ecosystem and that ruby is as much a language as a mindset.&lt;/p&gt;


	&lt;p&gt;One great example of this is this &lt;a href="http://mobileorchard.com/future"&gt;workshop&lt;/a&gt; which Dan Grigsby is putting together which teaches iPhone development specifically to Ruby developers.&lt;/p&gt;


	&lt;p&gt;Shopify is shipping 8 people to the conference. Hope to see you there :-)&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/too-biased/xml/~4/XzXNhsZhblE" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.leetsoft.com/2009/5/27/future-ruby</feedburner:origLink></entry>
  <entry xml:base="http://blog.leetsoft.com/">
    <author>
      <name>tobi</name>
    </author>
    <id>tag:blog.leetsoft.com,2009-03-19:4672</id>
    <published>2009-03-19T01:16:00Z</published>
    <updated>2009-03-19T01:34:16Z</updated>
    <link href="http://feedproxy.google.com/~r/too-biased/xml/~3/PpdDk4O8DRU/gazaro-launches" rel="alternate" type="text/html" />
    <title>Gazaro launches</title>
<content type="html">
            &lt;p&gt;&lt;a href="http://gazaro.com/"&gt;&lt;img src="http://blog.leetsoft.com/assets/2009/3/19/gazaro.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Ottawa friends of mine launched &lt;a href="http://gazaro.com/"&gt;Gazaro&lt;/a&gt;, a really remarkable comparison shopping engine that transcribes a full history of price fluctuations and allows you to see how good of a deal a deal really is.&lt;/p&gt;


	&lt;p&gt;I’ve been using it for the last few weeks and it really works great, give it a try.&lt;/p&gt;


	&lt;p&gt;Now to get Shopify’s product base on there…&lt;/p&gt;


&lt;div&gt;
&lt;/div&gt;
          &lt;img src="http://feeds.feedburner.com/~r/too-biased/xml/~4/PpdDk4O8DRU" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.leetsoft.com/2009/3/19/gazaro-launches</feedburner:origLink></entry>
  <entry xml:base="http://blog.leetsoft.com/">
    <author>
      <name>tobi</name>
    </author>
    <id>tag:blog.leetsoft.com,2008-12-20:4667</id>
    <published>2008-12-20T18:07:00Z</published>
    <updated>2008-12-20T18:07:28Z</updated>
    <category term="Talks" />
    <link href="http://feedproxy.google.com/~r/too-biased/xml/~3/lYCG7sh30OI/benjamin-zander" rel="alternate" type="text/html" />
    <title>Benjamin Zander</title>
<content type="html">
            &lt;p&gt;Thanks to &lt;a href="http://twitter.com/igrigorik/status/1066344417"&gt;@igrigorik&lt;/a&gt;&amp;nbsp;for the link to this wonderful &lt;a href="http://en.wikipedia.org/wiki/Benjamin_Zander"&gt;Benjamin Zander&lt;/a&gt; talk&lt;/p&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;lt;object height="322" width="512"&gt;
&amp;lt;param /&gt;
&amp;lt;param /&gt;
&amp;lt;param /&gt;
&amp;lt;param /&gt;
&amp;lt;param /&gt;&amp;lt;embed src="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.30" height="322" width="512"&gt;&amp;lt;/embed&gt;&amp;lt;/object&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;a href=”&lt;a href="http://video.yahoo.com/watch/10444215/10444215"&gt;http://video.yahoo.com/watch/10444215/10444215&lt;/a&gt;”&amp;gt;&amp;lt;/a&amp;gt; @ &amp;lt;a href=”&lt;a href="http://video.yahoo.com"&gt;http://video.yahoo.com&lt;/a&gt;” &amp;gt;Yahoo! Video&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/object&gt;
&lt;/div&gt;
          &lt;img src="http://feeds.feedburner.com/~r/too-biased/xml/~4/lYCG7sh30OI" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.leetsoft.com/2008/12/20/benjamin-zander</feedburner:origLink></entry>
  <entry xml:base="http://blog.leetsoft.com/">
    <author>
      <name>tobi</name>
    </author>
    <id>tag:blog.leetsoft.com,2008-12-13:4664</id>
    <published>2008-12-13T03:51:00Z</published>
    <updated>2008-12-18T03:46:34Z</updated>
    <link href="http://feedproxy.google.com/~r/too-biased/xml/~3/axfXqDkHz70/facebook-s-memcahed" rel="alternate" type="text/html" />
    <title>Facebook's memcached</title>
<content type="html">
            &lt;p&gt;Facebook’s server installation has been a point of interest for a long time. When an engineer on the memcached mailing list casually mentioned that they are running 4TB  worth of caches, a lot of people got their panties in a knot.&lt;/p&gt;


	&lt;p&gt;Since then Facebook has been more forthcoming with details about their exciting architecture. For example they &lt;a href="http://www.facebook.com/note.php?note_id=23844338919"&gt;explained how they created a custom Mysql&lt;/a&gt; to solve problems with cross-datacenter cache expiry and replication lag which is a great read for anyone looking into multi location hosting.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.facebook.com/note.php?note_id=39391378919&amp;amp;#38;id=9445547199&amp;amp;#38;index=0"&gt;Today there was another memcached centric post&lt;/a&gt; that talks about their fork of the memcached codebase which they also made &lt;a href="http://github.com/fbmarc/facebook-memcached/tree/master"&gt;available on github&lt;/a&gt;.&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt; We use more than 800 servers supplying over 28 terabytes of memory to our users. Over the past year as Facebook’s popularity has skyrocketed, we’ve run into a number of scaling issues. This ever increasing demand has required us to make modifications to both our operating system and memcached to achieve the performance that provides the best possible experience for our users. [...]&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;Fascinating read.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/too-biased/xml/~4/axfXqDkHz70" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.leetsoft.com/2008/12/13/facebook-s-memcahed</feedburner:origLink></entry>
  <entry xml:base="http://blog.leetsoft.com/">
    <author>
      <name>tobi</name>
    </author>
    <id>tag:blog.leetsoft.com,2008-11-15:4625</id>
    <published>2008-11-15T18:14:00Z</published>
    <updated>2008-11-15T19:13:45Z</updated>
    <category term="Code" />
    <category term="Rails" />
    <link href="http://feedproxy.google.com/~r/too-biased/xml/~3/Z4FmfdCrqeQ/passenger" rel="alternate" type="text/html" />
    <title>Passenger</title>
<content type="html">
            &lt;p&gt;So there is a lot of talk about &lt;a href="http://www.modrails.com/"&gt;Phusion Passenger&lt;/a&gt; lately and I feel the need to chime in here. David pointed out that &lt;a href="http://loudthinking.com/posts/30-myth-1-rails-is-hard-to-deploy"&gt;Shopify is running on passenger&lt;/a&gt; which is something I &lt;a href="http://twitter.com/tobi/statuses/922799148"&gt;announced on Twitter&lt;/a&gt; a few months ago.&lt;/p&gt;


	&lt;p&gt;Some context on Shopify’s installation: We launched Shopify originally on Lighttpd with FastCGI and later migrated to nginx with mongrels. Obviously we had to use HAProxy between Nginx and mongrels to avoid the dreaded “queue behind long running process” problem. We also added Monit to the mix which observed all mongrels to make sure that everything  is running according to plan. After a process reaches 260 mb of memory we signal it to shut down after the next request so that a new one can start out with less memory. For this we added runit to the mix which supervises the mongrels and starts them up quickly once they hit the ground.&lt;/p&gt;


	&lt;p&gt;It’s important to note that we are not talking about a memory leak here. The reason for the 260mb ceiling comes from two issues with Ruby’s garbage collector:&lt;/p&gt;


	&lt;ol&gt;
	&lt;li&gt;It allocates memory in very large chunks once the available memory gets low. This means a 140mb process increases to 260mb in a single go. It also never gives memory back to the operating system because Ruby’s GC is not able to move objects. Once it adds an object into the newly allocated space and that object remains alive, it cannot yield memory back to the OS. &lt;/li&gt;
		&lt;li&gt;Because Ruby’s garbage collector uses mark and sweep it has to traverse the entire memory space in search of pointers. There are no generations that help with that. It means that GC cycles become longer and longer the more memory is available. &lt;del&gt;-Rails mitigates these issues by moving a full GC run behind a &lt;span class="caps"&gt;HTTP&lt;/span&gt; response, into the time period when the process is waiting for a new request&lt;/del&gt; (&lt;strong&gt;Update:&lt;/strong&gt; Rails doesn’t do this anymore) but performance monitoring tools such as &lt;a href="https://rpm.newrelic.com/"&gt;NewRelic&lt;/a&gt; clearly show that average response times is directly correlated with the amount of memory used across the server farm.&lt;/li&gt;
	&lt;/ol&gt;


	&lt;p&gt;Now why did we switch to Passenger? Simple: the keyword is &lt;strong&gt;remove moving parts&lt;/strong&gt;.&lt;/p&gt;


	&lt;p&gt;Every additional tool you add will come with it’s own bugs. Many people I talked to over the past years considered haproxy to be the most solid piece of infrastructure in their stack but even there was a really &lt;a href="http://haproxy.1wt.eu/news.html"&gt;nasty bug&lt;/a&gt; recently (search for request queue handling).&lt;/p&gt;


	&lt;p&gt;We treat our server farm very similar to Shopify’s codebase. We are in this for the long haul and we cannot accept complex solutions when simple ones present themselves. Maintainability of our code and servers is paramount to the long term success of our product. Yes the Mongrel setup worked very well but Passenger allowed us to remove: Nginx, Haproxy, Runit and Monit. That’s a nice refactoring!&lt;/p&gt;


	&lt;p&gt;At the same time Passenger introduced some tangible improvements. We switched to enterprise ruby to get the full benefit of the &lt;acronym title="Copy on Write"&gt;COW&lt;/acronym&gt; memory characteristics and we can absolutely confirm the memory savings of 30%  some others have reported. This is many thousand dollars of savings even at today’s hardware prices. We allow Passenger to adaptively spawn more processes with demand but most of the time our application servers are running about 40 processes to handle more than a million dynamic requests a day. However, because passenger constantly despawns and respawns rails processes they always stay fresh, run short GC cycles and are generally a lot more responsive. All this means that the total amount of memory that is used by Shopify during normal operations went from average of 9GB to an average of 5GB. We evenly distributed the savings amongst more Shopify processes and more memcached space which moved our average response time from 210ms to 130ms while traffic grew 30% in the last few months.&lt;/p&gt;


	&lt;p&gt;In conclusion: I cannot see any reason to choose a different deployment strategy at this point. Its simple, complete, fast and well documented.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/too-biased/xml/~4/Z4FmfdCrqeQ" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.leetsoft.com/2008/11/15/passenger</feedburner:origLink></entry>
  <entry xml:base="http://blog.leetsoft.com/">
    <author>
      <name>tobi</name>
    </author>
    <id>tag:blog.leetsoft.com,2008-11-07:4620</id>
    <published>2008-11-07T17:30:00Z</published>
    <updated>2008-11-07T17:34:46Z</updated>
    <link href="http://feedproxy.google.com/~r/too-biased/xml/~3/yqp6QZCpKhI/interview" rel="alternate" type="text/html" />
    <title>Interview</title>
<content type="html">
            &lt;p&gt;&lt;a href="www.openvista.com"&gt;openvista&lt;/a&gt; posted their &lt;a href="http://www.openvista.com/index.ov#p14_November_06_2008"&gt;interview with me&lt;/a&gt; in which I talk about entrepreneurship and the early days of Shopify.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/too-biased/xml/~4/yqp6QZCpKhI" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.leetsoft.com/2008/11/7/interview</feedburner:origLink></entry>
  <entry xml:base="http://blog.leetsoft.com/">
    <author>
      <name>tobi</name>
    </author>
    <id>tag:blog.leetsoft.com,2008-10-28:4615</id>
    <published>2008-10-28T18:02:00Z</published>
    <updated>2008-10-28T18:04:53Z</updated>
    <link href="http://feedproxy.google.com/~r/too-biased/xml/~3/7wLyEjuQcFU/rockstar-memcaching-video" rel="alternate" type="text/html" />
    <title>Rockstar Memcaching (video)</title>
<content type="html">
            &lt;p&gt;InfoQ posted the video to my &lt;a href="http://blog.leetsoft.com/2008/7/21/rockstar-memcaching"&gt;rockstar memcaching&lt;/a&gt; presentation from ruby fringe.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.infoq.com/presentations/lutke-rockstar-memcaching"&gt;Rockstar Memcaching Video&lt;/a&gt;&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/too-biased/xml/~4/7wLyEjuQcFU" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.leetsoft.com/2008/10/28/rockstar-memcaching-video</feedburner:origLink></entry>
  <entry xml:base="http://blog.leetsoft.com/">
    <author>
      <name>tobi</name>
    </author>
    <id>tag:blog.leetsoft.com,2008-10-23:4613</id>
    <published>2008-10-23T22:08:00Z</published>
    <updated>2008-10-23T22:09:38Z</updated>
    <link href="http://feedproxy.google.com/~r/too-biased/xml/~3/Mr3hdvnYxTo/mobile-development" rel="alternate" type="text/html" />
    <title>Mobile Development</title>
<content type="html">
            &lt;p&gt;I’ve been playing around with mobile development lately which is a nice change of pace. Before Shopify and Rails I used to count myself amongst the ranks of the C++ desktop developers ( go &lt;span class="caps"&gt;WTL&lt;/span&gt;!! ) so in many ways the concepts of mobile development feel like the good’ old times—without all the things that drive you up the walls.&lt;/p&gt;


	&lt;p&gt;What’s so fun about it is the innocence of it all. It’s the gold rush all over again. For example that bastard Hampton managed to sell his Wikipedia browser iPedia 50k times. Check out &lt;a href="http://www.mobileorchard.com"&gt;www.mobileorchard.com&lt;/a&gt; which just published an &lt;a href="http://www.mobileorchard.com/podcast-interview-with-hampton-catlin/"&gt;interview with him&lt;/a&gt;.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/too-biased/xml/~4/Mr3hdvnYxTo" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.leetsoft.com/2008/10/23/mobile-development</feedburner:origLink></entry>
  <entry xml:base="http://blog.leetsoft.com/">
    <author>
      <name>tobi</name>
    </author>
    <id>tag:blog.leetsoft.com,2008-10-11:4607</id>
    <published>2008-10-11T17:28:00Z</published>
    <updated>2008-10-11T17:28:32Z</updated>
    <link href="http://feedproxy.google.com/~r/too-biased/xml/~3/sBHmZMhOEco/lhc-rap" rel="alternate" type="text/html" />
    <title>LHC Rap</title>
<content type="html">
            &lt;p&gt;via &lt;a href="http://www.youtube.com/watch?v=j50ZssEojtM"&gt;youtube&lt;/a&gt;&lt;/p&gt;


&amp;lt;object height="344" width="425"&gt;&amp;lt;param&gt;&amp;lt;/param&gt;&amp;lt;param&gt;&amp;lt;/param&gt;&amp;lt;embed src="http://www.youtube.com/v/j50ZssEojtM&amp;amp;#38;hl=en&amp;amp;#38;fs=1" height="344" width="425"&gt;&amp;lt;/embed&gt;&amp;lt;/object&gt;
          &lt;img src="http://feeds.feedburner.com/~r/too-biased/xml/~4/sBHmZMhOEco" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.leetsoft.com/2008/10/11/lhc-rap</feedburner:origLink></entry>
  <entry xml:base="http://blog.leetsoft.com/">
    <author>
      <name>tobi</name>
    </author>
    <id>tag:blog.leetsoft.com,2008-10-06:4606</id>
    <published>2008-10-06T18:41:00Z</published>
    <updated>2008-10-06T18:44:42Z</updated>
    <link href="http://feedproxy.google.com/~r/too-biased/xml/~3/HE2CyJZ2xsE/shopify-blogging" rel="alternate" type="text/html" />
    <title>Shopify Blogging</title>
<content type="html">
            &lt;p&gt;Brand and community development where always the guiding principles behind &lt;a href="http://www.shopify.com"&gt;Shopify&lt;/a&gt; and today we launched an important aspect of this: Your visitors can now comment on blog posts.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://blog.shopify.com/2008/10/6/new-feature-comments-for-blogs"&gt;Read more about it on the shopify blog&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;We will provide an import tool for wordpress and other blogging systems soon (implemented as an open source shopify api app. )&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/too-biased/xml/~4/HE2CyJZ2xsE" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.leetsoft.com/2008/10/6/shopify-blogging</feedburner:origLink></entry>
  <entry xml:base="http://blog.leetsoft.com/">
    <author>
      <name>tobi</name>
    </author>
    <id>tag:blog.leetsoft.com,2008-08-31:4590</id>
    <published>2008-08-31T01:54:00Z</published>
    <updated>2008-08-31T01:58:16Z</updated>
    <link href="http://feedproxy.google.com/~r/too-biased/xml/~3/Pbecgsbae7M/liquid-js" rel="alternate" type="text/html" />
    <title>Liquid JS</title>
<content type="html">
            &lt;p&gt;Color me impressed.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.mattmccray.com"&gt;Matt Mccray&lt;/a&gt; ported Liquid to javascript. &lt;a href="http://gist.github.com/8150"&gt;Go here&lt;/a&gt; to get the gist of it (yea, bad pun)&lt;/p&gt;


	&lt;p&gt;Pretty awesome work Matt :-)&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;
&amp;lt;script&amp;gt;
 Liquid.readTemplateFile = function(path) {
  var elem = $(path);
  if(elem) {
    return elem.innerHTML;
  } else {
    path +" can't be found."; // Or throw and error, or whatever you want...
  }
 }

 var tmpl = Liquid.parse("{% include 'myOtherTemplate' with current_user %}"); 
 alert( tmpl.render({ current_user:'M@' }));
&amp;lt;/script&amp;gt;

&amp;lt;script type="text/liquid" id="myOtherTemplate"&amp;gt;
  Hello, {{ current_user }}!
&amp;lt;/script&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
          &lt;img src="http://feeds.feedburner.com/~r/too-biased/xml/~4/Pbecgsbae7M" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.leetsoft.com/2008/8/31/liquid-js</feedburner:origLink></entry>
</feed>
