<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <title>Sudothinker - Home</title>
  <id>tag:sudothinker.com,2009:mephisto/</id>
  <generator uri="http://mephistoblog.com" version="0.8.0">Mephisto Drax</generator>
  
  <link href="http://sudothinker.com/" rel="alternate" type="text/html" />
  <updated>2009-04-07T03:01:21Z</updated>
  <link rel="self" href="http://feeds.feedburner.com/Sudothinker" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry xml:base="http://sudothinker.com/">
    <author>
      <name>sudothinker</name>
    </author>
    <id>tag:sudothinker.com,2009-04-07:46</id>
    <published>2009-04-07T03:00:00Z</published>
    <updated>2009-04-07T03:01:21Z</updated>
    <category term="howcast" />
    <category term="iphone" />
    <link href="http://feedproxy.google.com/~r/Sudothinker/~3/W-hScw24usM/howcast-iphone-app-commercial" rel="alternate" type="text/html" />
    <title>Howcast on TV! - iPhone App</title>
<content type="html">
            &lt;p&gt;The &lt;a href="http://www.howcast.com/iphone"&gt;Howcast Application for iPhone&lt;/a&gt; that I’ve been working on is featured in the new iPhone commercial!&lt;/p&gt;




	&lt;p&gt;If this video doesn’t work you can &lt;a href="http://www.apple.com/iphone/gallery/ads/"&gt;view it on the Apple site, under ‘Itchy’&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=292836649&amp;amp;mt=8"&gt;Download the app&lt;/a&gt;&lt;/p&gt;
          
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iIS2nX-EJLOjquZ67tcpOECCIx4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iIS2nX-EJLOjquZ67tcpOECCIx4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iIS2nX-EJLOjquZ67tcpOECCIx4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iIS2nX-EJLOjquZ67tcpOECCIx4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=W-hScw24usM:0w7F-32UtOE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=W-hScw24usM:0w7F-32UtOE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=W-hScw24usM:0w7F-32UtOE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=W-hScw24usM:0w7F-32UtOE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=W-hScw24usM:0w7F-32UtOE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=W-hScw24usM:0w7F-32UtOE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=W-hScw24usM:0w7F-32UtOE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=W-hScw24usM:0w7F-32UtOE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=W-hScw24usM:0w7F-32UtOE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sudothinker/~4/W-hScw24usM" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://sudothinker.com/2009/4/7/howcast-iphone-app-commercial</feedburner:origLink></entry>
  <entry xml:base="http://sudothinker.com/">
    <author>
      <name>sudothinker</name>
    </author>
    <id>tag:sudothinker.com,2009-03-28:43</id>
    <published>2009-03-28T19:48:00Z</published>
    <updated>2009-03-29T22:15:13Z</updated>
    <category term="music" />
    <category term="twitter" />
    <category term="twtbox" />
    <link href="http://feedproxy.google.com/~r/Sudothinker/~3/nmYlObIxVzU/twtbox-a-jukebox-powered-by-tweets" rel="alternate" type="text/html" />
    <title>twtbox - a jukebox powered by tweets</title>
<content type="html">
            &lt;p&gt;Expanding on the idea of twitter being a &lt;a href="http://sudothinker.com/2009/2/28/twitter-command-line-for-the-web"&gt;command line tool for the web&lt;/a&gt; – I’ve been working on a twitter powered jukebox – &lt;a href="http://twtbox.com"&gt;http://twtbox.com&lt;/a&gt; (with help from &lt;a href="http://twitter.com/jesseyoung"&gt;jesse&lt;/a&gt; and &lt;a href="http://twitter.com/howcats"&gt;henry&lt;/a&gt;).&lt;/p&gt;


	&lt;p&gt;The idea is to have a community jukebox where requests are done via twitter. &lt;a href="http://twitter.com/home?status=@twtbox%20"&gt;Tweet @twtbox&lt;/a&gt; with the song you want to hear and it’ll be queued on &lt;a href="http://twtbox.com"&gt;the jukebox&lt;/a&gt; – simple as that.&lt;/p&gt;


	&lt;p&gt;Its a working prototype right now but some cool stuff is in the works to make it even more fun.&lt;/p&gt;
          
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RwyfCdiqJmOYmCWOfw_RnzRqdCA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RwyfCdiqJmOYmCWOfw_RnzRqdCA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RwyfCdiqJmOYmCWOfw_RnzRqdCA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RwyfCdiqJmOYmCWOfw_RnzRqdCA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=nmYlObIxVzU:aYQpugPSQ8M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=nmYlObIxVzU:aYQpugPSQ8M:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=nmYlObIxVzU:aYQpugPSQ8M:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=nmYlObIxVzU:aYQpugPSQ8M:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=nmYlObIxVzU:aYQpugPSQ8M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=nmYlObIxVzU:aYQpugPSQ8M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=nmYlObIxVzU:aYQpugPSQ8M:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=nmYlObIxVzU:aYQpugPSQ8M:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=nmYlObIxVzU:aYQpugPSQ8M:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sudothinker/~4/nmYlObIxVzU" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://sudothinker.com/2009/3/28/twtbox-a-jukebox-powered-by-tweets</feedburner:origLink></entry>
  <entry xml:base="http://sudothinker.com/">
    <author>
      <name>sudothinker</name>
    </author>
    <id>tag:sudothinker.com,2009-03-05:32</id>
    <published>2009-03-05T06:01:00Z</published>
    <updated>2009-03-05T06:02:19Z</updated>
    <category term="plugins" />
    <category term="rails" />
    <link href="http://feedproxy.google.com/~r/Sudothinker/~3/lADSPn_Jipg/addition-to-acts_as_state_machine-on_transition" rel="alternate" type="text/html" />
    <title>Addition to acts_as_state_machine: on_transition</title>
<content type="html">
            &lt;p&gt;Here is a small addition to the &lt;a href="http://agilewebdevelopment.com/plugins/acts_as_state_machine"&gt;acts_as_state_machine plugin&lt;/a&gt; to add an on_transition event.&lt;/p&gt;


	&lt;p&gt;acts_as_state_machine already allows you to specify :enter and :exit events which get triggered when a model enters or leaves a particular state. However, I ran into a situation where there were multiple ways to enter a particular state and I only wanted to call a method whenever a particular event transition happened.&lt;/p&gt;


	&lt;p&gt;Code is available on github: &lt;a href="http://github.com/sudothinker/acts_as_state_machine/tree/master"&gt;http://github.com/sudothinker/acts_as_state_machine/tree/master&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Thanks to Scott Barron for writing the original acts_as_state_machine.&lt;/p&gt;


	&lt;p&gt;Here is an example usecase:&lt;/p&gt;


&lt;pre&gt;&lt;code class="ruby"&gt;class Order &amp;lt; ActiveRecord::Base
   acts_as_state_machine :initial =&amp;gt; :opened

   state :opened
   state :closed, :enter =&amp;gt; Proc.new {|o| Mailer.send_notice(o)}
   state :returned

   event :close do
     transitions :to =&amp;gt; :closed, :from =&amp;gt; :opened
   end

   event :return do
     transitions :to =&amp;gt; :returned, :from =&amp;gt; :closed
   end

   event :return_with_email do
     transitions :to =&amp;gt; :returned, :from =&amp;gt; :closed, :on_transition =&amp;gt; :email_user
   end

   def email_user
      Notifier.deliver_order_returned(self)
   end
 end
