<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Too-Biased</title>
 <link href="http://blog.leetsoft.com/atom.xml" rel="self"/>
 <link href="http://blog.leetsoft.com/"/>
 <updated>2011-09-14T19:18:51-07:00</updated>
 <id>http://blog.leetsoft.com.com/</id>
 <author>
   <name>Tobias Lütke</name>
 </author>

 
 <entry>
   <title>Steve Jobs on intelligence</title>
   <link href="http://blog.leetsoft.com/2011/09/14/steve-jobs.html"/>
   <updated>2011-09-14T00:00:00-07:00</updated>
   <id>http://blog.leetsoft.com/2011/09/14/steve-jobs</id>
   <content type="html">&lt;p&gt;Everyone is talking about Steve Jobs right now. Other people are better at describing how important his contributions were.&lt;/p&gt;

&lt;p&gt;It's as good a time as any to share one of my favorite pieces of his. It's a speech that he gave when he was just 26 years old at the &lt;a href=&quot;http://www.achievement.org/autodoc/pagegen/brochure/p3.html&quot;&gt;Academy of Archivement&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Direct link: &lt;a href=&quot;http://www.achievement.org/newsletter/audio/jobs-aud.mov&quot;&gt;Audio&lt;/a&gt; [Quicktime]&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Hacking the Customer Acquisition Game. </title>
   <link href="http://blog.leetsoft.com/2011/05/02/hacking-the-customer-acquisition-game.html"/>
   <updated>2011-05-02T12:56:00-07:00</updated>
   <id>http://blog.leetsoft.com/2011/05/02/hacking-the-customer-acquisition-game</id>
   <content type="html">&lt;p&gt;Around 2 years ago I spoke with my friend Tim Ferriss about growing &lt;a href=&quot;http://www.shopify.com&quot;&gt;Shopify&lt;/a&gt;, the eCommerce company I started in 2005. The biggest challenge of building a business is customer acquisition. It seems crazy because we have this amazing product that everyone seems to love. Shopify produces millions in wealth for its customers and costs them considerably less money and aggravation to use. I asked Tim, &amp;#8220;why don&amp;#8217;t more people just &lt;strong&gt;try&lt;/strong&gt; to open online stores.&amp;#8221; I should have asked, “why can’t we hack the customer acquisition game like we hack code?”&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.shopify.com/contest&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2011/5/2/contest-1.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tim paused for a moment and said something like this: &amp;#8220;You spend all this money on advertising but have you ever thought to just give it away instead?&amp;#8221; Paying people to use my product? It sounded just crazy enough to work. So off we went&amp;#8230; we took an entire month of marketing money and simply gave it away. We put together a contest that gave away $125,000 in prizes for whoever built the most successful online store in 6 months.&lt;/p&gt;
&lt;p&gt;The rest, so they say, is history. Almost 1,400 businesses were created as a result of the first Shopify Build-A-Business contest. Those are all businesses that wouldn&amp;#8217;t have been created some financial incentive?. Amazing success stories like &lt;a href=&quot;www.dodocase.com&quot;&gt;DODOcase&lt;/a&gt; found their start in this program. DODOcase is now a multi million-dollar company. What&amp;#8217;s even crazier is that they’re not the only ones. The alumni of our contest could fill an entire Harvard Business Review worth of case studies.&lt;/p&gt;
&lt;p&gt;We hacked the game! People don’t need flashy retargeting? ads and contextualized bullshit. What people need is a kick in the ass. Everyone knows the stories. You’ve all heard the fairy tales of people building online stores and making millions, but it always seems like the good ideas are all taken. However, what people forget is that online commerce is not a zero sum game. Here’s the dirty secret of internet retail: There are never enough online stores.&lt;/p&gt;
&lt;p&gt;Retail in the US alone is a multi-trillion dollar market. Every year a higher percentage is being spent online. Granted, a big chunk of this is going to the usual suspect: Amazon.&lt;/p&gt;
&lt;p&gt;However, Amazon.com is the Wal-Mart of the Internet. Who goes to Wal-Mart to shop? Lot&amp;#8217;s of people, but not the people who actually like shopping. Hear me out… when I go shopping for clothes, I go to my favorite place in Montreal. The store is incredible; brick walls, beautiful lighting, even a DJ booth with great music. You would never see a squeaky floor in a place like this. The experience is designed to impress, the staff knows everything you ask them, you buy something, love it and you will come back. Everyone comes back.&lt;/p&gt;
&lt;p&gt;How often do you have an experience like this online? Truth is, not as often as I would like, but they do exist. Shopify stores Evisu and DODOcase offer a boutique like experience that’s a far cry from the linoleum floor and fluorescent lighting of a big box store’s online offering. In fact, most of Shopify’s almost 14,000 stores break the mold of traditional eCommerce stores.&lt;/p&gt;
&lt;p&gt;In any case, let&amp;#8217;s get back to hacking the customer acquisition game. I&amp;#8217;m going to put my money where my mouth is. As I mentioned, last year we gave away $125,000 in prizes. This time it&amp;#8217;s personal and we are going to make it bigger and better. Today we are launching the &lt;a href=&quot;http://www.shopify.com/contest&quot;&gt;second act of the Build-A-Business contest&lt;/a&gt;. &lt;strong&gt;Tim Ferriss&lt;/strong&gt; is joining me again and we’re also partnering with &lt;strong&gt;Seth Godin&lt;/strong&gt; and &lt;strong&gt;Gary Vaynerchuck&lt;/strong&gt;. This killer team of mentors is going to work with the contestants through emails, advice, videos and even one on one sessions.&lt;/p&gt;
&lt;p&gt;My biggest regret of last years competition was that we failed on the education side of things. This year it&amp;#8217;s going to be different. You will be blown away.&lt;/p&gt;
&lt;p&gt;Ok so now I hope I have sufficiently made my point and fully &amp;#8220;acquired&amp;#8221; you. Run, don&amp;#8217;t walk over to www.shopify.com/contest and build yourself a life altering  business. We see success stories at Shopify every single day. Please join us. We want you in the ranks of the Build-A-Business alumni.&lt;/p&gt;
&lt;p&gt;Can&amp;#8217;t wait to write the cheques!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Q&A with me</title>
   <link href="http://blog.leetsoft.com/2010/06/04/q-a-with-me.html"/>
   <updated>2010-06-04T12:03:00-07:00</updated>
   <id>http://blog.leetsoft.com/2010/06/04/q-a-with-me</id>
   <content type="html">&lt;p&gt;37Signals just posted a Q&amp;amp;A with me about Shopify.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://37signals.com/svn/posts/2378-qa-with-tobias-ltke-of-shopify&quot;&gt;Check it out&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Shopify & 100k contest in NYTimes</title>
   <link href="http://blog.leetsoft.com/2010/02/03/shopify-100k-contest-in-nytimes.html"/>
   <updated>2010-02-03T11:31:00-08:00</updated>
   <id>http://blog.leetsoft.com/2010/02/03/shopify-100k-contest-in-nytimes</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://boss.blogs.nytimes.com/2010/02/02/shopify-gains-customers-with-a-competition/&quot;&gt;&lt;img src=&quot;http://www.storecontest.com/images/graphics/contest-flow.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://boss.blogs.nytimes.com/2010/02/02/shopify-gains-customers-with-a-competition/&quot;&gt;Article&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Clarity in log files.</title>
   <link href="http://blog.leetsoft.com/2009/12/06/clarity-in-log-files.html"/>
   <updated>2009-12-06T17:00:00-08:00</updated>
   <id>http://blog.leetsoft.com/2009/12/06/clarity-in-log-files</id>
   <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 &amp;#8211; 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=&quot;http://www.balabit.com/network-security/syslog-ng/opensource-logging-system/&quot;&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=&quot;http://github.com/tobi/clarity&quot;&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=&quot;http://github.com/tobi/clarity&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2009/12/6/claritypic.png?1260130051&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://github.com/tobi/clarity&quot;&gt;Clarity&lt;/a&gt; is very lightweight and only requires a few dependencies such as eventmachine and json. It&amp;#8217;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=&quot;http://github.com/tobi/clarity&quot;&gt;Clarity&lt;/a&gt; is now used by our support staff on a daily basis. It&amp;#8217;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=&quot;http://github.com/tobi/clarity&quot;&gt;github page&lt;/a&gt;. The &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; structure of Clarity is pretty simple so it&amp;#8217;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=&quot;caps&quot;&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;</content>
 </entry>
 
 <entry>
   <title>Build and deploy a Shopify app in 8 minutes</title>
   <link href="http://blog.leetsoft.com/2009/06/13/build-and-deploy-a-shopify-app-in-8-minutes.html"/>
   <updated>2009-06-13T20:48:00-07:00</updated>
   <id>http://blog.leetsoft.com/2009/06/13/build-and-deploy-a-shopify-app-in-8-minutes</id>
   <content type="html">&lt;p&gt;Enjoy the screencast:&lt;/p&gt;
&lt;p&gt;&lt;object width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/OvzmAi3VhDQ&amp;hl=en&amp;fs=1&amp;hd=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/OvzmAi3VhDQ&amp;hl=en&amp;fs=1&amp;hd=1&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>So, about this Shopify Platform</title>
   <link href="http://blog.leetsoft.com/2009/06/02/so-about-this-shopify-platform.html"/>
   <updated>2009-06-02T13:51:00-07:00</updated>
   <id>http://blog.leetsoft.com/2009/06/02/so-about-this-shopify-platform</id>
   <content type="html">&lt;p&gt;Today marks two events.&lt;/p&gt;
&lt;p style=&quot;float:right;&quot;&gt;&lt;a href=&quot;http://apps.shopify.com&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2009/6/2/THUMB-dimitri3.jpg.jpeg&quot; alt=&quot;&quot; /&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&amp;#8217;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&amp;#8217;m infinitely excited about: the &lt;a href=&quot;http://www.shopify.com/developers/&quot;&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&amp;#8217;t match, if the service is slow or the lighting is off, you will not like the experience. You won&amp;#8217;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=&quot;http://www.shopify.com/screenshots/&quot;&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 style=&quot;float:right;&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2009/6/2/THUMB-dimitri1.jpg.jpeg&quot; alt=&quot;&quot; /&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&amp;#8217;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=&quot;http://api.shopify.com/product.html&quot;&gt;handcrafted &lt;span class=&quot;caps&quot;&gt;REST&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt;. We even provide some amazing &lt;a href=&quot;http://github.com/Shopify/shopify_app/tree/master&quot;&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=&quot;http://apps.shopify.com&quot;&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&amp;#8217;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&amp;#8217;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;</content>
 </entry>
 
 <entry>
   <title>Future Ruby</title>
   <link href="http://blog.leetsoft.com/2009/05/27/future-ruby.html"/>
   <updated>2009-05-27T11:28:00-07:00</updated>
   <id>http://blog.leetsoft.com/2009/05/27/future-ruby</id>
   <content type="html">&lt;p&gt;My friends from unspace are putting together &lt;strong&gt;&lt;a href=&quot;http://futureruby.com/&quot;&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&amp;#8217;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=&quot;http://mobileorchard.com/future&quot;&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;</content>
 </entry>
 
 <entry>
   <title>Gazaro launches</title>
   <link href="http://blog.leetsoft.com/2009/03/18/gazaro-launches.html"/>
   <updated>2009-03-18T22:16:00-07:00</updated>
   <id>http://blog.leetsoft.com/2009/03/18/gazaro-launches</id>
   <content type="html">&lt;p style=&quot;float:right;&quot;&gt;&lt;a href=&quot;http://gazaro.com/&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2009/3/19/gazaro.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ottawa friends of mine launched &lt;a href=&quot;http://gazaro.com/&quot;&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&amp;#8217;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&amp;#8217;s product base on there&amp;#8230;&lt;/p&gt;
&lt;div style=&quot;clear:right&quot;&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Benjamin Zander</title>
   <link href="http://blog.leetsoft.com/2008/12/20/benjamin-zander.html"/>
   <updated>2008-12-20T15:07:00-08:00</updated>
   <id>http://blog.leetsoft.com/2008/12/20/benjamin-zander</id>
   <content type="html">&lt;p&gt;Thanks to &lt;a href=&quot;http://twitter.com/igrigorik/status/1066344417&quot;&gt;@igrigorik&lt;/a&gt;&amp;nbsp;for the link to this wonderful &lt;a href=&quot;http://en.wikipedia.org/wiki/Benjamin_Zander&quot;&gt;Benjamin Zander&lt;/a&gt; talk&lt;/p&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;object width=&quot;512&quot; height=&quot;322&quot;&gt;&lt;br /&gt;
&lt;param name=&quot;movie&quot; value=&quot;http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.30&quot; /&gt;&lt;br /&gt;
&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;br /&gt;
&lt;param name=&quot;AllowScriptAccess&quot; value=&quot;always&quot; /&gt;&lt;br /&gt;
&lt;param name=&quot;bgcolor&quot; value=&quot;#000000&quot; /&gt;&lt;br /&gt;
&lt;param name=&quot;flashVars&quot; value=&quot;id=10444215&amp;amp;vid=10444215&amp;amp;lang=en-us&amp;amp;intl=us&amp;amp;thumbUrl=&amp;amp;embed=1&quot; /&gt;&lt;embed src=&quot;http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.30&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;512&quot; height=&quot;322&quot; flashvars=&quot;id=10444215&amp;amp;vid=10444215&amp;amp;lang=en-us&amp;amp;intl=us&amp;amp;thumbUrl=&amp;amp;embed=1&quot;&gt;&lt;/embed&gt;&amp;lt;/object&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;a href=&amp;#8220;&amp;#8221;http://video.yahoo.com/watch/10444215/10444215&amp;quot;&amp;gt;http://video.yahoo.com/watch/10444215/10444215&lt;/a&gt;&amp;#8220;&amp;gt;&amp;lt;/a&amp;gt; @ &amp;lt;a href=&amp;#8221;&lt;a href=&quot;http://video.yahoo.com&quot;&gt;http://video.yahoo.com&lt;/a&gt;&amp;quot; &amp;gt;Yahoo! Video&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;/object&gt;&lt;/p&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Facebook's memcached</title>
   <link href="http://blog.leetsoft.com/2008/12/13/facebook-s-memcahed.html"/>
   <updated>2008-12-13T00:51:00-08:00</updated>
   <id>http://blog.leetsoft.com/2008/12/13/facebook-s-memcahed</id>
   <content type="html">&lt;p&gt;Facebook&amp;#8217;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=&quot;http://www.facebook.com/note.php?note_id=23844338919&quot;&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=&quot;http://www.facebook.com/note.php?note_id=39391378919&amp;amp;id=9445547199&amp;amp;index=0&quot;&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=&quot;http://github.com/fbmarc/facebook-memcached/tree/master&quot;&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&amp;#8217;s popularity has skyrocketed, we&amp;#8217;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. [&amp;#8230;]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Fascinating read.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Passenger</title>
   <link href="http://blog.leetsoft.com/2008/11/15/passenger.html"/>
   <updated>2008-11-15T15:14:00-08:00</updated>
   <id>http://blog.leetsoft.com/2008/11/15/passenger</id>
   <content type="html">&lt;p&gt;So there is a lot of talk about &lt;a href=&quot;http://www.modrails.com/&quot;&gt;Phusion Passenger&lt;/a&gt; lately and I feel the need to chime in here. David pointed out that &lt;a href=&quot;http://loudthinking.com/posts/30-myth-1-rails-is-hard-to-deploy&quot;&gt;Shopify is running on passenger&lt;/a&gt; which is something I &lt;a href=&quot;http://twitter.com/tobi/statuses/922799148&quot;&gt;announced on Twitter&lt;/a&gt; a few months ago.&lt;/p&gt;
&lt;p&gt;Some context on Shopify&amp;#8217;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 &amp;#8220;queue behind long running process&amp;#8221; 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&amp;#8217;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&amp;#8217;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&amp;#8217;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&amp;#8217;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=&quot;caps&quot;&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&amp;#8217;t do this anymore) but performance monitoring tools such as &lt;a href=&quot;https://rpm.newrelic.com/&quot;&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&amp;#8217;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=&quot;http://haproxy.1wt.eu/news.html&quot;&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&amp;#8217;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&amp;#8217;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=&quot;Copy on Write&quot;&gt;&lt;span class=&quot;caps&quot;&gt;COW&lt;/span&gt;&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&amp;#8217;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;</content>
 </entry>
 
 <entry>
   <title>Interview</title>
   <link href="http://blog.leetsoft.com/2008/11/07/interview.html"/>
   <updated>2008-11-07T14:30:00-08:00</updated>
   <id>http://blog.leetsoft.com/2008/11/07/interview</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;www.openvista.com&quot;&gt;openvista&lt;/a&gt; posted their &lt;a href=&quot;http://www.openvista.com/index.ov#p14_November_06_2008&quot;&gt;interview with me&lt;/a&gt; in which I talk about entrepreneurship and the early days of Shopify.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Rockstar Memcaching (video)</title>
   <link href="http://blog.leetsoft.com/2008/10/28/rockstar-memcaching-video.html"/>
   <updated>2008-10-28T15:02:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/10/28/rockstar-memcaching-video</id>
   <content type="html">&lt;p&gt;InfoQ posted the video to my &lt;a href=&quot;http://blog.leetsoft.com/2008/7/21/rockstar-memcaching&quot;&gt;rockstar memcaching&lt;/a&gt; presentation from ruby fringe.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.infoq.com/presentations/lutke-rockstar-memcaching&quot;&gt;Rockstar Memcaching Video&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Mobile Development</title>
   <link href="http://blog.leetsoft.com/2008/10/23/mobile-development.html"/>
   <updated>2008-10-23T19:08:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/10/23/mobile-development</id>
   <content type="html">&lt;p&gt;I&amp;#8217;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=&quot;caps&quot;&gt;WTL&lt;/span&gt;!! ) so in many ways the concepts of mobile development feel like the good&amp;#8217; old times &amp;#8212; without all the things that drive you up the walls.&lt;/p&gt;
&lt;p&gt;What&amp;#8217;s so fun about it is the innocence of it all. It&amp;#8217;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=&quot;http://www.mobileorchard.com&quot;&gt;www.mobileorchard.com&lt;/a&gt; which just published an &lt;a href=&quot;http://www.mobileorchard.com/podcast-interview-with-hampton-catlin/&quot;&gt;interview with him&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>test</title>
   <link href="http://blog.leetsoft.com/2008/10/18/test.html"/>
   <updated>2008-10-18T00:19:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/10/18/test</id>
   <content type="html">&lt;p&gt;test&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>LHC Rap</title>
   <link href="http://blog.leetsoft.com/2008/10/11/lhc-rap.html"/>
   <updated>2008-10-11T14:28:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/10/11/lhc-rap</id>
   <content type="html">&lt;p&gt;via &lt;a href=&quot;http://www.youtube.com/watch?v=j50ZssEojtM&quot;&gt;youtube&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/j50ZssEojtM&amp;hl=en&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/j50ZssEojtM&amp;hl=en&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Shopify Blogging</title>
   <link href="http://blog.leetsoft.com/2008/10/06/shopify-blogging.html"/>
   <updated>2008-10-06T15:41:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/10/06/shopify-blogging</id>
   <content type="html">&lt;p&gt;Brand and community development where always the guiding principles behind &lt;a href=&quot;http://www.shopify.com&quot;&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=&quot;http://blog.shopify.com/2008/10/6/new-feature-comments-for-blogs&quot;&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;</content>
 </entry>
 
 <entry>
   <title>Liquid JS</title>
   <link href="http://blog.leetsoft.com/2008/08/30/liquid-js.html"/>
   <updated>2008-08-30T22:54:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/08/30/liquid-js</id>
   <content type="html">&lt;p&gt;Color me impressed.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.mattmccray.com&quot;&gt;Matt Mccray&lt;/a&gt; ported Liquid to javascript. &lt;a href=&quot;http://gist.github.com/8150&quot;&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 +&quot; can't be found.&quot;; // Or throw and error, or whatever you want...
  }
 }

 var tmpl = Liquid.parse(&quot;Include file ''myOtherTemplate' with current_user' contains invalid characters or sequences&quot;); 
 alert( tmpl.render({ current_user:'M@' }));
&amp;lt;/script&amp;gt;

&amp;lt;script type=&quot;text/liquid&quot; id=&quot;myOtherTemplate&quot;&amp;gt;
  Hello, !
&amp;lt;/script&amp;gt;

&lt;/code&gt;&lt;/pre&gt;</content>
 </entry>
 
 <entry>
   <title>Competitor Comedy</title>
   <link href="http://blog.leetsoft.com/2008/08/22/competitor-comedy.html"/>
   <updated>2008-08-22T16:14:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/08/22/competitor-comedy</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.shopify.com&quot;&gt;Shopify&lt;/a&gt; got profiled last week in Practical E-Commerce as &lt;a href=&quot;http://www.practicalecommerce.com/articles/800-Cart-Of-The-Week-Shopify&quot;&gt;cart of the week&lt;/a&gt; . According to them they found 300 different Shopping cart packages, I know our market was big but that&amp;#8217;s pretty insane.&lt;/p&gt;
&lt;p&gt;Anyways, their Cart of the Week feature pits one Cart against another by asking a competitor to comment on the software, &lt;span class=&quot;caps&quot;&gt;CNN&lt;/span&gt; style. In our case they asked Rick Wilson of Miva Merchant to comment on Shopify. Here is what he dislikes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The obvious weaknesses I saw were the limits on what they called ‘enterprise’ level offering of only 10,000 SKUs. The other major weakness is the product is built using Ruby On Rails. Ruby On Rails seems to be a development environment with a lot of future possibilities, &lt;strong&gt;but as a general rule you don’t want your revenue-generating product to be based on cutting edge technology. There’s a lot of unforeseeable pitfalls in that area.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(emphasis mine).&lt;/p&gt;
&lt;p&gt;So to deconstruct the first part of this argument let me just say that we have millions of products in Shopify right now and it&amp;#8217;s a pure business decision to limit SKUs to 10k and has nothing to do with the software. There are millions of products in the database. In fact i&amp;#8217;d buy Rick lunch if Shopify isn&amp;#8217;t right now handling twice the traffic any given Miva Merchant store has ever sustained.&lt;/p&gt;
&lt;p&gt;What&amp;#8217;s left is the advice that you shouldn&amp;#8217;t run a revenue-generating web site based on cutting edge technology. I don&amp;#8217;t think I have to point out how ridiculous that statement is. First of all I presume that perl was pretty cutting edge ( definitely more than ruby is today ) in 1998 when Miva was written and also we are talking about bloody Miva Merchant here, the e-commerce system that runs on a proprietary closed source database that is known for corruption issues after several hundred products. Not only that, it seems to be one of their main sources of revenue: For &lt;a href=&quot;http://www.mivamerchant.com/services/serviceclub/&quot;&gt;129$ setup + 20$ a month&lt;/a&gt; you can get some support and basic database recovery. Unfortunately:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;** Due to the nature of database problems not all database corruption can be covered under this package&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Isn&amp;#8217;t it nice that you never have to worry about such tactics with hosted systems and SaaS packages like Shopify?&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Rockstar Memcaching</title>
   <link href="http://blog.leetsoft.com/2008/07/21/rockstar-memcaching.html"/>
   <updated>2008-07-21T06:37:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/07/21/rockstar-memcaching</id>
   <content type="html">&lt;p&gt;I&amp;#8217;m back from &lt;a href=&quot;http://rethink.unspace.ca/2008/7/20/we-are-rubyfringe&quot;&gt;Rubyfringe&lt;/a&gt; which was hands down the best conference i&amp;#8217;ve been to.&lt;/p&gt;
&lt;p&gt;Pete Forde asked me to present on memcached (mem-cache-dee) after my popular blog article &lt;a href=&quot;http://blog.leetsoft.com/2007/5/22/the-secret-to-memcached&quot;&gt;Secret to memcached&lt;/a&gt;. The talk covers different use cases such as simple html snippet stores to advanced expiry systems such as generational cache keys.&lt;/p&gt;
&lt;p&gt;Every talk at rubyfringe was taped so I&amp;#8217;ll update this space with the video once its online. In the meantime enjoy the slides which probably make zero sense on their own.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.leetsoft.com/assets/2008/7/21/Rubyfringe.pdf&quot;&gt;Download the &lt;span class=&quot;caps&quot;&gt;PDF&lt;/span&gt;&lt;/a&gt; or watch it on slideshare:&lt;/p&gt;
&lt;div style=&quot;width:425px;text-align:left&quot; id=&quot;__ss_522177&quot;&gt;&lt;a style=&quot;font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;&quot; href=&quot;http://www.slideshare.net/guest807bb2/rubyfringe?src=embed&quot; title=&quot;Rubyfringe&quot;&gt;Rubyfringe&lt;/a&gt;&lt;object style=&quot;margin:0px&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slideshare.net/swf/ssplayer2.swf?doc=rubyfringe-1216650794678661-8&quot;/&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed src=&quot;http://static.slideshare.net/swf/ssplayer2.swf?doc=rubyfringe-1216650794678661-8&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style=&quot;font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;&quot;&gt;view &lt;a href=&quot;http://www.slideshare.net/guest807bb2/rubyfringe?src=embed&quot; title=&quot;View Rubyfringe on SlideShare&quot;&gt;presentation&lt;/a&gt; (tags: &lt;a style=&quot;text-decoration:underline;&quot; href=&quot;http://slideshare.net/tag/memcached&quot;&gt;memcached&lt;/a&gt; &lt;a style=&quot;text-decoration:underline;&quot; href=&quot;http://slideshare.net/tag/ruby&quot;&gt;ruby&lt;/a&gt; &lt;a style=&quot;text-decoration:underline;&quot; href=&quot;http://slideshare.net/tag/code&quot;&gt;code&lt;/a&gt; &lt;a style=&quot;text-decoration:underline;&quot; href=&quot;http://slideshare.net/tag/talk&quot;&gt;talk&lt;/a&gt;)&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;P.S: 30 minute is the ideal length for talks at a Tech Conference.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; The video was &lt;a href=&quot;http://www.infoq.com/presentations/lutke-rockstar-memcaching&quot;&gt;posted here&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Shopify Sys Admin</title>
   <link href="http://blog.leetsoft.com/2008/07/07/shopify-sys-admin.html"/>
   <updated>2008-07-07T16:41:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/07/07/shopify-sys-admin</id>
   <content type="html">&lt;p&gt;If you love servers you should consider applying for our &lt;a href=&quot;http://jobs.37signals.com/jobs/4002&quot;&gt;system administrator position&lt;/a&gt; . Flexible work hours and you get to work with all the coolest and latest technologies and a fantastic team.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://jobs.37signals.com/jobs/4002&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2008/7/7/job.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>One million integers?!</title>
   <link href="http://blog.leetsoft.com/2008/07/07/one-million-integers.html"/>
   <updated>2008-07-07T00:09:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/07/07/one-million-integers</id>
   <content type="html">&lt;p&gt;This is a great general purpose interview tip:&lt;/p&gt;
&lt;p&gt;If you don&amp;#8217;t know how to answer a question because it&amp;#8217;s way outside of your &lt;br /&gt;
expertise simply give it your best guess and negate the question.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=k4RRi_ntQc8&quot;&gt;via youtube&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;object width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/k4RRi_ntQc8&amp;hl=en&amp;fs=1&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/k4RRi_ntQc8&amp;hl=en&amp;fs=1&quot; type=&quot;application/x-shockwave-flash&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;344&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;This can sometimes have pretty impressive results.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Gecko/Webkit Screenshots</title>
   <link href="http://blog.leetsoft.com/2008/05/17/gecko-webkit-screenshots.html"/>
   <updated>2008-05-17T13:07:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/05/17/gecko-webkit-screenshots</id>
   <content type="html">&lt;p&gt;For our &lt;a href=&quot;http://search.shopify.com/search?q=Surfing&amp;amp;min=&amp;amp;max=&amp;amp;limit=16&quot;&gt;Shopify Product Search&lt;/a&gt; we needed a good way to Screenshot web pages. There are some services on the web for this but we ended up building it but none of them fit our needs. They were either way to expensive, they didn&amp;#8217;t produce nearly the quality we needed or they didn&amp;#8217;t offer an &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; at all.&lt;/p&gt;
&lt;p&gt;Our solution was to install a headless X server in our server farm which runs firefox 2.0. We used a python &lt;span class=&quot;caps&quot;&gt;GTK&lt;/span&gt; automation script which navigates the Firefox instance to the page and then dumps the framebuffer into a png file when done. This works well enough but i&amp;#8217;d like something more robust for a different project.&lt;/p&gt;
&lt;p&gt;Ideally I&amp;#8217;d like someone to build a screenshot tool based on Gecko or Webkit which can simply take an url and spit out an png. A dependency on an running X server is acceptable but I&amp;#8217;d rather not have it running all the time because it complicates deployment a lot. It has to run on Linux and must not depend on a shared global resource, i.e. you should be able to take two screenshots at the same time.&lt;/p&gt;
&lt;p&gt;If you know of a tool like the one I describe or if you think you could build something like this for me please &lt;a href=&quot;mailto:tobi@leetsoft.com&quot;&gt;contact me&lt;/a&gt;. This may be paid open source work.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Twitter</title>
   <link href="http://blog.leetsoft.com/2008/05/08/twitter.html"/>
   <updated>2008-05-08T22:13:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/05/08/twitter</id>
   <content type="html">&lt;p&gt;I need more &lt;a href=&quot;http://twitter.com/tobi&quot;&gt;followers on twitter&lt;/a&gt; :-)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Canadian Citizenship</title>
   <link href="http://blog.leetsoft.com/2008/05/05/canadian-citizenship.html"/>
   <updated>2008-05-05T14:04:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/05/05/canadian-citizenship</id>
   <content type="html">&lt;p&gt;Today I got my Canadian citizenship.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2008/5/5/beaver_72.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Both Germany and Canada allow multiple citizenships so I&amp;#8217;m allowed to carry both.&lt;br /&gt;
Geographical redundancy accomplished. Next step is to apply for my Canadian passport so that I can instant failover :-)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Take the &lt;a href=&quot;http://www.yourlibrary.ca/citizenship/&quot;&gt;citizenship test&lt;/a&gt; yourself and post your score in the comments.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Database situps</title>
   <link href="http://blog.leetsoft.com/2008/04/22/database-situps.html"/>
   <updated>2008-04-22T09:45:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/04/22/database-situps</id>
   <content type="html">&lt;p&gt;Todd Hoff in his love letter to &lt;a href=&quot;http://highscalability.com/search-source-data-how-simpledb-differs-rdbms&quot;&gt;Amazon&amp;#8217;s SimpleDB&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SimpleDB shifts work out of the database and onto programmers which is why the SimpleDB programming model sucks: it requires a lot more programming to do simple things. I&amp;#8217;ll argue however that this is the kind of suckiness programmers like. Programmers like problems they can solve with more programming. We don&amp;#8217;t even care how twisted and inelegant the code is because we can make it work. And as long as we can make it work we are happy.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I can&amp;#8217;t think of what drove him to write this. This argument is directly contradicted by the success of Rails.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Active Shipping</title>
   <link href="http://blog.leetsoft.com/2008/04/21/active-shipping.html"/>
   <updated>2008-04-21T14:36:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/04/21/active-shipping</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://jmacaulay.net/&quot;&gt;James&lt;/a&gt; released his development version of &lt;a href=&quot;http://github.com/shopify/active_shipping/tree/master&quot;&gt;Active Shipping to github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Active Shipping does what Active Merchant did for payment gateways: Provide one unified &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; to talk to all the Parcel Services on the web. Given a weight, a to and a from address you can calculate the Shipping costs of every supported Shipping Service. All the complexity of the task is handled by the library.&lt;/p&gt;