&lt;/code&gt;&lt;/pre&gt;
          
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2bivRGFFcnt4pVzWtIPGVM8pOpU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2bivRGFFcnt4pVzWtIPGVM8pOpU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2bivRGFFcnt4pVzWtIPGVM8pOpU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2bivRGFFcnt4pVzWtIPGVM8pOpU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=lADSPn_Jipg:AJfPAdjwRlQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=lADSPn_Jipg:AJfPAdjwRlQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=lADSPn_Jipg:AJfPAdjwRlQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=lADSPn_Jipg:AJfPAdjwRlQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=lADSPn_Jipg:AJfPAdjwRlQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=lADSPn_Jipg:AJfPAdjwRlQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=lADSPn_Jipg:AJfPAdjwRlQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=lADSPn_Jipg:AJfPAdjwRlQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=lADSPn_Jipg:AJfPAdjwRlQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sudothinker/~4/lADSPn_Jipg" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://sudothinker.com/2009/3/5/addition-to-acts_as_state_machine-on_transition</feedburner:origLink></entry>
  <entry xml:base="http://sudothinker.com/">
    <author>
      <name>sudothinker</name>
    </author>
    <id>tag:sudothinker.com,2009-03-03:28</id>
    <published>2009-03-03T03:00:00Z</published>
    <updated>2009-03-03T01:17:45Z</updated>
    <category term="erlang" />
    <link href="http://feedproxy.google.com/~r/Sudothinker/~3/nOfaWGH3gsY/erlang-exercises-interaction-between-processes-concurrency-star-processes" rel="alternate" type="text/html" />
    <title>Erlang Exercises: Interaction between processes, Concurrency: Star of Processes</title>
<content type="html">
            &lt;p&gt;Here is my solution to the last of the 3 Erlang ‘Interaction between processes, concurrency’ problems here: &lt;a href="http://erlang.org/course/exercises.html#conc"&gt;http://erlang.org/course/exercises.html#conc&lt;/a&gt;. It is definitely much shorter than &lt;a href="http://sudothinker.com/2009/2/27/erlang-exercises-interaction-between-processes-concurrency-ring-code"&gt;my ring code&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Here are some things I assumed from the problem statement:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;The center node is the main process and is not spawned.&lt;/li&gt;
		&lt;li&gt;The center node continues to send messages to the star nodes regardless of the response. It doesn’t wait for the response to send another message.&lt;/li&gt;
	&lt;/ul&gt;


&lt;pre&gt;&lt;code class="erlang"&gt;-module(star).
-export([star/2, star_node/1]).

% Write a function which starts N processes in a star, 
% and sends a message to each of them M times. 
% After the messages have been sent the processes should terminate gracefully.
star(N, M) -&amp;gt;
  Nodes = lists:map(fun(X) -&amp;gt; spawn(star, star_node, [self()]) end, lists:seq(1, N)),
  io:format("Built nodes ~w~n", [Nodes]),    
  send(M, Nodes).

% Sends a ping +M+ times to each of the nodes in +Nodes+
send(0, Nodes) -&amp;gt;
  lists:flatmap(fun(X) -&amp;gt; X ! {self(), stop}, [X] end, Nodes);
send(M, Nodes) when M &amp;gt; 0 -&amp;gt;
  lists:flatmap(fun(X) -&amp;gt; X ! {self(), ping}, [X] end, Nodes),
  send(M - 1, Nodes).

% An element of the star, receives messages from +Center+ and sends them back
star_node(Center) -&amp;gt;
  receive
    {Center, ping} -&amp;gt;
      io:format("~w recieved a ping, sending it back to ~w~n", [self(), Center]),
      Center ! ping,
      star_node(Center);
    {Center, stop} -&amp;gt;
      io:format("~w recieved a stop~n", [self()]),
      true
  end.
&lt;/code&gt;&lt;/pre&gt;
          
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dj2jp8Mgugqx7LkXXqM_WeqLcOA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dj2jp8Mgugqx7LkXXqM_WeqLcOA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dj2jp8Mgugqx7LkXXqM_WeqLcOA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dj2jp8Mgugqx7LkXXqM_WeqLcOA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=nOfaWGH3gsY:4Jlk9shm0PI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=nOfaWGH3gsY:4Jlk9shm0PI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=nOfaWGH3gsY:4Jlk9shm0PI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=nOfaWGH3gsY:4Jlk9shm0PI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=nOfaWGH3gsY:4Jlk9shm0PI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=nOfaWGH3gsY:4Jlk9shm0PI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=nOfaWGH3gsY:4Jlk9shm0PI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=nOfaWGH3gsY:4Jlk9shm0PI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=nOfaWGH3gsY:4Jlk9shm0PI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sudothinker/~4/nOfaWGH3gsY" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://sudothinker.com/2009/3/3/erlang-exercises-interaction-between-processes-concurrency-star-processes</feedburner:origLink></entry>
  <entry xml:base="http://sudothinker.com/">
    <author>
      <name>sudothinker</name>
    </author>
    <id>tag:sudothinker.com,2009-03-02:16</id>
    <published>2009-03-02T04:59:00Z</published>
    <updated>2009-03-02T05:00:15Z</updated>
    <category term="cucumber" />
    <category term="rails" />
    <category term="rails 2.3" />
    <category term="rspec" />
    <category term="ruby" />
    <category term="simply_helpful" />
    <link href="http://feedproxy.google.com/~r/Sudothinker/~3/f8kveKK4kvk/rails-2-3-upgrade-problems-and-solutions" rel="alternate" type="text/html" />
    <title>Rails 2.3 Upgrade Problems and Solutions</title>
<content type="html">
            &lt;h3&gt;Cucumber&lt;/h3&gt;

	&lt;p&gt;This fix will address “undefined method `visits’ for # (NoMethodError)”&lt;/p&gt;


&lt;pre&gt;&lt;code class="ruby"&gt;# features/env.rb

require 'webrat/rails'
Webrat.configure do |config|
  config.mode = :rails
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Gems&lt;/h3&gt;

	&lt;p&gt;This fix will address “uninitialized constant RedCloth (NameError)”&lt;/p&gt;


&lt;pre&gt;&lt;code class="ruby"&gt;# config/environment.rb

config.gem "RedCloth", :lib =&amp;gt; "redcloth", :source =&amp;gt; "http://code.whytheluckystiff.net" 
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;rake gems:unpack
rake gems:build
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Forms&lt;/h3&gt;

	&lt;p&gt;Fields for now should be called on the outter form, before I had&lt;/p&gt;


&lt;pre&gt;&lt;code class="ruby"&gt;fields_for 'video[ingredient_attributes][]', ingredient do |i_form|&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;which used the &lt;a href="http://code.google.com/p/multimodel-forms/"&gt;Multimodel Forms plugin&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Now this becomes:&lt;/p&gt;


&lt;pre&gt;&lt;code class="ruby"&gt;video_form.fields_for :ingredients do |i_form|&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;See &lt;a href="http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes"&gt;http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes&lt;/a&gt; for more information.&lt;/p&gt;


&lt;h3&gt;Try&lt;/h3&gt;

	&lt;p&gt;The version of try I had was this:&lt;/p&gt;


&lt;pre&gt;&lt;code class="ruby"&gt;
class Object
  def try(method)
    send method if respond_to? method
  end
end
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;in rails 2.3 though the try method is changed to this:&lt;/p&gt;


&lt;pre&gt;&lt;code class="ruby"&gt;
class Object
  def try(method, *args, &amp;block)
    send(method, *args, &amp;block)
  end
end

class NilClass
   def try(method, *args, &amp;block)
     nil
   end
end
&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;So I got a bunch of undefined method errors which I had to change around to use respond_to, or move the try up the chain so it gets called on nil.&lt;/p&gt;


&lt;h3&gt;SimplyHelpful&lt;/h3&gt;

	&lt;p&gt;Get rid of this, the functionality has been added to rails. You might see “uninitialized constant SimplyHelpful::Record Identifier (ActionView::TemplateError)” otherwise.&lt;/p&gt;


&lt;h3&gt;route_for&lt;/h3&gt;

	&lt;p&gt;After a change to edge rails broke our monkey-patched #route_for method, I
decided to just delegate to rails’ #assert_generates method. For most cases,
this will not present a problem, but for some it might. You’ll know if you
upgrade and see any newly failing, route-related examples. Here are the things
that you might need to change.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Make sure IDs are strings&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;If you had :id =&amp;gt; 1 before, you need to change that to :id =&amp;gt; “1”&lt;/p&gt;


&lt;pre&gt;&lt;code class="ruby"&gt;
#old
route_for(:controller =&amp;gt; 'things', :action =&amp;gt; 'show', :id =&amp;gt; 1).should == "/things/1" 

#new
route_for(:controller =&amp;gt; 'things', :action =&amp;gt; 'show', :id =&amp;gt; "1").should == "/things/1" 
&lt;/code&gt;&lt;/pre&gt;

	&lt;ul&gt;
	&lt;li&gt;Convert paths for non-get methods to hashes&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;If you had an example with a route that requires post, put, or delete, you’ll
need to declare that explicitly.&lt;/p&gt;


&lt;pre&gt;&lt;code class="ruby"&gt;
#old
route_for(:controller =&amp;gt; 'things', :action =&amp;gt; 'create').should == "/things" 

#new
route_for(:controller =&amp;gt; 'things', :action =&amp;gt; 'create').should == {:path =&amp;gt; "/things", :method =&amp;gt; :post}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;assert_select&lt;/h3&gt;

	&lt;p&gt;I was using assert_select (should have_tag) in rspec in model specs to verify to_xml representations of models. This isn’t really recommended as have_tag should really only be used for html. Instead I used Hpricot to parse the xml (Hpricot.XML) and then verified the contents of the hpricot object.&lt;/p&gt;
          
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RGxs0vzx-K5CPqXY_DkdZgHlL9c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RGxs0vzx-K5CPqXY_DkdZgHlL9c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RGxs0vzx-K5CPqXY_DkdZgHlL9c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RGxs0vzx-K5CPqXY_DkdZgHlL9c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=f8kveKK4kvk:54HNRSmENDs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=f8kveKK4kvk:54HNRSmENDs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=f8kveKK4kvk:54HNRSmENDs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=f8kveKK4kvk:54HNRSmENDs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=f8kveKK4kvk:54HNRSmENDs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=f8kveKK4kvk:54HNRSmENDs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=f8kveKK4kvk:54HNRSmENDs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=f8kveKK4kvk:54HNRSmENDs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=f8kveKK4kvk:54HNRSmENDs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sudothinker/~4/f8kveKK4kvk" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://sudothinker.com/2009/3/2/rails-2-3-upgrade-problems-and-solutions</feedburner:origLink></entry>
  <entry xml:base="http://sudothinker.com/">
    <author>
      <name>sudothinker</name>
    </author>
    <id>tag:sudothinker.com,2009-02-28:22</id>
    <published>2009-02-28T03:00:00Z</published>
    <updated>2009-02-28T00:03:33Z</updated>
    <category term="command line" />
    <category term="twitter" />
    <category term="web" />
    <link href="http://feedproxy.google.com/~r/Sudothinker/~3/RTa0govNFEY/twitter-command-line-for-the-web" rel="alternate" type="text/html" />
    <title>Twitter: Command Line for the Web</title>
<content type="html">
            &lt;p&gt;Twitter bots: The basic idea is that there are twitter bots which have twitter accounts. When they receive direct messages, they lookup who they are from and perform the action in the message for the twitter user who sent the message. They might even reply back with some options, responses or confirmations.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;@comcast record entourage tonight&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;@netflix add 'slumdog millionaire' to my queue&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;@amazon I want an iPhone armband&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Amazon bot could maybe respond back to me with some choices?&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;@reddit whats the top link?&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;@laundry are you free?&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;@ticketmaster I want 2 tickets to see the redsox this saturday&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;@weather tomorrow in tahoe?&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code&gt;@home preheat the oven to 400&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Hmm..&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;@twitter I'm making some coffee&lt;/code&gt;&lt;/pre&gt;
          
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Iu7uLa2q4fFj4BqW00cm4Z7Eirk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Iu7uLa2q4fFj4BqW00cm4Z7Eirk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Iu7uLa2q4fFj4BqW00cm4Z7Eirk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Iu7uLa2q4fFj4BqW00cm4Z7Eirk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=RTa0govNFEY:v7eZRhdlLQw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=RTa0govNFEY:v7eZRhdlLQw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=RTa0govNFEY:v7eZRhdlLQw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=RTa0govNFEY:v7eZRhdlLQw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=RTa0govNFEY:v7eZRhdlLQw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=RTa0govNFEY:v7eZRhdlLQw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=RTa0govNFEY:v7eZRhdlLQw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=RTa0govNFEY:v7eZRhdlLQw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=RTa0govNFEY:v7eZRhdlLQw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sudothinker/~4/RTa0govNFEY" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://sudothinker.com/2009/2/28/twitter-command-line-for-the-web</feedburner:origLink></entry>
  <entry xml:base="http://sudothinker.com/">
    <author>
      <name>sudothinker</name>
    </author>
    <id>tag:sudothinker.com,2009-02-27:20</id>
    <published>2009-02-27T05:04:00Z</published>
    <updated>2009-02-28T20:13:19Z</updated>
    <category term="erlang" />
    <link href="http://feedproxy.google.com/~r/Sudothinker/~3/XOGh6SupPWo/erlang-exercises-interaction-between-processes-concurrency-ring-code" rel="alternate" type="text/html" />
    <title>Erlang Exercises: Interaction between processes, Concurrency: Ring Code</title>
<content type="html">
            &lt;p&gt;Solution to the Erlang ring problem: Write a function which starts N processes in a ring, and sends a message M times around all the processes in the ring. After the messages have been sent the processes should terminate gracefully.&lt;/p&gt;


	&lt;p&gt;This solution is perhaps more complex than other solutions on the web, one of the reasons is that each node knows about the node before and after it (other solutions just make each node know about the node after it). The reason is so that we can be sure that the message is making the correct path around the ring.&lt;/p&gt;


	&lt;p&gt;This is also a first attempt, I am sure there are cleanups and optimizations that could be done (after looking around it looks like foldl would have been handy).&lt;/p&gt;


&lt;pre&gt;&lt;code class="erlang"&gt;-module(ring).
-export([ring/2, node/0]).

% The algorithm, is to first create a list of the N processes.
% For each process we need to hook it up to the before and after process in the ring.
% Then we have hooked everything up:
%   we send the message from the first node in the ring
%   and wait until there is a response (went all the way around the ring)
%   we then repeat M times
% When we have repeated this M times, then we use the infastructure to pass around a stop
% message which will terminate the processes gracefully.

% We also include checks to make sure that the message came from the process before it in the ring
% and only advance it if it did.

% Starts N processes in a ring, and sends a message M times around all the nodes in the ring.
ring(N, M) -&amp;gt;
  Nodes = spawn_nodes(N),
  io:format("Built nodes ~w~n", [Nodes]),  
  ring(N, M, Nodes, []).

% This will be in charge of spawning +N+ nodes and adding them to +Nodes+
spawn_nodes(N) when N &amp;gt; 0 -&amp;gt; 
  [spawn(ring, node, [])] ++ spawn_nodes(N - 1);
spawn_nodes(0) -&amp;gt; [].

% When there are no nodes ordered yet then we make a from Node at the start
ring(N, M, [X,Y|Nodes], []) when N &amp;gt; 2 -&amp;gt;
  X ! {to, Y},
  ring(N - 1, M, [Y] ++ Nodes, [X]);

% Recursive case when there are full nodes to hook up
ring(N, M, [X,Y|Nodes], Ordered_nodes) when N &amp;gt; 2 -&amp;gt;
  X ! {lists:last(Ordered_nodes), Y},
  ring(N - 1, M, [Y] ++ Nodes, Ordered_nodes ++ [X]);

% When there are 2 nodes left to hook up we make a to Node at the end
ring(2, M, [X|Y], Ordered_nodes) when length(Ordered_nodes) &amp;gt; 0 -&amp;gt;
  X ! {from, lists:last(Ordered_nodes)},
  ring(1, M, Y, Ordered_nodes ++ [X]);

% Special case whenever we just want a ring of 2 nodes
ring(2, M, [X, Y], []) -&amp;gt;
  Y ! {X, X},
  X ! {Y, Y, M};

% Special case ring of 1
ring(1, M, [X], []) -&amp;gt;
  X ! {X, X, M};

% 1 node left to build which will be the instigator of the pinging  
ring(1, M, [Node], [X|Ordered_nodes]) -&amp;gt;
  % hook up the 2 ends with Node
  X ! {from, Node},  
  lists:last(Ordered_nodes) ! {to, Node},
  % Kick it all off
  Node ! {lists:last(Ordered_nodes), X, M}.

% Intermediary nodes which don't have a From and To hooked up yet
% Can be upgraded to a full node by passing in {from/to, From/To}
to(To) -&amp;gt; receive {from, From} -&amp;gt; node(From, To) end.
from(From) -&amp;gt; receive {to, To} -&amp;gt; node(From, To) end.

% Starting point for all nodes, from there they can be made into a 
% From/To/Full From,To pair  
node() -&amp;gt;
  receive
    {to, To} -&amp;gt; to(To);
    {from, From} -&amp;gt; from(From);
    {From, To} -&amp;gt; node(From, To);
    % A driver node
    {From, To, M} -&amp;gt; node(From, To, M)
  end.

% Will receive a ping from +From+ and will pass it on to +To+
% If it receives a stop it will pass that on to +To+ and then stop
node(From, To) -&amp;gt;
  receive
    {From, ping} -&amp;gt;
      io:format("Passing along a ping from ~w to ~w~n", [self(), To]),
      To ! {self(), ping},
      node(From, To);
    {From, stop} -&amp;gt;
      io:format("Passing along a stop from ~w to ~w~n", [self(), To]),      
      To ! {self(), stop},
      true;
    Other -&amp;gt; node(From, To)
  end.

% The driver node, this will ping +To+ +M+ times 
% It will only ping +To+ again whenever it gets a ping back from its +From+  
node(From, To, M) when M &amp;gt; 0 -&amp;gt;
  io:format("Sending around a ping starting from ~w to ~w, ~w left~n", [self(), To, M]),
  To ! {self(), ping},
  receive {From, ping} -&amp;gt; node(From, To, M - 1) end;

% Base case for driver node, we're done sending it around so just stop all the nodes
% Each node in the ring is responsible for passing along a stop.
node(From, To, 0) -&amp;gt;
  io:format("Sending around a stop starting from ~w to ~w~n", [self(), To]),  
  To ! {self(), stop},
  receive {From, stop} -&amp;gt; true end.
&lt;/code&gt;&lt;/pre&gt;
          
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xD8Vrh2NGmqFCQUyd6KtuX21NW0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xD8Vrh2NGmqFCQUyd6KtuX21NW0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xD8Vrh2NGmqFCQUyd6KtuX21NW0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xD8Vrh2NGmqFCQUyd6KtuX21NW0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=XOGh6SupPWo:vHTYjXt51aI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=XOGh6SupPWo:vHTYjXt51aI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=XOGh6SupPWo:vHTYjXt51aI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=XOGh6SupPWo:vHTYjXt51aI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=XOGh6SupPWo:vHTYjXt51aI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=XOGh6SupPWo:vHTYjXt51aI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=XOGh6SupPWo:vHTYjXt51aI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=XOGh6SupPWo:vHTYjXt51aI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=XOGh6SupPWo:vHTYjXt51aI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sudothinker/~4/XOGh6SupPWo" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://sudothinker.com/2009/2/27/erlang-exercises-interaction-between-processes-concurrency-ring-code</feedburner:origLink></entry>
  <entry xml:base="http://sudothinker.com/">
    <author>
      <name>sudothinker</name>
    </author>
    <id>tag:sudothinker.com,2009-02-25:19</id>
    <published>2009-02-25T03:56:00Z</published>
    <updated>2009-02-25T17:52:26Z</updated>
    <category term="erlang" />
    <link href="http://feedproxy.google.com/~r/Sudothinker/~3/opNZs8kc_7k/erlang-exercises-interaction-between-processes-concurrency" rel="alternate" type="text/html" />
    <title>Erlang Exercises: Interaction between processes, Concurrency</title>
<content type="html">
            &lt;p&gt;From &lt;a href="http://erlang.org/course/exercises.html#conc"&gt;http://erlang.org/course/exercises.html#conc.&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;1. Write a function which starts 2 processes, and sends a message M times forewards and backwards between them. After the messages have been sent the processes should terminate gracefully.&lt;/p&gt;


&lt;pre&gt;&lt;code class="erlang"&gt;-module(bouncer).
-export([bounce/1, ping/2, ponger/0]).

% Spawn a pinger and a ponger and message back and forth +M+ times
bounce(M) -&amp;gt;
  Ponger = spawn(bouncer, ponger, []),
  spawn(bouncer, ping, [Ponger, M]).

% I'm going to ping +Ponger+ +M+ times  
% When I've done that I'm going to tell Ponger to stop, and I'll stop
ping(Ponger, M) when M &amp;gt; 0 -&amp;gt;
  Ponger ! {self(), ping},
  receive
    {Ponger, pong} -&amp;gt;
      io:format("Ponged"),
      ping(Ponger, M - 1);
    stop -&amp;gt;
      true;
    % This is a safe guard, we only want to count pong's from +Ponger+
    Other -&amp;gt;
      ping(Ponger, M)
  end;
ping(Ponger, 0) -&amp;gt;
  Ponger ! stop.

% If I get a ping, im going to pong back  
ponger() -&amp;gt;
  receive
    {From, ping} -&amp;gt;
      io:format("Pinged"),
      From ! {self(), pong},
      ponger();
    stop -&amp;gt;
      true;
    % We'll ping anyone back, but it has to be in form {From, ping}
    Other -&amp;gt;
      ponger()
  end.
&lt;/code&gt;&lt;/pre&gt;
          
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/R9zWgsPHRNDVfEIyPlC174kv6kU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R9zWgsPHRNDVfEIyPlC174kv6kU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/R9zWgsPHRNDVfEIyPlC174kv6kU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R9zWgsPHRNDVfEIyPlC174kv6kU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=opNZs8kc_7k:i0F_KmRwiFc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=opNZs8kc_7k:i0F_KmRwiFc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=opNZs8kc_7k:i0F_KmRwiFc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=opNZs8kc_7k:i0F_KmRwiFc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=opNZs8kc_7k:i0F_KmRwiFc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=opNZs8kc_7k:i0F_KmRwiFc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=opNZs8kc_7k:i0F_KmRwiFc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=opNZs8kc_7k:i0F_KmRwiFc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=opNZs8kc_7k:i0F_KmRwiFc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sudothinker/~4/opNZs8kc_7k" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://sudothinker.com/2009/2/25/erlang-exercises-interaction-between-processes-concurrency</feedburner:origLink></entry>
  <entry xml:base="http://sudothinker.com/">
    <author>
      <name>sudothinker</name>
    </author>
    <id>tag:sudothinker.com,2009-02-24:18</id>
    <published>2009-02-24T03:31:00Z</published>
    <updated>2009-02-25T00:51:38Z</updated>
    <category term="erlang" />
    <link href="http://feedproxy.google.com/~r/Sudothinker/~3/ZfmlWeoYbpw/erlang-exercises-simple-recursive-programs" rel="alternate" type="text/html" />
    <title>Erlang Exercises: Simple recursive programs</title>
<content type="html">
            &lt;p&gt;My solutions to simple sequential program exercises: &lt;a href="http://erlang.org/course/exercises.html#recurs"&gt;http://erlang.org/course/exercises.html#recurs&lt;/a&gt;&lt;/p&gt;


&lt;pre&gt;&lt;code class="erlang"&gt;-module(lists1).
-export([min/1, max/1, min_max/1]).

min([H|L]) -&amp;gt; 
  min(H, L).
min(M, []) -&amp;gt;
  M;
min(M, [H|L]) when M &amp;lt; H -&amp;gt;
  min(M, L);
min(_M, [H|L]) -&amp;gt;
  min(H, L).

max([H|L]) -&amp;gt; 
  max(H, L).
max(M, []) -&amp;gt;
  M;
max(M, [H|L]) when M &amp;gt; H -&amp;gt;
  max(M, L);
max(_M, [H|L]) -&amp;gt;
  max(H, L).  

min_max(L) -&amp;gt;
  {min(L), max(L)}.
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class="erlang"&gt;-module(time).
-export([swedish_date/0]).

swedish_date() -&amp;gt;
  string:substr(integer_to_list(element(1, date())), 3, 4) ++ pad_string(integer_to_list(element(2, date()))) ++ pad_string(integer_to_list(element(3, date()))). 

pad_string(A_string) -&amp;gt;
  if 
    length(A_string) == 1 -&amp;gt; "0" ++ A_string;
    true -&amp;gt; A_string
  end.
&lt;/code&gt;&lt;/pre&gt;
          
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/aPYAcSWeMvUY1by3QfV0vlresS0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aPYAcSWeMvUY1by3QfV0vlresS0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/aPYAcSWeMvUY1by3QfV0vlresS0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aPYAcSWeMvUY1by3QfV0vlresS0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=ZfmlWeoYbpw:1LwO337CNcI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=ZfmlWeoYbpw:1LwO337CNcI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=ZfmlWeoYbpw:1LwO337CNcI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=ZfmlWeoYbpw:1LwO337CNcI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=ZfmlWeoYbpw:1LwO337CNcI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=ZfmlWeoYbpw:1LwO337CNcI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=ZfmlWeoYbpw:1LwO337CNcI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=ZfmlWeoYbpw:1LwO337CNcI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=ZfmlWeoYbpw:1LwO337CNcI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sudothinker/~4/ZfmlWeoYbpw" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://sudothinker.com/2009/2/24/erlang-exercises-simple-recursive-programs</feedburner:origLink></entry>
  <entry xml:base="http://sudothinker.com/">
    <author>
      <name>sudothinker</name>
    </author>
    <id>tag:sudothinker.com,2009-02-22:17</id>
    <published>2009-02-22T22:20:00Z</published>
    <updated>2009-02-25T00:52:20Z</updated>
    <category term="erlang" />
    <link href="http://feedproxy.google.com/~r/Sudothinker/~3/JpgeRZZoNGU/erlang-exercises-simple-sequential-programs" rel="alternate" type="text/html" />
    <title>Erlang Exercises: Simple sequential programs</title>
<content type="html">
            &lt;p&gt;My solutions to simple sequential program exercises: &lt;a href="http://erlang.org/course/exercises.html#simple"&gt;http://erlang.org/course/exercises.html#simple&lt;/a&gt;&lt;/p&gt;


&lt;pre&gt;&lt;code class="erlang"&gt;-module(temp).
-export([convert/1]).

convert({c, Temperature}) -&amp;gt;
  {f, c2f(Temperature)};
convert({f, Temperature}) -&amp;gt;
  {c, f2c(Temperature)};
convert(Other) -&amp;gt;
  {invalid_object, Other}.

c2f(X) -&amp;gt;
  ((9/5) * X) + 32.

f2c(X) -&amp;gt;
  (5/9) * (X - 32).  
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class="erlang"&gt;-module(mathStuff).
-export([perimeter/1]).

perimeter({square, Side}) -&amp;gt;
  4 * Side;
perimeter({circle, Radius}) -&amp;gt;
  2 * 3.14 * Radius;
perimeter({triangle, A, B, C}) -&amp;gt;
  A + B + C;
perimeter(Other) -&amp;gt;
  {invalid_object, Other}.
&lt;/code&gt;&lt;/pre&gt;
          
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SpKIAkz0XY8seTMUW6vtwDi3QMw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SpKIAkz0XY8seTMUW6vtwDi3QMw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SpKIAkz0XY8seTMUW6vtwDi3QMw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SpKIAkz0XY8seTMUW6vtwDi3QMw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=JpgeRZZoNGU:bNT4zG-ZI6c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=JpgeRZZoNGU:bNT4zG-ZI6c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=JpgeRZZoNGU:bNT4zG-ZI6c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=JpgeRZZoNGU:bNT4zG-ZI6c:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=JpgeRZZoNGU:bNT4zG-ZI6c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=JpgeRZZoNGU:bNT4zG-ZI6c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=JpgeRZZoNGU:bNT4zG-ZI6c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=JpgeRZZoNGU:bNT4zG-ZI6c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=JpgeRZZoNGU:bNT4zG-ZI6c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sudothinker/~4/JpgeRZZoNGU" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://sudothinker.com/2009/2/22/erlang-exercises-simple-sequential-programs</feedburner:origLink></entry>
  <entry xml:base="http://sudothinker.com/">
    <author>
      <name>sudothinker</name>
    </author>
    <id>tag:sudothinker.com,2009-02-19:9</id>
    <published>2009-02-19T02:30:00Z</published>
    <updated>2009-03-02T19:18:46Z</updated>
    <category term="deployment" />
    <category term="rails" />
    <category term="ruby" />
    <category term="setup" />
    <category term="slicehost" />
    <link href="http://feedproxy.google.com/~r/Sudothinker/~3/dODTgCUXyNw/getting-up-and-running-with-a-rails-deployment-environment" rel="alternate" type="text/html" />
    <title>Getting up and running with a Rails deployment environment</title>
<content type="html">
            &lt;p&gt;These are the steps I followed to get from a fresh Ubunto Gutsy installation on &lt;a href="http://www.slicehost.com/"&gt;Slicehost&lt;/a&gt; to a complete Rails deployment including: &lt;span class="caps"&gt;DNS&lt;/span&gt; records, &lt;span class="caps"&gt;SSH&lt;/span&gt; keys, Server Security (disabling root access and changing &lt;span class="caps"&gt;SSH&lt;/span&gt; port), &lt;span class="caps"&gt;SVN&lt;/span&gt;, Ruby, MySQL, rubygems, Rails, Mongrel, Mongrel cluster, nginx and Capistrano.&lt;/p&gt;


&lt;ol&gt;
&lt;li&gt;&lt;a href="http://articles.slicehost.com/2007/10/24/creating-dns-records"&gt;http://articles.slicehost.com/2007/10/24/creating-dns-records&lt;/a&gt; (More info: &lt;a href="http://wiki.slicehost.com/doku.php?id=detailed_information_on_dns_record_types"&gt;http://wiki.slicehost.com/doku.php?id=detailed_information_on_dns_record_types&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://articles.slicehost.com/2007/11/23/ubuntu-gutsy-mysql-and-ror"&gt;http://articles.slicehost.com/2007/11/23/ubuntu-gutsy-mysql-and-ror&lt;/a&gt; (Pages 1 and 2)&lt;/li&gt;&lt;li&gt;&lt;a href="http://articles.slicehost.com/2008/1/16/ubuntu-gutsy-nginx-vhosts-rails-and-mongrels"&gt;http://articles.slicehost.com/2008/1/16/ubuntu-gutsy-nginx-vhosts-rails-and-mongrels&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://articles.slicehost.com/subversion"&gt;http://articles.slicehost.com/subversion&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://articles.slicehost.com/2008/1/9/capistrano-series-introduction"&gt;http://articles.slicehost.com/2008/1/9/capistrano-series-introduction&lt;/a&gt;&lt;li&gt;&lt;a href="http://articles.slicehost.com/2007/11/29/ubuntu-gutsy-mongrel-clusters-and-surviving-a-reboot"&gt;http://articles.slicehost.com/2007/11/29/ubuntu-gutsy-mongrel-clusters-and-surviving-a-reboot&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;
          
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7cl0KLVRgUWAMffyrZzoCVjpcsg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7cl0KLVRgUWAMffyrZzoCVjpcsg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7cl0KLVRgUWAMffyrZzoCVjpcsg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7cl0KLVRgUWAMffyrZzoCVjpcsg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=dODTgCUXyNw:V359yWM6QJ8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=dODTgCUXyNw:V359yWM6QJ8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=dODTgCUXyNw:V359yWM6QJ8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=dODTgCUXyNw:V359yWM6QJ8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=dODTgCUXyNw:V359yWM6QJ8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=dODTgCUXyNw:V359yWM6QJ8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=dODTgCUXyNw:V359yWM6QJ8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=dODTgCUXyNw:V359yWM6QJ8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=dODTgCUXyNw:V359yWM6QJ8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sudothinker/~4/dODTgCUXyNw" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://sudothinker.com/2009/2/19/getting-up-and-running-with-a-rails-deployment-environment</feedburner:origLink></entry>
  <entry xml:base="http://sudothinker.com/">
    <author>
      <name>sudothinker</name>
    </author>
    <id>tag:sudothinker.com,2009-02-18:5</id>
    <published>2009-02-18T01:15:00Z</published>
    <updated>2009-03-02T19:18:38Z</updated>
    <category term="github pages" />
    <category term="mephisto" />
    <category term="setup" />
    <category term="slice" />
    <category term="tumblr" />
    <link href="http://feedproxy.google.com/~r/Sudothinker/~3/HQdn9ImfRME/setup-with-mephisto-github-pages-and-tumblr" rel="alternate" type="text/html" />
    <title>Setup with mephisto, github pages, and tumblr</title>
<content type="html">
            &lt;p&gt;I have a somewhat unique setup for sudothinker.com.&lt;/p&gt;


	&lt;p&gt;I use &lt;a href="http://mephistoblog.com/"&gt;mephisto&lt;/a&gt; hosted on my &lt;a href="http://slicehost.com"&gt;slicehost&lt;/a&gt; slice for &lt;a href="http://sudothinker.com"&gt;sudothinker.com&lt;/a&gt;, I use &lt;a href="http://tumblr.com"&gt;tumblr&lt;/a&gt; for &lt;a href="http://beers.sudothinker.com"&gt;beers.sudothinker.com&lt;/a&gt; and &lt;a href="http://pages.github.com"&gt;github pages&lt;/a&gt; for &lt;a href="http://codes.sudothinker.com"&gt;codes.sudothinker.com&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;The reason for the 3 separate tools is so I can have the best tool for the job at hand.&lt;/p&gt;


	&lt;p&gt;For my blog I wanted fully functional, battle tested blog software. I also wanted the flexibilty to make layout changes without code pushes. Mephisto fits this bill really well and its theme editor in the browser is pretty handy to avoid cap deploys.&lt;/p&gt;


	&lt;p&gt;For &lt;a href="http://beers.sudothinker.com"&gt;beers.sudothinker.com&lt;/a&gt;, I want a way to showcase photos easily. I normally take these photos with my iPhone and so publishing new photos is easy with the Tumblr app for the iPhone, I also get free image hosting through my tumblr account so its one hosting aspect that I don’t need to worry about.&lt;/p&gt;


	&lt;p&gt;For &lt;a href="http://codes.sudothinker.com"&gt;codes.sudothinker.com&lt;/a&gt;, I wanted somewhere where I can host static pages with the flexibility of revisions, all the css/js for this site are hosted on that subdomain too. This makes it really easy to make incremental changes to the css/js files for all three domains with the flexibility of a git backend. Changes are also pushed live right away and are hosted for free on github.com. I could probably do the same with mephisto pages/sections, but this way I get to use textmate and git for editing the static pages rather than the browser.&lt;/p&gt;


	&lt;p&gt;Stay tuned for a tutorial on this kind of setup.&lt;/p&gt;
          
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/F6MT30oblwZl3l6k1m3eJ4ooOgw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/F6MT30oblwZl3l6k1m3eJ4ooOgw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/F6MT30oblwZl3l6k1m3eJ4ooOgw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/F6MT30oblwZl3l6k1m3eJ4ooOgw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=HQdn9ImfRME:nJEPBYooyYc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=HQdn9ImfRME:nJEPBYooyYc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=HQdn9ImfRME:nJEPBYooyYc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=HQdn9ImfRME:nJEPBYooyYc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=HQdn9ImfRME:nJEPBYooyYc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=HQdn9ImfRME:nJEPBYooyYc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=HQdn9ImfRME:nJEPBYooyYc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=HQdn9ImfRME:nJEPBYooyYc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=HQdn9ImfRME:nJEPBYooyYc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sudothinker/~4/HQdn9ImfRME" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://sudothinker.com/2009/2/18/setup-with-mephisto-github-pages-and-tumblr</feedburner:origLink></entry>
  <entry xml:base="http://sudothinker.com/">
    <author>
      <name>sudothinker</name>
    </author>
    <id>tag:sudothinker.com,2009-02-13:1</id>
    <published>2009-02-13T03:11:00Z</published>
    <updated>2009-03-02T19:18:27Z</updated>
    <category term="backup" />
    <category term="rsync" />
    <category term="slicehost" />
    <link href="http://feedproxy.google.com/~r/Sudothinker/~3/yOSsHwLy84Q/simple-backup-with-rsync-and-slicehost" rel="alternate" type="text/html" />
    <title>Simple backup with rsync and slicehost</title>
<content type="html">
            &lt;p&gt;I’ve been looking into all sorts of backup solutions lately, including &lt;a href="http://www.backblaze.com"&gt;BackBlaze&lt;/a&gt;, &lt;a href="http://getdropbox.com"&gt;Dropbox&lt;/a&gt;, &lt;a href="http://aws.amazon.com/s3/"&gt;s3&lt;/a&gt; and &lt;a href="http://www.sugarsync.com/"&gt;SugarSync&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;My top level goals are:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Ridiculously easy to backup so I do it often&lt;/li&gt;
		&lt;li&gt;Syncing – I don’t want to have to deal with figuring out which files to back up and duplicate files.&lt;/li&gt;
		&lt;li&gt;Remote – I have a 1TB drive which I use to back up, but am trying to prevent against the fire/theft scenario and losing all my data&lt;/li&gt;
		&lt;li&gt;Low cost, I don’t want to pay an arm and a leg monthly for data which doesn’t frequently get accessed.&lt;/li&gt;
		&lt;li&gt;Attached network drive backup – I use a 1TB drive to house all the data which I need to backup remotely.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;BackBlaze seems too cheap to be true, I used it for the 14 day trial and it seemed to work fine and at $5 a month for unlimited data it seems like a steal. I am just a little worried about the company in general, be good to hear someone recommend them.&lt;/p&gt;


	&lt;p&gt;Dropbox is handy for sharing files but doesn’t fit my bill for my backup goals. It works well for a dropbox folder but becomes a little tricky if you want to backup your entire drive.&lt;/p&gt;


	&lt;p&gt;s3 is definitely a great service, but it is a little pricey for me. SugarSync is also a bit more money than what I was hoping to pay.&lt;/p&gt;


	&lt;p&gt;After trying all these services it dawned on me that I am getting 10GB on my &lt;a href="http://slicehost.com"&gt;Slicehost&lt;/a&gt; account which I am not really using. So I got to work writing an rsync back up solution which would backup to my slicehost slice.&lt;/p&gt;


&lt;pre&gt;
&lt;code&gt;rsync -vaz --delete-excluded --delete --exclude-from=/Users/michael/.rsync_exclude Documents code mik:~/backup/'&lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;This script when run from my home directory will rsync my Documents and code directories onto my slicehost slice (I have setup my .ssh/config to use the alias mik as my slicehost slice). I can also have a file .rsync_exclude in my home directory which can contain patterns of files which I want to exclude from these directories.&lt;/p&gt;


	&lt;p&gt;So far this has worked really well for me, with this command I can just set up a cron job on my local machine which will do the backups in the background, or just create a backup alias which can be run manually whenever I want to backup.&lt;/p&gt;
          
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OoBz4U-qiZv7vt2dXdLadYWWhqo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OoBz4U-qiZv7vt2dXdLadYWWhqo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OoBz4U-qiZv7vt2dXdLadYWWhqo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OoBz4U-qiZv7vt2dXdLadYWWhqo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=yOSsHwLy84Q:TU-to6Nzrlc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=yOSsHwLy84Q:TU-to6Nzrlc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=yOSsHwLy84Q:TU-to6Nzrlc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=yOSsHwLy84Q:TU-to6Nzrlc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=yOSsHwLy84Q:TU-to6Nzrlc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=yOSsHwLy84Q:TU-to6Nzrlc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=yOSsHwLy84Q:TU-to6Nzrlc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=yOSsHwLy84Q:TU-to6Nzrlc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=yOSsHwLy84Q:TU-to6Nzrlc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sudothinker/~4/yOSsHwLy84Q" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://sudothinker.com/2009/2/13/simple-backup-with-rsync-and-slicehost</feedburner:origLink></entry>
  <entry xml:base="http://sudothinker.com/">
    <author>
      <name>sudothinker</name>
    </author>
    <id>tag:sudothinker.com,2009-02-11:11</id>
    <published>2009-02-11T22:59:00Z</published>
    <updated>2009-02-18T23:00:07Z</updated>
    <link href="http://feedproxy.google.com/~r/Sudothinker/~3/C4NXb_mTzyU/found-blog" rel="alternate" type="text/html" />
    <title>Found Blog!</title>
  <content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3WnGDZ6R0yWeud8JAec--HaVU8o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3WnGDZ6R0yWeud8JAec--HaVU8o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3WnGDZ6R0yWeud8JAec--HaVU8o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3WnGDZ6R0yWeud8JAec--HaVU8o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=C4NXb_mTzyU:7l10VHhsFO0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=C4NXb_mTzyU:7l10VHhsFO0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=C4NXb_mTzyU:7l10VHhsFO0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=C4NXb_mTzyU:7l10VHhsFO0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=C4NXb_mTzyU:7l10VHhsFO0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=C4NXb_mTzyU:7l10VHhsFO0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=C4NXb_mTzyU:7l10VHhsFO0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=C4NXb_mTzyU:7l10VHhsFO0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=C4NXb_mTzyU:7l10VHhsFO0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sudothinker/~4/C4NXb_mTzyU" height="1" width="1"/&gt;</content><feedburner:origLink>http://sudothinker.com/2009/2/11/found-blog</feedburner:origLink></entry>
  <entry xml:base="http://sudothinker.com/">
    <author>
      <name>sudothinker</name>
    </author>
    <id>tag:sudothinker.com,2008-05-01:7</id>
    <published>2008-05-01T00:30:00Z</published>
    <updated>2009-06-16T19:33:00Z</updated>
    <category term="erector" />
    <category term="meetup" />
    <category term="ruby" />
    <link href="http://feedproxy.google.com/~r/Sudothinker/~3/F77gD-WL7EY/sf-ruby-meetup-4-29-08" rel="alternate" type="text/html" />
    <title>SF Ruby Meetup 4.29.08</title>
<content type="html">
            &lt;p&gt;Went to my first &lt;a href="http://ruby.meetup.com/6/calendar/7753596/"&gt;SF meetup&lt;/a&gt; today, hosted by the good folks at &lt;a href="http://www.affinitylabs.com/"&gt;Affinity Labs&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;Higher-Order Procedures&lt;/h3&gt;
The first talk was by Bala Paranj on the topic of Higher-Order Procedures in Ruby. He presented code like the following:

&lt;pre&gt;
&lt;code class="ruby"&gt;def make_filter(predicate)
  lambda do |list|
    results = []
    list.each do |r|
      results &amp;lt;&amp;lt; r if predicate.call(r)
    end
    results
  end
end

even_filter = make_filter(lambda{|x| x % 2 == 0})

p even_filter.call([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# [2, 4, 6, 8, 10]&lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;Im kind of conflicted with the above snippet – There are advantages of make_filter returning a proc:&lt;/p&gt;


&lt;ol&gt;
&lt;li&gt;You can delay code execution until later in the program&lt;/li&gt;
&lt;li&gt;It allows for more reusable code as you can pass filters around rather than repeating even procs&lt;/li&gt;
&lt;/ol&gt;

	&lt;p&gt;For (1) – this can be said as a big advantage of higher-order procedures in general, you don’t have to deal with data until the last possible point. With this approach you can separate business logic and data crunching through the application. For (2), I’m not so convinced, while it does make for reusable code, there is an extra level of indirection created and I feel that the even_filter would have to be used in multiple places in the app for it to be justified.&lt;/p&gt;


	&lt;p&gt;The alternative which I would probably implement to achieve the above:&lt;/p&gt;


&lt;pre&gt;
&lt;code class="ruby"&gt;def even?
  lambda {|x| x % 2 == 0}
end

def filter_list(list, predicate)
  list.inject([]) do |result, element|
    result &amp;lt;&amp;lt; element if predicate.call(element)
    result
  end
end

p filter_list([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], even?)
# [2, 4, 6, 8, 10]&lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;I would argue that this is a better abstraction to have, you are still passing around predicates but I feel that the filter_list is more re-useable than the make_filter method. With this implementation we can reuse logic like determining if a number is even, and we also get the flexibility of applying any predicate to a list to filter elements. Another reason why I like this is because I don’t like calling .call on what seem to be method objects, in the above example we had to use even_filter.call, which I see as cumbersome, with the later approach we can use filter_list as a method and call with straight parameters.&lt;/p&gt;


	&lt;p&gt;The above code can be found &lt;a href="http://github.com/sudothinker/ruby/blob/0ae925c28f035c9eff15b54384e1d730a92dd4a1/filters.rb"&gt;on my github page&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;Erector&lt;/h3&gt;

	&lt;p&gt;&lt;a href="http://evang.eli.st/blog"&gt;Pat Maddox&lt;/a&gt; presented a view template engine &lt;a href="http://erector.rubyforge.org"&gt;Erector&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Erector is an alternative to other templating engines like &lt;a href="http://redhanded.hobix.com/inspect/markabyForRails.html"&gt;Markaby&lt;/a&gt; and &lt;a href="http://haml.hamptoncatlin.com/"&gt;&lt;span class="caps"&gt;HAML&lt;/span&gt;&lt;/a&gt;. It is becoming a crowded field with over 19 templating engines now competing for dominance in rails. Since its inception, rails has been using erb for view templates. While this does have its limitations, it has stood the test of time. (Newer frameworks like merb allow for a more flexibility in choosing a template engine and support for markaby and &lt;span class="caps"&gt;HAML&lt;/span&gt; exist via gems for merb applications.)&lt;/p&gt;


	&lt;p&gt;So why is Erector different? Well the logic for starting Erector which I understood from the presentation was that writing erb sucks, and that Markaby and &lt;span class="caps"&gt;HAML&lt;/span&gt; are either not good enough or just look ugly. While I agree that &lt;span class="caps"&gt;HAML&lt;/span&gt; looks ugly, I am not really convinced that Markaby should be shot down quite so quickly before investing time on a new template engine.&lt;/p&gt;


	&lt;p&gt;Erector feels a lot like Markaby in many respects, the main difference I see is the code organization, Markaby follows erb convention in laying out your views in that each view reads from top to bottom, but instead of erb and &lt;span class="caps"&gt;HTML&lt;/span&gt;, it uses Ruby. Erector on the other hand splits up common chuncks of markup and functionality into ‘widgets’ which can get called from controllers via render_widget. It splits up these widgets in order to get reusability and extensibility in the views – these widgets are basically ruby objects and so can be subclassed and extended to gain functionality.&lt;/p&gt;


	&lt;p&gt;While I think Erector is an interesting concept, I feel the indirection created is very cumbersome. In order to change some copy, you have to find the layout, then follow the indirection of all the widgets which are rendered and then find the text you want to change. Widgets seem a bit like partials to me, but I feel that partials are logically organized and make sense as chunks of markup, making these widget ruby objects of markup just seems like overkill to me and introduces a lot of complexity in view rendering.&lt;/p&gt;


&lt;h3&gt;&lt;span class="caps"&gt;IBM&lt;/span&gt; Sharable Code &amp; Mashups&lt;/h3&gt;

	&lt;p&gt;The last presentation came from &lt;a href="http://www.maximilien.com/homepage/welcome.html"&gt;Michael Maximilien&lt;/a&gt; on the topic of &lt;a href="http://services.alphaworks.ibm.com/isc/"&gt;mashups&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;He presented on an interesting system which is basically a &lt;span class="caps"&gt;DSL&lt;/span&gt; for generating mashups. The example given was generating a website which mashes up some flickr photos and digg articles or youtube videos. The process is to write a single ‘Recipe’ in the &lt;span class="caps"&gt;DSL&lt;/span&gt; which in turn generates a full rails application, complete with migrations and &lt;span class="caps"&gt;API&lt;/span&gt; service calls to generate the mashup. So whats the &lt;span class="caps"&gt;DSL&lt;/span&gt; recipe? Well its everything that defines the mashup. All &lt;span class="caps"&gt;API&lt;/span&gt; calls need to be iterated out, all possible data objects returned by the &lt;span class="caps"&gt;API&lt;/span&gt;, all the views along with the markup for the application…&lt;/p&gt;


	&lt;p&gt;Another interesting aspect is deployments, you can specify a recipe for a particular deployment destination, for example facebook or iphone – define all the api keys and then generate a new rails application for that target. The main pitfall of something like this is that, although the &lt;span class="caps"&gt;API&lt;/span&gt; data can be reused, you’d have to iterate out all the views for the different deploy targets (Facebook in &lt;span class="caps"&gt;FBML&lt;/span&gt; for example).&lt;/p&gt;


	&lt;p&gt;This seems interesting, and goes along with the goal of Sharable Code. While I can’t see programmers using a tool like this to generate mash ups as they would want more flexibility in the generated code, there may be some appeal for non-programmers who want to get quick functional mashups with minimal initial overhead.&lt;/p&gt;


	&lt;p&gt;I also found a &lt;a href="http://techwebtv.feedroom.com/?fr_story=a0d9fae7c8e464a2ca314f5d1214604c84f13106&amp;amp;rf=sitemap"&gt;video&lt;/a&gt; of Michael himself explaining Swashup.&lt;/p&gt;
          
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/o6owtqEmmQElJU5btVO4VqRfCGM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o6owtqEmmQElJU5btVO4VqRfCGM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/o6owtqEmmQElJU5btVO4VqRfCGM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o6owtqEmmQElJU5btVO4VqRfCGM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=F77gD-WL7EY:fp3YP34zpM4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=F77gD-WL7EY:fp3YP34zpM4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=F77gD-WL7EY:fp3YP34zpM4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=F77gD-WL7EY:fp3YP34zpM4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=F77gD-WL7EY:fp3YP34zpM4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=F77gD-WL7EY:fp3YP34zpM4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=F77gD-WL7EY:fp3YP34zpM4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Sudothinker?a=F77gD-WL7EY:fp3YP34zpM4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Sudothinker?i=F77gD-WL7EY:fp3YP34zpM4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Sudothinker/~4/F77gD-WL7EY" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://sudothinker.com/2008/5/1/sf-ruby-meetup-4-29-08</feedburner:origLink></entry>
</feed>