&lt;p&gt;Active Shipping has been in production use with &lt;a href=&quot;http://www.shopify.com&quot;&gt;Shopify&lt;/a&gt; since the beginning of the year.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;: &lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
require 'active_shipping'
include ActiveMerchant::Shipping&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Package up a poster and a Wii for your nephew.&lt;br /&gt;
packages = [&lt;br /&gt;
  Package.new(  100,                        # 100 grams&lt;br /&gt;
                [93,10],                    # 93 cm long, 10 cm diameter&lt;br /&gt;
                :cylinder =&amp;gt; true),         # cylinders have different volume calculations&lt;/li&gt;
&lt;/ol&gt;
Package.new(  (7.5 * 16),                 # 7.5 lbs, times 16 oz/lb.
[15, 10, 4.5],              # 15&amp;#215;10&amp;#215;4.5 inches
:units =&amp;gt; :imperial)        # not grams, not centimetres
&lt;p&gt;]&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;You live in Beverly Hills, he lives in Ottawa&lt;br /&gt;
origin = Location.new(      :country =&amp;gt; &amp;#8216;US&amp;#8217;,&lt;br /&gt;
                            :state =&amp;gt; &amp;#8216;CA&amp;#8217;,&lt;br /&gt;
                            :city =&amp;gt; &amp;#8216;Beverly Hills&amp;#8217;,&lt;br /&gt;
                            :zip =&amp;gt; &amp;#8216;90210&amp;#8217;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;destination = Location.new( :country =&amp;gt; &amp;#8216;CA&amp;#8217;,&lt;br /&gt;
                            :province =&amp;gt; &amp;#8216;ON&amp;#8217;,&lt;br /&gt;
                            :city =&amp;gt; &amp;#8216;Ottawa&amp;#8217;,&lt;br /&gt;
                            :postal_code =&amp;gt; &amp;#8216;K1P 1J1&amp;#8217;)&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Find out how much it&amp;#8217;ll be.&lt;br /&gt;
ups = &lt;span class=&quot;caps&quot;&gt;UPS&lt;/span&gt;.new(:login =&amp;gt; &amp;#8216;auntjudy&amp;#8217;, :password =&amp;gt; &amp;#8216;secret&amp;#8217;, :key =&amp;gt; &amp;#8216;xml-access-key&amp;#8217;)&lt;br /&gt;
response = ups.find_rates(origin, destination, packages)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ups_rates = response.rates.sort_by(&amp;amp;:price).collect {|rate| [rate.service_name, rate.price]}&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;=&amp;gt; [[&amp;#8220;&lt;span class=&quot;caps&quot;&gt;UPS&lt;/span&gt; Standard&amp;#8221;, 3936],&lt;/li&gt;
	&lt;li&gt;[&amp;#8220;&lt;span class=&quot;caps&quot;&gt;UPS&lt;/span&gt; Worldwide Expedited&amp;#8221;, 8682],&lt;/li&gt;
	&lt;li&gt;[&amp;#8220;&lt;span class=&quot;caps&quot;&gt;UPS&lt;/span&gt; Saver&amp;#8221;, 9348],&lt;/li&gt;
	&lt;li&gt;[&amp;#8220;&lt;span class=&quot;caps&quot;&gt;UPS&lt;/span&gt; Express&amp;#8221;, 9702],&lt;/li&gt;
	&lt;li&gt;[&amp;#8220;&lt;span class=&quot;caps&quot;&gt;UPS&lt;/span&gt; Worldwide Express Plus&amp;#8221;, 14502]]&lt;/li&gt;
&lt;/ol&gt;
&lt;ol&gt;
	&lt;li&gt;Check out &lt;span class=&quot;caps&quot;&gt;USPS&lt;/span&gt; for comparison&amp;#8230;&lt;br /&gt;
usps = &lt;span class=&quot;caps&quot;&gt;USPS&lt;/span&gt;.new(:login =&amp;gt; &amp;#8216;developer-key&amp;#8217;)&lt;br /&gt;
response = usps.find_rates(origin, destination, packages)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;usps_rates = response.rates.sort_by(&amp;amp;:price).collect {|rate| [rate.service_name, rate.price]}&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;=&amp;gt; [[&amp;#8220;&lt;span class=&quot;caps&quot;&gt;USPS&lt;/span&gt; Priority Mail International&amp;#8221;, 4110],&lt;/li&gt;
	&lt;li&gt;[&amp;#8220;&lt;span class=&quot;caps&quot;&gt;USPS&lt;/span&gt; Express Mail International (&lt;span class=&quot;caps&quot;&gt;EMS&lt;/span&gt;)&amp;#8221;, 5750],&lt;/li&gt;
	&lt;li&gt;[&amp;#8220;&lt;span class=&quot;caps&quot;&gt;USPS&lt;/span&gt; Global Express Guaranteed Non-Document Non-Rectangular&amp;#8221;, 9400],&lt;/li&gt;
	&lt;li&gt;[&amp;#8220;&lt;span class=&quot;caps&quot;&gt;USPS&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;GXG&lt;/span&gt; Envelopes&amp;#8221;, 9400],&lt;/li&gt;
	&lt;li&gt;[&amp;#8220;&lt;span class=&quot;caps&quot;&gt;USPS&lt;/span&gt; Global Express Guaranteed Non-Document Rectangular&amp;#8221;, 9400],&lt;/li&gt;
	&lt;li&gt;[&amp;#8220;&lt;span class=&quot;caps&quot;&gt;USPS&lt;/span&gt; Global Express Guaranteed&amp;#8221;, 9400]]&lt;br /&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;</content>
 </entry>
 
 <entry>
   <title>Git and Capistrano</title>
   <link href="http://blog.leetsoft.com/2008/04/15/git-and-capistrano.html"/>
   <updated>2008-04-15T18:45:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/04/15/git-and-capistrano</id>
   <content type="html">&lt;p&gt;Git support in the latest capistrano works very well but there are two gotcha&amp;#8217;s I ran into, i&amp;#8217;ll document them here so that Google can pick it up.&lt;/p&gt;
&lt;p&gt;The first problem was the bizarre error message I got when I forgot to push my changes to the deployment repository:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
 ** [err] Needed a single revision
 ** [err] Needed a single revision
 [...]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Needed a single revision, well then. Git seems to use the rare other meaning of &amp;#8220;single&amp;#8221; which means &amp;#8220;existing&amp;#8221; or &amp;#8220;valid&amp;#8221;.&lt;/p&gt;
&lt;p&gt;The other problem was harder to track down. Capistrano would simply hang forever after the update_code task. It would also leave the cached_copy directories in a totally invalid state on some servers which required manual rm -rf. Thanks go to Scott Raymond on &lt;a href=&quot;http://twitter.com/sco/statuses/788416848&quot;&gt;Twitter&lt;/a&gt; for pointing me in the right direction. It seems that we have too many App servers for a stock sshd_config and It triggers some kind of throttling logic which git cannot deal with.&lt;/p&gt;
&lt;p&gt;If you are deploying to medium to large server farms better head over to your git box and increase the &lt;code&gt;MaxStartups&lt;/code&gt; now.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
MaxStartups 10000:1:10000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This solves the problem.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Work on Shopify</title>
   <link href="http://blog.leetsoft.com/2008/04/10/work-on-shopify.html"/>
   <updated>2008-04-10T22:44:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/04/10/work-on-shopify</id>
   <content type="html">&lt;p&gt;Are you in Ottawa, Canada or willing to relocate? &lt;br /&gt;
Want to work in the coolest office in town? Would you like to work on a high profile rails application with millions of users? &lt;br /&gt;
Do you want to work with some of the best rails programmers out there?&lt;/p&gt;
&lt;p&gt;Please email me at &lt;a href=&quot;mailto:tobi@jadedpixel.com&quot;&gt;tobi@jadedpixel.com&lt;/a&gt;. &lt;br /&gt;
Please include a piece of code you are especially proud of or point me to some of your open source work. If you include a CV please attach it as &lt;span class=&quot;caps&quot;&gt;PDF&lt;/span&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Wtf?</title>
   <link href="http://blog.leetsoft.com/2008/04/10/wtf.html"/>
   <updated>2008-04-10T22:17:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/04/10/wtf</id>
   <content type="html">&lt;pre&gt;&lt;code&gt;
if false
  var = nil
end

p var.nil? #=&amp;gt; true ??? 
&lt;/code&gt;&lt;/pre&gt;</content>
 </entry>
 
 <entry>
   <title>On Return</title>
   <link href="http://blog.leetsoft.com/2008/04/03/on-return.html"/>
   <updated>2008-04-03T12:49:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/04/03/on-return</id>
   <content type="html">&lt;p&gt;ActiveSupport has this really nice returning tool. It allows you to rewrite the common pattern of initialization and returning a object from am method like this:&lt;/p&gt;
&lt;pre&gt;
returning something = Thing.new do
  something.this
  something.that
end
&lt;/pre&gt;
&lt;p&gt;We were wondering if there may be a performance issue with the tool so a quick benchmark showed the following:&lt;/p&gt;
&lt;pre&gt;
                                          user     system      total        real
def n; i = 0; return i; end           0.510000   0.000000   0.510000 (  0.520417)
def n; i = 0; i ; end                 0.340000   0.000000   0.340000 (  0.344569)
def n; returning i = 0 do; end; end   0.730000   0.000000   0.730000 (  0.726853)

&lt;/pre&gt;
&lt;p&gt;Those numbers are after 1m runs on a core 2 duo laptop. As you can see the difference is very minor. Code vanity can safely prevail. &lt;a href=&quot;http://pastie.caboo.se/174661&quot;&gt;Full Benchmark&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Shopify stores are gorgeous</title>
   <link href="http://blog.leetsoft.com/2008/03/25/shopify-stores-are-gorgeous.html"/>
   <updated>2008-03-25T09:00:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/03/25/shopify-stores-are-gorgeous</id>
   <content type="html">&lt;p&gt;The quality of &lt;a href=&quot;http://www.shopify.info&quot;&gt;Shopify&lt;/a&gt; stores being launched every day really boggles my mind. Just look at those 3 most recent examples:&lt;/p&gt;
&lt;div class=&quot;shop&quot;&gt;
        &lt;div class=&quot;shop-thumb&quot;&gt;&lt;a href=&quot;http://www.clothmoth.net/&quot;&gt;&lt;img src=&quot;http://jadedpixel.com/assets/2008/3/19/wwwclothmothnet-clipped.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
        &lt;p&gt;ClothMoth&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;shop&quot;&gt;
        &lt;div class=&quot;shop-thumb&quot;&gt;&lt;a href=&quot;http://www.ziprc.com/&quot;&gt;&lt;img src=&quot;http://jadedpixel.com/assets/2008/3/17/wwwziprccom-clipped.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
        &lt;p&gt;ZipRC&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;shop&quot;&gt;
        &lt;div class=&quot;shop-thumb&quot;&gt;&lt;a href=&quot;http://www.destinative.com/&quot;&gt;&lt;img src=&quot;http://jadedpixel.com/assets/2008/3/17/wwwdestinativecom-clipped.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
        &lt;p&gt;Destinative&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If you like pretty stores, i recommend subscribing to the &lt;a href=&quot;http://www.jadedpixel.com/shop-of-the-moment&quot;&gt;Shop of the moment&lt;/a&gt; feature or head over to our &lt;a href=&quot;http://www.shopify.info/screenshots/&quot;&gt;http://www.shopify.info/screenshots/&lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;Speaking of which, our screenshot page is actually powered from the &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feed of the Shop of the moment category on our blog.   Shopify.info is powered by radiant and we use the &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; Reader extension with some minor modifications and some clever &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;. This is a great example of how we can reduce content production work by re-using various &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feeds. Another example of this is our feature page where we list all the Payment gateways Shopify currently supports. This comes straight from a &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feed generated by the Shopify application and so it&amp;#8217;s automatically always up-to-date.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Money as debt</title>
   <link href="http://blog.leetsoft.com/2008/03/24/money-as-debt.html"/>
   <updated>2008-03-24T11:41:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/03/24/money-as-debt</id>
   <content type="html">&lt;blockquote&gt;
&lt;p&gt;Paul Grignon&amp;#8217;s 47-minute animated presentation of &amp;#8220;Money as Debt&amp;#8221; tells in very simple and effective graphic terms what money is and how it is being created.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://video.google.ca/videoplay?docid=-9050474362583451279&quot;&gt;via google video&lt;/a&gt; :&lt;/p&gt;
&lt;p&gt;&lt;embed style=&quot;width:400px; height:326px;&quot; id=&quot;VideoPlayback&quot; type=&quot;application/x-shockwave-flash&quot; src=&quot;http://video.google.com/googleplayer.swf?docId=-9050474362583451279&amp;hl=en-CA&quot; flashvars=&quot;&quot;&gt; &lt;/embed&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>many many DJs</title>
   <link href="http://blog.leetsoft.com/2008/03/23/many-many-djs.html"/>
   <updated>2008-03-23T11:16:00-07:00</updated>
   <id>http://blog.leetsoft.com/2008/03/23/many-many-djs</id>
   <content type="html">&lt;p&gt;I just checked in a new version of the &lt;a href=&quot;http://github.com/tobi/delayed_job/tree/master&quot;&gt;delayed_job plugin&lt;/a&gt; which handles background processing of long running tasks in Shopify.&lt;/p&gt;
&lt;p&gt;DJ is now fully parallelizable and does not require any global locking anymore. This means that you can run as many worker processes as you want across your server farm if you need to speed up the queue processing.&lt;/p&gt;
&lt;p&gt;This became necessary when we kicked off a full search server reindex recently and realized that a single worker process would require 48 hours to complete the task. Such is the burden of success.&lt;/p&gt;
&lt;p&gt;This feature is DB independent and doesn&amp;#8217;t rely on row level locking. I found that row level locking lead to a lot of unnecessary lock timeout waits. If you are updating from the previous version of the plugin please be advised that there are two new columns you have to add.&lt;/p&gt;
&lt;p&gt;Grab the latest version form &lt;a href=&quot;http://github.com/tobi/delayed_job/tree/master&quot;&gt;http://github.com/tobi/delayed_job/tree/master&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Mysql Locking</title>
   <link href="http://blog.leetsoft.com/2008/03/06/mysql-locking.html"/>
   <updated>2008-03-06T12:31:00-08:00</updated>
   <id>http://blog.leetsoft.com/2008/03/06/mysql-locking</id>
   <content type="html">&lt;p&gt;Small plugin for using the global lock service of mysql in your rails app: &lt;a href=&quot;http://github.com/tobi/locking/tree/master&quot;&gt;Locking plugin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Great if you have long running cron tasks or require exclusive access to some resources.&lt;/p&gt;
&lt;p&gt;Example:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
Invoice.acquire_lock(&quot;Shopify billing&quot;) do&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Can only run once across your server farm&lt;br /&gt;
  Invoice.find_all_due.each { |invoice| invoice.collect_payment! } &lt;br /&gt;
end&lt;br /&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;</content>
 </entry>
 
 <entry>
   <title>Shopify SCM</title>
   <link href="http://blog.leetsoft.com/2008/02/17/shopify-scm.html"/>
   <updated>2008-02-17T18:21:00-08:00</updated>
   <id>http://blog.leetsoft.com/2008/02/17/shopify-scm</id>
   <content type="html">&lt;p&gt;So we went from Darcs &amp;#8594; &lt;span class=&quot;caps&quot;&gt;SVN&lt;/span&gt; &amp;#8594; Mercurial &amp;#8594; Git in just over 3 years and without losing a single commit in the process. 4th one is a real winner though. If you don&amp;#8217;t use git yet you should really check it out.&lt;/p&gt;
&lt;p&gt;If you are unfamiliar with &lt;span class=&quot;caps&quot;&gt;GIT&lt;/span&gt;, I recommend watching &lt;a href=&quot;http://peepcode.com/products/git&quot;&gt;Peepcode&amp;#8217;s introduction&lt;/a&gt;. We have a site-license for peepcode at jadedPixel and often run the latest screencasts on the big &lt;span class=&quot;caps&quot;&gt;LCD&lt;/span&gt; in the office during lunch break. Its great.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Delayed Job (DJ)</title>
   <link href="http://blog.leetsoft.com/2008/02/17/delayed-job-dj.html"/>
   <updated>2008-02-17T18:04:00-08:00</updated>
   <id>http://blog.leetsoft.com/2008/02/17/delayed-job-dj</id>
   <content type="html">&lt;p&gt;I finally got a &lt;a href=&quot;http://www.github.com&quot;&gt;github&lt;/a&gt; invitation and used the opportunity to release another  &lt;a href=&quot;http://www.shopify.info&quot;&gt;Shopify&lt;/a&gt; extractions.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://github.com/tobi/delayed_job/tree/master&quot;&gt;Delayed::Job&lt;/a&gt; or &lt;a href=&quot;http://github.com/tobi/delayed_job/tree/master&quot;&gt;DJ&lt;/a&gt; is a asynchronous priority queue which only relies on a simple database table. It doesn&amp;#8217;t require you to run a dedicated server like many other systems do.&lt;/p&gt;
&lt;p&gt;We use for a lot of longer running tasks in Shopify such as sending newsletters, uploading files to s3, downloading images from urls, indexing products to &lt;a href=&quot;http://lucene.apache.org/solr/&quot;&gt;Solr&lt;/a&gt; and so on.&lt;/p&gt;
&lt;p&gt;There are two ways to add jobs to the queue:&lt;/p&gt;
&lt;p&gt;Jobs are simple ruby objects with a method called perform. Any object which responds to perform can be stuffed into the jobs table.&lt;br /&gt;
Job objects are serialized to yaml so that they can later be resurrected by the job runner.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
  class NewsletterJob &amp;lt; Struct.new(:text, :emails)
    def perform
      emails.each { |e| NewsletterMailer.deliver_text_to_email(text, e) }
    end    
  end  
  
  Delayed::Job.enqueue NewsletterJob.new('lorem ipsum...', Customers.find(:all).collect(&amp;amp;:email))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There is also a second way to get jobs in the queue: send_later.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
  BatchImporter.new(Shop.find(1)).send_later(:import_massive_csv, massive_csv)                                                    
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will simply create a Delayed::PerformableMethod job in the jobs table which serializes all the parameters you pass to it. There are some special smarts for active record objects&lt;br /&gt;
which are stored as their text representation and loaded from the database fresh when the job is actually run later.&lt;/p&gt;
&lt;p&gt;The plugin can be &lt;a href=&quot;http://github.com/tobi/delayed_job/tree/master&quot;&gt;found on github&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>ActiveMerchant PDF</title>
   <link href="http://blog.leetsoft.com/2008/01/29/activemerchant-pdf.html"/>
   <updated>2008-01-29T20:07:00-08:00</updated>
   <id>http://blog.leetsoft.com/2008/01/29/activemerchant-pdf</id>
   <content type="html">&lt;p&gt;If you are working on a ruby application that requires dealing with credit cards, you are probably using &lt;a href=&quot;http://www.activemerchant.org&quot;&gt;ActiveMerchant&lt;/a&gt;. If not, you probably didn&amp;#8217;t know about ActiveMerchant.&lt;/p&gt;
&lt;p&gt;ActiveMerchant is an extraction from &lt;a href=&quot;http://www.shopify.info&quot;&gt;Shopify&lt;/a&gt;. It&amp;#8217;s a simple to use library which translates one common interface into the wire language of 30-40 different payment processors around the globe with more added at rapid pace. As long as your application can talk to active merchant you can switch payment providers with a single line of code.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://peepcode.com/products/activemerchant-pdf&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2008/1/29/activemerchant-cover.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Treat yourself to Cody Fauser&amp;#8217;s excellent &lt;a href=&quot;http://peepcode.com/products/activemerchant-pdf&quot;&gt;ActiveMerchant PeepCode &lt;span class=&quot;caps&quot;&gt;PDF&lt;/span&gt;&lt;/a&gt; which is an in depth discussion about the library and covers topics such as order pipelines, order state management and the appropiate unit testing which a financial application requires.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.codyfauser.com&quot;&gt;Cody&lt;/a&gt; is the main programmer ActiveMerchant which I originally started. Cody took the library further than anything I envisioned and it&amp;#8217;s now one of the most competent libraries for ruby.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Shopify Brochure Page</title>
   <link href="http://blog.leetsoft.com/2008/01/28/shopify-brochure-page.html"/>
   <updated>2008-01-28T14:31:00-08:00</updated>
   <id>http://blog.leetsoft.com/2008/01/28/shopify-brochure-page</id>
   <content type="html">&lt;p style=&quot;float:right;&quot;&gt;&lt;a href=&quot;http://www.shopify.info&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2008/1/28/Shopify.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.troubleseeker.com&quot;&gt;Daniel&lt;/a&gt;, our designer, has just posted the redesign of the &lt;a href=&quot;http://www.shopify.info&quot;&gt;Shopify brochure page&lt;/a&gt;. The new version features a video overview of some of Shopify&amp;#8217;s features, as well as profiles and interviews with some of Shopify&amp;#8217;s clients such as &lt;a href=&quot;http://www.shopify.info/clients/tesla-motors/&quot;&gt;Tesla Motors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A Shop in minutes, a business for life; If you&amp;#8217;re in the market for an e-commerce store or if you&amp;#8217;re into eye candy then you&amp;#8217;ll definitely want to go and check it out.&lt;/p&gt;
&lt;div style=&quot;clear:both&quot;&gt;&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Compiling ThruDB on OSX</title>
   <link href="http://blog.leetsoft.com/2007/12/31/compiling-thrudb-on-osx.html"/>
   <updated>2007-12-31T15:09:00-08:00</updated>
   <id>http://blog.leetsoft.com/2007/12/31/compiling-thrudb-on-osx</id>
   <content type="html">&lt;p&gt;After successfully &lt;a href=&quot;http://blog.leetsoft.com/2007/12/30/compiling-thrift-on-osx&quot;&gt;installing thrift&lt;/a&gt; there are still a string of dependencies needed before you can install ThruDB.&lt;/p&gt;
&lt;p&gt;Thanks in no small part to &lt;a href=&quot;http://3.rdrail.net/blog/&quot;&gt;Jake Luciani&lt;/a&gt; for helping me with finding the dependencies.&lt;/p&gt;
&lt;h3&gt;MacPorts&lt;/h3&gt;
&lt;p&gt;First we need several packages from the macports. You may want to run &lt;code&gt;sudo port selfupdate&lt;/code&gt; to get the latest versions of those packages.&lt;/p&gt;
&lt;pre&gt;

sudo port install boost clucene libevent memcached ossp-uuid
&lt;/pre&gt;
&lt;p&gt;I hit a weird compile error on boost. I fixed it by running &lt;code&gt;sudo port clean boost&lt;/code&gt; and simply re-running the port install command. Same problem on both my machines.&lt;/p&gt;
&lt;h3&gt;Manual dependencies&lt;/h3&gt;
&lt;p&gt;Like mentioned above, we need facebook&amp;#8217;s thrift. We will their public &lt;span class=&quot;caps&quot;&gt;SVN&lt;/span&gt; version because this fixes a bug which makes compiling on &lt;span class=&quot;caps&quot;&gt;OSX&lt;/span&gt; easier.&lt;/p&gt;
&lt;pre&gt;
svn co http://svn.facebook.com/svnroot/thrift/trunk/ thrift
cd thrift; ./bootstrap.sh
./configure --with-boost=/opt/local --with-libevent=/opt/local --prefix=/opt/local
sudo make install
&lt;/pre&gt;
&lt;p&gt;Don&amp;#8217;t forget to install the thrift ruby libraries:&lt;/p&gt;
&lt;pre&gt;
cd thrift/lib/rb
ruby setup.rb
&lt;/pre&gt;
&lt;p&gt;Next we need &lt;a href=&quot;http://www.spread.org&quot;&gt;spread&lt;/a&gt;. Spread is a message bus which works much like you imagine a network of &lt;span class=&quot;caps&quot;&gt;IRC&lt;/span&gt; server to work. ThruDB uses it for replication and two-phase commits amongst other things. Its a remarkable piece of software which should find its way in most server farms, regardless of ThruDB&amp;#8217;s use or not. Once common usecase is to broadcast server logs to spread. This allows you to write a simple client which just listens to the messages and calculates user statistics, traffic and so on. Its also great for replication and keeping multiple systems in sync, such as a search server and the main database.&lt;/p&gt;
&lt;p&gt;Unfortunately the spread team decided that everyone who wants to install it has to fill out a quick form so you will have to manually download it from &lt;a href=&quot;http://www.spread.org/download/spread-src-4.0.0.tar.gz&quot;&gt;http://www.spread.org/download/spread-src-4.0.0.tar.gz&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;
tar zxf spread-src-4.0.0
./configure --prefix=/opt/local 
make
sudo make install
&lt;/pre&gt;
&lt;p&gt;ThruDB makes heavy usage of memcached, therefore it uses the up-and-coming c library by Brian Aker which is quickly establishing itself as the defacto standard client implementation due to its speed and use of &lt;a href=&quot;http://en.wikipedia.org/wiki/Consistent_hashing&quot;&gt;Consistent Hashing&lt;/a&gt;. I actually wrote a ruby extension for this client library with some &lt;a href=&quot;http://pastie.caboo.se/pastes/133285&quot;&gt;very encouraging performance metrics&lt;/a&gt;. I hope to release this soon.&lt;/p&gt;
&lt;pre&gt;
curl http://download.tangent.org/libmemcached-0.12.tar.gz &amp;gt; libmemcached-0.12.tar.gz
tar zxf libmemcached-0.12.tar.gz
cd libmemcached-0.12
./configure --prefix=/opt/local
sudo make install
&lt;/pre&gt;
&lt;p&gt;Lastly there is log4cxx to be installed. This is a pretty heavy library because of its use of apache apr. Jake said that he may dump it in an upcoming release to make the dependencies of ThruDB a bit more sane.&lt;/p&gt;
&lt;pre&gt;
svn checkout http://svn.apache.org/repos/asf/logging/log4cxx/trunk apache-log4cxx
cd apache-log4cxx
./autogen.sh
./configure --prefix=/opt/local
sudo make install
&lt;/pre&gt;
&lt;h3&gt;Compiling ThruDB&lt;/h3&gt;
&lt;pre&gt;
svn co http://thrudb.googlecode.com/svn/trunk thrudb
cd thrudb; ./autogen.sh
env LDFLAGS=&quot;-L/opt/local/lib&quot; CPPFLAGS=&quot;-I/opt/local/lib -I/opt/local/include -I/opt/local/include/thrift&quot; ./configure --prefix=/opt/local
sudo make install
&lt;/pre&gt;
&lt;p&gt;If the compile fails with a missing thriftnb library than you didn&amp;#8217;t compile thrift with &amp;#8212;with-libevent=/opt/local . Just do that again, we&amp;#8217;ll wait.&lt;/p&gt;
&lt;h3&gt;ThruDB &amp;amp; ruby.&lt;/h3&gt;
&lt;pre&gt;
# Run memcached server
memcached -d
# Setup lib shenanigans
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/opt/local/lib/

#run thrudb tutorials
cd tutorial

# create the ruby client for the bookmarks.thrift service
make

# start thrudb
./thrudbctl start

# run the tutorial
cd rb; ruby BookmarkExample.rb 

# Profit! (to quote Jake) 
&lt;/pre&gt;</content>
 </entry>
 
 <entry>
   <title>Compiling Thrift on OSX</title>
   <link href="http://blog.leetsoft.com/2007/12/30/compiling-thrift-on-osx.html"/>
   <updated>2007-12-30T14:30:00-08:00</updated>
   <id>http://blog.leetsoft.com/2007/12/30/compiling-thrift-on-osx</id>
   <content type="html">&lt;p&gt;Compiling &lt;a href=&quot;http://developers.facebook.com/thrift/&quot;&gt;thrift&lt;/a&gt; on &lt;span class=&quot;caps&quot;&gt;OSX&lt;/span&gt; can be a bit of a hassle because of some &lt;span class=&quot;caps&quot;&gt;POSIX&lt;/span&gt; discrepancies.&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;ruby&quot;&gt;
sudo port install boost 

tar xfz thrift-*
cd thirft-*
curl http://blog.leetsoft.com/files/patches/thrift.patch | patch -p1
./configure --with-boost=/opt/local  --prefix=/opt/local
make
sudo make install 

&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Installing from &lt;span class=&quot;caps&quot;&gt;SVN&lt;/span&gt; is doesn&amp;#8217;t require the patch above so I&amp;#8217;m recommending to do that now:&lt;/p&gt;
&lt;pre&gt;
svn co http://svn.facebook.com/svnroot/thrift/trunk/ thrift
cd thrift; sh bootstrap.sh
./configure --with-boost=/opt/local --with-libevent=/opt/local --prefix=/opt/local
sudo make install
&lt;/pre&gt;
&lt;p&gt;To install the ruby libs for thrift simply do:&lt;/p&gt;
&lt;pre&gt;
cd lib/rb
ruby setup.rb
&lt;/pre&gt;</content>
 </entry>
 
 <entry>
   <title>Futuretalk: ThruDB</title>
   <link href="http://blog.leetsoft.com/2007/12/28/futuretalk-thrudb.html"/>
   <updated>2007-12-28T14:36:00-08:00</updated>
   <id>http://blog.leetsoft.com/2007/12/28/futuretalk-thrudb</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.igvita.com&quot;&gt;Igvita&lt;/a&gt; shares the details on &lt;a href=&quot;http://code.google.com/p/thrudb/&quot;&gt;ThruDB&lt;/a&gt;, another take on the document storage paradigm.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.igvita.com/2007/12/28/thrudb-faster-and-cheaper-than-simpledb/&quot;&gt;Article: ThruDB, faster and cheaper than SimpleDB&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The architecture sound incredible. Amongst others there is the rank and file of the high scalability open source software such as &lt;a href=&quot;http://www.danga.com/memcached/&quot;&gt;memcached&lt;/a&gt;, &lt;a href=&quot;http://www.spread.org/&quot;&gt;spread&lt;/a&gt;, &lt;a href=&quot;http://sourceforge.net/projects/clucene/&quot;&gt;CLucene&lt;/a&gt; and facebook&amp;#8217;s newcomer &lt;a href=&quot;http://developers.facebook.com/thrift/&quot;&gt;thrift&lt;/a&gt; for wire protocols.&lt;/p&gt;
&lt;p&gt;ThruDB is able to use &lt;a href=&quot;http://www.amazon.com/gp/browse.html?node=16427261&quot;&gt;Amazon S3&lt;/a&gt; as a permanent data store which makes it an ideal fit for &lt;a href=&quot;http://www.amazon.com/b/ref=sc_fe_l_2?ie=UTF8&amp;amp;node=201590011&amp;amp;no=3435361&amp;amp;me=A36L942TSJ2AJA&quot;&gt;EC2&lt;/a&gt; installations. For quick document access its able to utilize the local disks and even memcached.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2007/12/28/thrudoc_memcached.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Everything about ThruDB&amp;#8217;s design is genius. The innovation here is that it separates the concerns of permanent document storage and querys. For querying documents it uses the lucene fulltext search engine. CLucene is naturally more suited for the requirements of a web application. &lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt; cannot compete with the quality and features of lucene for query and lookup.&lt;/p&gt;
&lt;p&gt;In the end you have something more safe, more scalable and much faster than a traditional &lt;span class=&quot;caps&quot;&gt;RBMS&lt;/span&gt; with the added benefit of &lt;strong&gt;world class full text search&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Cheers &lt;a href=&quot;http://3.rdrail.net/blog/&quot;&gt;Jake&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Startup help</title>
   <link href="http://blog.leetsoft.com/2007/12/27/startup-help.html"/>
   <updated>2007-12-27T13:11:00-08:00</updated>
   <id>http://blog.leetsoft.com/2007/12/27/startup-help</id>
   <content type="html">&lt;p&gt;Fantastic article from readwriteweb: &lt;a href=&quot;http://www.readwriteweb.com/archives/36_startup_tips.php&quot;&gt;36 Startup tips&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There is no way of saying where Shopify would be at by now if we would have had this article to rocket fuel us when we incorporated 3 years ago.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Google Chart API</title>
   <link href="http://blog.leetsoft.com/2007/12/06/google-chart-api.html"/>
   <updated>2007-12-06T18:47:00-08:00</updated>
   <id>http://blog.leetsoft.com/2007/12/06/google-chart-api</id>
   <content type="html">&lt;p&gt;Google made their internal &lt;a href=&quot;http://code.google.com/apis/chart/&quot;&gt;chart library&lt;/a&gt; available to the public:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://chart.apis.google.com/chart?cht=lc&amp;chs=200x125&amp;chd=s:ATSTaVd21981uocA&amp;chco=224499&amp;chxt=x,y&amp;chxl=0:|Sep|Oct|Nov|Dec|1:||50|100&amp;chm=B,76A4FB,0,0,0&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The kicker? It all works using urls. You simply embed an image pointing to their chart engine at http://chart.apis.google.com/chart and pass parameters with your data. This got to be one of the most clever internet API&amp;#8217;s yet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Thanks to &lt;a href=&quot;http://programming.reddit.com&quot;&gt;reddit&lt;/a&gt; for those:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://chart.apis.google.com/chart?cht=p3&amp;chs=500x200&amp;chd=t:82,18&amp;chl=Looks%20like%20Pac-man|Does%20not%20look%20like%20Pac-man&amp;chco=FFFF00,000000&amp;chtt=Percentage%20of%20chart%20which%20looks%20like%20Pac-man&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://chart.apis.google.com/chart?cht=lc&amp;chs=200x150&amp;chd=s:AUYZZZYYXWmyzzzymUXZZZZZZUYZZZZZYUA&quot; /&gt; &lt;img src=&quot;http://chart.apis.google.com/chart?cht=lxy&amp;chs=200x150&amp;chd=t:5,5,5,9,12|5,30,25,28,28|13,23,21,18,15,13,15,18,21,23|18,18,27,29,27,18,9,5,7,10|35,33,30,27,25,27,30,32,35,35,35|24,27,29,27,18,9,5,5,8,5,45|47,45,42,39,37,39,42,44,47,47,47|24,27,29,27,18,9,5,5,8,5,45|51,51|4,27|51,53,51,49,51|29,32,35,32,29|54,60|26,26|57,57|4,33&quot; /&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>ActiveShipping: call for contributions</title>
   <link href="http://blog.leetsoft.com/2007/10/16/activeshipping-call-for-contributions.html"/>
   <updated>2007-10-16T11:30:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/10/16/activeshipping-call-for-contributions</id>
   <content type="html">&lt;p&gt;At &lt;a href=&quot;http://www.shopify.info&quot;&gt;Shopify&lt;/a&gt; we are shifting our attention to shipping in the near&lt;br /&gt;
future. ActiveMerchant supports an impressive 30+ payment gateways and&lt;br /&gt;
its time for the library to become more than ActivePayments: we want&lt;br /&gt;
ActiveShipping.&lt;/p&gt;
&lt;p&gt;To this end i&amp;#8217;d like to collect all the shipping related code you may have&lt;br /&gt;
floating around. Have you integrated with &lt;span class=&quot;caps&quot;&gt;UPS&lt;/span&gt;? Canada Post? Any&lt;br /&gt;
shipping service? Do you have a script to generate shipping labels?&lt;br /&gt;
Bar codes? Implemented First Fit / Best Fit Descending &lt;a href=&quot;http://en.wikipedia.org/wiki/Bin_packing_problem&quot;&gt;Packaging algorithm&lt;/a&gt; ?&lt;/p&gt;
&lt;p&gt;If you have anything to contribute under your copyright or if you can&lt;br /&gt;
persuate your employer to relicense such snippets of code under the&lt;br /&gt;
terms of the &lt;a href=&quot;http://www.opensource.org/licenses/mit-license.php&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIT&lt;/span&gt; license&lt;/a&gt; for our new project please send an email&lt;br /&gt;
to tobi &lt;at&gt; jadedpixel.com to work out the details.&lt;/p&gt;
&lt;p&gt;The more code we can scrape together from contributions the sooner we&lt;br /&gt;
can release another unified access layer for such services and the&lt;br /&gt;
more likely it is that we get it right.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>RailsConf Europe</title>
   <link href="http://blog.leetsoft.com/2007/09/13/going-to-berlin.html"/>
   <updated>2007-09-13T13:46:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/09/13/going-to-berlin</id>
   <content type="html">&lt;p&gt;Flying to &lt;a href=&quot;http://www.railsconfeurope.com/&quot;&gt;railsconf europe&lt;/a&gt; today. Despite growing up in Germany I only made it to the capital once before so I&amp;#8217;m really stroked to get such a good opportunity to enjoy the town for a few days. &lt;br /&gt;
The travel guides indicate that the fun to be had in Berlin is off the charts.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll speak on the 19th on outsourcing to open source. &lt;span class=&quot;caps&quot;&gt;PDI&lt;/span&gt; checking it out.&lt;/p&gt;
&lt;p&gt;( If anyone has the capacity to pick up an iphone for me before flying over the pond please send me an email to tobi@leetsoft.com )&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>About</title>
   <link href="http://blog.leetsoft.com/2007/09/12/about.html"/>
   <updated>2007-09-12T15:55:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/09/12/about</id>
   <content type="html">&lt;p&gt;Tobias Lütke  (born 1980 in Koblenz) is a German programmer and creator of the popular &lt;a href=&quot;http://shopify.com&quot;&gt;Shopify&lt;/a&gt; e-commerce platform and Typo weblog engine. He also co-founded &lt;a href=&quot;http://jadedpixel.com&quot;&gt;jadedPixel&lt;/a&gt;, a technology company in Ottawa, Canada where he now lives.&lt;/p&gt;
&lt;p&gt;Tobi has been part of the &lt;a href=&quot;http://www.rubyonrails.org/core&quot;&gt;Ruby on Rails core team&lt;/a&gt; since its interception in 2005 and has released a series of popular open source projects such as &lt;a href=&quot;http://www.liquidtemplate.org&quot;&gt;Liquid template&lt;/a&gt;  engine and &lt;a href=&quot;http://www.activemerchant.org&quot;&gt;ActiveMerchant&lt;/a&gt;, two core technologies of the Shopify project and smaller gems like Paypal-lib, login_generator and Hieraki.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Futuretalk: CouchDB</title>
   <link href="http://blog.leetsoft.com/2007/09/02/futuretalk-couchdb.html"/>
   <updated>2007-09-02T12:42:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/09/02/futuretalk-couchdb</id>
   <content type="html">&lt;p&gt;I have to confess: I really don&amp;#8217;t like relational databases. I can&amp;#8217;t wait for the day we can ditch them.&lt;/p&gt;
&lt;p&gt;Think about it for a second: Databases store data to disk. Thats all what 90% of us use them for. They are essentially elaborate hash tables backed by a disk drive. Why are they more lines of code than some operating systems?&lt;/p&gt;
&lt;p&gt;Despite that, unless you have a really well thought out setup, a disk failure is still a major disaster. Even if you have backups, even if you have replication, there will be downtime and manual labor while a new master server is established. &lt;br /&gt;
Databases never put your 10-20 commodity server boxes with all their spare disk space to use. They always sit on these really expensive ivory tower &lt;span class=&quot;caps&quot;&gt;IBM&lt;/span&gt; boxes outside of your cheap cluster.&lt;/p&gt;
&lt;p&gt;Despite million man years of research databases are actually pretty dumb. You have to tell them about every nuance of your schema, you have to tell them about indexes and so on. If you forget an index they are perfectly happy to run sequentially run through all the data you ever inserted into them many times a second.&lt;/p&gt;
&lt;p&gt;Replication is generally a nightmare and every machine involved in the replication needs to have enough disk space to store the entire content of the database.&lt;/p&gt;
&lt;p&gt;There are several interesting projects which try to re-invent the database as we know them. Yesterday i found out about a particularly interesting one: &lt;a href=&quot;http://couchdb.org/CouchDB/CouchDBWeb.nsf/Home?OpenForm&quot;&gt;CouchDB&lt;/a&gt; a contender for &amp;#8220;The next generation web storage&amp;#8221; as their website proclaims. The project started out using C but eventually changed to Erlang which is a perfect choice for highly parallel server software.&lt;/p&gt;
&lt;p&gt;CouchDB has no tables, it just has a flat global namespace for documents. A document is a simple &lt;span class=&quot;caps&quot;&gt;JSON&lt;/span&gt; record.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
POST /shopify/
{
 &quot;value&quot;:
 {
   title:&quot;Arbor Draft&quot;,
   type:&quot;Product&quot;,
   price:299.00,
   tags:[&quot;snowboarding&quot;, &quot;freestyle&quot;, &quot;wintersport&quot;],
   description:&quot;....&quot;
 }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Instead of defining the schema we simply add arbitrary records.  There are no tables.&lt;/p&gt;
&lt;p&gt;So how do we receive all the records again? CouchDB uses the concept of views which are essentially javascript methods. It uses &lt;a href=&quot;http://en.wikipedia.org/wiki/MapReduce&quot;&gt;map/reduce&lt;/a&gt; to find matching records in its global namespace so that at query time the results are available instantaneously. This is a huge performance boost for web applications which generally have many more queries than update/inserts.&lt;/p&gt;
&lt;p&gt;Lets install some usefull views under /shopify/all:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
PUT /shopify/all
{
  &quot;_view_documents&quot;: &quot;function(doc) { return doc; }&quot;,
  &quot;_view_products&quot;: function(doc) { 
       if(doc.type == 'product') { return doc; } 
   }
}


GET http://couchserver/shopify/all:products
returns:
  {
    &quot;_id&quot;:&quot;all:products&quot;,
    &quot;rows&quot;:
    [
      {
        &quot;_id&quot;:&quot;64ACF01B05F53ACFEC48C062A5D01D89&quot;,
        &quot;_rev&quot;:&quot;62D22746&quot;,
         title:&quot;Arbor Draft&quot;,
         type:&quot;Product&quot;,
         price:299.00,
         tags:[&quot;snowboarding&quot;, &quot;freestyle&quot;, &quot;wintersport&quot;],
         description:&quot;....&quot;
      },
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There are a lot more cool things in CouchDB. Notice that the returned document has a _rev? Older revisions of documents are only deleted if you say so. If you are working on a wiki you just got your historical data for free. Unfortunately CouchDB is still in alpha but i think the fundamentals are sound. Its a lot more aligned with the way a modern web application works and needs its data represented. Its replication system is already much more powerful than that of other database systems and in fact is very similar to the way google works with tis bigtable and map/reduce infrastructure.&lt;/p&gt;
&lt;p&gt;For further information head to the projects &lt;a href=&quot;http://www.couchdbwiki.com/index.php?title=Main_Page&quot;&gt;Wiki&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Seam Carving</title>
   <link href="http://blog.leetsoft.com/2007/08/23/seam-carving.html"/>
   <updated>2007-08-23T13:34:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/08/23/seam-carving</id>
   <content type="html">&lt;p&gt;Impressive photo resizing algorithm, via &lt;a href=&quot;http://www.dpreview.com/news/0708/07082201seamcarvingimageresizing.asp&quot;&gt;dpreview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;object width=&quot;425&quot; height=&quot;353&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/vIFCV2spKtg&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/vIFCV2spKtg&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;353&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Static DNS despite of it all</title>
   <link href="http://blog.leetsoft.com/2007/08/15/static-dns-despite-of-it-all.html"/>
   <updated>2007-08-15T15:58:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/08/15/static-dns-despite-of-it-all</id>
   <content type="html">&lt;p&gt;When external services have to access your code from the outside world development setups often become complicated.&lt;/p&gt;
&lt;p&gt;Take for example writing a paypal &lt;span class=&quot;caps&quot;&gt;IPN&lt;/span&gt; based application. Paypal&amp;#8217;s sandbox wants a callback address which they can post the test IPNs to. Writing a facebook application? Many public urls have to be exposed to make it work.&lt;/p&gt;
&lt;p&gt;Your options here are either to forward the required ports in your firewall or deploy your code to a publicly accessible area and perform the trial &amp;amp; deploy &amp;amp; repeat dance.&lt;/p&gt;
&lt;p&gt;Worse, if you actually develop from a laptop, maybe from coffee shops around town, all bets are off.&lt;/p&gt;
&lt;p&gt;However there is help, a little known aspect of &lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt; tunnels called reverse tunnels can be used to our advantage here. To enable it you have to edit your /etc/ssh/sshd_config:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
# sshd_config
GatewayPorts yes 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Unfortunately the feature is disabled by default and requires OpenSSH 4 or newer.&lt;/p&gt;
&lt;p&gt;Once enabled you can tell the server to forward any traffic arriving on a local port through the tunnel to one of your local ports.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
ssh server -R *:5555:127.0.0.1:3000 -vv
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Read: Traffic from *(any)ip arriving on port 5555 goes through the tunnel and is released on the other side to 127.0.0.1:3000, your local rails application.&lt;/p&gt;
&lt;p&gt;Now you can simply create a new script in your rails folder called script/tunnel and you can work from everywhere!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
#!/bin/sh
echo &quot;Listening on port 5555&quot; 
echo &quot;Forwarding to localhost:3000&quot; 
ssh server -R *:5555:127.0.0.1:3000 -vv
&lt;/code&gt;&lt;/pre&gt;</content>
 </entry>
 
 <entry>
   <title>There's no one programmer who does the work of ten other programmers.</title>
   <link href="http://blog.leetsoft.com/2007/08/08/there-s-no-one-programmer-who-does-the-work-of-ten-other-programmers.html"/>
   <updated>2007-08-08T10:07:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/08/08/there-s-no-one-programmer-who-does-the-work-of-ten-other-programmers</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://developers.slashdot.org/comments.pl?sid=262509&amp;amp;cid=20136383&quot;&gt;A great slashdot comment&lt;/a&gt; regarding the difference between programmers and great programmers:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There&amp;#8217;s no one programmer who does the work of ten other programmers. One uber-programmer does just as much work as one ordinary programmer. It&amp;#8217;s just that the results solve ten times as many problems. Programming is fundamentally a design problem. A great bridge designer doesn&amp;#8217;t do the work of ten lousy bridge designers; the great one designs one great bridge in the time it takes the ten lousy ones to design ten lousy bridges.&lt;/p&gt;
&lt;p&gt;The best approximation is that each problem has a certain complexity and a certain size. The size determines how long it will take, and it doesn&amp;#8217;t matter how good the developers are. The complexity determines how good a developer is needed to make progress at all. If you&amp;#8217;ve got only easy problems, an uber-programmer doesn&amp;#8217;t help you much (unless the programmer can find a smaller, harder problem that replaces the big easy one). If you&amp;#8217;ve got a hard problem, ten average programmers will work on it forever without getting any results.&lt;/p&gt;
&lt;p&gt;And there&amp;#8217;s one last thing specific to computers: the computer can solve easy problems for you, but making it do so is a hard problem. But solving that one hard problem (plus some processor time) resolves a lot of easy problems. Another type of hard problem is writing a magic library function that makes a range of moderately hard problems easy enough for average programmers to solve.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;ve got ten people essentially doing data entry, an uber-programmer may be able to eliminate the need for them to do that at all. If you&amp;#8217;ve got ten developers working on some problem, an uber-programmer may be able to double their productivity. In either of these cases, the uber-programmer directly produces something that isn&amp;#8217;t part of the actual project, but the benefit to the project is on the order of ten average programmers&amp;#8217; work. And, if the uber-programmer reduces the complexity of the problem to put it in reach of the rest of the team, no amount of ordinary programmers&amp;#8217; work would benefit the project as much as the uber-programmer&amp;#8217;s contribution. Of course, if you require an uber-programmer to literally do the work of average programmers, there&amp;#8217;s no benefit at all.&lt;/p&gt;
&lt;/blockquote&gt;</content>
 </entry>
 
 <entry>
   <title>Married</title>
   <link href="http://blog.leetsoft.com/2007/08/07/married.html"/>
   <updated>2007-08-07T11:11:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/08/07/married</id>
   <content type="html">&lt;p style=&quot;float:right;&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1153/1036464030_a1a8f98837_m.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On sunny August the 4th I got married to my love Fiona.&lt;/p&gt;
&lt;p&gt;I love you Fi and I&amp;#8217;m looking forward to spending my life with you!&lt;/p&gt;
&lt;p&gt;I would like to thank everyone who was there and made it work. Especially Bruce, Dale and Kim who organized the lion share of the occasion. I&amp;#8217;d also like to thank all from my old and new family who traveled from Europe, Central America and Asia just to attend. You guys rock.&lt;/p&gt;
&lt;p&gt;In best geek fashion we crowdsourced the wedding photography with following challange (german pronunciation of challenge ):&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/tobi_and_fiona/1006680487/&quot; title=&quot;Photo Sharing&quot;&gt;&lt;img src=&quot;http://farm2.static.flickr.com/1129/1006680487_3906f1f3bc_m.jpg&quot; width=&quot;195&quot; height=&quot;240&quot; alt=&quot;Photo Challange&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The results are slowly arriving at flickr tag &lt;a href=&quot;http://flickr.com/photos/tags/tobifionawedding/&quot;&gt;tobifionawedding&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Nginx Gzip SSL</title>
   <link href="http://blog.leetsoft.com/2007/07/25/nginx-gzip-ssl.html"/>
   <updated>2007-07-25T15:13:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/07/25/nginx-gzip-ssl</id>
   <content type="html">&lt;p&gt;We switched our production server farm to &lt;a href=&quot;http://wiki.codemongers.com/&quot;&gt;Nginx&lt;/a&gt; when we moved it to toronto a few months back and it has been working admirably well.&lt;/p&gt;
&lt;p&gt;A few days ago we ran into an issue though. GZip compressed responses which were requested through &lt;span class=&quot;caps&quot;&gt;SSL&lt;/span&gt; were cut off after 32kb which was problematic because our biggest js file compresses down to 62kb.&lt;/p&gt;
&lt;p&gt;After some upgrading and experimentation the culprit was found to be the following config line:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://wiki.codemongers.com/NginxHttpGzipModule#gzip_buffers&quot;&gt;gzip_buffers&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;syntax: gzip_buffers number size&lt;/li&gt;
	&lt;li&gt;default: gzip_buffers 4 4k/8k&lt;/li&gt;
	&lt;li&gt;context: http, server, location Assigns the number and the size of the buffers into which to store the compressed response. If unset, the size of one buffer is equal to the size of page, depending on platform this either 4K or 8K.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;4 * 8kb == 32768bytes, exactly where the transfer was cut off when accounting for &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; response header size.&lt;/p&gt;
&lt;p&gt;Adjusting the config to &lt;strong&gt;gzip_buffers 16 8k;&lt;/strong&gt; saves the day here.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Ostrava Slides & Video</title>
   <link href="http://blog.leetsoft.com/2007/07/04/ostrava-slides-video.html"/>
   <updated>2007-07-04T14:10:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/07/04/ostrava-slides-video</id>
   <content type="html">&lt;p&gt;Robert Cigán from &lt;a href=&quot;http://www.rails.cz/&quot;&gt;rails.cz&lt;/a&gt; taped the talks of the recent Ostrava on Rails conference.&lt;/p&gt;
&lt;p&gt;Here is &lt;a href=&quot;http://video.google.ca/videoplay?docid=8388334018807083488&amp;amp;hl=en-CA&quot;&gt;my talk&lt;/a&gt; as well as &lt;a href=&quot;http://blog.leetsoft.com/files/Presentation.pdf&quot;&gt;the slides&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Via &lt;a href=&quot;http://video.google.ca/videoplay?docid=8388334018807083488&amp;amp;hl=en-CA&quot;&gt;Google video&lt;/a&gt; :&lt;/p&gt;
&lt;p&gt;&lt;embed style=&quot;width:400px; height:326px;&quot; id=&quot;VideoPlayback&quot; type=&quot;application/x-shockwave-flash&quot; src=&quot;http://video.google.com/googleplayer.swf?docId=8388334018807083488&amp;hl=en-CA&quot; flashvars=&quot;&quot;&gt; &lt;/embed&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Ostrava on Rails</title>
   <link href="http://blog.leetsoft.com/2007/06/26/ostrava-on-rails.html"/>
   <updated>2007-06-26T11:14:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/06/26/ostrava-on-rails</id>
   <content type="html">&lt;p style=&quot;float:right;&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2007/6/27/Ostrava_small__1_of_5_.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I just returned from the most exciting 4 days in Europe to attend the &lt;a href=&quot;http://ostrava.rails.cz/en&quot;&gt;Ostrava on Rails&lt;/a&gt; conference. After about 17 hours of travel I finally made it to Prague where I was supposed to have a stopover of several hours. It was all planned in advance. I was going to wait an hour in the Airport for &lt;a href=&quot;http://weblog.jamisbuck.org/&quot;&gt;Jamis Buck&lt;/a&gt; to arrive and we were going to take the bus downtown to do some sightseeing. Well in theory, theory is just like practice. In reality Frankfurt airport shut down due to a lightning storm.&lt;/p&gt;
&lt;p&gt;With my plane canceled I got right in line at the ticket counter to get a seat assigned for the next flight. Natural Airport madness ensued. After making it to the front they told me that they can only assign seats about half an hour before the plane loads.&lt;/p&gt;
&lt;p style=&quot;float:right;&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2007/6/27/Ostrava_small__5_of_5_.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;No problem, except that every time we managed to get within 45 minutes of take off the plane was delayed another half hour. Of course I could never stop being in line because someone else might get my precious seat. One complete boarding and de-boarding of the plane later, and after about 3 triumphant extra laps around Prague because of more bad weather in this area, we finally touched down with approx. 45 minutes to go until my train left for Ostrava; a 5 hour train ride with no good other trains leaving that day.&lt;/p&gt;
&lt;p&gt;Good thing I travel light and don&amp;#8217;t have to wait for my luggage at the baggage claim! Or so I thought. The people at the counter told me that the trip downtown to the train station would take about an hour! I couldn&amp;#8217;t even make it in time after all this!&lt;/p&gt;
&lt;p&gt;One thing immediately became clear to me: Prague&amp;#8217;s taxi drivers mean business. After a short exchange that went something like this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stranded Rails developer&lt;/strong&gt;: I need to be at the train station in 30 minutes! (add German accent)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Taxi driver&lt;/strong&gt;: I&amp;#8217;ll do it in 25! (imagine no words at all but him just throwing my luggage in his trunk and flooring the Volkswagen)&lt;/p&gt;
&lt;p&gt;This Michael Schumacher of the taxi world manged to make it but had to employ the following strategy:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;He drove approx. 90% of the time on the street car tracks (illegal)&lt;/li&gt;
	&lt;li&gt;He cut from the street car tracks over 2 lanes of traffic into a one way street (insane)&lt;/li&gt;
	&lt;li&gt;He overtook a police car on the right hand side (illegal, insane)&lt;/li&gt;
	&lt;li&gt;He drove 80km/h in a 30km/h area with cars parked on both sides of the street. (dear god)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After paying him well I ran into (or almost over) Jamis at the train station and we finally made it to Ostrava.&lt;/p&gt;
&lt;p style=&quot;float:right;&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2007/6/27/Ostrava_small__4_of_5_.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The conference itself went really well. It took place in a beautiful modern technology park in one of the suburbs of Ostrava. The English talks were well received, the audience asked great questions and was visibly enjoying itself. What really stood out was the perfect organization of the event. At no time were the foreign people allowed to be bored. There was always a program. Great dinner, great pubs, and always a designated driver. The event locations had signs pointing everyone in the right direction and the talks were cut off on time with a subtlety only matched by the Oscars (heh). The team was clearly not properly challenged by the event. I&amp;#8217;m sure organizing a conference of 5 times the size would be just as easy for them.&lt;/p&gt;
&lt;p style=&quot;float:right;&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2007/6/27/Ostrava_small__2_of_5_.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The whole trip was a very enjoyable experience. Ostrava is a ex-coal mining town which is well on its way to re-inventing itself by events such as this conference and the Czech Republic is blessed by a lot of very passionate people. I expect rails and web development in general to hit a tipping point over there at any moment; all the fundamental things are there, all that is needed is a bit of entrepreneurial spirit and incorporation of start-ups.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2007/6/27/Ostrava_small__3_of_5_.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Here are some thoughts which might help to accelerate this process:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Centralize the rails community. There should be only one mailing list, one forum and one page which explains what rails is.&lt;/li&gt;
	&lt;li&gt;Create a mailing list and launch local unconferences in the style of barcamp.org around the country.&lt;/li&gt;
	&lt;li&gt;Follow up next year with a Central Europe on Rails conference and get the whole region involved!&lt;/li&gt;
	&lt;li&gt;Deploy to &lt;a href=&quot;http://www.railshosting.cz/pages/co-nabizime/&quot;&gt;railshosting.cz&lt;/a&gt; , they rock&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks again to everyone, especially Jiří, Lucie and Robert for being such great hosts.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Off to Europe</title>
   <link href="http://blog.leetsoft.com/2007/06/19/off-to-europe.html"/>
   <updated>2007-06-19T23:19:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/06/19/off-to-europe</id>
   <content type="html">&lt;p&gt;I&amp;#8217;m fortunate enough to have been invited to the Czech Republic for the &lt;a href=&quot;http://ostrava.rails.cz/en&quot;&gt;Ostrava on Rails&lt;/a&gt; conference as a speaker.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m really looking forward to this trip. I always heard that Prague is a must see town and I was sad that i never got around to visiting it when I was still living in Germany. I&amp;#8217;ll have about 5 hours of stop over there before boarding a train to Ostrava, any recommendations?&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Cool little http utility</title>
   <link href="http://blog.leetsoft.com/2007/06/10/cool-little-http-utility.html"/>
   <updated>2007-06-10T11:40:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/06/10/cool-little-http-utility</id>
   <content type="html">&lt;p&gt;via &lt;a href=&quot;http://programming.reddit.com/&quot;&gt;reddit&lt;/a&gt; :&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://hping.org/wbox/&quot;&gt;Wbox &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; testing tool&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This little tool which was just released is proving to be really useful for setting up our new server farm. It basically works like a ping for http but you can instruct it to test various aspects of http such as gzip compression and concurrency.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;pre&amp;gt;
% wbox www.google.it
WBOX www.google.it (64.233.183.99) port 80
0. 200 OK    3774 bytes    407 ms
1. 200 OK    (3767) bytes    273 ms
2. 200 OK    3767 bytes    304 ms
3. 200 OK    3767 bytes    260 ms
user terminated
&amp;lt;/pre&amp;gt;&lt;/code&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Shopify's anniversary</title>
   <link href="http://blog.leetsoft.com/2007/06/02/shopify-s-anniversary.html"/>
   <updated>2007-06-02T21:48:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/06/02/shopify-s-anniversary</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://jadedpixel.com/2007/6/2/1-year-old&quot;&gt;Shopify is celebrating its first anniversary&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Liquid repository woes</title>
   <link href="http://blog.leetsoft.com/2007/05/27/liquid-repository-woes.html"/>
   <updated>2007-05-27T00:04:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/05/27/liquid-repository-woes</id>
   <content type="html">&lt;p&gt;Hosting liquid and some other open source projects from a box in my basement was never really that good of an idea but it turned from bad to worse today when this machine lost all its data.&lt;/p&gt;
&lt;p&gt;I setup a google code project for liquid in haste which should be a more stable hosting platform for this project. If you are svn:external&amp;#8217;d to liquid please do switch to the new repository location, the old one will not come back.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://code.google.com/p/liquid-markup/&quot;&gt;http://code.google.com/p/liquid-markup/&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Shopify is a finalist in the Webware 100</title>
   <link href="http://blog.leetsoft.com/2007/05/25/shopify-is-a-finalist-in-the-webware-100.html"/>
   <updated>2007-05-25T14:13:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/05/25/shopify-is-a-finalist-in-the-webware-100</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://shopify.com&quot;&gt;Shopify&lt;/a&gt; has been chosen as a finalist for the &lt;a href=&quot;http://www.webware.com/html/ww/100/2007/productivity.html&quot;&gt;Webware 100 Awards&lt;/a&gt;. Finalists represent the top 250 out of a pool of 2000 qualifying Web 2.0 services. Voting for the final 100 begins today and goes until June 11th.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not quite sure why they lumped the commerce section into productivity but what can you do.&lt;/p&gt;
&lt;p&gt;It would be great to see Shopify make the top 100. If you’re a happy Shopify user or just think that we deserve some publicity, please &lt;a href=&quot;http://www.webware.com/html/ww/100/2007/productivity.html&quot;&gt;throw a vote our way&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>The Secret to Memcached</title>
   <link href="http://blog.leetsoft.com/2007/05/22/the-secret-to-memcached.html"/>
   <updated>2007-05-22T12:50:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/05/22/the-secret-to-memcached</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.danga.com/memcached/&quot;&gt;Memcached&lt;/a&gt; has long been the answer to most questions containing the word scale. &lt;br /&gt;
There are some spectacular memcached installations out there. Facebook is said to &lt;a href=&quot;http://lists.danga.com/pipermail/memcached/2007-May/004098.html&quot;&gt;run a 200 server&lt;/a&gt; with 3TB of memory &lt;br /&gt;
solely for servicing memcached; &lt;a href=&quot;http://shopify.com&quot;&gt;Shopify&lt;/a&gt;, twitter, digg, Slashdot and just about every other public facing application &lt;br /&gt;
depends on it. Facebook&amp;#8217;s installation is said to deliver a 99% cache hit rate while servicing tens of thousands of &lt;br /&gt;
requests a second.&lt;/p&gt;
&lt;p&gt;There are many ways to use this elaborate hash table and many ways which are more trouble then they are worth.&lt;br /&gt;
In our experience the key to use memcached effectively is to ask it for the exact thing you want, but i&amp;#8217;m getting ahead of&lt;br /&gt;
myself.&lt;/p&gt;
&lt;p&gt;A common pattern to using memcached is the following&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
class Product &amp;lt; AR:B

  def load(id)
    Cache.get(key, self) || Cache.set(key, find(id))
  end

  def after_save; Cache.expire(key); end
  def after_destroy; Cache.expire(key); end
  
  def key
   &quot;#{table_name}/#{id}&quot;
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The issue is that this model only caches on a per object basis. But the real database load comes usually from loading&lt;br /&gt;
collections. Storing a collection in memcached is harder because you have to start tracking the objects in the collection somewhere&lt;br /&gt;
so that you can efficiently expire the collection once one of its items is changed. And that way, he knew, lay madness.&lt;/p&gt;
&lt;p&gt;In Shopify&amp;#8217;s case, what we really need, is to cache all the required data to render a given public &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt;. &lt;br /&gt;
Two requests to the same &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; should always yield a cache hit given all input parameters being equal. &lt;br /&gt;
In code this could look something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
cache params.values.sort.to_s do
  ... load all data ...
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Of course you have to keep track of all the keys you store in memcached now. A database table will do nicely here.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
class CacheKey &amp;lt; AR:B
  def after_destroy; Cache.expire(key); end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;
cache key = params.values.sort.to_s do
  ... load all data ...
  CacheKey.create :key =&amp;gt; key
end
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;
CacheKey.destroy_all # Sweep cache
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So far so good.&lt;/p&gt;
&lt;p&gt;This has been the traditional approach and has worked somewhat. &lt;br /&gt;
I&amp;#8217;m here to offer a better solution here though:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ask for the thing you need, be specific:&lt;/strong&gt; The complexity to the above solution comes from the simple fact &lt;br /&gt;
that we formulated our question to memcached too vague. Ask yourself what you really require from memcached and then ask it for exactly that. &lt;br /&gt;
Consider this: When a product is updated all current urls should be invalidated because they are outdated. Shopify allows &lt;br /&gt;
the designers to reference a product from any page in the system so we have to run a full sweep. &lt;br /&gt;
Without informing memcached that its caches are stale it will continue to deliver this stale data&lt;br /&gt;
and customers will continue to see the old version of the product. A clear miss-understanding between shopify and memcached.&lt;/p&gt;
&lt;p&gt;The solution is simple: &lt;br /&gt;
At the beginning of each request we load a shop object which we pick depending on the incoming host name. &lt;br /&gt;
We use the fact that we always load this shop model anyways and add versioning to it. &lt;br /&gt;
This version column is incremented every time we want to sweep all caches.&lt;/p&gt;
&lt;p&gt;Now we add the version number to the cache keys:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
cache shop.version + params.values.sort.to_s  do
  ... load all data ...
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;this means that we will never get an outdated version from the caches because we ask them for a very specific thing. After &lt;br /&gt;
the version number is increased in the database all incoming requests will miss the caches but will be re-cached quickly.&lt;/p&gt;
&lt;p&gt;Memcached will automatically get rid of the stale keys once space is needed, least recently used keys are discarded first&lt;br /&gt;
so there is no need for manual cleanup.&lt;/p&gt;
&lt;p&gt;In Shopify we use this technology as a way to do Page caching. We keep the rendered &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;, &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; return status code and Content-Type in &lt;br /&gt;
memcached and use all the differentiating input variables as keys such as content of the shopping cart. We keep the &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; because&lt;br /&gt;
this saves our server cluster valuable bandwidth by avoiding loading and compiling the liquid templates from the &lt;span class=&quot;caps&quot;&gt;NFS&lt;/span&gt; server.&lt;br /&gt;
Requests for cached documents are now rendered in sub 10ms regions.&lt;/p&gt;
&lt;p&gt;To summarize Shopify asks memcached politely to: &amp;#8220;Hand over version 55 of the index html for www.snowdevil.com the way it would look like with one Draft 151cm snowboard in the cart&amp;#8221;. &lt;br /&gt;
A very specific question for which there is only one valid answer, the exact data we want, stale data can never &lt;br /&gt;
be returned because everything which would make it stale will increase the version number.&lt;/p&gt;
&lt;p&gt;Quick remark. When you use memcached in ruby make absolutly sure that you use &lt;a href=&quot;http://seattlerb.rubyforge.org/memcache-client&quot;&gt;memcache-client&lt;/a&gt; as it&amp;#8217;s the fastest and most used ruby implementation of the protocol.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>SQL joins explained</title>
   <link href="http://blog.leetsoft.com/2007/04/20/sql-joins-explained.html"/>
   <updated>2007-04-20T23:33:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/04/20/sql-joins-explained</id>
   <content type="html">&lt;p&gt;This is the best explanation of &lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt; joins i have ever seen:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.khankennels.com/blog/index.php/archives/2007/04/20/getting-joins/&quot;&gt;http://www.khankennels.com/blog/index.php/archives/2007/04/20/getting-joins/&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Sitenotes for your blog, Google style</title>
   <link href="http://blog.leetsoft.com/2007/04/19/sitenotes-for-your-blog-google-style.html"/>
   <updated>2007-04-19T09:53:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/04/19/sitenotes-for-your-blog-google-style</id>
   <content type="html">&lt;ol&gt;
	&lt;li&gt;Sign up to use Googles &lt;a href=&quot;http://code.google.com/apis/ajaxfeeds/index.html&quot;&gt;newly released Feed &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Follow the instructions to include their javascript correctly&lt;/li&gt;
	&lt;li&gt;Create a ul called shared-posts in your sidebar&lt;/li&gt;
	&lt;li&gt;Sign up for Google reader&lt;/li&gt;
	&lt;li&gt;Share some posts &lt;br /&gt;
 &lt;img src=&quot;http://blog.leetsoft.com/assets/2007/4/19/share.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
	&lt;li&gt;Note down the url of your shared articles feed &lt;br /&gt;
 &lt;img src=&quot;http://blog.leetsoft.com/assets/2007/4/19/shared-items_400x84.shkl.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
	&lt;li&gt;Add following javascript to your blog:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;
var Sitenote = {
  fromGoogle: function(result)  {
    var feed = new google.feeds.Feed(&quot;http://www.google.com/reader/public/atom/user/...&quot;);
    feed.load(function(result) {
      if (result.error) { return; }
      var container = document.getElementById(&quot;shared-posts&quot;);
      for (var i = 0; i &amp;lt; result.feed.entries.length; i++) {
        var entry = result.feed.entries[i];
        var li = document.createElement(&quot;li&quot;);
        var link = document.createElement('a');
        link.href = entry.link;
        link.title = entry.title; 
        link.appendChild(document.createTextNode(entry.title));
        li.appendChild(link);
        container.appendChild(li);
      }
    });
  }
};

google.load(&quot;feeds&quot;, &quot;1&quot;);
google.setOnLoadCallback(Sitenote.fromGoogle);
&lt;/pre&gt;&lt;p&gt;&lt;/code&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Steve Jobs at Stanford</title>
   <link href="http://blog.leetsoft.com/2007/03/31/steve-jobs-at-stanford.html"/>
   <updated>2007-03-31T18:03:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/03/31/steve-jobs-at-stanford</id>
   <content type="html">&lt;p&gt;via &lt;a href=&quot;http://video.google.com/videoplay?docid=3014637678488153340&quot;&gt;google video&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;embed style=&quot;width:400px; height:326px;&quot; id=&quot;VideoPlayback&quot; type=&quot;application/x-shockwave-flash&quot; src=&quot;http://video.google.com/googleplayer.swf?docId=3014637678488153340&amp;hl=en&quot; flashvars=&quot;&quot;&gt; &lt;/embed&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Cody is famous!</title>
   <link href="http://blog.leetsoft.com/2007/03/29/cody-is-famous.html"/>
   <updated>2007-03-29T16:41:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/03/29/cody-is-famous</id>
   <content type="html">&lt;p&gt;Spy on my &lt;a href=&quot;http://www.codyfauser.com&quot;&gt;Cody&lt;/a&gt;, my rock-star coworker and find out how he and his girl got to acquire their matching rock-star outfits:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.2magazine.com/couplemakeovertv/&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2007/3/29/cody.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Congrats guys! This is awesome :)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Only Apple</title>
   <link href="http://blog.leetsoft.com/2007/03/29/only-apple.html"/>
   <updated>2007-03-29T00:33:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/03/29/only-apple</id>
   <content type="html">&lt;p&gt;From the changelog of &lt;a href=&quot;http://www.apple.com/macosx/bootcamp/&quot;&gt;Apple&amp;#8217;s Bootcamp 1.2&lt;/a&gt; release:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Improved Windows driver installation experience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What a unique thing in the windows world.&lt;/p&gt;
&lt;p&gt;For those who don&amp;#8217;t know: Installing windows on a apple laptop is a experience to behold. Apple Ships a single installer which installs the driver for every single device in the machine (Remote, Camera, Trackpad, Bluetooth, Network, Chipset, Graphics Card etc). Leave it to Apple to make provide the best user experience in the windows world.&lt;br /&gt;
It worked so well that i can&amp;#8217;t even imagine what they might have improved in the 1.2 release.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>I heel you</title>
   <link href="http://blog.leetsoft.com/2007/03/28/i-heel-you.html"/>
   <updated>2007-03-28T13:03:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/03/28/i-heel-you</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2007/3/28/shoe-repair.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Domain claims and its woes</title>
   <link href="http://blog.leetsoft.com/2007/03/26/domain-claims-and-its-woes.html"/>
   <updated>2007-03-26T14:52:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/03/26/domain-claims-and-its-woes</id>
   <content type="html">&lt;p&gt;One of Shopify&amp;#8217;s best features is that it allows you to use your own domain. The system we use involves &amp;#8220;claiming&amp;#8221; a domain and then going to your hosting provider and forwarding this domain using a &lt;span class=&quot;caps&quot;&gt;CNAME&lt;/span&gt; to our servers. &lt;br /&gt;
So once a request for an unknown domain comes to shopify we consult the claimed domains table and see if we can match it up with one of our customers.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2007/3/26/domainclaim.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This system works incredibly well and leads to some great integrations of Shopify with other software packages such as Mephisto. &lt;a href=&quot;http://endoborn.com/&quot;&gt;Endoborn&lt;/a&gt; is a great example of this.&lt;/p&gt;
&lt;p&gt;There are some problems with this system such as the absolutely &lt;a href=&quot;http://help.shopify.com/design/show/Godaddy+DNS+Setup&quot;&gt;arcane&lt;/a&gt; &lt;a href=&quot;http://help.shopify.com/design/show/NameCheap+DNS+Setup&quot;&gt;user interfaces&lt;/a&gt; of most domain registrars.&lt;/p&gt;
&lt;p&gt;Well this is a problem which can be solved. More about this at a later date.&lt;/p&gt;
&lt;p&gt;Some of those registrars also offer a simple method of domain forwarding: &lt;span class=&quot;caps&quot;&gt;DNS&lt;/span&gt; Masking. &lt;br /&gt;
This works by hosting a frameset on the customers domain which just includes the real &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; as its only frame. &lt;br /&gt;
The browser will happily show the right domain name but it will do so regardless where on the page you are. Any detail urls are lost because all the normal disadvantages of framesets apply. So instead of showing http://www.snowdevil.ca/products/titan it would still show http://www.snowdevil.ca/.&lt;/p&gt;
&lt;p&gt;It gets worse: As it happens Internet explorer rejects all cookies from third party included domains. This is a deadly blow to Shopify because cookies are a minimum requirement for its operation. Firefox and Safari do not have this error so many of our store owners set up &lt;span class=&quot;caps&quot;&gt;DNS&lt;/span&gt; masking and test it successfully in Firefox only to discover months down the road that Internet Explorer users cannot add items to their shopping cart.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I finally found some documentation on the issue. IE wants your server to implement a Compact P3P policy statement which is a special header describing what you intend to do with the cookies. This is one of those utter garbage standards the w3c dreamed up before it imploded. Bad standards attract bad programmers so obviously Internet Explorer uses it.&lt;/p&gt;
&lt;p&gt;To fix this just add the following code to the very top of your application.rb class:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
before_filter { |c| c.headers['P3P'] = %|CP=&quot;NOI DSP COR NID ADMa OPTa OUR NOR&quot;| }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I don&amp;#8217;t really care what this line means. I regard it as a fix for a broken browser.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update2:&lt;/strong&gt; References &amp;#8212;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://news.com.com/2100-1023-268478.html?legacy=cnet&quot;&gt;IE6 pushes ad networks on design&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.oreillynet.com/mac/blog/2002/06/p3p_in_ie6_frustrating_failure.html&quot;&gt;P3P in IE6: Frustrating Failure&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.w3.org/P3P/&quot;&gt;P3P Spec&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.affiliatewiz.com/support/p3p.asp&quot;&gt;Third Party Cookies in IE6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>Looking good</title>
   <link href="http://blog.leetsoft.com/2007/03/23/looking-good.html"/>
   <updated>2007-03-23T11:31:00-07:00</updated>
   <id>http://blog.leetsoft.com/2007/03/23/looking-good</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://lookingrealgood.com/2007/3/23&quot;&gt;I&amp;#8217;m famous&lt;/a&gt; !&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Everyone looks good at least some of the time. Our mission is to capture that moment, and then celebrate it by giving you 24 hours of attention — your very own holiday. Looking Real Good is &lt;span class=&quot;caps&quot;&gt;NOT&lt;/span&gt; a beauty contest. There is no voting, and people cannot leave comments. It&amp;#8217;s just about vanity, pure and simple. There is no desired &amp;#8220;type.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Excellent motion Pete. I love projects which go against the trends.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>OpenID is taking hold</title>
   <link href="http://blog.leetsoft.com/2007/03/08/openid-is-taking-hold.html"/>
   <updated>2007-03-08T22:27:00-08:00</updated>
   <id>http://blog.leetsoft.com/2007/03/08/openid-is-taking-hold</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://jadedpixel.com/2007/3/8/openid-support&quot;&gt;Shopify now supports OpenID&lt;/a&gt; as an first class login method. After our friends at &lt;a href=&quot;http://37signals.com&quot;&gt;37signals&lt;/a&gt; figured out how to do the present a pleasant UI and &lt;a href=&quot;http://www.loudthinking.com/&quot;&gt;David&lt;/a&gt; created the wonderful &lt;a href=&quot;http://dev.rubyonrails.org/browser/plugins/open_id_authentication&quot;&gt;open_id_authentication&lt;/a&gt; plugin, it was just the matter of a single workday to bring OpenID to the tousands of Shopify stores out there.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://openid.net&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2007/3/9/openid.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Awesome technology for awesome products. OpenID&amp;#8217;s future is as bright as can be :)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Lasik Girls</title>
   <link href="http://blog.leetsoft.com/2007/03/02/lasik-girls.html"/>
   <updated>2007-03-02T10:40:00-08:00</updated>
   <id>http://blog.leetsoft.com/2007/03/02/lasik-girls</id>
   <content type="html">&lt;p&gt;Fiona posted a &lt;a href=&quot;http://infogopher.com/2007/3/2/lasik-1-week-update-and-summary&quot;&gt;summary of her experience with the Lasik surgery&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;small&gt;please pdi digging this&lt;/small&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Brazil vs Argentina</title>
   <link href="http://blog.leetsoft.com/2007/02/24/brazil-vs-argentinia.html"/>
   <updated>2007-02-24T14:44:00-08:00</updated>
   <id>http://blog.leetsoft.com/2007/02/24/brazil-vs-argentinia</id>
   <content type="html">&lt;p&gt;Before a recent football match between Argentina and Brazil (an archrivalry), an Argentinean condom company  posted ad to let Brazilians know what will presumably happen to them at the upcoming bout.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2007/2/24/argentinia-ad.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Well, Brazil won the match prompting the Brazillian Football organization to run this ad:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2007/2/24/brazil-ad.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Cheers Latin America. You guys rule the advertising space!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Lasik</title>
   <link href="http://blog.leetsoft.com/2007/02/23/lasik.html"/>
   <updated>2007-02-23T11:43:00-08:00</updated>
   <id>http://blog.leetsoft.com/2007/02/23/lasik</id>
   <content type="html">&lt;p&gt;Fiona, my fiancee, is getting he eyes laserd today.&lt;/p&gt;
&lt;p&gt;She is going to log her experience over at &lt;a href=&quot;http://infogopher.com&quot;&gt;infogopher.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://infogopher.com&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2007/2/23/DSC_0009.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Check it out if lasik is something you are considering.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Query Cache</title>
   <link href="http://blog.leetsoft.com/2007/02/14/query-cache.html"/>
   <updated>2007-02-14T20:52:00-08:00</updated>
   <id>http://blog.leetsoft.com/2007/02/14/query-cache</id>
   <content type="html">&lt;p&gt;Rails 2.0 is getting its first bunch of new features. One of the first additions was a &lt;a href=&quot;http://dev.rubyonrails.org/changeset/6138&quot;&gt;new set of clothes&lt;/a&gt; for the query cache. David started this feature quite a while ago but never finished it and it wasn&amp;#8217;t activated.&lt;/p&gt;
&lt;p&gt;Here is the catalyst which prompted the development:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
 Blog.find(1).articles.each { |a| puts &quot;#{a.blog.title} #{a.title}&quot; }
   =&amp;gt; Blog Load (0.000461)   SELECT * FROM blogs WHERE (blogs.id = 1) 
   =&amp;gt; Article Load (0.000521)   SELECT * FROM articles WHERE (articles.blog_id = 1)
   =&amp;gt; Blog Load (0.000461)   SELECT * FROM blogs WHERE (blogs.id = 1) 
   =&amp;gt; Blog Load (0.000460)   SELECT * FROM blogs WHERE (blogs.id = 1) 
   =&amp;gt; Blog Load (0.000469)   SELECT * FROM blogs WHERE (blogs.id = 1) 
   =&amp;gt; Blog Load (0.000460)   SELECT * FROM blogs WHERE (blogs.id = 1) 
   =&amp;gt; Blog Load (0.000462)   SELECT * FROM blogs WHERE (blogs.id = 1) 
   [..]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Painful stuff. This is because each belongs_to has its own cache. So for each article the blog object has to be loaded again even though we just received a perfectly capable set of data from the database a second earlier.&lt;/p&gt;
&lt;p&gt;With a recent change you can now do the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
Blog.cache do 
   Blog.find(1).articles.each { |a| puts &quot;#{a.blog.title} #{a.title}&quot; }
   =&amp;gt; Blog Load (0.000461)   SELECT * FROM blogs WHERE (blogs.id = 1) 
   =&amp;gt; Article Load (0.000521)   SELECT * FROM articles WHERE (articles.blog_id = 1)
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For the duration of the cache block the same query will not be run twice ( unless you run any &lt;span class=&quot;caps&quot;&gt;INSERTS&lt;/span&gt; or &lt;span class=&quot;caps&quot;&gt;UPDATES&lt;/span&gt;, in which case all the cache is flushed to disk )&lt;/p&gt;
&lt;p&gt;For Rails 2.0 we hope to cultivate these humble beginnings into an automatic cache so that all read queries are only run once per rails request if possible.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Dave Thomas</title>
   <link href="http://blog.leetsoft.com/2007/01/30/dave-thomas.html"/>
   <updated>2007-01-30T20:44:00-08:00</updated>
   <id>http://blog.leetsoft.com/2007/01/30/dave-thomas</id>
   <content type="html">&lt;p&gt;Dave&amp;#8217;s talk from european railsconf can now be &lt;a href=&quot;http://video.google.com/videoplay?docid=-7327520943909344563&quot;&gt;found online&lt;/a&gt;. &lt;br /&gt;
Its one of the best talks I had the pleasure of seeing in person.&lt;/p&gt;
&lt;p&gt;via &lt;a href=&quot;http://video.google.com/videoplay?docid=-7327520943909344563&quot;&gt;Google video link&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;embed style=&quot;width:400px; height:326px;&quot; id=&quot;VideoPlayback&quot; type=&quot;application/x-shockwave-flash&quot; src=&quot;http://video.google.com/googleplayer.swf?docId=-7327520943909344563&amp;hl=en&quot; flashvars=&quot;&quot;&gt; &lt;/embed&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Business Journal</title>
   <link href="http://blog.leetsoft.com/2007/01/30/business-journal.html"/>
   <updated>2007-01-30T19:20:00-08:00</updated>
   <id>http://blog.leetsoft.com/2007/01/30/business-journal</id>
   <content type="html">&lt;p&gt;Jaded Pixel was profiled in the Ottawa Business Journal as one of Ottawa&amp;#8217;s &lt;a href=&quot;http://www.ottawabusinessjournal.com/&quot;&gt;Startups to Watch&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In a moment of childish exuberance, we made a bet with the owner of another start up on the list that Jaded Pixel could get more votes than his company in the poll on the bottom of the page. So please do whats right ;)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Presentation tip from Steve Jobs</title>
   <link href="http://blog.leetsoft.com/2007/01/19/presentation-tip-from-steve-jobs.html"/>
   <updated>2007-01-19T19:17:00-08:00</updated>
   <id>http://blog.leetsoft.com/2007/01/19/presentation-tip-from-steve-jobs</id>
   <content type="html">&lt;p&gt;A photographer took a picture of Steve Job&amp;#8217;s booklet from his &lt;a href=&quot;http://events.apple.com.edgesuite.net/j47d52oo/event/&quot;&gt;recent Macworld Keynote&lt;/a&gt; where he unveiled the iPhone.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.leetsoft.com/assets/2007/1/19/LJRzUHAdOF_1.jpg&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2007/1/19/keynote_400x297.shkl.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Apart from the interesting way in which he organizes his thoughts, its also very interesting to see which parts of the presentation are scripted and which are not (ordering 4000 lattes is on the list). What strikes me is just how gorgeous the booklet looks however.&lt;/p&gt;
&lt;p&gt;Luckily, a avid jobs fan over at digg took the opportunity to recreate a &lt;a href=&quot;http://rapidshare.com/files/11494708/Keynote_Booklet.zip.html&quot;&gt;template for Apple&amp;#8217;s Pages&lt;/a&gt; which makes it easy to create such booklets yourself.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://rapidshare.com/files/11494708/Keynote_Booklet.zip.html&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2007/1/19/Picture_4_400x329.shkl.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Want to work on a cool project?</title>
   <link href="http://blog.leetsoft.com/2007/01/18/want-to-work-on-a-cool-project.html"/>
   <updated>2007-01-18T19:34:00-08:00</updated>
   <id>http://blog.leetsoft.com/2007/01/18/want-to-work-on-a-cool-project</id>
   <content type="html">&lt;p&gt;I have it on authority that working on something like Shopify is tons of fun. Now you can &lt;a href=&quot;http://www.rentacoder.com/RentACoder/misc/BidRequests/ShowBidRequest.asp?lngBidRequestId=606430&quot;&gt;experience the thrill as well&lt;/a&gt; ;)&lt;/p&gt;
&lt;p&gt;They give you a 30 days deadline which should be plenty. Considering that some people can write something like &lt;a href=&quot;http://www.digg.com/software/Shopify_released_-_RoR_based_internet_store_in_2_minutes#c1872979&quot;&gt;Shopify in C in a few days&lt;/a&gt; &lt;br /&gt;
this should be plenty.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://objection.mrdictionary.net/go.php?n=1671692&quot;&gt;Objection!&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Dealing with Gravatar</title>
   <link href="http://blog.leetsoft.com/2006/12/15/dealing-with-gravatar.html"/>
   <updated>2006-12-15T17:56:00-08:00</updated>
   <id>http://blog.leetsoft.com/2006/12/15/dealing-with-gravatar</id>
   <content type="html">&lt;p&gt;We use the gravatar service on many occasions across the web applications of jadedpixel. The service recently became ridiculously slow however so we needed to find a solution.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.troubleseeker.com/&quot;&gt;Daniel&lt;/a&gt; explains how to decouple the gravatar loading from the actual page loading so that the webpages remain snappy.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.troubleseeker.com/2006/12/15/taming-the-gravatar&quot;&gt;Taming the Gravatar&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Mad world</title>
   <link href="http://blog.leetsoft.com/2006/12/13/mad-world.html"/>
   <updated>2006-12-13T14:31:00-08:00</updated>
   <id>http://blog.leetsoft.com/2006/12/13/mad-world</id>
   <content type="html">&lt;p&gt;I know this ad is being played up and down on TV and cinema but it should be mentioned here anyways. &lt;br /&gt;
Microsoft, after about a decade of failed attempts, finally figured out how to properly advertise a  computer game. No longer is the most professional part about a game ad the last scene: &amp;#8220;Rated M for Mature&amp;#8221; .&lt;/p&gt;
&lt;p&gt;The mistake, or so it seems now, was that advertisers tried to convoy either the gameplay or the graphical prowess in the 30 second segments which both leave most people bewildered. Good modern games are a form of story telling however; They establish a fictive setting which you uncover as the story goes on, not unlike popular fiction books.&lt;/p&gt;
&lt;p&gt;&amp;#8220;Mad world&amp;#8221; manages to combine a graphical showcase with a hint of gameplay and, more importantly, it tells you about the setting of the game. You know that this is a hostile planet. That a war is being fought. Everything is destroyed. One side does not look human. The situation is obviously hopeless. The mood and grim.&lt;/p&gt;
&lt;p&gt;Marcus Fenix, the protagonist, however seems to be on top of things. He has a legitimate claim on the title of most bad ass digital action hero ever. As it turns out this title has to be attributed to Coal Train, a character who joins your squad in the second act of Gears of war.&lt;/p&gt;
&lt;p&gt;You basically want to run to the closest EB games and pick it up to see how things go by yourself.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://youtube.com/watch?v=IrL96H2wEVc&quot;&gt;via YouTube&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;object width=&quot;425&quot; height=&quot;350&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/IrL96H2wEVc&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/IrL96H2wEVc&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;350&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;It definitely helps that Gears is clearly one of the best games ever made. Its always a lot easier to advertise a good product.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>I am Canadian</title>
   <link href="http://blog.leetsoft.com/2006/12/11/i-am-canadian.html"/>
   <updated>2006-12-11T14:53:00-08:00</updated>
   <id>http://blog.leetsoft.com/2006/12/11/i-am-canadian</id>
   <content type="html">&lt;p&gt;Well ok i&amp;#8217;m not ( I probably get my passport sometime next year ) but regardless this ad makes people proud to be canadian even if they wouldn&amp;#8217;t even be able to find it on the map.&lt;/p&gt;
&lt;p&gt;It was played on the airwaves for many years so most north americans are probably overdosed on it by now. I decided to post it anyways for the benefit of the europeans. Hey Germany: Beer ads don&amp;#8217;t have to always contain obese people in beer gardens or random landscapes!&lt;/p&gt;
&lt;p&gt;&lt;object width=&quot;425&quot; height=&quot;350&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/BRI-A3vakVg&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/BRI-A3vakVg&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;350&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Excellence in Advertisement</title>
   <link href="http://blog.leetsoft.com/2006/12/09/original-playstation.html"/>
   <updated>2006-12-09T20:39:00-08:00</updated>
   <id>http://blog.leetsoft.com/2006/12/09/original-playstation</id>
   <content type="html">&lt;p&gt;Ok i admit it. I love good advertisement. I decided to collect some of the greater examples of the trade here and post them in the new Excellence in Advertisement section.&lt;/p&gt;
&lt;p&gt;To kick this off, here is the European original ad for the sony playstation. In my humble opinion this is one of the best ads ever made:&lt;/p&gt;
&lt;p&gt;&lt;object width=&quot;425&quot; height=&quot;350&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/6Bqq38WZctA&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/6Bqq38WZctA&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;350&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;If you know of great advertisement &amp;#8211; preferably controversial pieces &amp;#8211; please post it in the comments.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Ad war of the titans</title>
   <link href="http://blog.leetsoft.com/2006/12/08/ad-war-of-the-titans.html"/>
   <updated>2006-12-08T13:16:00-08:00</updated>
   <id>http://blog.leetsoft.com/2006/12/08/ad-war-of-the-titans</id>
   <content type="html">&lt;p&gt;via &lt;a href=&quot;http://wagerlabs.com&quot;&gt;wagerlabs&lt;/a&gt; :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/12/7/BMW.jpg&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/12/8/Audi_400x300.shkl.jpg&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/12/8/Subaru_400x300.shkl.jpg&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/12/8/Bentley_400x510.shkl.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Xbox repair</title>
   <link href="http://blog.leetsoft.com/2006/12/04/xbox-repair.html"/>
   <updated>2006-12-04T13:39:00-08:00</updated>
   <id>http://blog.leetsoft.com/2006/12/04/xbox-repair</id>
   <content type="html">&lt;p&gt;If you ever feel inclined to return your broken xbox 360 to future shop, well, don&amp;#8217;t.&lt;/p&gt;
&lt;p&gt;Deal directly with microsoft. Its better for your heart.&lt;/p&gt;
&lt;p&gt;This monday marks the beginning of &lt;strong&gt;week 8&lt;/strong&gt; since turning it in.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/12/4/x360.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;UPDATE&lt;/span&gt;&lt;/strong&gt;: Finally got it back.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>As seen on TV</title>
   <link href="http://blog.leetsoft.com/2006/11/27/as-seen-on-tv.html"/>
   <updated>2006-11-27T23:51:00-08:00</updated>
   <id>http://blog.leetsoft.com/2006/11/27/as-seen-on-tv</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://callforhelptv.com/&quot;&gt;Call for Help&lt;/a&gt; recently conducted an interview with me and &lt;a href=&quot;http://tech.nologi.ca&quot;&gt;Scott&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;object width=&quot;425&quot; height=&quot;350&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/sbEwrFEzKDA&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/sbEwrFEzKDA&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;350&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Happy Helloween!</title>
   <link href="http://blog.leetsoft.com/2006/10/31/happy-helloween.html"/>
   <updated>2006-10-31T22:45:00-08:00</updated>
   <id>http://blog.leetsoft.com/2006/10/31/happy-helloween</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;http://static.flickr.com/101/285151401_31a01cb0a3.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Thanks &lt;a href=&quot;http://www.infogopher.com&quot;&gt;Fiona&lt;/a&gt;! I had a good laugh when I came home today :)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Do not click</title>
   <link href="http://blog.leetsoft.com/2006/10/27/do-not-click.html"/>
   <updated>2006-10-27T18:37:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/10/27/do-not-click</id>
   <content type="html">&lt;p&gt;Amazing &amp;#8220;research&amp;#8221; site about &lt;a href=&quot;http://www.dontclick.it/&quot;&gt;no click interfaces&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Talk about eating your own dogfood.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.dontclick.it/&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/10/27/noclick.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Daytrading</title>
   <link href="http://blog.leetsoft.com/2006/10/25/daytrading.html"/>
   <updated>2006-10-25T11:47:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/10/25/daytrading</id>
   <content type="html">&lt;p&gt;A friend send me a picture of his desk recently&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.leetsoft.com/assets/2006/10/25/desktop-big.jpg&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/10/25/desktop.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I guess that about sums it up.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Ninjistix FTW</title>
   <link href="http://blog.leetsoft.com/2006/10/19/ninjistix-ftw.html"/>
   <updated>2006-10-19T23:53:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/10/19/ninjistix-ftw</id>
   <content type="html">&lt;p style=&quot;float:right;&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/10/20/ninja_2_thumb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://codyfauser.com&quot;&gt;Cody&lt;/a&gt;, &lt;a href=&quot;http://troubleseeker.com&quot;&gt;Daniel&lt;/a&gt; and I locked ourselves into the office one whole Saturday to compete in the last RailsDay competition with the objective to create a rails app in 24 hours.&lt;/p&gt;
&lt;p&gt;We decided to do the obvious: a Ninja simulation which would allow you to duel other ninjas 24/7 including drafting of a training schedule, rare special moves, quest, exp, leveling and of course random killing sprees in the local village. They don&amp;#8217;t mind.&lt;/p&gt;
&lt;p&gt;120 checkins  later ( choice checkin message: &amp;#8220;Fixed the bug that would leave your ninja unconscious after meditating&amp;#8221; ) we finished entry.&lt;/p&gt;
&lt;p&gt;For some freaky reason however we received higest honors: &lt;a href=&quot;http://railsday2006.com/2006/10/18/rails-day-2006-winners&quot;&gt;1st place in the Most Creative section&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;On behalf of the team I would like to apologize to any sane person who was forced to try out Ninjistix by the committee duty. We accept the prize nonetheless!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;UPDATE&lt;/span&gt;:&lt;/strong&gt; Evan posted a great &lt;a href=&quot;http://blog.evanweaver.com/articles/2006/10/19/grand-tour-of-the-13-railsday-winners&quot;&gt;writeup of the winners&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Boxed Terraflops</title>
   <link href="http://blog.leetsoft.com/2006/10/17/boxed-terraflops.html"/>
   <updated>2006-10-17T16:06:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/10/17/boxed-terraflops</id>
   <content type="html">&lt;p&gt;Sun unveiled &lt;a href=&quot;http://www.sun.com/emrkt/blackbox/index.jsp&quot;&gt;Project Blackbox&lt;/a&gt; which is essentially an entire data-center in a industry standard Shipping container.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.sun.com/emrkt/blackbox/index.jsp&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/10/17/sun.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The idea is a stroke of genius and will surely help to dramatically reduce hosting fees in the foreseeable future. There should be little reason to create a traditional datacenter with these things readily available.&lt;/p&gt;
&lt;p&gt;Sun stock just started to look really really compelling.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Shoes vs. Space</title>
   <link href="http://blog.leetsoft.com/2006/10/16/shoes-vs-space.html"/>
   <updated>2006-10-16T23:58:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/10/16/shoes-vs-space</id>
   <content type="html">&lt;p&gt;One of the &lt;del&gt;worst&lt;/del&gt; best things about going abroad for a while is finding all the subtle differences when you get home. In my house for example the usual suspects are completely re-arranged furniture or different wall colors in various rooms stemming from bored females in my life.&lt;/p&gt;
&lt;p&gt;Here is the kicker though:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.infogopher.com&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/10/17/shoedrawer.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is my sweater drawer. At least it used to be. I&amp;#8217;m reduced to a grand total of two drawers for all my clothing. Talk about embracing constraints.&lt;/p&gt;
&lt;p&gt;At various points since my return I tried to bring up the point about gender equality in storage space but I suspect most of you know how well these things usually work&amp;#8230;&lt;/p&gt;
&lt;p&gt;If you feel like telling Fiona what you think about this &amp;#8220;redistribution&amp;#8221; of space you should swing by her own blog at &lt;a href=&quot;http://www.infogopher.com&quot;&gt;infogopher.com&lt;/a&gt; or better subscribe. Lots of embarrassing facts about me will surely be revealed there.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>jP Testing setup</title>
   <link href="http://blog.leetsoft.com/2006/10/11/jp-testing-setup.html"/>
   <updated>2006-10-11T13:58:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/10/11/jp-testing-setup</id>
   <content type="html">&lt;p&gt;Running a server farm is hard business.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/10/11/servers.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Paul, our server admin, talks on how to inject some sanity in the process by creating a good &lt;br /&gt;
&lt;a href=&quot;http://paul.ouderkirk.ca/2006/10/11/network-experiments-with-vmware-server&quot;&gt;virtualized server setup&lt;/a&gt; while toying with &lt;span class=&quot;caps&quot;&gt;CARP&lt;/span&gt;, a system which creates redundancy on the IP level.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Google code search</title>
   <link href="http://blog.leetsoft.com/2006/10/05/google-code-search.html"/>
   <updated>2006-10-05T13:20:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/10/05/google-code-search</id>
   <content type="html">&lt;p style=&quot;float:right;&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/10/5/codesearch_logo.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Google launched their new &lt;a href=&quot;http://www.google.com/codesearch&quot;&gt;Code Search&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here is an example of how to search for the implementation of assert_difference limited to &lt;span class=&quot;caps&quot;&gt;MIT&lt;/span&gt; licensed code:&lt;/p&gt;
&lt;p&gt;&amp;#8220;&lt;code&gt;&amp;#8221;def assert_difference&amp;quot; license:&lt;span class=&quot;caps&quot;&gt;MIT&lt;/span&gt;&lt;/code&gt;&amp;quot;:http://www.google.com/codesearch?q=%22def+assert_difference%22+license%3AMIT&amp;amp;btnG=Search+Code&lt;/p&gt;
&lt;p&gt;Hats off google. This is all kinds of awesome. Finally we can prove that programmers &lt;a href=&quot;http://www.google.com/codesearch?hl=en&amp;amp;lr=&amp;amp;q=fuck%7Cshit%7Cdamn%7Ccrap&amp;amp;btnG=Search&quot;&gt;like to swear a lot&lt;/a&gt; &lt;em&gt;(179,000 results)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/10/5/crap.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Uh Oh</title>
   <link href="http://blog.leetsoft.com/2006/09/27/uh-oh.html"/>
   <updated>2006-09-27T01:16:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/09/27/uh-oh</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/9/27/native.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Nasty. Via &lt;a href=&quot;http://thedailywtf.com/&quot;&gt;Daily wtf&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Microformats</title>
   <link href="http://blog.leetsoft.com/2006/09/26/microformats.html"/>
   <updated>2006-09-26T21:00:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/09/26/microformats</id>
   <content type="html">&lt;p style=&quot;float:right;&quot;&gt;&lt;a href=&quot;http://microformats.org/&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/9/26/microformats.gif&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://microformats.org/&quot;&gt;Microformats&lt;/a&gt; are definitely picking up the pace.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://leftlogic.com/&quot;&gt;Remy Sharp&lt;/a&gt; now weighted in with this brilliant &lt;a href=&quot;http://leftlogic.com/info/articles/microformats_bookmarklet&quot;&gt;microformats bookmarklet&lt;/a&gt;&lt;br /&gt;
. It allows you to discover common microformats on pages with a simple click of a button. Its great to see the grand vision of microformats edging closer to reality every day.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://leftlogic.com/info/articles/microformats_bookmarklet&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/9/27/mac_microformat.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Golden tobi double thumb for excellent execution.&lt;/p&gt;
&lt;p&gt;What are microformats?&lt;/p&gt;
&lt;p&gt;Microformats are essentially a guideline of how content designers should format common data. These &amp;#8220;formats&amp;#8221; are standardized and while not changing the appearance of this data it allows machines to parse it and extract these nuggets of data and process them further. In other words you will finally be able to drag drop a web page with contact information onto your Address software and it should &amp;#8220;just work&amp;#8221;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Dashalytics</title>
   <link href="http://blog.leetsoft.com/2006/09/20/dashalytics.html"/>
   <updated>2006-09-20T05:00:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/09/20/dashalytics</id>
   <content type="html">&lt;p&gt;Very cool &lt;span class=&quot;caps&quot;&gt;OSX&lt;/span&gt; Dashboard widget:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dashalytics.rovingrob.com/&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/9/20/dashaltytics.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Europe</title>
   <link href="http://blog.leetsoft.com/2006/09/04/europe.html"/>
   <updated>2006-09-04T20:34:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/09/04/europe</id>
   <content type="html">&lt;p&gt;I&amp;#8217;ll be in Europe for two weeks visiting family in Germany and then going to &lt;a href=&quot;http://europe.railsconf.com/&quot;&gt;RailsConf europe&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Drop me a note if you are a rubyists around Koblenz and we could meet up for a beer or two.&lt;/p&gt;
&lt;p&gt;Hope to see you there!&lt;/p&gt;
&lt;p&gt;In the mean time, check out the &lt;a href=&quot;http://jadedpixel.com/2006/9/4/crowdsourcing-internationalization&quot;&gt;latest post&lt;/a&gt; over on the jadedPixel blog on Crowdsourcing&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Super simple CSS bars</title>
   <link href="http://blog.leetsoft.com/2006/08/22/super-simple-css-bars.html"/>
   <updated>2006-08-22T13:41:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/08/22/super-simple-css-bars</id>
   <content type="html">&lt;p&gt;I needed some simple progress bars in a html table to indicate the progress of string translations in the new internationalizeable checkout process of Shopify and found an &lt;a href=&quot;http://blog.leetsoft.com/assets/2006/8/22/bars.html&quot;&gt;elegant &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; solution&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Html&lt;/strong&gt;: &lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;div class=&quot;progress-container&quot;&amp;gt;          
    &amp;lt;div style=&quot;width: 95%&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stylesheet&lt;/strong&gt;: &lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
div.progress-container {
  border: 1px solid #ccc; 
  width: 100px; 
  margin: 2px 5px 2px 0; 
  padding: 1px; 
  float: left; 
  background: white;
}&lt;/p&gt;
&lt;p&gt;div.progress-container &amp;gt; div {&lt;br /&gt;
  background-color: #ACE97C; &lt;br /&gt;
  height: 12px&lt;br /&gt;
}&lt;br /&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Which ends up looking like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/assets/2006/8/22/bars.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Liquid Group</title>
   <link href="http://blog.leetsoft.com/2006/08/21/liquid-group.html"/>
   <updated>2006-08-21T22:58:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/08/21/liquid-group</id>
   <content type="html">&lt;p&gt;I just started a mailing list / discussion board for &lt;a href=&quot;http://home.leetsoft.com/liquid&quot;&gt;Liquid&lt;/a&gt; at &lt;a href=&quot;http://groups.google.com/group/liquid-templates&quot;&gt;google groups&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you are interested please &lt;a href=&quot;http://home.leetsoft.com/liquid&quot;&gt;join the group&lt;/a&gt;. &lt;br/&gt;
If you are working on an application which uses liquid in any way, shape or form double please &lt;a href=&quot;http://home.leetsoft.com/liquid&quot;&gt;join the group&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: I posted some thoughts on the &lt;a href=&quot;http://groups.google.ca/group/liquid-templates/browse_thread/thread/9b1ab115b11f1c78/0477cbbf6a55c019?hl=en#0477cbbf6a55c019&quot;&gt;state of liquid&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Futuretech - Starfish</title>
   <link href="http://blog.leetsoft.com/2006/08/18/futuretech.html"/>
   <updated>2006-08-18T23:41:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/08/18/futuretech</id>
   <content type="html">&lt;p&gt;Lucas Carlson talks about his exciting new distributed application approach dubbed &lt;a href=&quot;http://tech.rufy.com/2006/08/mapreduce-for-ruby-ridiculously-easy.html&quot;&gt;Starfish&lt;/a&gt; which isessentially a 20% work (or less) 80% the effect implementation of google&amp;#8217;s phenomenally clever &lt;a href=&quot;http://en.wikipedia.org/wiki/MapReduce&quot;&gt;MapReduce&lt;/a&gt; technology.&lt;/p&gt;
&lt;p&gt;A distributed log file parser can look as simple as this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
    server do |map_reduce|
      map_reduce.type = File
      map_reduce.input = &quot;/tmp/big_log_file&quot;
      map_reduce.queue_size = 1000 # how many lines of the file to
buffer at a time
      map_reduce.lines_per_client = 100 # how many lines each client
will process at a time
      map_reduce.rescan_when_complete = true
    end

    client do |line|
      if line =~ /some_regex/
        logger.info(line)
      end
    end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Save and run it as &lt;code&gt;statistics.rb&lt;/code&gt; and run&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
# starfish statistics.rb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Which leads the server to read in the affectionaly called big_ass_file in chunks of 1000 lines, tickle them out to any amount of clients which in turn parse the data by regexp and report back their findings to the server. The server can then act upon this new found wisdom. Perhaps by updating your client&amp;#8217;s statistics or by issuing warnings to abusive customers. Any sizable data mining task should be accomplishable with this strategy.&lt;/p&gt;
&lt;p&gt;The library only works with ActiveRecord data sets at this point but array and file, as demonstrated above, are in the pipeline.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Starfish 1.1 is now available with the file support mentioned above.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Google Analytics now open</title>
   <link href="http://blog.leetsoft.com/2006/08/16/google-analytics-now-open.html"/>
   <updated>2006-08-16T09:45:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/08/16/google-analytics-now-open</id>
   <content type="html">&lt;div style=&quot;float:right;padding: 15px&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.google.com/analytics/&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/images/analytics.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;http://www.google.com/analytics/&quot;&gt;Google Analytics&lt;/a&gt; has finally opened its doors to the general public.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://analytics.blogspot.com/2006/08/were-open-instant-access-now-available_15.html&quot;&gt;Announcement is here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We use GA quite heavily to improve the &lt;span class=&quot;caps&quot;&gt;CMS&lt;/span&gt; powering &lt;a href=&quot;http://shopify.com&quot;&gt;Shopify.com&lt;/a&gt; and there are plans to integrate GA directly into shopify for super convenient conversation tracking. Its a brilliant product and free to boot.&lt;/p&gt;
&lt;p&gt;&lt;br clear=&quot;all&quot; /&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Text Link Ads plugin</title>
   <link href="http://blog.leetsoft.com/2006/08/14/text-link-ads-plugin.html"/>
   <updated>2006-08-14T20:43:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/08/14/text-link-ads-plugin</id>
   <content type="html">&lt;div style=&quot;float:right;padding: 15px&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.text-link-ads.com/?ref=20722&quot;&gt;&lt;img src=&quot;http://www.text-link-ads.com/images/text_link_ads_A_125x125.gif&quot; border=&quot;0&quot; alt=&quot;Text Link Ads&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;You have probably noticed the sponsored links off to the side on this weblog.&lt;/p&gt;
&lt;p&gt;These links come from the wonderful service &lt;a href=&quot;http://www.text-link-ads.com/?ref=20722&quot;&gt;Text Link Ads&lt;/a&gt; which is currently financing my video game addiction and some.&lt;/p&gt;
&lt;p&gt;To integrate the service in this mephisto blog I created a simple set of &lt;a href=&quot;http://home.leetsoft.com/liquid&quot;&gt;liquid&lt;/a&gt; helpers:&lt;/p&gt;
&lt;p&gt;To install just run&lt;/p&gt;
&lt;macro:code&gt;
./script/plugin install svn://vault.jadedpixel.com/plugins/mephisto_textlinkads
&lt;/macro:code&gt;
&lt;p&gt;and add something this anywhere in your liquid files:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
  &amp;lt;div class=&quot;sidebar-node&quot;&amp;gt;
      &amp;lt;h3&amp;gt;Sponsored Links&amp;lt;/h3&amp;gt;
      &amp;lt;ul&amp;gt;        
      &amp;lt;your tla code&amp;gt;
     &amp;lt;/ul&amp;gt;
  &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;</content>
 </entry>
 
 <entry>
   <title>Rails 1.1.5</title>
   <link href="http://blog.leetsoft.com/2006/08/09/rails-1-1-5.html"/>
   <updated>2006-08-09T21:56:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/08/09/rails-1-1-5</id>
   <content type="html">&lt;p&gt;A Security problem cropped up the other day which was so serious that we decited to create another release.&lt;/p&gt;
&lt;p&gt;Please &lt;a href=&quot;http://weblog.rubyonrails.com/2006/8/9/rails-1-1-5-mandatory-security-patch-and-other-tidbits&quot;&gt;read the annoucement&lt;/a&gt; on the rails blog and run &lt;code&gt;gem update&lt;/code&gt; as soon as possible.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Shiny Liquid</title>
   <link href="http://blog.leetsoft.com/2006/08/02/shiny-liquid.html"/>
   <updated>2006-08-02T10:22:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/08/02/shiny-liquid</id>
   <content type="html">&lt;p&gt;Eugen Minciu created  a &lt;a href=&quot;http://www.vim.org/scripts/script.php?script_id=1626&quot;&gt;liquid syntax highlighting&lt;/a&gt; script for &lt;span class=&quot;caps&quot;&gt;VIM&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;If &amp;#8220;vim is the totally best editor in like ever&amp;#8221; to you please give it a spin and join the discussion &lt;a href=&quot;http://home.leetsoft.com/liquid/ticket/280&quot;&gt;on the trac&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Nike+ iPod Sports Kit</title>
   <link href="http://blog.leetsoft.com/2006/07/25/nike-ipod-sports-kit.html"/>
   <updated>2006-07-25T14:57:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/07/25/nike-ipod-sports-kit</id>
   <content type="html">&lt;p&gt;Anyone successfully acquired one of &lt;a href=&quot;http://www.nike.com/nikeplus/&quot;&gt;these beauties&lt;/a&gt; in Canada?&lt;/p&gt;
&lt;p&gt;Running Room.ca says they will get some of the compatible shoes middle to late August. Unfortunately thats already pretty much the homestretch of the running season up here so I wonder if there are any other options of getting the set?&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Typo 4.0 is out</title>
   <link href="http://blog.leetsoft.com/2006/07/23/typo-4-0-is-out.html"/>
   <updated>2006-07-23T09:06:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/07/23/typo-4-0-is-out</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://scottstuff.net/blog/articles/2006/07/22/typo-4-0-0&quot;&gt;Scott Laird and team released&lt;/a&gt; &lt;br /&gt;
 the new major version of typo.&lt;/p&gt;
&lt;p&gt;Everything from federated feedback overview to &lt;a href=&quot;http://akismet.com/&quot;&gt;Akismet&lt;/a&gt; spam filtering everything is included and pre packaged for you.&lt;/p&gt;
&lt;p&gt;Head over to &lt;a href=&quot;http://typosphere.org/trac&quot;&gt;typosphere&lt;/a&gt; or use the new gems &lt;br /&gt;
installation system to fetch your copy.&lt;/p&gt;
&lt;blockquote&gt;
$ gem install typo&lt;br/&gt;
$ typo install /some/directory
&lt;/blockquote&gt;</content>
 </entry>
 
 <entry>
   <title>Shopify Party</title>
   <link href="http://blog.leetsoft.com/2006/07/10/shopify-party.html"/>
   <updated>2006-07-10T20:48:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/07/10/shopify-party</id>
   <content type="html">&lt;p&gt;Don&amp;#8217;t forget that tonight is the belated &lt;a href=&quot;http://shopify.com/party/&quot;&gt;Shopify Launch Party&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://maps.google.com/maps?f=q&amp;amp;hl=en&amp;amp;q=292+Elgin+Street,+Ottawa,+Canada&amp;amp;ie=UTF8&amp;amp;ll=45.418998,-75.689793&amp;amp;spn=0.025966,0.079222&amp;amp;om=1&quot;&gt;venue&lt;/a&gt; is fantastic and Fiona did a great job organizing everything. We even got our very own schwag!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/schwag.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Beautiful Apps</title>
   <link href="http://blog.leetsoft.com/2006/07/03/beautiful-apps.html"/>
   <updated>2006-07-03T11:44:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/07/03/beautiful-apps</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.phillryu.com&quot;&gt;Phill Ryu&lt;/a&gt; compiled a wonderful lists of the &lt;a href=&quot;http://www.phillryu.com/2006/07/03/the-top-ten-most-beautiful-os-x-apps/&quot;&gt;top 10 most beautiful &lt;span class=&quot;caps&quot;&gt;OSX&lt;/span&gt; apps&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.phillryu.com/2006/07/03/the-top-ten-most-beautiful-os-x-apps/&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/voicecandy.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Definitely check this out, even if you &lt;a href=&quot;http://flickr.com/photos/mintchaos/sets/72157594176520552&quot;&gt;don&amp;#8217;t have a mac yet&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Happy Canada Day</title>
   <link href="http://blog.leetsoft.com/2006/07/01/happy-canada-day.html"/>
   <updated>2006-07-01T14:18:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/07/01/happy-canada-day</id>
   <content type="html">&lt;p style=&quot;text-align:justify;&quot;&gt;&lt;a href=&quot;http://blog.leetsoft.com/files/canada-day.jpg&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/canada-day-t.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Radiant is cool</title>
   <link href="http://blog.leetsoft.com/2006/06/19/radiant-is-cool.html"/>
   <updated>2006-06-19T11:46:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/06/19/radiant-is-cool</id>
   <content type="html">&lt;p&gt;We just re-launched &lt;a href=&quot;http://shopify.com&quot;&gt;Shopify.com&lt;/a&gt; based on &lt;a href=&quot;http://www.radiantcms.com/&quot;&gt;Radiant &lt;span class=&quot;caps&quot;&gt;CMS&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;text-align:center;&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;http://www.radiantcms.com/&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/screenshots/radiant.gif&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Highly recommended.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>RJS Templates for Rails</title>
   <link href="http://blog.leetsoft.com/2006/06/13/rjs-templates-for-rails.html"/>
   <updated>2006-06-13T14:01:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/06/13/rjs-templates-for-rails</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://oreilly.com/catalog/rjsrails/&quot; title=&quot;RJS Templates for Rails&quot; style=&quot;float:right; padding: 0 0 10px 10px&quot;&gt;&lt;img src=&quot;/files/images/rjs.gif&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class=&quot;caps&quot;&gt;RJS&lt;/span&gt; is one of the hottest topics in the rails and web development world. It fuses the worlds of server sided development and client sided code into a familiar and streamlined unit. All recently released rails applications I can think of make heavy use of this technology.&lt;/p&gt;
&lt;p&gt;One of the main things that held it back so far was the lack of documentation. Like many abstract concepts its hard to explain a elegant solution like &lt;span class=&quot;caps&quot;&gt;RJS&lt;/span&gt; if you have never felt the actual pains and experienced the problems which it solves.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.codyfauser.com/&quot;&gt;Cody Fauser&amp;#8217;s&lt;/a&gt; newly released book &lt;a href=&quot;http://oreilly.com/catalog/rjsrails/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RJS&lt;/span&gt; Templates for Rails&lt;/a&gt; addresses this issue masterfully and explains everything with clarity and context; something that makes a book of this type stand out from the crowd.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Shopify is live</title>
   <link href="http://blog.leetsoft.com/2006/06/02/shopify-live.html"/>
   <updated>2006-06-02T11:57:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/06/02/shopify-live</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://shopify.com&quot;&gt;Shopify&lt;/a&gt; is live. As simple as that.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://shopify.com&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/images/shopify.png&quot; alt=&quot;Shopify is live&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;small&gt;Excuse me I&amp;#8217;m going to faint now.&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Please &lt;a href=&quot;http://digg.com/software/Shopify_released_-_RoR_based_internet_store_in_2_minutes&quot;&gt;Digg&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Rightclick for early adopters</title>
   <link href="http://blog.leetsoft.com/2006/06/01/rightclick-for-early-adopters.html"/>
   <updated>2006-06-01T19:03:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/06/01/rightclick-for-early-adopters</id>
   <content type="html">&lt;p&gt;Early adopters have it tough when it comes to Apple products. Often their products can be too cutting edge for their own good and fail in &lt;del&gt;not so&lt;/del&gt; funny ways.&lt;/p&gt;
&lt;p&gt;One of the rougher occurances in recent &amp;#8220;early adopter shaftings&amp;#8221; was the decision to add the &amp;#8216;right click&amp;#8217; feature to all apple laptops except for the first batch of 15&amp;quot; MacBook Pro&amp;#8217;s.&lt;/p&gt;
&lt;p&gt;The one I bought&amp;#8230;&lt;br /&gt;
Note to self: never get a first gen product.&lt;/p&gt;
&lt;p&gt;Hackers to the rescue, the crafty crowd at OSX86 managed to extract an installer which can retrofit those MBP&amp;#8217;s with the missing feature. &lt;br /&gt;
You can read all about it on &lt;a href=&quot;http://forum.osx86project.org/index.php?showtopic=17685&amp;amp;st=20&amp;amp;p=118012&amp;amp;#entry118012&quot;&gt;their boards&lt;/a&gt; or on &lt;a href=&quot;http://www.tuaw.com/&quot;&gt;tuaw.com&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Interview with Scott</title>
   <link href="http://blog.leetsoft.com/2006/06/01/interview-with-scott.html"/>
   <updated>2006-06-01T06:32:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/06/01/interview-with-scott</id>
   <content type="html">&lt;p&gt;Marketing Monger &lt;a href=&quot;http://www.marketingmonger.com&quot;&gt;Eric Mattson&lt;/a&gt; recently interviewed &lt;a href=&quot;http://tech.nologi.ca&quot;&gt;Scott Lake&lt;/a&gt; on his Podcast.&lt;/p&gt;
&lt;p&gt;Scott talks about how Shopify came to pass and other marketing related things.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.marketingmonger.com/2006/05/marketingmonger_podcast_34_interview_with_scott_lake_of_jaded_pixel_and_shopify.htm&quot;&gt;MarketingMonger Podcast #34 &amp;#8211; Interview with Scott Lake of Jaded Pixel and Shopify&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>One for the books</title>
   <link href="http://blog.leetsoft.com/2006/06/01/one-for-the-books.html"/>
   <updated>2006-06-01T06:14:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/06/01/one-for-the-books</id>
   <content type="html">&lt;p&gt;This lack of soccer craze here in north america is getting to me.&lt;/p&gt;
&lt;p&gt;Here is a master piece of commentary to make up for it:&lt;/p&gt;
&lt;p&gt;&lt;object width=&quot;425&quot; height=&quot;350&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/wsVeixhtlkc&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/wsVeixhtlkc&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;425&quot; height=&quot;350&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Shopify Sneak Preview</title>
   <link href="http://blog.leetsoft.com/2006/05/31/shopify-sneak-preview.html"/>
   <updated>2006-05-31T07:13:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/05/31/shopify-sneak-preview</id>
   <content type="html">&lt;p&gt;Yesterday we sent out invitation tokens to everyone who signed up to the shopify announcement list.&lt;/p&gt;
&lt;p&gt;The responses we got so far were fantastic. I cannot even describe how incredible it feels to see so many people excited about the product of 2 years labor. High five to everyone in the team and thanks to all the people who have been rooting for us!&lt;/p&gt;
&lt;p&gt;About 1.500 stores signed up for the sneak preview yesterday. At times we were pushing 1mb per second in traffic and went to just shy of 100 hits per second. Everything worked as intended. The Database shrugged it off and &lt;a href=&quot;http://home.leetsoft.com/liquid&quot;&gt;Liquid&lt;/a&gt; was happily compiling templates as it should.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://76design.com/shiftcontrol/index.php/2006/05/30/shopify/&quot;&gt;Shift+control&lt;/a&gt; said:&lt;/p&gt;
&lt;p&gt;&amp;gt;  For something as ubiquitous as e-commerce, it’s been too expensive for regular people to get into for too long &amp;#8211; hopefully Shopify can change that the same way Blogger and LiveUpdate did for personal websites a few years ago.&lt;/p&gt;
&lt;p&gt;and &lt;a href=&quot;http://www.dannyweb.eu/2006/53&quot;&gt;Daniel McClelland&lt;/a&gt; noted:&lt;/p&gt;
&lt;p&gt;&amp;gt; The admin side of the site looks very impressive with a nice feel to the interface, everything is neatly organised and the features are impressively simple to use. &lt;br /&gt;
Along with the admin section is a Look and Feel section, which allows you to choose from the many pre-designed themes. Each one look as good as the last which could easily pass as a professionally designed £5000 design.&lt;/p&gt;
&lt;p&gt;We will open up &lt;a href=&quot;http://shopify.com&quot;&gt;Shopify&lt;/a&gt; to the general public within the week.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Running</title>
   <link href="http://blog.leetsoft.com/2006/05/30/running.html"/>
   <updated>2006-05-30T05:33:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/05/30/running</id>
   <content type="html">&lt;p&gt;So i recently picked up &lt;a href=&quot;http://www.bbc.co.uk/health/healthy_living/fitness/active_run.shtml&quot;&gt;running&lt;/a&gt; as a recreational instrument. &lt;br /&gt;
So far I&amp;#8217;m really enjoying it and more importantly quickly grow addicted to the additional energy it gives me.&lt;/p&gt;
&lt;p&gt;I hate to admit it but I fell in the hole of no workout that so many other people in the industry seem to be in after leaving high school. Occasional Rock Climbing, Snowboarding and other seasonal things not withstandingly.&lt;/p&gt;
&lt;p&gt;Running seems to be a good fit. Its available, requring no travel. I don&amp;#8217;t rely on other people who might be as hard to motivate as i&amp;#8217;m myself. &lt;br /&gt;
Its efficient because it doesn&amp;#8217;t require a long time to reach my personal limit as opposed to say biking.&lt;/p&gt;
&lt;p&gt;What other workouts are common for the time deprived and lazy programmer folks out there?&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Easy migration between Databases</title>
   <link href="http://blog.leetsoft.com/2006/05/29/easy-migration-between-databases.html"/>
   <updated>2006-05-29T07:01:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/05/29/easy-migration-between-databases</id>
   <content type="html">&lt;p&gt;Recently we did a major switch in Database architectures here at jaded Pixel and needed a simple way to move from one architecture to another.&lt;/p&gt;
&lt;p&gt;The first thing I tried was to try to get the dump utility of the database we were using to produce sensible and portable &lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt; inserts. This effort fell flat on the face because of subtile differences in the database&amp;#8217;s string escaping and handling of booleans.&lt;/p&gt;
&lt;p&gt;So after a quick inquiry in the rails core channel &lt;a href=&quot;http://techno-weenie.net/&quot;&gt;Rick Olson&lt;/a&gt; recommended dumping the data to &lt;span class=&quot;caps&quot;&gt;YAML&lt;/span&gt; and reloading it on the other side. Simple enough, the total amount of data to transfer was well below 100mb so this seemed like a sensible approach.&lt;/p&gt;
&lt;p&gt;Get the &lt;strong&gt;&lt;a href=&quot;/files/code/backup.rake&quot;&gt;backup.rake&lt;/a&gt;&lt;/strong&gt; and add it to your lib/tasks/ directory.&lt;/p&gt;
&lt;p&gt;Here is the basic process:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Connect to your server and use &lt;code&gt;RAILS_ENV=production rake db:backup:write&lt;/code&gt; to get a yaml representation of all your data&lt;br /&gt;
  &lt;pre&gt;&lt;code&gt;
  rake db:backup:write
  (in /Users/tobi/Code/Ruby/shopify)
  Writing addresses...
  Writing articles...
  Writing blogs...
  Writing carts...
  Writing collections...
  ...
  &lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
	&lt;li&gt;Update your datababe.yml to point to your new database.&lt;/li&gt;
	&lt;li&gt;Run &lt;code&gt;RAILS_ENV=production rake db:backup:read&lt;/code&gt; to fill your new database with all written data.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Careful &lt;code&gt;db:backup:read&lt;/code&gt; will &lt;strong&gt;delete all data&lt;/strong&gt; in the target database. Use only with extreme caution.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Shopify on news.com</title>
   <link href="http://blog.leetsoft.com/2006/05/27/shopify-on-news-com.html"/>
   <updated>2006-05-27T12:46:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/05/27/shopify-on-news-com</id>
   <content type="html">&lt;p&gt;Rafe Needleman of CNet took &lt;a href=&quot;http://shopify.com&quot;&gt;Shopify&lt;/a&gt; for a spin.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Next week, Shopify officially launches. It&amp;#8217;s a hosted commerce site &amp;#8212; not a unique concept. But it&amp;#8217;s got a super-clean design that makes setting up a store incredibly easy. If you have a small business that sells goods, this site is definitely worth checking out.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://news.com.com/2061-12572_3-6077602.html&quot;&gt;Shopify makes quick work of setting up shop&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Next week? Fun!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>TorCamp</title>
   <link href="http://blog.leetsoft.com/2006/05/13/torcamp.html"/>
   <updated>2006-05-13T09:04:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/05/13/torcamp</id>
   <content type="html">&lt;p&gt;I&amp;#8217;m off to toronto for this weekend&amp;#8217;s &lt;a href=&quot;http://barcamp.org/TorCamp&quot;&gt;BarCamp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;See you there!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://static.flickr.com/49/138335437_8b741ec533.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Mock some methods</title>
   <link href="http://blog.leetsoft.com/2006/05/03/mock-some-methods.html"/>
   <updated>2006-05-03T17:07:00-07:00</updated>
   <id>http://blog.leetsoft.com/2006/05/03/mock-some-methods</id>
   <content type="html">&lt;p&gt;Raphael Bauduin has a nice write-up on mock_methods. A handy tool for unit-testing, which lets you replace any number of methods on existing objects for the duration of a block.&lt;/p&gt;
&lt;p&gt;He explains how he uses it to test some difficult to test area in his paypal integration where the controller is dependent on outside information returned from paypal.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.myowndb.com/blog/?p=13&quot;&gt;Testing Rails controllers communicating with external web services&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Shopify is Real</title>
   <link href="http://blog.leetsoft.com/2006/04/14/shopify-is-real.html"/>
   <updated>2006-04-14T17:14:12-07:00</updated>
   <id>http://blog.leetsoft.com/2006/04/14/shopify-is-real</id>
   <content type="html">&lt;p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/beta.jpg&quot; border=&quot;0&quot; height=&quot;149&quot; width=&quot;150&quot; alt=&quot;beta.jpg&quot; style=&quot;float: right;margin: 0 5px; border: 0&quot; /&gt;&lt;/p&gt;
&lt;p&gt;What do you know? After more then a year, almost two if you count the development of snowdevil, &lt;a href=&quot;http://shopify.com/&quot;&gt;Shopify&lt;/a&gt; is done and ready to be shared.&lt;/p&gt;
&lt;p&gt;What a process. Releasing something you have worked on for such a long time got to be one of the most overwhelming things imaginable.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;Release &lt;a href=&quot;http://blog.jadedpixel.com/articles/2006/04/14/shopify-is-now-in-beta&quot;&gt;annoucement&lt;/a&gt; is on the jaded Pixel blog.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First 5 comments with emails get a invitaton key&lt;/strong&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Shopify Profile</title>
   <link href="http://blog.leetsoft.com/2006/03/21/shopify-profile.html"/>
   <updated>2006-03-21T17:47:40-08:00</updated>
   <id>http://blog.leetsoft.com/2006/03/21/shopify-profile</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://ecommerce.typepad.com/exciting_ecommerce/&quot;&gt;Exciting Commerce&lt;/a&gt;, a german speaking blog wrote a &lt;a href=&quot;http://ecommerce.typepad.com/exciting_ecommerce/2006/03/designershops_s.html&quot;&gt;nice article&lt;/a&gt; about &lt;a href=&quot;http://shopify.com/&quot;&gt;Shopify&lt;/a&gt; and its premise. Great read when you speak the language.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Good data</title>
   <link href="http://blog.leetsoft.com/2006/03/16/good-data.html"/>
   <updated>2006-03-16T15:12:15-08:00</updated>
   <id>http://blog.leetsoft.com/2006/03/16/good-data</id>
   <content type="html">&lt;p&gt;Rule #1 of sustainable development:&lt;/p&gt;
&lt;h3&gt;Have funny test data&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/cowabunga.png&quot; border=&quot;0&quot; height=&quot;361&quot; width=&quot;459&quot; alt=&quot;cowabunga.png&quot; align=&quot;&quot; /&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Liquid Textmate Bundle</title>
   <link href="http://blog.leetsoft.com/2006/03/16/liquid-textmate-bundle.html"/>
   <updated>2006-03-16T13:41:42-08:00</updated>
   <id>http://blog.leetsoft.com/2006/03/16/liquid-textmate-bundle</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://sg.validcode.at/&quot;&gt;Sebastian&lt;/a&gt; just posted his &lt;a href=&quot;http://sg.validcode.at/articles/2006/03/16/liquid-and-shopify-textmate-bundle&quot;&gt;textmate bundles&lt;/a&gt; for liquid and shopify.&lt;/p&gt;
&lt;p&gt;Cheers!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://sg.validcode.at/articles/2006/03/16/liquid-and-shopify-textmate-bundle&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/textmate-bundles.png&quot; border=&quot;0&quot; height=&quot;78&quot; width=&quot;315&quot; alt=&quot;textmate-bundles.png&quot; align=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Slash7 Interview</title>
   <link href="http://blog.leetsoft.com/2006/03/16/slash7-interview.html"/>
   <updated>2006-03-16T12:05:27-08:00</updated>
   <id>http://blog.leetsoft.com/2006/03/16/slash7-interview</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.slash7.com&quot;&gt;Amy Hoy&lt;/a&gt; recently conducted a little &lt;a href=&quot;http://www.slash7.com/articles/2006/03/15/interview-with-tobi-lutke-of-shopify&quot;&gt;interview&lt;/a&gt; with me. &lt;br /&gt;
The topic of the hour is &lt;a href=&quot;http://vision.shopify.com/&quot;&gt;Vision&lt;/a&gt;, our tool for &lt;a href=&quot;http://www.shopify.com/&quot;&gt;Shopify&lt;/a&gt; design mavens but we also touch on Buzz, Shopify and Rails.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>DAMN!</title>
   <link href="http://blog.leetsoft.com/2006/03/16/damn.html"/>
   <updated>2006-03-16T00:55:10-08:00</updated>
   <id>http://blog.leetsoft.com/2006/03/16/damn</id>
   <content type="html">&lt;p&gt;Whats the worst nightmare of a rails committer?&lt;/p&gt;
&lt;p&gt;Causing david to commit something like &lt;a href=&quot;http://dev.rubyonrails.org/changeset/3883&quot;&gt;this&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The shame!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Simple Encryption</title>
   <link href="http://blog.leetsoft.com/2006/03/14/simple-encryption.html"/>
   <updated>2006-03-14T18:06:00-08:00</updated>
   <id>http://blog.leetsoft.com/2006/03/14/simple-encryption</id>
   <content type="html">&lt;p&gt;For storing credit cards of our clients in our databases we use an asymmetric encryption system. Our web server farm only has the public key to encrypt the incoming cc&amp;#8217;s. For the actual billing we use an internal server with no direct ties to the net. It receives a list of encrypted credit cards and the amount owed and goes to work with the private key to decrypt the cards and balance the books.&lt;/p&gt;
&lt;p&gt;This little class does the encryption and decryption and even allows you to create a valid key pair. The ruby openssl library is not really documented so this might be useful to someone.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.leetsoft.com/files/crypto-key.rb.txt&quot;&gt;crypto-key.rb&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;

    require 'key' 

    Crypto.create_keys # creates rsa_key and rsa_key.pub


    priv_key = Crypto::Key.from_file('rsa_key')
    pub_key =  Crypto::Key.from_file('rsa_key.pub')
    
    text = &quot;I was encrypted but came back!&quot;
    
    secret = pub_key.encrypt(text)
    puts priv_key.decrypt(secret) #=&amp;gt; 
            &quot;I was encrypted but came back!&quot;

&lt;/code&gt;&lt;/pre&gt;</content>
 </entry>
 
 <entry>
   <title>Whats new in Rails 1.1</title>
   <link href="http://blog.leetsoft.com/2006/02/28/whats-new-in-rails-1-1.html"/>
   <updated>2006-02-28T11:33:18-08:00</updated>
   <id>http://blog.leetsoft.com/2006/02/28/whats-new-in-rails-1-1</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://scottraymond.net/&quot;&gt;Scott Raymond&lt;/a&gt; posted this great &lt;a href=&quot;http://scottraymond.net/articles/2006/02/28/rails-1.1&quot;&gt;overview of the new features&lt;/a&gt; in the upcoming rails 1.1 release.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Vision & WebDAV</title>
   <link href="http://blog.leetsoft.com/2006/02/25/vision-webdav.html"/>
   <updated>2006-02-25T15:24:26-08:00</updated>
   <id>http://blog.leetsoft.com/2006/02/25/vision-webdav</id>
   <content type="html">&lt;p&gt;Sebastian Gräßl figured out a way to share his vision themes &lt;a href=&quot;http://sg.validcode.at/articles/2006/02/25/vision-everywhere&quot;&gt;over WebDAV&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Vision for workgroups?&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>[RELEASE] Vision is out</title>
   <link href="http://blog.leetsoft.com/2006/02/21/release-vision-is-out.html"/>
   <updated>2006-02-21T00:17:00-08:00</updated>
   <id>http://blog.leetsoft.com/2006/02/21/release-vision-is-out</id>
   <content type="html">&lt;p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/vision-logo.png&quot; border=&quot;0&quot; height=&quot;128&quot; width=&quot;128&quot; alt=&quot;vision-logo.png&quot; style=&quot;float: right;margin: 0 5px&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Today we are releasing Vision, our tool to help designers create Shopify themes.&lt;/p&gt;
&lt;p&gt;Since this is a technical blog I&amp;#8217;ll leave the explanations to my fellow pixels regarding what this means for &lt;a href=&quot;http://encytemedia.com/blog/&quot;&gt;designers&lt;/a&gt; and &lt;a href=&quot;http://tech.nologi.ca/articles/2006/02/21/vision-is-great-for-business&quot;&gt;entrepreneurs&lt;/a&gt;. Instead I&amp;#8217;ll just describe what Vision is composed of on a technical level.&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;Vision is a ruby application built around webrick. It uses a home cooked servlet class which closely resembles rails for ease of use.&lt;/p&gt;
&lt;p&gt;After starting Vision up you will see the /dashboard/ screen on which you can decide where to go from there. If you decide to just check out one of the two default themes a cookie is set and you are taken to the root url / of vision.&lt;/p&gt;
&lt;p&gt;All urls in vision match their shopify counterparts. /products/arbor-draft would be /products/arbor-draft on the live server.&lt;/p&gt;
&lt;p&gt;Creating a new theme is just as easy on the dashboard. You just provide which theme you want to use as a base and what the name of the new theme should be.&lt;/p&gt;
&lt;p&gt;All themes live in the vision/themes folder. Creating a new theme just means copying the existing one in the new folder. You don&amp;#8217;t have to use the dashboard for this.&lt;/p&gt;
&lt;p&gt;Lastly there is export. Exporting a theme creates a zip file which you can in turn import in Shopify to get your redesign online.&lt;/p&gt;
&lt;p&gt;Technically one of the most nifty things about vision is the designers bar. This blue bar at the bottom of the browser is injected into your template and allows you to freely switch around between themes for comparison and move to all the different possible templates.&lt;/p&gt;
&lt;p&gt;So run, don&amp;#8217;t walk, to the vision page and snatch one of those &lt;a href=&quot;http://blog.jadedpixel.com/articles/2006/02/21/shopify-theme-challenge-a-one-gig-nano-and-your-name-up-in-lights&quot;&gt;iPod Nano&amp;#8217;s we are giving out&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;P.S: Please &lt;a href=&quot;http://tinyurl.com/rykqm&quot;&gt;digg&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Coming Soon</title>
   <link href="http://blog.leetsoft.com/2006/02/17/coming-soon.html"/>
   <updated>2006-02-17T20:16:24-08:00</updated>
   <id>http://blog.leetsoft.com/2006/02/17/coming-soon</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/vision-screen.gif&quot; border=&quot;0&quot; height=&quot;391&quot; width=&quot;438&quot; alt=&quot;vision-screen.gif&quot; align=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The coolest tool for designers since &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; :)&lt;/p&gt;
&lt;p&gt;Stay tuned.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Ottawa Citizen</title>
   <link href="http://blog.leetsoft.com/2006/02/16/ottawa-citizen.html"/>
   <updated>2006-02-16T15:48:52-08:00</updated>
   <id>http://blog.leetsoft.com/2006/02/16/ottawa-citizen</id>
   <content type="html">&lt;p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/tobi-picture-1.jpg&quot; border=&quot;0&quot; alt=&quot;tobi-picture-1.jpg&quot; align=&quot;right&quot; width=&quot;150&quot; height=&quot;150&quot; style=&quot;margin: 0 10px&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://www.canada.com/ottawacitizen/index.html&quot;&gt;Ottawa Citizen&lt;/a&gt; conducted a series of interviews with me and the other pixels. It talks about the history behind typo and what web 2.0 means to different people amongst other things.&lt;br /&gt;
&lt;br/&gt;&lt;br/&gt;
The magazine is in print but the article is also available on their web page:&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.canada.com/ottawacitizen/news/technology/story.html?id=2f5d740a-c4db-45df-a1af-0cacf2ffb367&quot;&gt;Read it here&lt;/a&gt;&lt;/p&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Acts As Threaded</title>
   <link href="http://blog.leetsoft.com/2006/02/11/acts-as-threaded.html"/>
   <updated>2006-02-11T13:16:02-08:00</updated>
   <id>http://blog.leetsoft.com/2006/02/11/acts-as-threaded</id>
   <content type="html">&lt;p&gt;Very cool &lt;a href=&quot;http://www.railtie.net/plugins/acts_as_threaded/threaded.swf&quot;&gt;screencast&lt;/a&gt; for a very cool &lt;a href=&quot;http://www.railtie.net/articles/2006/02/05/rails-acts_as_threaded-plugin&quot;&gt;plugin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cheers!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>New Liquid features</title>
   <link href="http://blog.leetsoft.com/2006/02/10/new-liquid-features.html"/>
   <updated>2006-02-10T14:06:58-08:00</updated>
   <id>http://blog.leetsoft.com/2006/02/10/new-liquid-features</id>
   <content type="html">&lt;p&gt;For &lt;a href=&quot;http://shopify.com&quot;&gt;shopify&lt;/a&gt; I&amp;#8217;m currently working more and more with &lt;a href=&quot;http://home.leetsoft.com/liquid&quot;&gt;liquid&lt;/a&gt; since  we are finishing up Vision, our tool for shopify theme designers.&lt;/p&gt;
&lt;p&gt;With liquid increasingly becoming something real I&amp;#8217;m adding more and more features to it based on feedback and on actual needs which become clear during development.&lt;/p&gt;
&lt;p&gt;Here are some recent additions:&lt;/p&gt;
&lt;p&gt;for syntax now supports sql like limit and offset syntax&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;for html tables you can use the similar tablerow helper which takes an optional cols parameter:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
&amp;amp;lt;table&amp;amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;I also added new filters to the &lt;a href=&quot;http://home.leetsoft.com/liquid/browser/trunk/liquid/lib/liquid/standardfilters.rb&quot;&gt;standard&lt;/a&gt; library.&lt;br /&gt;
Amongst others you can now find&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;truncate&lt;/li&gt;
	&lt;li&gt;truncatewords&lt;/li&gt;
	&lt;li&gt;date&lt;/li&gt;
	&lt;li&gt;upcase&lt;/li&gt;
	&lt;li&gt;downcase&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let me know of any other ones you would like to see by default&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>RailsConf, here I come</title>
   <link href="http://blog.leetsoft.com/2006/02/03/railsconf-here-i-come.html"/>
   <updated>2006-02-03T15:50:03-08:00</updated>
   <id>http://blog.leetsoft.com/2006/02/03/railsconf-here-i-come</id>
   <content type="html">&lt;p&gt;I just got ticket &amp;amp; hotel room for &lt;a href=&quot;http://www.troubleseeker.com/&quot;&gt;Daniel&lt;/a&gt; and me for this year&amp;#8217;s &lt;a href=&quot;http://www.railsconf.com/&quot;&gt;RailsConf&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/Picture_2.png&quot; border=&quot;0&quot; height=&quot;153&quot; width=&quot;265&quot; alt=&quot;Rails Conf&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If you want to attend you should head over there now and reserve your spot as it seems to be half sold out already after just one day.&lt;/p&gt;
&lt;p&gt;See you there!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Cool App of the Day</title>
   <link href="http://blog.leetsoft.com/2006/01/27/cool-app-of-the-day.html"/>
   <updated>2006-01-27T20:37:00-08:00</updated>
   <id>http://blog.leetsoft.com/2006/01/27/cool-app-of-the-day</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.stikipad.com/&quot;&gt;StikiPad&lt;/a&gt; is a great new hosted wiki app written in full ruby on rails.&lt;/p&gt;
&lt;p&gt;From my impartial point of view the coolest thing about it is that they use &lt;a href=&quot;http://home.leetsoft.com/liquid&quot;&gt;liquid&lt;/a&gt; for customer templates.&lt;/p&gt;
&lt;p&gt;Well damn someone beat me to it!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The killer feature for us &amp;#8211; was being able to use &lt;a href=&quot;http://home.leetsoft.com/liquid&quot;&gt;Liquid&lt;/a&gt; &amp;#8212; Jonathan George&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Congrats on shipping your app! Its damn hard, let me tell you&amp;#8230;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Shopify & Your own Domain.com</title>
   <link href="http://blog.leetsoft.com/2006/01/24/shopify-your-own-domain-com.html"/>
   <updated>2006-01-24T20:37:00-08:00</updated>
   <id>http://blog.leetsoft.com/2006/01/24/shopify-your-own-domain-com</id>
   <content type="html">&lt;p&gt;I just posted some new information on &lt;a href=&quot;http://blog.jadedpixel.com/articles/2006/01/24/how-domains-work-in-shopify&quot;&gt;how to wire up your own domains to Shopify&lt;/a&gt; on the &lt;a href=&quot;http://blog.jadedpixel.com&quot;&gt;pixelsoup&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We get a lot of questions about the &lt;em&gt;&amp;#8220;bring your own domain&amp;#8221;&lt;/em&gt; feature of Shopify. &lt;br /&gt;
Somewhat surprisingly there doesn&amp;#8217;t seem to be many web applications which offer this feature (are there any?).&lt;/p&gt;
&lt;p&gt;Here is how it will work in Shopify&amp;#8230;&lt;/p&gt;
&lt;/blockquote&gt;</content>
 </entry>
 
 <entry>
   <title>Shopify orders screen</title>
   <link href="http://blog.leetsoft.com/2006/01/16/shopify-orders-screen.html"/>
   <updated>2006-01-16T21:16:45-08:00</updated>
   <id>http://blog.leetsoft.com/2006/01/16/shopify-orders-screen</id>
   <content type="html">&lt;p&gt;We just posted added a &lt;a href=&quot;http://shopify.com/screenshots/&quot;&gt;Screenshots&lt;/a&gt; section to the &lt;a href=&quot;http://shopify.com/&quot;&gt;Shopify homepage&lt;/a&gt; and used the occasion to post another shot of the shopify orders screen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://shopify.com/screenshots/orders_fullscreen.png&quot; style=&quot;padding:5px;border 1px solid #ccc;&quot;&gt;&lt;img src=&quot;http://shopify.com/screenshots/order-thumb.gif&quot; alt=&quot;Shopify Orders screen&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Shopify Happenings</title>
   <link href="http://blog.leetsoft.com/2006/01/07/shopify-happenings.html"/>
   <updated>2006-01-07T01:54:48-08:00</updated>
   <id>http://blog.leetsoft.com/2006/01/07/shopify-happenings</id>
   <content type="html">&lt;p&gt;Shopify development is surging along. New exciting things are happening all the time like yesterday&amp;#8217;s exposure on &lt;a href=&quot;http://www.techcrunch.com/2006/01/04/shopping-20/&quot;&gt;Techcrunch&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Today marked two more milestones for this project. We launched a new and improved ( 80% more gray, round corners for good measure ) &lt;a href=&quot;http://shopify.com&quot;&gt;shopify.com&lt;/a&gt; and also released the first &lt;a href=&quot;http://blog.jadedpixel.com/files/screens/shot1.jpg&quot;&gt;public screenshot&lt;/a&gt; of the administration interface.&lt;/p&gt;
&lt;p&gt;Exciting times, thats for sure.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.jadedpixel.com/files/screens/shot1.jpg&quot; &gt;&lt;img src=&quot;http://blog.jadedpixel.com/files/screens/shot1_thumb.jpg&quot; title=&quot;Shopify admin interface&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Ottawa Ruby Group meeting</title>
   <link href="http://blog.leetsoft.com/2005/12/24/ottawa-ruby-group-meeting.html"/>
   <updated>2005-12-24T21:17:00-08:00</updated>
   <id>http://blog.leetsoft.com/2005/12/24/ottawa-ruby-group-meeting</id>
   <content type="html">&lt;p&gt;Last week we had the first meeting of the Ottawa Group of Ruby Enthusiasts (&lt;span class=&quot;caps&quot;&gt;OGRE&lt;/span&gt;) and it was a great success.&lt;/p&gt;
&lt;p&gt;With &lt;strong&gt;12 people&lt;/strong&gt; present we had a fantastic turnout. The most amazing thing however was that about half the people present were actually earning money using Ruby. That makes more people in Ottawa earning their paycheck with our beloved little language in december 2005 then there were payed ruby programmers at RubyConf 2004.&lt;/p&gt;
&lt;p&gt;We decited that we will have our next meeting in January and now we are looking for a location. If everything goes well we will make this a regular occurance and meet once a month.&lt;/p&gt;
&lt;p&gt;For all those who are interested &lt;del&gt;in lurking&lt;/del&gt; there is now a &lt;a href=&quot;http://lists.jadedpixel.com/mailman/listinfo/ogre&quot;&gt;mailing list&lt;/a&gt;  .&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Postgres8 quick install</title>
   <link href="http://blog.leetsoft.com/2005/12/14/postgres8-quick-install.html"/>
   <updated>2005-12-14T11:47:00-08:00</updated>
   <id>http://blog.leetsoft.com/2005/12/14/postgres8-quick-install</id>
   <content type="html">&lt;p&gt;This is a quick guide on how to setup postgres 8.1 under osx using &lt;a href=&quot;http://darwinports.org&quot;&gt;DarwinPorts&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
% sudo port install postgresql8 
% mkdir -p ~/Databases/Postgres
% mate /etc/profile

# Append following lines to the file:
export PATH=/opt/local/lib/pgsql8/bin:$PATH
export PGDATA=$HOME/Databases/Postgres

% source /etc/profile

# compile postgres ruby drivers
% sudo gem install postgres -- 
    --with-pgsql-include-dir=/opt/local/include/pgsql8/ 
    --with-pgsql-lib-dir=/opt/local/lib/pgsql8/

# create the postgres DB
% initdb

# start your database server. pg_ctl supports start / stop / reload 
% pg_ctl start 

# create the root superuser
% createuser root 

# create your db
% createdb blog_dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you want to get rid of the &lt;span class=&quot;caps&quot;&gt;NOTICE&lt;/span&gt; spam which appears when running rake open $&lt;span class=&quot;caps&quot;&gt;PGDATA&lt;/span&gt;/postgresql.conf change client_min_messages from &lt;em&gt;notice&lt;/em&gt; to &lt;em&gt;warning&lt;/em&gt; and run &amp;#8220;pg_ctl restart&amp;#8221;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Dave let me know that instead of using the postgres gem you should be using &lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
sudo gem install ruby-postgres
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Ottawa Ruby meetup</title>
   <link href="http://blog.leetsoft.com/2005/12/07/ottawa-ruby-meetup.html"/>
   <updated>2005-12-07T20:23:53-08:00</updated>
   <id>http://blog.leetsoft.com/2005/12/07/ottawa-ruby-meetup</id>
   <content type="html">&lt;p&gt;The first meeting of the Ottawa Group of Ruby Enthusiasts (&lt;span class=&quot;caps&quot;&gt;OGRE&lt;/span&gt;) is set to happen Thursday December 15th at 7pm at Woody’s at 330 Elgin Street, Ottawa, Ontario, Canada.&lt;/p&gt;
&lt;p&gt;Its meant as a small get together to get this group started and bond a bit over some good beer and easy chatting.&lt;/p&gt;
&lt;p&gt;For more information visit the &lt;a href=&quot;http://blog.jadedpixel.com/articles/2005/12/07/ruby-and-rails-meeting-in-ottawa&quot;&gt;pixelsoup&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>uh oh</title>
   <link href="http://blog.leetsoft.com/2005/11/15/uh-oh.html"/>
   <updated>2005-11-15T12:36:38-08:00</updated>
   <id>http://blog.leetsoft.com/2005/11/15/uh-oh</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/weather.png&quot; border=&quot;0&quot; height=&quot;245&quot; width=&quot;276&quot; alt=&quot;weather.png&quot; align=&quot;&quot; /&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Oh so wrong</title>
   <link href="http://blog.leetsoft.com/2005/11/10/oh-so-wrong.html"/>
   <updated>2005-11-10T01:15:53-08:00</updated>
   <id>http://blog.leetsoft.com/2005/11/10/oh-so-wrong</id>
   <content type="html">&lt;p&gt;Over at &lt;a href=&quot;http://digg.com&quot;&gt;digg.com&lt;/a&gt; I found this great &lt;a href=&quot;http://forums.macrumors.com/showthread.php?t=500&quot;&gt;link&lt;/a&gt; to a form of people discussing the annoucement of the first iPod in 2001.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Installing liquid</title>
   <link href="http://blog.leetsoft.com/2005/11/05/installing-liquid.html"/>
   <updated>2005-11-05T17:46:57-08:00</updated>
   <id>http://blog.leetsoft.com/2005/11/05/installing-liquid</id>
   <content type="html">&lt;p&gt;Installing liquid is really easy on edge rails :)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://leetsoft.com/rails/liquid-installation.mov&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/installing-liquid.png&quot; border=&quot;0&quot; height=&quot;401&quot; width=&quot;460&quot; alt=&quot;installing-liquid.png&quot; align=&quot;&quot; /&gt;&lt;/a&gt;&lt;br/&gt;
(3.5mb)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Introducing Liquid</title>
   <link href="http://blog.leetsoft.com/2005/11/05/introducing-liquid.html"/>
   <updated>2005-11-05T13:03:00-08:00</updated>
   <id>http://blog.leetsoft.com/2005/11/05/introducing-liquid</id>
   <content type="html">&lt;p&gt;I finally spent some time finishing up &lt;a href=&quot;http://home.leetsoft.com/liquid&quot;&gt;Liquid&lt;/a&gt; to get the 1.0 version of it out the door. I have been talking about Liquid here and there, but lets start at the beginning.&lt;/p&gt;
&lt;p&gt;Liquid is a simple text processor. You give it text, instrumented with certain tags and a hash with variables, and it will merge them together and return the output in similar fashion to &lt;span class=&quot;caps&quot;&gt;ERB&lt;/span&gt;. The difference is that Liquid does not use eval to work. This means that you can store liquid based templates in your database and let your users edit the appearance of your pages without risking the security of your server&amp;#8217;s data.&lt;/p&gt;
&lt;h3&gt;What does that look like?&lt;/h3&gt;
&lt;p&gt;When starting to look around for inspiration for liquid&amp;#8217;s syntax I found &lt;a href=&quot;http://www.djangoproject.com/documentation/templates/&quot;&gt;django templates&lt;/a&gt; from the python community. It is itself based on smarty, but features a very clean syntax:&lt;/p&gt;
&lt;typo:code lang=&quot;html&quot;&gt;&lt;ul id=&quot;products&quot;&gt;	&lt;/ul&gt;&lt;/typo:code&gt;
&lt;h3&gt;How can I try it out?&lt;/h3&gt;
&lt;p&gt;If you are running the latest and greatest rails you should have noticed the new script/plugin script. Liquid comes packaged as a plugin. After dropping it in your vendor/plugins folder you can start using it right away by renaming your views to *.liquid.&lt;/p&gt;
&lt;h3&gt;Where did that come from?!&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://home.leetsoft.com/liquid&quot;&gt;Liquid&lt;/a&gt; is another extraction from &lt;a href=&quot;http://www.shopify.com/&quot;&gt;Shopify&lt;/a&gt; next to &lt;a href=&quot;http://dist.leetsoft.com/api/money/&quot;&gt;Money&lt;/a&gt;, &lt;a href=&quot;http://dist.leetsoft.com/api/paypal/&quot;&gt;Paypal&lt;/a&gt; and the soon to be released ActiveMerchant. The nice thing is its something users can more directly profit from then say the Paypal bindings ( which either work or not ). So if you are planning to use shopify, have a look at liquid &amp;#8212; all the improvements to it will benefit you directly as soon as &lt;a href=&quot;http://www.shopify.com/&quot;&gt;Shopify&lt;/a&gt; is released.&lt;/p&gt;
&lt;p&gt;Read more on the &lt;a href=&quot;http://home.leetsoft.com/liquid&quot;&gt;Liquid home page&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>XML.com on REST webservices</title>
   <link href="http://blog.leetsoft.com/2005/11/03/xml-com-on-rest-webservices.html"/>
   <updated>2005-11-03T12:46:07-08:00</updated>
   <id>http://blog.leetsoft.com/2005/11/03/xml-com-on-rest-webservices</id>
   <content type="html">&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt;.com explains how to implement proper &lt;span class=&quot;caps&quot;&gt;REST&lt;/span&gt; webservices with rails&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.xml.com/pub/a/2005/11/02/rest-on-rails.html&quot;&gt;&lt;span class=&quot;caps&quot;&gt;REST&lt;/span&gt; on Rails&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Type theme contest</title>
   <link href="http://blog.leetsoft.com/2005/11/01/type-theme-contest.html"/>
   <updated>2005-11-01T07:44:38-08:00</updated>
   <id>http://blog.leetsoft.com/2005/11/01/type-theme-contest</id>
   <content type="html">&lt;p&gt;The &lt;a href=&quot;http://www.typogarden.com/&quot;&gt;typo theme contest&lt;/a&gt; is going in overdrive move. Thanks to the wonderful guys at &lt;a href=&quot;http://www.site5.com/&quot;&gt;site5&lt;/a&gt; the prizes now include a &lt;b&gt;15&amp;quot; Powerbook&lt;/b&gt; and a &lt;b&gt;12&amp;quot; iBook&lt;/b&gt; joining the ranks of the IPod nano and all the other great stuff.&lt;/p&gt;
&lt;p&gt;What are you still waiting for? Crank out those amazing themes!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Scoped databases</title>
   <link href="http://blog.leetsoft.com/2005/10/31/scoped-databases.html"/>
   <updated>2005-10-31T14:46:00-08:00</updated>
   <id>http://blog.leetsoft.com/2005/10/31/scoped-databases</id>
   <content type="html">&lt;p&gt;A Little tidbit from the rails mailing list:&lt;/p&gt;
&lt;p&gt;In Shopify there are over 30 tables which store a shop_id. The Shop&lt;br /&gt;
object is figured out at the beginning of each request by looking at&lt;br /&gt;
the incoming domain of the user.&lt;/p&gt;
&lt;p&gt;Product.find(:all) becomes shop.products.find(:all)&lt;br /&gt;
Product.new becomes shop.products.build&lt;/p&gt;
&lt;p&gt;Since rails 0.13.1 we support calling class methods over associations.&lt;br /&gt;
This is actually a direct extraction out of shopify and makes such&lt;br /&gt;
databases much easier to handle.&lt;/p&gt;
&lt;typo:code lang=&quot;ruby&quot;&gt;
&lt;p&gt;class Product &amp;lt; AR:B&lt;br /&gt;
  def self.search(q)&lt;br /&gt;
      find(:all, :conditions =&amp;gt; &amp;#8220;title &lt;span class=&quot;caps&quot;&gt;LIKE&lt;/span&gt; &amp;#8216;&lt;span&gt;#{q}&lt;/span&gt;&amp;#8217;&amp;#8221;)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;/p&gt;
&lt;/typo:code&gt;
&lt;p&gt;Product.search(&amp;#8220;snowboard&amp;#8221;) will search in the entire database as&lt;br /&gt;
normal but shop.products.search(&amp;#8220;snowboards&amp;#8221;) will only search the&lt;br /&gt;
products with the appropriate shop_id. &lt;br /&gt;
This same change which allowed this also makes dynamic finders work on associations. shop.products.find_by_type(&amp;#8216;snowboard&amp;#8217;) returns the expected results .&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Typo theme contest</title>
   <link href="http://blog.leetsoft.com/2005/10/13/typo-theme-contest.html"/>
   <updated>2005-10-13T11:52:52-07:00</updated>
   <id>http://blog.leetsoft.com/2005/10/13/typo-theme-contest</id>
   <content type="html">&lt;p&gt;Geoffrey Grosenbach has announced the Typo Theme Contest.&lt;br /&gt;
Head over to  &lt;a href=&quot;http://TypoGarden.org&quot;&gt;TypoGarden.org&lt;/a&gt; and check it out.&lt;/p&gt;
&lt;p&gt;There are many amazing prices, including a &lt;strong&gt;iPod nano&lt;/strong&gt; sponsored by &lt;a href=&quot;http://ma.gnolia.com&quot;&gt;ma.gnolia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks &lt;a href=&quot;http://nubyonrails.topfunky.com/&quot;&gt;Geoffrey&lt;/a&gt; for pulling this off. Best of luck to all participants.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>wtf?</title>
   <link href="http://blog.leetsoft.com/2005/09/27/wtf.html"/>
   <updated>2005-09-27T14:04:00-07:00</updated>
   <id>http://blog.leetsoft.com/2005/09/27/wtf</id>
   <content type="html">&lt;typo:code lang=&quot;ruby&quot;&gt;
&lt;p&gt;irb(main):007:0&amp;gt; (4.10 * 100.0 ).to_i&lt;br /&gt;
=&amp;gt; 409&lt;/p&gt;
&lt;/typo:code&gt;</content>
 </entry>
 
 <entry>
   <title>Rails Core</title>
   <link href="http://blog.leetsoft.com/2005/09/26/rails-core.html"/>
   <updated>2005-09-26T06:16:55-07:00</updated>
   <id>http://blog.leetsoft.com/2005/09/26/rails-core</id>
   <content type="html">&lt;p&gt;I officially got &lt;a href=&quot;http://weblog.rubyonrails.com/archives/2005/09/24/rails-commit-team-jumps-to-12-members&quot;&gt;promoted&lt;/a&gt;. I promise I won&amp;#8217;t break too much!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Typo sighting</title>
   <link href="http://blog.leetsoft.com/2005/09/23/typo-sighting.html"/>
   <updated>2005-09-23T14:27:00-07:00</updated>
   <id>http://blog.leetsoft.com/2005/09/23/typo-sighting</id>
   <content type="html">&lt;p&gt;Jeremy Pinnix from &lt;a href=&quot;http://www.pixelgrazer.com/&quot;&gt;pixelgrazer&lt;/a&gt; sent along a link to &lt;a href=&quot;http://www.bartmillard.org/&quot;&gt;this&lt;/a&gt; beautifully modded typo blog. He says he and his coworker spent just 4 hours on the design. Cheers guys!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.bartmillard.org/&quot;&gt;bartmillard.org&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Problems with modern marketing</title>
   <link href="http://blog.leetsoft.com/2005/09/08/problems-with-modern-marketing.html"/>
   <updated>2005-09-08T12:03:05-07:00</updated>
   <id>http://blog.leetsoft.com/2005/09/08/problems-with-modern-marketing</id>
   <content type="html">&lt;p&gt;Reading the slashdot &lt;a href=&quot;http://games.slashdot.org/article.pl?sid=05/09/08/1456204&amp;amp;tid=10&quot;&gt;topic&lt;/a&gt; about the game &lt;a href=&quot;http://www.darwinia.co.uk/&quot;&gt;Darwinia&lt;/a&gt; &amp;#8212; which has trouble finding a publisher despite good reviews and great graphics &amp;#8212; there was this gem of a comment from CDarklock. I just felt like it needs sharing:&lt;/p&gt;
&lt;p&gt;&amp;gt; Somewhere along the line, marketing stopped being about finding people who want something, and started being mostly about making people buy things they don&amp;#8217;t want. This industry reinvention has made it very difficult for most marketers to handle a good product, because they can&amp;#8217;t find the right people who don&amp;#8217;t want it.&lt;/p&gt;
&lt;p&gt;Spot on.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>New Stuff</title>
   <link href="http://blog.leetsoft.com/2005/08/27/new-stuff.html"/>
   <updated>2005-08-27T08:05:03-07:00</updated>
   <id>http://blog.leetsoft.com/2005/08/27/new-stuff</id>
   <content type="html">&lt;p&gt;The web pages for &lt;a href=&quot;http://jadedpixel.com/&quot;&gt;jaded Pixel&lt;/a&gt; and &lt;a href=&quot;http://shopify.com/&quot;&gt;shopify&lt;/a&gt; are now online.&lt;/p&gt;
&lt;p&gt;Check them out and subscribe to the newsletter and weblog &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feed to keep up with the latest stuff :)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Ruby on Rails podcast</title>
   <link href="http://blog.leetsoft.com/2005/08/27/ruby-on-rails-podcast.html"/>
   <updated>2005-08-27T07:25:47-07:00</updated>
   <id>http://blog.leetsoft.com/2005/08/27/ruby-on-rails-podcast</id>
   <content type="html">&lt;p&gt;Recently I was interviewed for the &lt;a href=&quot;http://podcast.rubyonrails.com/&quot;&gt;ruby on rails podcast&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This new episode was just released, listen in &lt;a href=&quot;http://www.rubyonrails.com/media/podcast/rails-podcast-003.mp3&quot;&gt;here&lt;/a&gt; or go ahead and subscribe to it using &lt;a href=&quot;pcast://podcast.rubyonrails.org/podcast.xml&quot;&gt;itunes&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Canada's new ruby programmer</title>
   <link href="http://blog.leetsoft.com/2005/08/23/canadas-new-ruby-programmer.html"/>
   <updated>2005-08-23T07:40:00-07:00</updated>
   <id>http://blog.leetsoft.com/2005/08/23/canadas-new-ruby-programmer</id>
   <content type="html">&lt;p&gt;My buddy &lt;a href=&quot;http://www.troubleseeker.com/&quot;&gt;Daniel&lt;/a&gt; just arrived in Canada last week. &lt;br /&gt;
He moved back from germany with his girlfriend who happens to be from the ottawa region too&amp;#8212; how weird is that?&lt;/p&gt;
&lt;p&gt;Daniel will help me with my and &lt;a href=&quot;http://www.jadedpixel.com/&quot;&gt;my company&amp;#8217;s&lt;/a&gt; new project &lt;a href=&quot;http://blog.jadedpixel.com/pages/shopify&quot;&gt;shopify&lt;/a&gt; which will be released later this year.&lt;/p&gt;
&lt;p&gt;He spent the first few days familiarizing himself with ruby on rails by writing a weblog from scratch, be sure to &lt;a href=&quot;http://www.troubleseeker.com/&quot;&gt;drop by&lt;/a&gt; and leave a comment!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Typo 2.5 released</title>
   <link href="http://blog.leetsoft.com/2005/08/06/typo-2-5-released.html"/>
   <updated>2005-08-06T17:04:00-07:00</updated>
   <id>http://blog.leetsoft.com/2005/08/06/typo-2-5-released</id>
   <content type="html">&lt;p style=&quot;text-align:right;&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/settings_thumb.png&quot; height=&quot;210&quot; width=&quot;219&quot; border=&quot;1&quot; align=&quot;right&quot; hspace=&quot;4&quot; vspace=&quot;4&quot; alt=&quot;Settings Thumb-1&quot; /&gt;&lt;/p&gt;&lt;p&gt;
&lt;p&gt;We &lt;a href=&quot;http://rubyforge.org/projects/typo/&quot;&gt;released&lt;/a&gt; the latest typo and its just oozing with amazing features.&lt;br /&gt;
Many of the additions were demanded by the recent influx of high traffic and high profile blogs.&lt;br /&gt;
Here are some choice additions:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Static Caching, your typo blog will now serve thousands of pages per second with ease. All the active elements of the frontend were moved into JavaScript&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;First official release with the new Azure theme&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Multiple theme support, please create your own!&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Newly designed admin interface&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Textile, Markdown and Smartypants support, all &lt;br /&gt;
bundled&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Enhanced spam protection&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Quick post functionality&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Support for multiple users posting to the same &lt;br /&gt;
blog&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Powerful sidebar management with drag and drop goodness&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Monthly archives&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Multiple syndication support built in for 43things, del.icio.us, Flickr, upcoming.org, tadalist, technorati, 43places and much more.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Ajax&amp;#8217;ed out the wazoo&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Edit/nuke comments while reading them in the frontend ( as admin )&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Converters for most major blog software including import from &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; &lt;/span&gt;feeds.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
&amp;#8230; and tons more new features and improvements. The svn repository number doubled since the last release.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
In other news:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
Please welcome our new dev team members &lt;a href=&quot;http://www.encytemedia.com/&quot;&gt;Justin Palmer&lt;/a&gt; who is responsible for the typo visual identity and themes and &lt;a href=&quot;http://scottstuff.net/blog/&quot;&gt;Scott Laird&lt;/a&gt; who reinforces the typo hacking team. Scott did the majority of typo improvements in the last weeks. The theme system, the sidebar admin and countless other improvements were his work.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
For more, read the &lt;a href=&quot;http://rubyforge.org/projects/typo/&quot;&gt;stable page&lt;/a&gt; on the typo trac.&lt;/p&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Typo 2.5 preview</title>
   <link href="http://blog.leetsoft.com/2005/08/05/typo-2-5-preview.html"/>
   <updated>2005-08-05T08:26:48-07:00</updated>
   <id>http://blog.leetsoft.com/2005/08/05/typo-2-5-preview</id>
   <content type="html">&lt;p&gt;
&lt;p&gt;Justin Palmer wrote a great &lt;a href=&quot;http://www.encytemedia.com/article/48/typo-25-previews&quot;&gt;preview&lt;/a&gt; of the upcoming ( any minute now ) typo 2.5 release including pictures of the admin interface.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.encytemedia.com/article/48/typo-25-previews&quot;&gt;Check it out&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>David is the "Best Hacker"</title>
   <link href="http://blog.leetsoft.com/2005/08/03/david-is-the-best-hacker.html"/>
   <updated>2005-08-03T08:48:04-07:00</updated>
   <id>http://blog.leetsoft.com/2005/08/03/david-is-the-best-hacker</id>
   <content type="html">&lt;p&gt;On Thursday &lt;a href=&quot;http://www.loudthinking.com/arc/000489.html&quot;&gt;David Heinemeier Hansson&lt;/a&gt; was given the Google/O&amp;rsquo;Reilly Best Hacker of the Year award for his Ruby on Rails framework.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/awards/best-hacker.jpg&quot; border=&quot;0&quot; height=&quot;349&quot; width=&quot;468&quot; alt=&quot;best-hacker.jpg&quot; title=&quot;Best hacker - David Heinemeier Hansson&quot; align=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A deserved award. Congratulations david!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>We Are the Web</title>
   <link href="http://blog.leetsoft.com/2005/07/27/we-are-the-web.html"/>
   <updated>2005-07-27T20:36:00-07:00</updated>
   <id>http://blog.leetsoft.com/2005/07/27/we-are-the-web</id>
   <content type="html">&lt;p&gt;Kevin Kelly wrote a great article about the web, its history and its unlikely development.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This view is spookily godlike. You can switch your gaze of a spot in the world from map to satellite to 3-D just by clicking. Recall the past? It&amp;#8217;s there. Or listen to the daily complaints and travails of almost anyone who blogs (and doesn&amp;#8217;t everyone?). I doubt angels have a better view of humanity.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Read &lt;a href=&quot;http://www.wired.com/wired/archive/13.08/tech.html?pg=3&amp;amp;topic=tech&amp;amp;topic_set&quot;&gt;We are the web&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>There is Sex in my Violence!</title>
   <link href="http://blog.leetsoft.com/2005/07/27/there-is-sex-in-my-violence.html"/>
   <updated>2005-07-27T11:01:44-07:00</updated>
   <id>http://blog.leetsoft.com/2005/07/27/there-is-sex-in-my-violence</id>
   <content type="html">&lt;p&gt;With the recent assault on violent video games this level headed open letter to Senator Clinton is really a nice change of pace:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.latimes.com/news/opinion/commentary/la-oe-johnson27jul27,0,1432940.story?coll=la-news-comment-opinions&quot;&gt;Hillary vs. the Xbox: Game over&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t know why this is being pinned directly to Sen. Clinton. As far as I know 80% of the Congressmen voted for the investigation, more republicans then democrats but this is beside the point.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Happy Birthday Rails!</title>
   <link href="http://blog.leetsoft.com/2005/07/24/happy-birthday-rails.html"/>
   <updated>2005-07-24T18:56:26-07:00</updated>
   <id>http://blog.leetsoft.com/2005/07/24/happy-birthday-rails</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://weblog.rubyonrails.com/archives/2005/07/24/happy-birthday-rails&quot;&gt;Rails is 1 year old&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;I have been there almost from the start and boy what a ride it has been.&lt;/p&gt;
&lt;p&gt;It has not only attracted thousands of developers and, more importantly, the top percent of the programming community &amp;#8212; it also leaked its methodology everywhere. &lt;br /&gt;
There is no web framework which has seen active development in the last year which didn&amp;#8217;t incorporate at least some of rails concepts.&lt;/p&gt;
&lt;p&gt;Today we expect full stack frameworks, resent xml sitpups, demand aesthetically pleasing code and prefer code generators over one size fits all framework solutions. We don&amp;#8217;t code things anymore which the framework already knows about. We don&amp;#8217;t repeat ourselves anymore.&lt;/p&gt;
&lt;p&gt;I believe that Rails has fundamentally redirected the direction code by developers for developers was going. Less is more. Make something beautiful. Use the right half of your brain. I feel a lot better about my profession&amp;#8217;s future now then I did a year ago. Thanks Rails and especially thank you &lt;a href=&quot;http://www.loudthinking.com/&quot;&gt;david&lt;/a&gt; for making it !&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Typo hackday</title>
   <link href="http://blog.leetsoft.com/2005/07/23/typo-hackday.html"/>
   <updated>2005-07-23T08:11:00-07:00</updated>
   <id>http://blog.leetsoft.com/2005/07/23/typo-hackday</id>
   <content type="html">&lt;p&gt;Today the typo dev team is doing one of our famous hack-days. We will try our very best to get a release out within the next days. Things on the list today&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Merge of the new admin interface&lt;/li&gt;
	&lt;li&gt;Introduction of the new plugin sidebar architecture&lt;/li&gt;
	&lt;li&gt;Introduction of the theming system.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are interested to get any patches included or if you just want to keep the spirits high by telling dirty jokes join us in irc at [irc.freenode.net]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; today!&lt;/p&gt;
&lt;p&gt;&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;: irc://irc.freenode.net/typo&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>WW2 as per RTS</title>
   <link href="http://blog.leetsoft.com/2005/07/19/ww2-as-per-rts.html"/>
   <updated>2005-07-19T18:30:00-07:00</updated>
   <id>http://blog.leetsoft.com/2005/07/19/ww2-as-per-rts</id>
   <content type="html">&lt;p&gt;What would it look like if worldwar2 would have been a &lt;span class=&quot;caps&quot;&gt;RTS&lt;/span&gt;?&lt;/p&gt;
&lt;p&gt;This question has [finally been answered]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&amp;gt; Roosevelt: o this fockin sucks i got a depression!
&amp;gt; benny-tow: haha america sux
&amp;gt; Stalin: hey hitler you dont fight me i dont fight u, cool?
&amp;gt; Hitler[AoE]; sure whatever
&lt;p&gt;&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;: http://www.strategypage.com/humor/articles/military_jokes_20057151.asp&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Typo static</title>
   <link href="http://blog.leetsoft.com/2005/07/19/typo-static.html"/>
   <updated>2005-07-19T16:11:44-07:00</updated>
   <id>http://blog.leetsoft.com/2005/07/19/typo-static</id>
   <content type="html">&lt;p&gt;With major help by Damien Pollet we have moved almost all the &amp;#8220;active&amp;#8221; code of the typo user interface to the client.&lt;/p&gt;
&lt;p&gt;Things like &amp;#8220;posted 24 minutes ago&amp;#8221; now found their new home in javascript. Same goes for deciding whether to display the inline admin controls for comments which were featured in the recent [teaser]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;There will still be some bugs but however. Thats why I keep this blog running the very latest version of the code. Please post any bugs you find on [typo&amp;#8217;s trac]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; to help us release a stable version as soon as possible.&lt;/p&gt;
&lt;p&gt;&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;: http://www.leetsoft.com/rails/typo_ajax.mov&lt;br /&gt;
 &amp;#8220;Typo ajax admin teaser&amp;#8221;&lt;br /&gt;
&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;: http://typo.leetsoft.com/trac/newticket&lt;br /&gt;
 &amp;#8220;Create a new ticket&amp;#8221;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Typo goes all static, ror.com</title>
   <link href="http://blog.leetsoft.com/2005/07/18/typo-goes-all-static-ror-com.html"/>
   <updated>2005-07-18T08:00:30-07:00</updated>
   <id>http://blog.leetsoft.com/2005/07/18/typo-goes-all-static-ror-com</id>
   <content type="html">&lt;p&gt;Typo is now the official &lt;a href=&quot;http://weblog.rubyonrails.com&quot;&gt;rubyonrails.com&lt;/a&gt; weblog software!&lt;br /&gt;
To cope with the high traffic this page receives ( its a page rank 7 page ) i just &lt;br /&gt;
checked some code into trunk which adds proper page caches to typo&amp;#8217;s frontend. &lt;br /&gt;
This means that the web server can serve 99% of all the traffic directly without asking typo for the pages.&lt;/p&gt;
&lt;p&gt;In praxis this means that a webserver like &lt;a href=&quot;http://blog.lighttpd.net/&quot;&gt;lighttpd&lt;/a&gt; can easily cope with 1-2k pages &lt;strong&gt;per second&lt;/strong&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Typo next</title>
   <link href="http://blog.leetsoft.com/2005/07/17/typo-next.html"/>
   <updated>2005-07-17T14:08:04-07:00</updated>
   <id>http://blog.leetsoft.com/2005/07/17/typo-next</id>
   <content type="html">&lt;p&gt;First picture of the new admin interface design surfaces:&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=http://encytemedia.com/demo/jason/x6.png alt=&amp;#8220;Typo Admin interface design by Justin Palmer&amp;#8221; style=&amp;#8220;border: 1px solid #ccc; padding: 3px;&amp;#8221; /&amp;gt;&lt;/p&gt;
&lt;p&gt;Go &lt;a href=&quot;http://encytemedia.com/&quot;&gt;Justin&lt;/a&gt;!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Spamonologue</title>
   <link href="http://blog.leetsoft.com/2005/07/14/spamonologue.html"/>
   <updated>2005-07-14T08:39:14-07:00</updated>
   <id>http://blog.leetsoft.com/2005/07/14/spamonologue</id>
   <content type="html">&lt;p&gt;&amp;#8220;Dear sir, complements of the day to you.&amp;#8221;&lt;/p&gt;
&lt;p&gt;]&lt;/p&gt;
&lt;p&gt;Absolutely brilliant&lt;/p&gt;
&lt;p&gt;&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;: http://www.leetsoft.com/fun/dear.mov&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>[hieraki & noc].flatten => [hieraki2]</title>
   <link href="http://blog.leetsoft.com/2005/07/14/hieraki-noc-flatten-hieraki2.html"/>
   <updated>2005-07-14T08:33:51-07:00</updated>
   <id>http://blog.leetsoft.com/2005/07/14/hieraki-noc-flatten-hieraki2</id>
   <content type="html">&lt;p&gt;I admit it. Hieraki didn&amp;#8217;t get the attention it deserved. Ever since I agreed to make typo public its momentum prevented me from putting any considerable effort into Hierkai. A share really because there are several high-profile &lt;a href=&quot;http://hieraki.simplicio.com/&quot;&gt;Hieraki&lt;/a&gt; &lt;a href=&quot;http://docs.rubygems.org/&quot;&gt;users&lt;/a&gt; &lt;a href=&quot;http://manuals.rubyonrails.com/&quot;&gt;out&lt;/a&gt; &lt;a href=&quot;http://manuals.textdrive.com/&quot;&gt;there&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;gt; My name is Alexander Horn, student at Truman State University. Several&lt;br /&gt;
&amp;gt; months ago, I adopted parts of Hieraki to add on new features that we&lt;br /&gt;
&amp;gt; needed for a learning object repository. Some of those features are:&lt;br /&gt;
&amp;gt; *  attachments for documents&lt;br /&gt;
&amp;gt; *  version control for documents and attachments&lt;br /&gt;
&amp;gt; *  security model (a simple one but it does the job)&lt;br /&gt;
&amp;gt; *  some tweaks to the navigation and the look-and-feel in general&lt;br /&gt;
&amp;gt; *  finding dead links&lt;br /&gt;
&amp;gt; *  and several other new concepts or improvements&amp;#8230;&lt;br /&gt;
&amp;gt; If you want to download the source (which still needs a make-up and&lt;br /&gt;
&amp;gt; much more testing) go to &lt;a href=&quot;http://www2.truman.edu/~ah428/noc.html&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I was blown away. Alexander took Hieraki exactly where I wanted it to go. And not only that, he agreed to overtake stewardship of the project and merge back Noc as Hieraki2.&lt;/p&gt;
&lt;p&gt;Its really great to see that Hieraki is again moving forward. Its a great project and extremely useful. &lt;br /&gt;
Now we just need to make rails apps easier to install. Stay tuned  for more on that after the 1.0 release :)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Typo teaser</title>
   <link href="http://blog.leetsoft.com/2005/07/10/typo-teaser.html"/>
   <updated>2005-07-10T15:22:08-07:00</updated>
   <id>http://blog.leetsoft.com/2005/07/10/typo-teaser</id>
   <content type="html">&lt;p&gt;Here is a little teaser for the next version of typo&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.leetsoft.com/rails/typo_ajax.mov&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/files//files/teasers/typo_ajax.png&quot; border=&quot;0&quot; height=&quot;212&quot; width=&quot;281&quot; alt=&quot;typo_ajax.png&quot; align=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Rails 0.13 and typo</title>
   <link href="http://blog.leetsoft.com/2005/07/07/rails-0-13-and-typo.html"/>
   <updated>2005-07-07T11:50:24-07:00</updated>
   <id>http://blog.leetsoft.com/2005/07/07/rails-0-13-and-typo</id>
   <content type="html">&lt;p&gt;As most people know &lt;a href=&quot;http://weblog.rubyonrails.com/archives/2005/07/06/rails-013-225-featuresfixes-in-75-days/&quot;&gt;Rails 0.13&lt;/a&gt; was released yesterday. It has been the biggest rails release so far with tons and tons of great new &lt;a href=&quot;http://weblog.rubyonrails.com/archives/2005/07/06/rails-013-225-featuresfixes-in-75-days/&quot;&gt;features&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.poocs.net/&quot;&gt;Scoop&lt;/a&gt; and I spend some time this morning to get typo to sing on 0.13 so if you are living on svn trunk!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Lots of updates went into typo. Please run &lt;strong&gt;svn up&lt;/strong&gt; and tell me how it works. If everything goes alright I should push a new release tomorrow evening.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Fcgi gem</title>
   <link href="http://blog.leetsoft.com/2005/06/18/fcgi-gem.html"/>
   <updated>2005-06-18T19:52:00-07:00</updated>
   <id>http://blog.leetsoft.com/2005/06/18/fcgi-gem</id>
   <content type="html">&lt;p&gt;So it seems that the fcgi gem I released recently had some quirks which made it fail on some systems.&lt;/p&gt;
&lt;p&gt;If you had any trouble with it please run gem update to get version 0.8.6.1.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Installing rails made easy</title>
   <link href="http://blog.leetsoft.com/2005/06/17/installing-rails-made-easy.html"/>
   <updated>2005-06-17T15:00:35-07:00</updated>
   <id>http://blog.leetsoft.com/2005/06/17/installing-rails-made-easy</id>
   <content type="html">&lt;p&gt;Many webhosts are starting to offer fastcgi as more and more customers are moving to rails and similar projects. There is hope that the mod_&amp;#8217;s will die out as fastcgi can provide the same services in a simpler, faster, memory saving and flexible manner.&lt;/p&gt;
&lt;p&gt;Today I read that &lt;a href=&quot;http://www.dreamhost.com/&quot;&gt;dreamhost&lt;/a&gt; enabled fastcgi service for their shared customers. One problem with shared servers is that you don&amp;#8217;t have a lot of influence on the installed ruby and rails version. To fix this they offer a very nice script which installs ruby and rails locally in your home directory for you.&lt;/p&gt;
&lt;p&gt;I expanded this script a bit and made it more general purpose. So if you are thinking of installing rails and ruby on a shell go ahead and type:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
curl http://home.leetsoft.com/dropbox/private-ruby/install | sh
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This will get you ruby 1.8.2 the latest ruby gems, the latest rails version as well as the gems with the C versions of fcgi and mysql.&lt;/p&gt;
&lt;p&gt;Hope that helps.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>FCGI memory leaks</title>
   <link href="http://blog.leetsoft.com/2005/06/12/fcgi-memory-leaks.html"/>
   <updated>2005-06-12T11:11:43-07:00</updated>
   <id>http://blog.leetsoft.com/2005/06/12/fcgi-memory-leaks</id>
   <content type="html">&lt;p&gt;The current fastcgi gem has a fairly serious memory leak. With every page impression the rails process will use up another 16kb of memory.&lt;/p&gt;
&lt;p&gt;There was a fixed version out for a while now on &lt;a href=&quot;http://raa.ruby-lang.org/project/fcgi/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RAA&lt;/span&gt;&lt;/a&gt; but it never made it to the rubygems server. Today I put together a new gem for easy install. If it works alright I&amp;#8217;ll try to get it included in the main gems repository.&lt;/p&gt;
&lt;p&gt;Install it using:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
gem install fcgi
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Please leave feedback here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; its now available in the main gem repository.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Comedy goldmine</title>
   <link href="http://blog.leetsoft.com/2005/06/09/comedy-goldmine.html"/>
   <updated>2005-06-09T10:04:00-07:00</updated>
   <id>http://blog.leetsoft.com/2005/06/09/comedy-goldmine</id>
   <content type="html">&lt;p&gt;Award of excellence goes to &lt;a href=&quot;http://slashdot.org/comments.pl?sid=152187&amp;cid=12770441&quot;&gt;this&lt;/a&gt; comment to the slashdot topic &lt;a href=&quot;http://slashdot.org/article.pl?sid=05/06/09/1440226&amp;tid=133&amp;tid=1&quot;&gt;Nerds Make Better Lovers&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Proper mug</title>
   <link href="http://blog.leetsoft.com/2005/06/07/proper-mug.html"/>
   <updated>2005-06-07T07:45:08-07:00</updated>
   <id>http://blog.leetsoft.com/2005/06/07/proper-mug</id>
   <content type="html">&lt;p&gt;finally!&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.leetsoft.com/files//files/logos/desktop.png&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/files//files/logos/mug.png&quot; border=&quot;0&quot; height=&quot;90&quot; width=&quot;104&quot; alt=&quot;mug.png&quot; /&gt;&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Paul Graham talk</title>
   <link href="http://blog.leetsoft.com/2005/05/30/paul-graham-talk.html"/>
   <updated>2005-05-30T14:50:53-07:00</updated>
   <id>http://blog.leetsoft.com/2005/05/30/paul-graham-talk</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.itconversations.com/shows/detail188.html&quot;&gt;Paul Graham at &lt;span class=&quot;caps&quot;&gt;OSCON&lt;/span&gt; 2004&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;IT Conversations (are you subscribed to their &lt;a href=&quot;http://www.itconversations.com/rss/category-rss.php?k=rss&amp;e=1&quot;&gt;podcast&lt;/a&gt; yet?) put up this great &lt;a href=&quot;http://www.itconversations.com/shows/detail188.html&quot;&gt;talk&lt;/a&gt; by &lt;a href=&quot;http://www.paulgraham.com/&quot;&gt;Paul Graham&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While we are on the topic, a friend recently gave me his new book &lt;a href=&quot;http://www.amazon.com/exec/obidos/tg/detail/-/0596006624/ref=ase_toobiased-20/102-6766788-4848941?v=glance&amp;s=books&quot;&gt;Hackers&amp;amp;Painters&lt;/a&gt; which I also thoroughly enjoyed. If you like the talk you will love the book!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Agile Web Development with Rails</title>
   <link href="http://blog.leetsoft.com/2005/05/26/agile-web-development-with-rails.html"/>
   <updated>2005-05-26T13:51:21-07:00</updated>
   <id>http://blog.leetsoft.com/2005/05/26/agile-web-development-with-rails</id>
   <content type="html">&lt;p&gt;The beta version of &lt;a href=&quot;http://www.pragmaticprogrammer.com/titles/rails/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;AWDWR&lt;/span&gt;&lt;/a&gt; (heh) is now available for purchase.&lt;/p&gt;
&lt;p&gt;You will get the final version as soon as its available.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>New in rails</title>
   <link href="http://blog.leetsoft.com/2005/05/26/new-in-rails.html"/>
   <updated>2005-05-26T08:18:09-07:00</updated>
   <id>http://blog.leetsoft.com/2005/05/26/new-in-rails</id>
   <content type="html">&lt;p&gt;One of the bigger changes coming in the next rails will be an overhauled render method.&lt;/p&gt;
&lt;p&gt;Here are some examples. New syntax in bold.&lt;/p&gt;
&lt;p&gt;render_with_layout &amp;#8220;weblog/show&amp;#8221;, &amp;#8220;200 OK&amp;#8221;, &amp;#8220;layouts/dialog&amp;#8221; &lt;br/&gt;
&lt;strong&gt;render :action =&amp;gt; &amp;#8220;show&amp;#8221;, :layout =&amp;gt; &amp;#8220;dialog&amp;#8221;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;render_without_layout &amp;#8220;weblog/show&amp;#8221;                          &lt;br/&gt;
*render :action =&amp;gt; &amp;#8220;show&amp;#8221;, :layout =&amp;gt; false *&lt;/p&gt;
&lt;p&gt;render_action &amp;#8220;error&amp;#8221;, &amp;#8220;404 Not Found&amp;#8221;                       &lt;br/&gt;
&lt;strong&gt;render :action =&amp;gt; &amp;#8220;error&amp;#8221;, :status =&amp;gt; &amp;#8220;404 Not Found&amp;#8221;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;render_template &amp;#8220;xml.div(&amp;#8216;stuff&amp;#8217;)&amp;#8221;, &amp;#8220;200 OK&amp;#8221;, :rxml          &lt;br/&gt;
*render :inline =&amp;gt; &amp;#8220;xml.div(&amp;#8216;stuff&amp;#8217;)&amp;#8221;, :type =&amp;gt; :rxml *&lt;/p&gt;
&lt;p&gt;render_text &amp;#8220;hello world!&amp;#8221;                                   &lt;br/&gt;
&lt;strong&gt;render :text =&amp;gt; &amp;#8220;hello world!&amp;#8221;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;render_partial_collection &amp;#8220;person&amp;#8221;, @people, nil, :a =&amp;gt; 1    &lt;br/&gt;
&lt;strong&gt;render :partial =&amp;gt; &amp;#8220;person&amp;#8221;, :collection =&amp;gt; @people, :locals =&amp;gt; { :a =&amp;gt; 1 }&lt;/strong&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Spore and the Demo Scene</title>
   <link href="http://blog.leetsoft.com/2005/05/25/spore-and-the-demo-scene.html"/>
   <updated>2005-05-25T18:18:17-07:00</updated>
   <id>http://blog.leetsoft.com/2005/05/25/spore-and-the-demo-scene</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.gamasutra.com/php-bin/news_index.php?story=5570&quot;&gt;Mind-boggeling&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I just watched Will Wright&amp;#8217;s presentation on his new game Spore. It uses procedural calculations to create content from parameters, a technology which was previously mainly employed by the &lt;a href=&quot;http://scene.org/&quot;&gt;demo scene&lt;/a&gt; (mostly an european thing). Using procedural algorithms it&amp;#8217;s not unusual to see some demos calculating gigabyte worth of assets from files smaller then an empty word document.&lt;/p&gt;
&lt;p&gt;I have very fond memories of the golden ages of the &lt;a href=&quot;http://scene.org/&quot;&gt;demo scene&lt;/a&gt; when my friends and I where driving all over europe to attend these fantastic gatherings and see what other programmers where up to. Remarkable times and it&amp;#8217;s fantastic to see that one of the smartest minds of the gaming industry finally dreamed up a use for this art form.&lt;/p&gt;
&lt;p&gt;Watch the video &lt;a href=&quot;http://www.gamasutra.com/php-bin/news_index.php?story=5570&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you are interested in the demo scene in general I recommend watching the &lt;a href=&quot;http://www.farb-rausch.com/&quot;&gt;farbrausch&lt;/a&gt; 64kb demos. My favorite is &lt;a href=&quot;http://www.scene.org/file.php?file=/demos/groups/farb-rausch/fr08_final.zip&amp;fileinfo&quot;&gt;das produkkt&lt;/a&gt; from 2000.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Back in the country</title>
   <link href="http://blog.leetsoft.com/2005/05/22/back-in-the-country.html"/>
   <updated>2005-05-22T13:43:00-07:00</updated>
   <id>http://blog.leetsoft.com/2005/05/22/back-in-the-country</id>
   <content type="html">&lt;p&gt;Its really odd to visit the country you grew up in and feel like a tourist doing so.&lt;/p&gt;
&lt;p&gt;Either way, getting upgraded to business class for trans-atlantic flights is definitely way to go. Highly recommended :)&lt;/p&gt;
&lt;p&gt;While in germany i met with &lt;a href=&quot;http://poocs.net&quot;&gt;Patrick Lenz&lt;/a&gt; and we contemplated typo&amp;#8217;s future. Some nice stuff is coming down the pipe, let me tell you!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Backpack it!</title>
   <link href="http://blog.leetsoft.com/2005/05/03/backpack-it.html"/>
   <updated>2005-05-03T09:38:55-07:00</updated>
   <id>http://blog.leetsoft.com/2005/05/03/backpack-it</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/files//files/logos/backpack-small-header-logo.gif&quot; border=&quot;0&quot; height=&quot;37&quot; width=&quot;144&quot; alt=&quot;backpack-small-header-logo.gif&quot; align=&quot;right&quot; /&gt;&lt;a href=&quot;http://www.backpackit.com/&quot;&gt;Backpack&lt;/a&gt; finally launched.&lt;/p&gt;
&lt;p&gt;If you wondered what the Web 2.0 will look like then just go ahead and check it out. It arrived at long last. Mad props to the 37signals team for unparalleled excellence.&lt;/p&gt;
&lt;p&gt;Make sure to watch the movies about &lt;a href=&quot;http://www.backpackit.com/example_movies/pages.mov&quot;&gt;pages&lt;/a&gt; and &lt;a href=&quot;http://www.backpackit.com/example_movies/reminders.mov&quot;&gt;reminders&lt;/a&gt;. &lt;br /&gt;
Personally my favorite feature is that every page has an &lt;a href=&quot;http://backpackit.com/weblog/archives/tips_tricks/pages_adding_content_to_a_page_via_email.php&quot;&gt;email&lt;/a&gt; address and you can just fill them up with your forward button. This is just the right amount of convenience for me to keep using a product.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Your SQL</title>
   <link href="http://blog.leetsoft.com/2005/05/01/your-sql.html"/>
   <updated>2005-05-01T07:47:59-07:00</updated>
   <id>http://blog.leetsoft.com/2005/05/01/your-sql</id>
   <content type="html">&lt;p&gt;
&lt;p&gt;Since &lt;a href=&quot;http://cocoamysql.sourceforge.net/&quot;&gt;CocoaMySql&lt;/a&gt; stopped developing a while ago I&amp;#8217;m happy to discover a worthy successor&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
&lt;a href=&quot;http://blog.leetsoft.com/files/images/Your%20sql.png&quot; onclick=&quot;window.open('http://blog.leetsoft.com/files/images/Your%20sql.png','popup','width=721,height=667,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=yes,left=0,top=0');return false&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/images/Your%20sql-tm.jpg&quot; height=&quot;287&quot; width=&quot;310&quot; border=&quot;1&quot; hspace=&quot;4&quot; vspace=&quot;4&quot; alt=&quot;Your Sql&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt; &lt;br /&gt;
&lt;br /&gt;Get Your &lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt; &lt;a href=&quot;http://www.mludi.net/YourSQL/download.php&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Orange County</title>
   <link href="http://blog.leetsoft.com/2005/04/30/orange-county.html"/>
   <updated>2005-04-30T22:28:07-07:00</updated>
   <id>http://blog.leetsoft.com/2005/04/30/orange-county</id>
   <content type="html">&lt;p&gt;So I just came back from my 5 days stay in orange county (South California).&lt;/p&gt;
&lt;p&gt;It was the first time I have been down to the US since the new visitor rules apply for german citizens. The fingerprinting and mug-shot went a lot smoother then I expected though; I have to admit that I had a bit of an esoteric idea of how these things are done. I followed the advice of my buddy Daniel and wore a suit for the flight. This usually gets you around any trouble with custom officers.&lt;/p&gt;
&lt;p&gt;After arriving at the John Wayne airport near anaheim things instantly started looking bleak; Baggage was the last of plane to start this off, the clerk at the budget counter wouldn&amp;#8217;t give me my rental car because I&amp;#8217;m not 25 yet. Whatever&amp;#8230; someone knew another rental service downtown which rents cars to people above 21. There is nothing wrong with company policies of this kind in my eyes. It would just be nice if expedia would have told me. In general expedia seems to be rather car unfriendly. I used the convenient feature to print out a route description from the airport to the hotel and thats where the day went even bleaker as those where utterly useless. &lt;br /&gt;
1 hour 20 minutes, 3 gas stations full of directions, a 5$ map and 21 miles later i managed to find the hotel and passed out.&lt;/p&gt;
&lt;p&gt;The next morning I met with Solomon and company where I conducted a little rails workshop. I&amp;#8217;m really sad that I didn&amp;#8217;t bring any kind of camera with me, their office has got to be one of the nicest decorated places ever.&lt;/p&gt;
&lt;p&gt;We worked on several of their cool projects. Most of the time we used the peer programming style where one person was on the keyboard and we all discussed the problems at hand and how to tackle them. I&amp;#8217;m pretty sure the poor guys will have nightmares about test driven development tough. However we had a lot of fun on and off duty; Solomon took me for a fantastic drive around the area. Driving through Laguna Beach and Newport during a stunning sunset and great music was something to behold.&lt;/p&gt;
&lt;p&gt;On Thursday I met with the people from Medsphere; Again a very cool company. They are working in the &lt;br /&gt;
healthcare industry and wrote open source all over their banners. Their &lt;span class=&quot;caps&quot;&gt;CTO&lt;/span&gt; Steve with whom I was in contact prior to meeting turned out to be a big ruby fan. I was delighted to discover that they have been using ruby for a long time for their integration and installation needs, cutting down installation times from 4 weeks or more which are usual in the industry to just one day. I learned a lot about this interesting industry and the daunting task of modernizing 25 years old code but also left some 0day code there in the form of a neat ajax based time tracker which I coded up on Friday. &lt;br /&gt;
Medsphere is also the employer of Todd Berman of MonoDevelop fame who &lt;a href=&quot;http://off.net/~tberman/diary/archives/003410.html&quot;&gt;blogged&lt;/a&gt; about his first real encounter with rails.&lt;/p&gt;
&lt;p&gt;On friday evening I met with Robert Bousquet, a fellow typo contributor, who drove up from LA for mexican food and light chatting.&lt;/p&gt;
&lt;p&gt;The flight home was painless other then the fact that I had to get up at 4am. Overall a fantastic trip. I only met amazing people and Orange County is truly a gorgeous area. Its great to talk about rails with people face to face and its even greater to see the adoption rate increase so radically. New industries pick up rails daily. Its exciting times and it will only get better. Rails is where its at.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Typo converters</title>
   <link href="http://blog.leetsoft.com/2005/04/30/typo-converters.html"/>
   <updated>2005-04-30T11:34:20-07:00</updated>
   <id>http://blog.leetsoft.com/2005/04/30/typo-converters</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/files//files/logos/5t.png&quot; border=&quot;0&quot; height=&quot;52&quot; width=&quot;97&quot; alt=&quot;5t.png&quot; align=&quot;right&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.poocs.net/articles/2005/04/30/eager-to-try-out-typo-convert-today&quot; title=&quot;Eager to try out typo? Convert today!&quot;&gt;Patrick Lenz&lt;/a&gt; just checked in two new converters to the typo trunk.  You can now easily convert your wordpress and textpattern blogs to our humble blogging engine.&lt;br /&gt;
&lt;blockquote&gt;Following suit with the initial &lt;a href=&quot;http://poocs.net/articles/2005/04/03/poocs-net-going-typo&quot;&gt;Movable Type 3.x converter&lt;/a&gt; for the typo weblogging engine all current users of &lt;a href=&quot;http://www.wordpress.org/&quot;&gt;WordPress&lt;/a&gt; and &lt;a href=&quot;http://www.textpattern.com/&quot;&gt;TextPattern&lt;/a&gt; may now convert easily as well.&lt;/p&gt;
&lt;/blockquote&gt;</content>
 </entry>
 
 <entry>
   <title>Introducing Azure</title>
   <link href="http://blog.leetsoft.com/2005/04/27/introducing-azure.html"/>
   <updated>2005-04-27T22:46:00-07:00</updated>
   <id>http://blog.leetsoft.com/2005/04/27/introducing-azure</id>
   <content type="html">&lt;p&gt;Alright this is not the post you should be reading in your &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; reader.&lt;/p&gt;
&lt;p&gt;Justin Palmer just merged his new design into trunk which is dubbed Azure.&lt;/p&gt;
&lt;p&gt;I really love justin&amp;#8217;s work; It looks awesome. Make sure you head over to his &lt;a href=&quot;http://www.encytemedia.com/&quot;&gt;weblog&lt;/a&gt; and send him some mad props.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Typo 2.0 arrives</title>
   <link href="http://blog.leetsoft.com/2005/04/23/typo-2-0-arrives.html"/>
   <updated>2005-04-23T17:51:38-07:00</updated>
   <id>http://blog.leetsoft.com/2005/04/23/typo-2-0-arrives</id>
   <content type="html">&lt;p&gt;From the announcement email:&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m proud to announce the 2.0 release of the typo web logging engine. What started as a toy project while &lt;br /&gt;
I was waiting for a client at starbucks now became a prestige open source project with tons of modern features a dedicated dev team and even its own hosting service!&lt;/p&gt;
&lt;p&gt;The 2.0 release has been long coming. Here are some of the new features:&lt;/p&gt;
&lt;p&gt;Highlights:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; admin &amp;#8211; Thats right, I gave up. Typo now has a real html admin and you can access most of its features from it. Some minor features are still desktop client only but you can definitely get your blogging fix on vacation now.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Sophisticated Spam protection. Patrick Lenz ported the most popular Movable Type spam protection weapons right to the typo codebase. Typo ships with more spam protection than most other engines can get with plugins.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Ajax galore. Comments are posted using Ajax, We also have a live search like google suggest and live textile/markdown preview in the admin.&lt;/li&gt;
	&lt;li&gt;Pretty urls (permalinks)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other feature improvements:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;One-click setup&lt;/li&gt;
	&lt;li&gt;Support for non-vhost installations&lt;/li&gt;
	&lt;li&gt;Support for multiple authors&lt;/li&gt;
	&lt;li&gt;Pagination&lt;/li&gt;
	&lt;li&gt;Syndication of 43 Things&lt;/li&gt;
	&lt;li&gt;Database backed sessions&lt;/li&gt;
	&lt;li&gt;Transition to ActionWebService&lt;/li&gt;
	&lt;li&gt;Markdown support&lt;/li&gt;
	&lt;li&gt;Migration script for MovableType 3 users&lt;/li&gt;
	&lt;li&gt;Extended testing suites&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Non code:&lt;/p&gt;
&lt;p&gt;Justin Palmer has started working on the Typo visual identity which is due to arrive with the next release (bye bye kubrick) &lt;br /&gt;
You can see the new typo logo &lt;a href=&quot;http://www.encytemedia.com/images/5.png&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I would like to thank all the contributors who sent patches and suggestions for this release. Especially I want to thank Patrick Lenz and Seth Hall for the tireless bug fixing and improvement of the code health.&lt;/p&gt;
&lt;p&gt;Typo is now 1435 lines of very aesthetic code and is backed up by 1120 lines of tests putting it at a 0:8 ratio.&lt;/p&gt;
&lt;p&gt;Get it at &lt;a href=&quot;http://rubyforge.org/frs/?group_id=555&amp;amp;release_id=2069&quot;&gt;rubyforge&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Typo Visual Identity</title>
   <link href="http://blog.leetsoft.com/2005/04/21/typo-visual-identity.html"/>
   <updated>2005-04-21T09:50:34-07:00</updated>
   <id>http://blog.leetsoft.com/2005/04/21/typo-visual-identity</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://blog.leetsoft.com/files//files/typo-logo.png&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/files//files/3.gif&quot; border=&quot;0&quot; height=&quot;125&quot; width=&quot;286&quot; alt=&quot;typo logo&quot; style=&quot;margin: 0 0 5px 5px&quot; align=&quot;right&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Its no secret that typo is starting to become one of the prestige rails applications. &lt;br /&gt;
Who would have thought two months ago when I setup trac after people literally harassed me into doing so.&lt;/p&gt;
&lt;p&gt;Its a great example that good software comes out of projects which started out of the developers needs. &lt;a href=&quot;http://www.rubyonrails.com/&quot;&gt;Rails&lt;/a&gt; and &lt;a href=&quot;http://www.basecamphq.com/&quot;&gt;Basecamp&lt;/a&gt; themselves are great examples of this and so Is the software I created for my own ecommerce store &lt;a href=&quot;http://www.snowdevil.ca/&quot;&gt;snowdevil&lt;/a&gt; ( Look forward for some announcements regarding its codebase in the coming months ).&lt;/p&gt;
&lt;p&gt;Today another piece of the puzzle fell into place for the typo project. I&amp;#8217;m pleased to announce that Justin Palmer joined the typo team. Justin will work on all aspects of frontend but will  mainly coin the visual identity of typo. And he did so with a bang by singlehandedly creating this gorgeous new logo for the project.&lt;/p&gt;
&lt;p&gt;Read his announcement &lt;a href=&quot;http://www.encytemedia.com/article/6/a-fresh-start-typo&quot;&gt;here&lt;/a&gt;. Make sure to subscribe to his &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; as he will be documenting the process of creating the design.&lt;/p&gt;
&lt;p&gt;Welcome on board Justin!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Typo admin interface</title>
   <link href="http://blog.leetsoft.com/2005/04/20/typo-admin-interface.html"/>
   <updated>2005-04-20T08:24:21-07:00</updated>
   <id>http://blog.leetsoft.com/2005/04/20/typo-admin-interface</id>
   <content type="html">&lt;p&gt;the next release of typo will feature the first stab at an &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; Admin interface.&lt;/p&gt;
&lt;p&gt;Currently its not much more then scaffold in nicer cloths but its already very useful. &lt;br /&gt;
Desktop clients will continue to be the preferred (-and more supported) way to post articles. The &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; admin will be useful to post from vacations or out of a friends house.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/files/admin.png&quot; border=&quot;0&quot; height=&quot;277&quot; width=&quot;438&quot; alt=&quot;admin.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If you where planning to dive into the inner workings of typo or a rails project in general the admin interface is a good place to get started because of its scaffolding base. There are many little features needed like being able to sent trackbacks from the admin and similar things so the entry chance to get patches included are better then ever :)&lt;/p&gt;
&lt;p&gt;Oh and don&amp;#8217;t forget to subscribe to the &lt;a href=&quot;http://rubyforge.org/mailman/listinfo/typo-list&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Weblogs new home</title>
   <link href="http://blog.leetsoft.com/2005/04/06/weblogs-new-home.html"/>
   <updated>2005-04-06T11:28:09-07:00</updated>
   <id>http://blog.leetsoft.com/2005/04/06/weblogs-new-home</id>
   <content type="html">&lt;p&gt;This weblog has been running from my home Linux box for the past week and I&amp;#8217;m very happy with the current setup.&lt;/p&gt;
&lt;p&gt;I had to relieve the snowdevil server of a few tasks and while I was thinking of a way to move my private web pages to  my local network Jeremy Kemper mentioned that with a bit of &lt;span class=&quot;caps&quot;&gt;DNS&lt;/span&gt; tricksery and the free service &lt;a href=&quot;http://www.everydns.net/&quot;&gt;www.everydns.net&lt;/a&gt; you could map any &lt;span class=&quot;caps&quot;&gt;DNS&lt;/span&gt; to a dynamic IP.&lt;/p&gt;
&lt;p&gt;How is this done?&lt;/p&gt;
&lt;p&gt;First you need to transfer your NS servers for the domain you want to use to everydns.net. They have a great track record of stability so this is probably a good idea anyways. &lt;br /&gt;
Next, you register a sub &lt;span class=&quot;caps&quot;&gt;DNS&lt;/span&gt; like dynamic.leetsoft.com with will be marked as dynamic so that they let you use their infrastructure to update the IP it points to with a simple &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; call. &lt;br /&gt;
After that you can set up &lt;span class=&quot;caps&quot;&gt;CNAMES&lt;/span&gt; pointing to the dynamic address. Currently &lt;a href=&quot;http://blog.leetsoft.com/&quot;&gt;blog.leetsoft.com&lt;/a&gt; and &lt;a href=&quot;http://home.leetsoft.com/&quot;&gt;home.leetsoft.com&lt;/a&gt; are hosted locally.&lt;/p&gt;
&lt;p&gt;Luckily I have a good &lt;span class=&quot;caps&quot;&gt;DSL&lt;/span&gt; line and disconnect at most once a month ( go canada ) to support a stunt like this.&lt;/p&gt;
&lt;p&gt;Since I&amp;#8217;m a ruby nut and couldn&amp;#8217;t stand relying on a perl script to update my address after each reconnect I ported the &lt;a href=&quot;http://home.leetsoft.com/dropbox/everydns/everydns.rb&quot;&gt;IP update script to ruby&lt;/a&gt; which is also the main reason for this post. Simply integrating it into the ipup script of my router ensures that the &lt;span class=&quot;caps&quot;&gt;DNS&lt;/span&gt; record is updated as soon as the machine connects.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Get your own typo blog</title>
   <link href="http://blog.leetsoft.com/2005/04/05/get-your-own-typo-blog.html"/>
   <updated>2005-04-05T12:41:09-07:00</updated>
   <id>http://blog.leetsoft.com/2005/04/05/get-your-own-typo-blog</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.planetargon.com/&quot;&gt;Planet Argon&lt;/a&gt; extended their &lt;a href=&quot;http://www.planetargon.com/blog_hosting/&quot;&gt;Blog hosting package&lt;/a&gt; by offering typo.&lt;/p&gt;
&lt;p&gt;For as low as 3$ a month the deal can be had and you even get to choose between running the latest stable version or svn trunk.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Typo to AWS</title>
   <link href="http://blog.leetsoft.com/2005/04/05/typo-to-aws.html"/>
   <updated>2005-04-05T06:02:24-07:00</updated>
   <id>http://blog.leetsoft.com/2005/04/05/typo-to-aws</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://poocs.net&quot;&gt;Patrick Lenz&lt;/a&gt;, who switched to typo just two days ago worked tirelessly to port the engine to rails&amp;#8217; native web service engine &lt;a href=&quot;http://manuals.rubyonrails.com/read/chapter/67&quot;&gt;ActiveWebService&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;He documented his experience and his findings about the port in his latest essay on his &lt;a href=&quot;http://poocs.net/articles/2005/04/05/lifting-typo-onto-actionwebservice&quot;&gt;weblog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The next typo release is coming along nicely. Its going to be a 2.0 indicating that it will contain backwards incompatible database changes and that I have no shame in liberally increasing version numbers.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>More typo adoption</title>
   <link href="http://blog.leetsoft.com/2005/04/03/more-typo-adoption.html"/>
   <updated>2005-04-03T10:47:01-07:00</updated>
   <id>http://blog.leetsoft.com/2005/04/03/more-typo-adoption</id>
   <content type="html">&lt;p&gt;Patrick Lenz converted his moveable type based &lt;a href=&quot;http://poocs.com/&quot;&gt;weblog&lt;/a&gt; to typo. To make the transition as painless as possible he invoked his ruby-fu and came up with a Moveable Type to Typo converter &lt;a href=&quot;http://poocs.net/files/mt3.rb&quot;&gt;script&lt;/a&gt;. Future Typo releases will include this script under script/mt3.rb. If anyone else created similar importers for other weblogging engines please let me know!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tobias&amp;#8217; weblog engine is getting more and more mature every day. Just recently he added both Ajax powered comments and beautiful permalinks.&lt;/p&gt;
&lt;p&gt;With the recent trackback spam attacks and all the comment spam issues surrounding blog market leader Movable Type it seems to be the time to opt for the underdog (again?).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;small&gt;I even fixed sending trackbacks to post this&lt;/small&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Say bye to /articles/read/5</title>
   <link href="http://blog.leetsoft.com/2005/04/02/say-bye-to-articles-read-5.html"/>
   <updated>2005-04-02T20:50:09-08:00</updated>
   <id>http://blog.leetsoft.com/2005/04/02/say-bye-to-articles-read-5</id>
   <content type="html">&lt;p&gt;Typo just got good looking permanent urls!&lt;/p&gt;
&lt;p&gt;so instead of&lt;/p&gt;
&lt;p&gt;http://blog.leetsoft.com/articles/read/25&lt;/p&gt;
&lt;p&gt;we now have&lt;/p&gt;
&lt;p&gt;http://blog.leetsoft.com/articles/2005/03/28/round-corners&lt;/p&gt;
&lt;p&gt;nifty huh?&lt;/p&gt;
&lt;p&gt;For good measure its also possible to list all posts done in month of February by going to http://blog.leetsoft.com/articles/2005/02 or all posts of 2005 by http://blog.leetsoft.com/articles/2005.&lt;/p&gt;
&lt;p&gt;Here are the two routes which make it all possible:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
  # allow neat perma urls
  map.connect 'articles/:year/:month/:day', :controller  =&amp;gt; 'articles', 
            :action =&amp;gt; 'find_by_date', 
            :year =&amp;gt; /\d{4}/, :day =&amp;gt; nil, :month =&amp;gt; nil
  map.connect 'articles/:year/:month/:day/:title', :controller  =&amp;gt; 'articles', 
            :action =&amp;gt; 'permalink', :year =&amp;gt; /\d{4}/
&lt;/pre&gt;&lt;p&gt;&lt;/code&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Ajax rocks</title>
   <link href="http://blog.leetsoft.com/2005/04/01/ajax-rocks.html"/>
   <updated>2005-04-01T23:15:45-08:00</updated>
   <id>http://blog.leetsoft.com/2005/04/01/ajax-rocks</id>
   <content type="html">&lt;p&gt;I just added ajax support to typo for writing comments. Check it out :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Some world class spamming going on here&amp;#8230; I improved the form somewhat, cookies should work much nicer.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Round corners</title>
   <link href="http://blog.leetsoft.com/2005/03/28/round-corners.html"/>
   <updated>2005-03-28T09:30:44-08:00</updated>
   <id>http://blog.leetsoft.com/2005/03/28/round-corners</id>
   <content type="html">&lt;p&gt;I did some fooling around with java-script today. The language is really growing on me, It more like ruby then most other scripting languages. The only thing its really missing is the beautiful syntax, the power is certainly there.&lt;/p&gt;
&lt;p&gt;Since I wanted to learn how the &lt;a href=&quot;http://prototype.conio.net/&quot;&gt;prototype&lt;/a&gt; library works I &amp;#8220;ported&amp;#8221; the JS based &lt;a href=&quot;http://pro.html.it/esempio/nifty/&quot;&gt;nifty corners&lt;/a&gt; to a more prototype like &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.leetsoft.com/javascript/corners/#&quot;&gt;Nifty JS corners a la prototype&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Rails 0.11</title>
   <link href="http://blog.leetsoft.com/2005/03/22/rails-0-11.html"/>
   <updated>2005-03-22T09:24:11-08:00</updated>
   <id>http://blog.leetsoft.com/2005/03/22/rails-0-11</id>
   <content type="html">&lt;p&gt;Rails 0.11 was just &lt;a href=&quot;http://weblog.rubyonrails.com/archives/2005/03/22/rails-0110-ajax-pagination-non-vhost-incoming-mail/&quot;&gt;released&lt;/a&gt;. And what kind of crazy release it is!&lt;/p&gt;
&lt;p&gt;With the 0.11 release rails has committed itself to the &lt;a href=&quot;http://www.adaptivepath.com/publications/essays/archives/000385.php&quot;&gt;ajax&lt;/a&gt; using Sam Stephenson&amp;#8217;s fantastic &lt;a href=&quot;http://prototype.conio.net/&quot;&gt;prototype&lt;/a&gt; library which he custom build for rails.&lt;/p&gt;
&lt;p&gt;You can &lt;a href=&quot;http://www.leetsoft.com/rails/rails-ajax.mov&quot;&gt;watch&lt;/a&gt; himself use it, applying it by way of the helpers rails gives provides for you with, to his upcoming application Elements which he is developing alongside Marcel Molina Jr.&lt;/p&gt;
&lt;p&gt;This is a significant commitment. Not only is rails the only fullstack framework which assists in all parts of modern web page development from data to view, it also now spans the server and the client side.&lt;/p&gt;
&lt;p&gt;Rails applications have been better than those developed with other frameworks by the additional polish you could afford to apply with the time rails saved you during development. Now rails applications will be significantly better than those you can create with other frameworks because of the new and easy to use JS tech it offers.&lt;/p&gt;
&lt;p&gt;This is completely new territory for a web application framework.&lt;/p&gt;
&lt;p&gt;The web is going to be a very different place than it is now a year from now and rails leads the way google proposed.&lt;/p&gt;
&lt;p&gt;Other enhancements are:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Super easy non vhost installation. Just symlink to the public directory from anywhere on your apache server!&lt;/li&gt;
	&lt;li&gt;Improved flash&lt;/li&gt;
	&lt;li&gt;ActionMailer can now &lt;a href=&quot;http://wiki.rubyonrails.com/rails/show/HowToReceiveEmailsWithActionMailer&quot;&gt;receive&lt;/a&gt; emails&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://rails.rubyonrails.com/classes/ActionView/Helpers/CaptureHelper.html&quot;&gt;Captures&lt;/a&gt; which allow you to insert code in the header of your page from anywhere in your view code for the xhtml 1.1 strict nuts.&lt;/li&gt;
	&lt;li&gt;Build in pagination support&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>Hard to find bugs Episode #23221</title>
   <link href="http://blog.leetsoft.com/2005/03/18/hard-to-find-bugs-episode-23221.html"/>
   <updated>2005-03-18T07:54:24-08:00</updated>
   <id>http://blog.leetsoft.com/2005/03/18/hard-to-find-bugs-episode-23221</id>
   <content type="html">&lt;p&gt;OK since I have not talked much about snowdevil and how its faring in production I&amp;#8217;ll tell you about one of those really hard to find bugs and how to go about fixing it. This is also meant to give a glimpse at how maintenance works in a test driven environment using ruby on rails. I&amp;#8217;ll show you how to create the test cases which expose the bugged behavior, how to fix it and how to restore the integrity of your database using rails facilities.&lt;/p&gt;
&lt;p&gt;Whenever an exception is thrown on snowdevil I get an email. This has been an invaluable tool so far. This email contains&lt;br /&gt;
everything from requested &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; to user data (if available) to stack traces, environment variables, params, session and all the rest of the anatomy of the request known to the system.&lt;/p&gt;
&lt;p&gt;Yesterday I started getting very odd emails. A user was adding items to his shopping cart but he would get an exception in doing so.&lt;/p&gt;
&lt;p&gt;Now this is a fairly well tested concept in this store ( We sold 10 snowboards just last week). So what went wrong?&lt;/p&gt;
&lt;p&gt;Turns out that this particular user is a returning customer and on his last visit he left the store with items in his shopping cart which are since deleted. This leads to a &amp;#8220;undefined method &amp;#8216;product&amp;#8217; for nil&amp;#8221; type error when the shopping cart is supposed to be displayed. Ouch!&lt;/p&gt;
&lt;p&gt;Bugs stink so lets fix this critter.&lt;/p&gt;
&lt;p&gt;First lets recreate the issue in a test case. The bug happens when rendering the shopping page so we will go with a functional test case first.&lt;br /&gt;
Note that we won&amp;#8217;t fix the error in the template, even though this sounds appealing. The error coming from ActionView is only a symptom. We will&lt;br /&gt;
fix the cause.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
  def test_user_with_deleted_item_in_cart

    # add item one to cart    
    post :add, &quot;id&quot; =&amp;gt; 1

    # delete this item
    Product.find(1).destroy
    
    assert_raise(ActiveRecord::RecordNotFound) do
      Product.find(1)
    end

    assert_raise(ActiveRecord::RecordNotFound) do
      ProductUnit.find(1)
    end

    # add another item to cart
    post :add, &quot;id&quot; =&amp;gt; 3

    # tell the cart to refresh its items collection. This is done 
    # automatically between real requests
    @request.session[&quot;cart&quot;].items(:reload)
        
    # render the cart overview
    get :index
    assert_success
  end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;BAM&lt;/span&gt;!  ActionView::TemplateError: undefined method `product&amp;#8217; for nil:NilClass. Ever been happy about getting an error? Here is your chance!&lt;br /&gt;
This is exactly what I have been emailed about by my trusty store. &lt;br /&gt;
So now lets fix it, ok? No we do &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt;. Lets declare our intention with another unit test:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
  def test_deleted_unit
    
    @board1_151cm.destroy
      
    assert_raise(ActiveRecord::RecordNotFound) do
      @cart1_item1.reload
    end
    
  end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wonderful. This fails as well.&lt;/p&gt;
&lt;p&gt;Now equipped with our failing unit tests we can go and write some production code to fix the issue:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
  class ProductUnit &amp;lt; ActiveRecord::Base
    has_many :cart_items, :foreign_key =&amp;gt; &quot;unit_id&quot;, :dependent =&amp;gt; true
    [...]
  end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;rake tells us that all unit tests work and we fixed a bug. &lt;strong&gt;forever&lt;/strong&gt; and it will never appear again or rake would tell us.&lt;/p&gt;
&lt;p&gt;Now off to deploying the changes on the production site and fixing the database retroactively.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
tobi@commerce snowdevil $ ruby script/console production
Loading environment...
irb(main):001:0&amp;gt; CartItem.find_all.each { |o| o.destroy if o.unit == nil }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So long and thanks for all the fish.&lt;/p&gt;
&lt;p&gt;If you are interested to learn about &lt;span class=&quot;caps&quot;&gt;TDD&lt;/span&gt; i recommend the book &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0321146530/toobiased-20?creative=327641&amp;amp;camp=14573&amp;amp;link_code=as1&quot;&gt;Test driven development&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Typofication</title>
   <link href="http://blog.leetsoft.com/2005/03/17/typofication.html"/>
   <updated>2005-03-17T08:10:31-08:00</updated>
   <id>http://blog.leetsoft.com/2005/03/17/typofication</id>
   <content type="html">&lt;p&gt;I finally got to update my own typo install with all the latest developments. &lt;br /&gt;
One of the really cool new things in the last release was the live search. check it out.&lt;/p&gt;
&lt;p&gt;Oh. This also means that comments finally work again.  Post away!&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m also extremely impressed by the quick adoption rate of typo considering its limitations.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&quot;ext-link&quot; title=&quot;http://blog.remor.com&quot; href=&quot;http://blog.remor.com&quot;&gt;seth hall&lt;/a&gt; and his unnamed blog. Co-developer of typo.&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;ext-link&quot; title=&quot;http://www.robbyonrails.com&quot; href=&quot;http://www.robbyonrails.com&quot;&gt;RobbyOnRails&lt;/a&gt; Robby Russell shares his experiences with Rails.&lt;/li&gt;&lt;li&gt;&lt;a class=&quot;ext-link&quot; title=&quot;http://www.wheeledone.com&quot; href=&quot;http://www.wheeledone.com&quot;&gt;WheeledOne&lt;/a&gt; WheeledOne&amp;#8217;s blog&amp;#8230;Wanted: A purpose.&lt;/li&gt;&lt;li&gt;&lt;a class=&quot;ext-link&quot; title=&quot;http://www.shanesbrain.net&quot; href=&quot;http://www.shanesbrain.net&quot;&gt;Shanes&amp;#8217;s Brain Extension&lt;/a&gt; Shane Vitarana&amp;#8217;s thoughts on technology.&lt;/li&gt;&lt;li&gt;&lt;a class=&quot;ext-link&quot; title=&quot;http://www.okdisco.com&quot; href=&quot;http://www.okdisco.com&quot;&gt;OkDisco&lt;/a&gt; Enjoying the software, thanks.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;If you are running a blog based on typo please add yourself to the &lt;a href=&quot;http://typo.leetsoft.com/&quot;&gt;list&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>About Limber</title>
   <link href="http://blog.leetsoft.com/2005/03/16/about-limber.html"/>
   <updated>2005-03-16T12:36:24-08:00</updated>
   <id>http://blog.leetsoft.com/2005/03/16/about-limber</id>
   <content type="html">&lt;p&gt;from &lt;a href=&quot;http://takeoneonion.org/archives/2005/03/making_things_lmbr_the_r.html&quot;&gt;take one onion&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Since coining acronym is all the rage lately ( welcome &lt;a href=&quot;http://www.adaptivepath.com/publications/essays/archives/000385.php&quot;&gt;Ajax&lt;/a&gt; ) here is an interesting new one:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So with this move towards Ruby on Rails rather than Perl or &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;; &lt;span class=&quot;caps&quot;&gt;BSD&lt;/span&gt; rather than Linux and maybe lighttpd rather than apache, MySQL seems to be the constant. So rather than &lt;span class=&quot;caps&quot;&gt;LAMP&lt;/span&gt; try &lt;span class=&quot;caps&quot;&gt;LMBR&lt;/span&gt;, pronounced limber to coin a new acronym.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Good point. And looking at &lt;a href=&quot;http://www.onlamp.com&quot;&gt;onlamp&lt;/a&gt; they barely talk about lamp at all nowadays.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Action Mailer tips</title>
   <link href="http://blog.leetsoft.com/2005/03/15/action-mailer-tips.html"/>
   <updated>2005-03-15T07:47:18-08:00</updated>
   <id>http://blog.leetsoft.com/2005/03/15/action-mailer-tips</id>
   <content type="html">&lt;p&gt;OK so today I confused the hell out of my partner who does all the shipping for snowdevil.&lt;/p&gt;
&lt;p&gt;After testing a new revision of the software I he called me and asked &amp;#8220;Hey did you really just order 3 snowboards??!&amp;#8221;. My local test have been dispatching emails looking just like the real thing.&lt;/p&gt;
&lt;p&gt;Here is a simple which keeps emails going but doesn&amp;#8217;t confuse the hell out of other people (added to your development.rb) :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
ActionMailer::Base.perform_deliveries              = true
ActionMailer::Base.delivery_method                 = :fixed_email

class ActionMailer::Base

  def self.perform_delivery_fixed_email(mail)
    mail.to = 'your.own@email-address.com'
    mail.subject = '[DEV] ' + mail.subject
    Net::SMTP.start(
           server_settings[:address], 
           server_settings[:port], 
           server_settings[:domain], 
           server_settings[:user_name], 
           server_settings[:password], 
           server_settings[:authentication]) do |smtp|
                 smtp.sendmail(mail.encoded, mail.from, mail.destinations)
           end
  end

end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now i get all the emails the system sends myself. Thats much better&amp;#8230;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>A week worth of updates</title>
   <link href="http://blog.leetsoft.com/2005/03/07/a-week-worth-of-updates.html"/>
   <updated>2005-03-07T17:28:13-08:00</updated>
   <id>http://blog.leetsoft.com/2005/03/07/a-week-worth-of-updates</id>
   <content type="html">&lt;p&gt;I have updated some of my open source offerings&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;http://www.hieraki.org/&quot;&gt;Hieraki&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Hieraki got plenty of improvements next to the rails 0.10 update. The&lt;br /&gt;
biggest new features are proper yaml, html and readme export. But&lt;br /&gt;
there are also plenty of new code improvements like the switch to my&lt;br /&gt;
favorite &lt;a href=&quot;http://dev.hieraki.org/trac.cgi/file/trunk/app/controllers/book_controller.rb&quot;&gt;postback&lt;/a&gt; style for all controllers. Hieraki traditionally&lt;br /&gt;
serves as a demo app for many newcomers to rails so its code health is&lt;br /&gt;
very important. I also upped the testcase coverage to fairly good 1:0.8&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;http://typo.leetsoft.com/&quot;&gt;Typo&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Typo got some the 0.10 treatment and a few interesting updates. There&lt;br /&gt;
is a new del.icio.us aggregation helper and the search function now&lt;br /&gt;
uses ajax to update results in real time.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;http://dist.leetsoft.com/api/money/&quot;&gt;Money&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The money class received some major usability updates. I extracted&lt;br /&gt;
the currency exchange code into a pluggable Bank object which means&lt;br /&gt;
that you can totally customize how money handles currency exchange.&lt;br /&gt;
If you are working on anything e-commerce related definitely check this out&lt;/p&gt;
&lt;h3&gt;Login generator&lt;/h3&gt;
&lt;p&gt;Login generator got some neat updates as well. First of all thanks to&lt;br /&gt;
Jeremy Kemper&amp;rsquo;s phenomenal new generator framework the login generator&lt;br /&gt;
is now a gem. This means no copying around of the generator into each&lt;br /&gt;
and every of your projects anymore. Also the new generators now ask&lt;br /&gt;
before overwriting things which really helps when one chooses to&lt;br /&gt;
enforce as generic names as &amp;lsquo;user.rb&amp;rsquo; (lala). I updated the readme a&lt;br /&gt;
bit and fixed a bug or two.&lt;/p&gt;
&lt;h3&gt;Postback generator &amp;#160;(new)&lt;/h3&gt;
&lt;p&gt;This is a modified scaffold editor which uses my favored &lt;a href=&quot;http://dev.hieraki.org/trac.cgi/file/trunk/app/controllers/book_controller.rb&quot;&gt;postback&lt;/a&gt;&lt;br /&gt;
style. Additionally it improves upon scaffolding in several ways like extracting the actual form into an partial shared by new and edit. It also provides ample&lt;br /&gt;
hooks for css cumizations.&lt;/p&gt;
&lt;p&gt;Most those things can be had from my &lt;a href=&quot;http://dist.leetsoft.com&quot;&gt;distribution site&lt;/a&gt;. Hieraki is&lt;br /&gt;
still not released as a package and can be had using svn. More about&lt;br /&gt;
hieraki at its &lt;a href=&quot;http://dev.hieraki.org/&quot;&gt;homepage&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Back in the country</title>
   <link href="http://blog.leetsoft.com/2005/02/28/back-in-the-country.html"/>
   <updated>2005-02-28T21:41:35-08:00</updated>
   <id>http://blog.leetsoft.com/2005/02/28/back-in-the-country</id>
   <content type="html">&lt;p&gt;I&amp;#8217;m back from my one week vacation in the Dominican Republic.&lt;br /&gt;
We had a fantastic time and did lots of interesting touristy things like wale watching and cigar rolling.&lt;/p&gt;
&lt;p&gt;On an even more personal note; I&amp;#8217;m also thrilled to announce that Fiona accepted my proposal to marry her on our 4th anniversary.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Why i love quicksilver</title>
   <link href="http://blog.leetsoft.com/2005/02/17/why-i-love-quicksilver.html"/>
   <updated>2005-02-17T17:17:03-08:00</updated>
   <id>http://blog.leetsoft.com/2005/02/17/why-i-love-quicksilver</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://quicksilver.blacktree.com/&quot;&gt;Quicksilver&lt;/a&gt; is the coolest application for the mac platform.  &lt;br /&gt;
This is how I open my programming project:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.leetsoft.com/files//images/quicksilver.jpg&quot; border=&quot;0&quot; height=&quot;317&quot; width=&quot;487&quot; alt=&quot;quicksilver.jpg&quot; align=&quot;right&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;snow (= snowdevil, a folder)&lt;/li&gt;
	&lt;li&gt;ow (= open with, an action)&lt;/li&gt;
	&lt;li&gt;T (= &lt;a href=&quot;http://macromates.com/&quot;&gt;TextMate&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quicksilver lets you do everything from queuing up a couple of albums on iTunes to pasting the address of one of your address book contacts where your cursor is. &lt;br /&gt;
If you think a command line is faster to use than a well done &lt;span class=&quot;caps&quot;&gt;GUI&lt;/span&gt; like Apple&amp;#8217;s take tools like quicksilver into consideration.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>New Typo release</title>
   <link href="http://blog.leetsoft.com/2005/02/17/new-typo-release.html"/>
   <updated>2005-02-17T07:13:53-08:00</updated>
   <id>http://blog.leetsoft.com/2005/02/17/new-typo-release</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://typo.leetsoft.com/&quot;&gt;Typo&lt;/a&gt; has been extended rapidly almost exclusively due to the efforts of &lt;a href=&quot;http://blog.remor.com/articles/&quot;&gt;Seth Hall&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I just updated a new version to &lt;a href=&quot;http://dist.leetsoft.com&quot;&gt;dist.leetsoft.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;New features include:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Categories&lt;/li&gt;
	&lt;li&gt;Trackback / Pingback&lt;/li&gt;
	&lt;li&gt;Moveable Type &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; support&lt;/li&gt;
	&lt;li&gt;Flickr syndication&lt;/li&gt;
	&lt;li&gt;Google nofollow support&lt;/li&gt;
	&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;RDS&lt;/span&gt; auto discovery&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Geeze this little accident of an app sure shapes up nicely :)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Typo</title>
   <link href="http://blog.leetsoft.com/2005/02/15/typo.html"/>
   <updated>2005-02-15T19:51:00-08:00</updated>
   <id>http://blog.leetsoft.com/2005/02/15/typo</id>
   <content type="html">&lt;p&gt;Because there seems to be some interest in typo lately (Why is beyond me) I went ahead and setup &lt;a href=&quot;http://typo.leetsoft.com/&quot;&gt;trac&lt;/a&gt; for it. &lt;a href=&quot;http://www.opensource.org/licenses/mit-license.php&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIT&lt;/span&gt;&lt;/a&gt; as always&amp;#8230;&lt;/p&gt;&lt;p&gt;Special thanks go to &lt;a href=&quot;http://blog.remor.com/articles/&quot;&gt;Seth Hall&lt;/a&gt; for for submitting the first &lt;a href=&quot;http://typo.leetsoft.com/trac.cgi/changeset/34&quot;&gt;patch&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://typo.leetsoft.com/&quot;&gt;Enjoy&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Deployment</title>
   <link href="http://blog.leetsoft.com/2005/02/14/deployment.html"/>
   <updated>2005-02-14T17:47:43-08:00</updated>
   <id>http://blog.leetsoft.com/2005/02/14/deployment</id>
   <content type="html">&lt;p&gt;How do I deploy my code on a production server?&lt;/p&gt;&lt;p&gt;A few months back we had this little discussion in &lt;span class=&quot;caps&quot;&gt;IRC&lt;/span&gt; to which &lt;a href=&quot;http://www.loudthinking.com/&quot;&gt;david&lt;/a&gt; replied that he keeps different versions of his production apps on their respective directories and uses a symlink to hook up a working copy to the web server. &lt;/p&gt;&lt;p&gt;The big advantage in this is that you can test the code before restarting the web server since the current web site runs untouched. This has saved me from deploying quite a couple of bugs in the beginning and it prompted me to install &lt;a href=&quot;http://damagecontrol.codehaus.org/&quot;&gt;damagecontrol&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Over the last couple of weeks I have tried to automate this process. What I came up with is a script which basically acts as a batch handler for server deployment. &lt;/p&gt;&lt;p&gt;Take for instance &lt;a href=&quot;http://www.hieraki.org/&quot;&gt;Hieraki&lt;/a&gt;. Issuing deploy hieraki runs through the following steps:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;ssh connect to production server&lt;/li&gt;&lt;li&gt;checkout the latest version from subversion &lt;/li&gt;&lt;li&gt;run all unit tests using rake&lt;/li&gt;&lt;li&gt;set permissions on log dir&lt;/li&gt;&lt;li&gt;point the hieraki/latest symlink to the newly deployed copy &lt;/li&gt;&lt;li&gt;restart apache gracefully&lt;/li&gt;&lt;p&gt;&lt;/ul&gt;&lt;p&gt;The current version of my deploy script reads the file ~/.deployrc for its configuration. In hieraki&amp;rsquo;s case this looks like this:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;  hieraki:&lt;/p&gt;
server: myserver
checkout: svn export svn://myserver/hieraki/trunk
directory: /var/www/applications/hieraki
test: RAILS_ENV=production rake
after_test:
- chmod 777 log/
- chmod 666 log/*
after_commit:
- sudo /etc/init.d/apache reload
&lt;p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A nice and clean yaml config file as you can see. Hope this is a useful starting point for others.&lt;/p&gt;&lt;p&gt;Download the script &lt;a href=&quot;http://dist.leetsoft.com/pkg/deploy&quot;&gt;here&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Consulting</title>
   <link href="http://blog.leetsoft.com/2005/02/11/consulting.html"/>
   <updated>2005-02-11T10:24:59-08:00</updated>
   <id>http://blog.leetsoft.com/2005/02/11/consulting</id>
   <content type="html">&lt;p&gt;Lately I did quite a bit of rails consulting, usually over the phone while sharing the desktop one way or another. &lt;br /&gt;
This kind of service has been so well received that I decided to formally advertise it.&lt;/p&gt;
&lt;p&gt;If you are just starting out using rails, you are stuck doing something tricky or you need to convince your co-workers to use rails and want to prepare for answering their questions have a look into what I have to say at &lt;a href=&quot;http://www.leetsoft.com/&quot;&gt;leetsoft.com&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;quot;After spending 2 hours with Tobi, I feel like Neo in The  Matrix after his session with the computerized training simulator:  &amp;#8220;Whoa, I know Rails!&amp;#8221; &lt;br/&gt; Tobi is friendly, patient, and has a deep knowledge of Rails. He also has a gift  for transmitting this knowledge in easily-understood terms. I wholeheartedly  recommend him to anyone wishing to accelerate their Rails learning.&amp;quot;&lt;/p&gt;&lt;p&gt;&lt;cite&gt; &amp;#8212; Josh Purinton&lt;/cite&gt;&lt;/blockquote&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Should I consider lighttpd?</title>
   <link href="http://blog.leetsoft.com/2005/02/08/should-i-consider-lighttpd.html"/>
   <updated>2005-02-08T09:44:21-08:00</updated>
   <id>http://blog.leetsoft.com/2005/02/08/should-i-consider-lighttpd</id>
   <content type="html">&lt;p&gt;
&lt;p&gt;Jason Hoffman of TextDrive fame posted a great little essay on &lt;a href=&quot;http://lighttpd.net/&quot;&gt;lighttpd&lt;/a&gt;. What is even better is that he mentions that they are using &lt;a href=&quot;http://www.hieraki.org/&quot;&gt;Hieraki&lt;/a&gt; for their internal documentation. &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://textdrive.com/weblog/article/25/should-i-consider-lighttpd&quot;&gt;TextDrive Weblog: Should I consider lighttpd?&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Lighttpd seems to be all the rage lately, Its a blazingly fast web server which is also easy to setup and comes with all the features a modern apache setup would have build in.&lt;/p&gt;
&lt;p&gt;I have been evaluating it for a while and so has &lt;a href=&quot;http://www.loudthinking.com/&quot;&gt;david&lt;/a&gt; who is looking to transfer &lt;a href=&quot;http://www.basecamphq.com/&quot;&gt;basecamp&lt;/a&gt; and &lt;a href=&quot;http://www.tadalist.com/&quot;&gt;tadalist&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On a related note: The next version of rails will contain a new Routing sub system which will overtake the job of mod_rewrite. This means that you will be able to use any web server under the stars with rails come 0.9.6!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Money is everything</title>
   <link href="http://blog.leetsoft.com/2005/02/04/money-is-everything.html"/>
   <updated>2005-02-04T08:07:27-08:00</updated>
   <id>http://blog.leetsoft.com/2005/02/04/money-is-everything</id>
   <content type="html">&lt;p&gt;I can&amp;#8217;t seem to send mails to the Rails mailing list currently ( It has been suggested in irc that I&amp;#8217;m banned for lack of quality posts ). &lt;br /&gt;
So I have to misuse this space to announce a small piece of code I want to publish.&lt;/p&gt;
&lt;p&gt;In the last days I got some requests for the money class I use in snowdevil and while it is certainly nothing spectacular and some might even call the way the currency exchange works harmful here is it non the less:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://leetsoft.com/rails/money&quot;&gt;Money class&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please help me extend this class and make something reasonable out of it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: The &lt;a href=&quot;http://lists.rubyonrails.org/mailman/listinfo/rails&quot;&gt;mailing list&lt;/a&gt; was out of order. Its working again now.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Snowdevil launches!</title>
   <link href="http://blog.leetsoft.com/2005/02/01/snowdevil-launches.html"/>
   <updated>2005-02-01T08:37:13-08:00</updated>
   <id>http://blog.leetsoft.com/2005/02/01/snowdevil-launches</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.snowdevil.ca/&quot;&gt;&lt;img src=&quot;http://blog.leetsoft.com/files/logo/logo_small.jpg&quot; border=&quot;0&quot; height=&quot;41&quot; width=&quot;176&quot; alt=&quot;logo_small.jpg&quot; style=&quot;float:right;padding:2px 10px&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
At long last, it&amp;#8217;s done. &lt;a href=&quot;http://www.snowdevil.ca/&quot;&gt;Snowdevil&lt;/a&gt; launched on 31.1.2005 after close to 4 months of the most intense but also fulfilling programming of my life.&lt;/p&gt;
&lt;p&gt;I have learned a lot of things during all stages of getting snowdevil on the web and I would do a great many things differently if I were to start over again. I&amp;#8217;m sure I&amp;#8217;ll have lots of opportunities to share these new &amp;#8220;insights&amp;#8221; here on this blog but here are the highlights.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Use &lt;a href=&quot;http://www.rubyonrails.org/&quot;&gt;Ruby on Rails&lt;/a&gt; if you do web development. If you don&amp;#8217;t use it, start today. &lt;cite&gt;Newton&lt;/cite&gt; said &amp;#8220;&lt;em&gt;If I have seen further, it is by standing on the shoulders of giants.&lt;/em&gt;&amp;#8221;. I consider the unveiling of Rails as one of the biggest jumps in productivity the computer industry has seen since it moved from assembler to high level languages. This is the time where small businesses can compete or outperform big businesses just because of better tools. You need to be as efficient as a team? No problem! By the end of the year most companies worth a damn will use Rails or a clone of it. Be ahead of the curve. &lt;/li&gt;&lt;li&gt;Embrace &lt;a href=&quot;http://c2.com/cgi/wiki?TestDrivenDevelopment&quot;&gt;Test driven development&lt;/a&gt;. Test cases are what make modern programming possible. Not only do they function as your personal QA department,  they also save you a lot of time you would spend hunting for bugs; That means they subtract from the most tedious annoying and frustrating time part of software development, the bug hunt. If you are not writing tests yet I recommend this &lt;a href=&quot;http://www.pragmaticprogrammer.com/starter_kit/utc/&quot;&gt;book&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Embrace as many &lt;a href=&quot;http://c2.com/cgi/wiki?ExtremeProgramming&quot;&gt;XP mantras&lt;/a&gt; as you can. Then apply them to everything you do, not only to programming. If I would have done this from the get go I would have saved us a lot of time. The biggest delay came from waiting too long to apply for the credit card processing. If i would have followed the &amp;#8220;&lt;em&gt;Most important feature first&lt;/em&gt;&amp;#8221; practice I would have put the application in the day I started to code. Other then that, telling myself &amp;#8220;&lt;em&gt;Do the simplest thing possible&lt;/em&gt;&amp;#8221; really helped me find the best code quicker than usual with less trying around. XP Is a major asset, If you want to learn more about it here is another &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0201616416/104-3798487-7938354&quot;&gt;book&lt;/a&gt; recommendation. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;With that out of the way, I can&amp;#8217;t even put into words how thrilled I am that the first milestone is done and the ground work is laid out and clearly seen by everyone who bothers to navigate to &lt;a href=&quot;http://www.snowdevil.ca/&quot;&gt;us&lt;/a&gt;. Its going to be a lot of fun to figure out all the aspects of running a virtual retail store and I&amp;#8217;m thrilled that I&amp;#8217;m doing it together with my business partner Scott Lake who is doing all the heavy lifting in the real world while pushing me to do an equally good job with the technical aspects of the venture. We have very ambitious plans for the snowdevil codebase and great technical challenges are yet to come. I can&amp;#8217;t wait!&lt;/p&gt;
&lt;p&gt;P.S: Since this is a technical blog and these numbers make me look good, here are the stats as per &lt;a href=&quot;http://www.dwheeler.com/sloccount/&quot;&gt;sloccount&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Total Physical Source Lines of Code (SLOC)                = 6,086
Development Effort Estimate, Person-Years (Person-Months) = 1.33 (15.99)
 (Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05))
Schedule Estimate, Years (Months)                         = 0.60 (7.17)
 (Basic COCOMO model, Months = 2.5 * (person-months**0.38))
Estimated Average Number of Developers (Effort/Schedule)  = 2.23
Total Estimated Cost to Develop                           = $ 179,966
 (average salary = $56,286/year, overhead = 2.40).&lt;/code&gt;&lt;/pre&gt;</content>
 </entry>
 
 <entry>
   <title>Syndication and TaDa</title>
   <link href="http://blog.leetsoft.com/2005/01/29/syndication-and-tada.html"/>
   <updated>2005-01-29T09:35:39-08:00</updated>
   <id>http://blog.leetsoft.com/2005/01/29/syndication-and-tada</id>
   <content type="html">&lt;p&gt;I&amp;#8217;m a great believer in the semantic web and syndication.&lt;/p&gt;
&lt;p&gt;I like applications which specialize on one task and do it very well. &lt;a href=&quot;http://www.tadalist.com/&quot;&gt;Ta-da&lt;/a&gt; is such a website, &lt;a href=&quot;http://www.flickr.com/&quot;&gt;Flickr&lt;/a&gt; is one or photos and &lt;a href=&quot;http://www.43things.com/home/&quot;&gt;43things&lt;/a&gt; for your ambitions.&lt;/p&gt;
&lt;p&gt;They cut right though the crap and concentrate on the core of the issue. &lt;br /&gt;
Why are those pages successful now and weren&amp;#8217;t 5 years ago? &lt;br /&gt;
The simple answer is syndication. Your data is never lost in some proprietary data pit;It actually gets more accessible after you entered it!&lt;/p&gt;
&lt;p&gt;To back up this claim I spend some time today to integrate Ta-da list into this Blog  (see right hand side). And see how nicely it works.&lt;/p&gt;
&lt;p&gt;If you like playing with websites like the ones I mentioned above there is an great number of information you can syndicate back to your homepage about yourself. &lt;br /&gt;
I&amp;#8217;ll try to add one new syndication to the page whenever I have time.&lt;/p&gt;
&lt;p&gt;The web is an exciting place!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>34 Very valid reasons</title>
   <link href="http://blog.leetsoft.com/2005/01/25/34-very-valid-reasons.html"/>
   <updated>2005-01-25T12:52:55-08:00</updated>
   <id>http://blog.leetsoft.com/2005/01/25/34-very-valid-reasons</id>
   <content type="html">&lt;p&gt;Debian and ruby don&amp;#8217;t like each other. &lt;br /&gt;
Thats no secret. In the rails support channel it regularly happens that people come up with the most obscure error messages about missing stuff. You will hear 3+ people asking &amp;#8220;what distro&amp;#8221; but they know the answer already.&lt;/p&gt;
&lt;p&gt;So what wen&amp;#8217;t wrong? How did they come up with the brilliant idea to split the &lt;strong&gt;standard library&lt;/strong&gt; into 34 different packages. I just can&amp;#8217;t see how something moronic like this can even get started considering that a &lt;strong&gt;standard library&lt;/strong&gt; is all about raising the status quo of the language by providing some shoulders to stand on so people can reach for higher goals.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;a href=&quot;http://www.jamisbuck.org/jamis/blog.cgi/programming/34%20Reasons%20Why%20I%20Will%20Never%20Use%20Debian_20050125144114.tx&quot;&gt;the buckblogs here&lt;/a&gt;: &amp;#8220;Some brilliant (and I use the term extremely loosely) Debian package maintainer decided to break Ruby into a million little pieces. They must have been big-time haters of Ruby, because the only reason I can think of for doing this is to make it as difficult as possible for Debian users to install a fully-functional Ruby on their system.&amp;#8221;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;If you need help installing rails on Debian you can read about it in the &lt;a href=&quot;http://wiki.rubyonrails.com/rails/show/RailsOnDebian&quot;&gt;wiki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, I strongly recommend to &lt;a href=&quot;http://www.gentoo.org/&quot;&gt;move&lt;/a&gt; [gentoo.org] &lt;a href=&quot;http://www.freebsd.org/&quot;&gt;on&lt;/a&gt; [freebsd.org].&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Rolling with Rails reviewed</title>
   <link href="http://blog.leetsoft.com/2005/01/24/rolling-with-rails-reviewed.html"/>
   <updated>2005-01-24T13:13:21-08:00</updated>
   <id>http://blog.leetsoft.com/2005/01/24/rolling-with-rails-reviewed</id>
   <content type="html">&lt;p&gt;Eriberri has written a very nice &amp;#8220;review&amp;#8221; of the recently published O&amp;#8217;Reilly &lt;a href=&quot;http://www.onlamp.com/pub/a/onlamp/2005/01/20/rails.html&quot;&gt;article&lt;/a&gt; on her weblog &lt;a href=&quot;http://www.slash7.com/&quot;&gt;slash7&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is especially interesting because of Eri&amp;#8217;s designer background. &lt;br /&gt;
Don&amp;#8217;t forget to subscribe when you are there!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.slash7.com/flashback/2005/01/oreilly_onlamp.html#more&quot;&gt;(24)Slash7: Really Getting Started in Rails&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>CD Baby & 90k lines of PHP going rails</title>
   <link href="http://blog.leetsoft.com/2005/01/22/cd-baby-90k-lines-of-php-going-rails.html"/>
   <updated>2005-01-22T20:22:00-08:00</updated>
   <id>http://blog.leetsoft.com/2005/01/22/cd-baby-90k-lines-of-php-going-rails</id>
   <content type="html">&lt;p&gt;Read the announcement: &lt;a href=&quot;http://www.oreillynet.com/pub/wlg/6286&quot;&gt;CD Baby rewrite in Postgres and Ruby, Baby!&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.cdbaby.com/&quot;&gt;CD Baby&lt;/a&gt; is going rails.&lt;/p&gt;
&lt;p&gt;This is huge!&lt;br /&gt;
If you don&amp;#8217;t know CD Baby, its a distribution site with over 80.000 musicians under contract and its one of the biggest digital distributors of audio to Apple iTunes, Napster, Rhapsody, etc. &amp;#160;Read all about it &lt;a href=&quot;http://cdbaby.com/about&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What is even more exciting about it is that I&amp;#8217;m on board for the rewrite and I had chance to talk to Derek on the phone directly for a consulting session which might have played its little part in the decision to go with rails. Come monday I&amp;#8217;ll work together with him and other rails contributor Jeremy Kemper to help crunch those 90k lines of &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt; in beautifully compact code for which Rails and Ruby are known.&lt;/p&gt;
&lt;p&gt;Here is a quote from Derek&amp;#8217;s announcement on his &lt;a href=&quot;http://www.oreillynet.com/pub/au/1841&quot;&gt;weblog&lt;/a&gt;:&lt;br /&gt;
&lt;blockquote&gt;Like a lost soul walkin&amp;#8217; the earth, lookin&amp;#8217; for spirituality, that stumbles upon the right church with the right people at the right time, I&amp;#8217;ve found my niche with Ruby. Its little itty-bitty community attracts some brilliant &amp;#8220;think different&amp;#8221; types with a love for beautiful code that do this for love, not money.&lt;/p&gt;
&lt;/blockquote&gt;</content>
 </entry>
 
 <entry>
   <title>Java vs Rails</title>
   <link href="http://blog.leetsoft.com/2005/01/21/java-vs-rails.html"/>
   <updated>2005-01-21T20:03:41-08:00</updated>
   <id>http://blog.leetsoft.com/2005/01/21/java-vs-rails</id>
   <content type="html">&lt;p&gt;Patrick, the author of &lt;a href=&quot;http://www.opensymphony.com/webwork/&quot;&gt;webwork&lt;/a&gt; thinks ruby on rails is &lt;a href=&quot;http://www.lightbody.net/~plightbo/archives/000144.html&quot;&gt;overhyped&lt;/a&gt; without ever trying it.&lt;/p&gt;
&lt;blockquote&gt;At the end of the day, RoR is simply a RESTful &lt;span class=&quot;caps&quot;&gt;CRUD&lt;/span&gt; framework.&lt;br /&gt;
There isn&amp;#8217;t anything wrong with that. I think we need more of these &amp;#8220;low barrier&amp;#8221; frameworks. However, to proclaim that RoR revolutionizes web application development is just ludicrous. Anyone who has written a very large application (thousands of concurrent users and/or hundreds of thousands of gigabytes) knows that a &lt;span class=&quot;caps&quot;&gt;CRUD&lt;/span&gt; framework just doesn&amp;#8217;t cut it. &lt;/blockquote&gt;
&lt;p&gt;Considering he is the author of bloody webwork this is especially funny.&lt;/p&gt;
&lt;blockquote&gt;&amp;#8220;First they ignore you, then they ridicule you, then they fight you, then you win.&amp;#8221;&lt;br /&gt;
&lt;cite&gt;&amp;#8212; &amp;#160;Mahatma Gandhi&lt;/cite&gt;&lt;/blockquote&gt;</content>
 </entry>
 
 <entry>
   <title>Pages</title>
   <link href="http://blog.leetsoft.com/2005/01/21/pages.html"/>
   <updated>2005-01-21T17:20:37-08:00</updated>
   <id>http://blog.leetsoft.com/2005/01/21/pages</id>
   <content type="html">&lt;p&gt;It needs a special company to get me excited about a bloody word processor but &lt;a href=&quot;http://www.apple.com/&quot;&gt;apple&lt;/a&gt; did it. Today I received the &lt;a href=&quot;http://www.apple.com/iwork/&quot;&gt;iWork&lt;/a&gt; package which is apples new office package containing &lt;a href=&quot;http://www.apple.com/iwork/pages/&quot;&gt;Pages&lt;/a&gt; and &lt;a href=&quot;http://www.apple.com/iwork/keynote/&quot;&gt;Keynote 2&lt;/a&gt;.&lt;br /&gt;
I can&amp;#8217;t really comment on keynote, Its awesome to play around with but I don&amp;#8217;t know the competitor Powerpoint well enough.&lt;/p&gt;
&lt;p&gt;I am however &lt;strong&gt;stunned&lt;/strong&gt; by Pages. Just when you think an word processor is just like the next apple unleashes this monstrosity of innovation.&lt;/p&gt;
&lt;p&gt;The integration with the iLife suite is beyond seamless, the paragraph style repository is an great idea, the templates are gorgeous but flexible and its just a pleasure to work with.&lt;/p&gt;
&lt;p&gt;The mac is now in the best situation it ever has been. For every application I used on windows I can get a much much better mac exclusive now.&lt;/p&gt;
&lt;p&gt;I also converted my &lt;a href=&quot;http://blog.leetsoft.com/files/documents/resume.pdf&quot;&gt;resume&lt;/a&gt; while i was at it ;)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>ONLamp.com</title>
   <link href="http://blog.leetsoft.com/2005/01/20/onlamp-com.html"/>
   <updated>2005-01-20T20:36:17-08:00</updated>
   <id>http://blog.leetsoft.com/2005/01/20/onlamp-com</id>
   <content type="html">&lt;p&gt;Its an amazing time to be involved with the rails project.&lt;/p&gt;
&lt;p&gt;No day goes by without my &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; reader filling up my rails smart folder with posts about this amazing framework. While the blogsphere has actually started to settle down a bit now where its common knowledge just exactly how good rails is the more traditional media is picking it up.&lt;/p&gt;
&lt;p&gt;Today onlamp published an article which walks you through the creation of a simple cookbook. They also recommend some very nifty tools for windows along the way.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.onlamp.com/pub/a/onlamp/2005/01/20/rails.html&quot;&gt;ONLamp.com: Rolling with Ruby on Rails&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;My favorite quote from the article however comes from the introduction to ruby. I have never seen it put quite so nicely:&lt;/p&gt;
&lt;blockquote&gt;Ruby is a pure object-oriented programming language with a super clean syntax that makes programming elegant and fun. Ruby successfully combines Smalltalk&amp;#8217;s conceptual elegance, Python&amp;#8217;s ease of use and learning, and Perl&amp;#8217;s pragmatism.&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; the article has been &lt;a href=&quot;http://developers.slashdot.org/article.pl?sid=05/01/21/1514234&amp;tid=156&quot;&gt;slashdotted&amp;#8230;&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Relaunch of too-biased</title>
   <link href="http://blog.leetsoft.com/2005/01/20/relaunch-of-too-biased.html"/>
   <updated>2005-01-20T19:26:32-08:00</updated>
   <id>http://blog.leetsoft.com/2005/01/20/relaunch-of-too-biased</id>
   <content type="html">&lt;p&gt;Yesterday I had some time so i decided to tackle a little project I was contemplating &lt;br /&gt;
for a while.&lt;/p&gt;
&lt;p&gt;Welcome &lt;strong&gt;typo&lt;/strong&gt;.&lt;br /&gt;
Typo is the smallest possible weblog. It doesn&amp;#8217;t have an admin interface at all and its based on sqlite. It took about 6 hours to write and most of the work was put into the &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;XMLRPC&lt;/span&gt;&lt;/strong&gt; backend.&lt;/p&gt;
&lt;p&gt;So &lt;a href=&quot;http://ranchero.com/marsedit/&quot;&gt;Marsedit&lt;/a&gt; is the only way to get any content onto this site now and thats plenty.&lt;/p&gt;
&lt;p&gt;As always my code is free under &lt;a href=&quot;http://www.opensource.org/licenses/mit-license.php&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIT&lt;/span&gt;&lt;/a&gt; licence and you can fetch it from my svn server at svn://leetsoft.com/typo/trunk&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Tada list launched</title>
   <link href="http://blog.leetsoft.com/2005/01/20/tada-list-launched.html"/>
   <updated>2005-01-20T19:19:06-08:00</updated>
   <id>http://blog.leetsoft.com/2005/01/20/tada-list-launched</id>
   <content type="html">&lt;p&gt;The latest project by the guys at 37signals launched and its as cool and fleshy as you would expect from this group. &lt;a href=&quot;http://www.tadalist.com&quot;&gt;Tada&lt;/a&gt; is based on an extraction of a well working concept from &lt;a href=&quot;http://www.basecamphq.com&quot;&gt;Basecamp&lt;/a&gt; much like &lt;a href=&quot;http://www.rubyonrails.com&quot;&gt;RubyOnRails&lt;/a&gt; itself. This time its no web development framework but a web page focused around the topic of the age old simple todo list. &lt;br /&gt;
Ever needed a page to keep&amp;amp;share your todo lists? Are you working on a project and want to make sure you don&amp;#8217;t forget tasks? Is your desk littered with post-it notes? Do you have todo list files on your HD which you are sorely missing when you are in the office? Tada solves all those problems and does so with a lot of style. Its just a whole lot of fun to use. Kudos to the team for taking an age old system and bringing it to 2005.  If you would like to integrate tada into your web page, i have written a little class which requests you a todo list from their server for convenient reuse.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.leetsoft.com/rails/tadalist.rb&quot;&gt;Download&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 
</feed>
