<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Ari Lerner</title>
  <link href="http://xnot.org/atom.xml" rel="self"/>
  <link href="http://xnot.org/"/>
  <updated>2010-02-03T03:27:13-08:00</updated>
  <id>http://xnot.org/</id>
  <author>
    <name>Ari Lerner</name>
    <email>hello@xnot.org</email>
  </author>
  
    <entry>
      <title>Wounded</title>
      <link href="http://xnot.org/2010/02/02/wounded"/>
      <updated>2010-02-02T00:00:00-08:00</updated>
      <id>http://xnot.org/2010/02/02/wounded</id>
      <content type="html">
&lt;div class="highlight"&gt;&lt;pre&gt;You used to speak so easy,
Now you&amp;#39;re afaid to talk [to me].
Its like walking with the wounded.

Carrying that weight way too far, 
The concrete pulled you down so hard
Out there with the wounded,
We&amp;#39;re missing you.
&lt;/pre&gt;
&lt;/div&gt;

I know.</content>
    </entry>
  
    <entry>
      <title>A thought...</title>
      <link href="http://xnot.org/2009/10/20/new_beginnings"/>
      <updated>2009-10-20T00:00:00-07:00</updated>
      <id>http://xnot.org/2009/10/20/new_beginnings</id>
      <content type="html">&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='n'&gt;ruby&lt;/span&gt; &lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;le&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;32.times{|y|print&amp;quot; &amp;quot;*(31-y),(0..y).map{|x|~y&amp;amp;x&amp;gt;0?&amp;quot; .&amp;quot;:&amp;quot; A&amp;quot;}}&amp;#39;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Try it!&lt;/p&gt;</content>
    </entry>
  
    <entry>
      <title>New Blog</title>
      <link href="http://xnot.org/2009/07/14/new-blog-willcode"/>
      <updated>2009-07-14T00:00:00-07:00</updated>
      <id>http://xnot.org/2009/07/14/new-blog-willcode</id>
      <content type="html">&lt;p&gt;Check out my new code blog: &lt;a href='http://xnot.org/'&gt;http://xnot.org&lt;/a&gt; and the latest blog &lt;a href='http://willcodeforfoo.com/2009/07/10/erlang-makefile/'&gt;post&lt;/a&gt; about erlang and Makefiles to simply erlang development!&lt;/p&gt;</content>
    </entry>
  
    <entry>
      <title>Accomplice, Hollywood</title>
      <link href="http://xnot.org/2009/06/27/accomplice"/>
      <updated>2009-06-27T00:00:00-07:00</updated>
      <id>http://xnot.org/2009/06/27/accomplice</id>
      <content type="html">&lt;p&gt;My baby brother is in town for holiday for the summer and is visiting me in Hollywood this week. Sam and I took Jeremy to &lt;a href='http://www.accomplicetheshow.com/'&gt;Accomplice&lt;/a&gt;, the improvised mystery on the streets of &lt;a href='http://www.accomplicetheshow.com/details-hollywood.php'&gt;Hollywood&lt;/a&gt;. Originating in &lt;a href='http://www.accomplicetheshow.com/details-ny.php'&gt;NYC&lt;/a&gt;, Accomplice takes show-goers around the Hollywood Blvd. to seemingly unrelated, uninvolved bystanders wrapping them up into the story.&lt;/p&gt;

&lt;p&gt;Carefully choosing my words here as to not give anything away, anyone on the &lt;a href='http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;q=Hollywood+Boulevard,+Los+Angeles,+Los+Angeles,+California&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=40.460237,89.121094&amp;amp;ie=UTF8&amp;amp;cd=3&amp;amp;geocode=FUpZCAIdZGDy-A&amp;amp;split=0&amp;amp;z=14&amp;amp;iwloc=A'&gt;Boulevard&lt;/a&gt; can be involved and clues are scattered throughout the day. Even the fellow attendees in our &lt;a href='http://www.facebook.com/photo.php?pid=2873700&amp;amp;op=1&amp;amp;view=all&amp;amp;subj=10102569&amp;amp;id=677540819'&gt;group&lt;/a&gt; suspected us to be apart of the show, because we solved a few clues.&lt;/p&gt;

&lt;p&gt;I must say that the experience was one I won&amp;#8217;t soon forget and will most definitely recommend to friends. They do corporate events too! Highly recommend, even for birthday parties!&lt;/p&gt;</content>
    </entry>
  
    <entry>
      <title>Ruby's precedence</title>
      <link href="http://xnot.org/2009/04/08/ruby-precedence"/>
      <updated>2009-04-08T00:00:00-07:00</updated>
      <id>http://xnot.org/2009/04/08/ruby-precedence</id>
      <content type="html">&lt;p&gt;And you thought and was equal to &lt;em&gt;&amp;amp;&amp;amp;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Have you ever looked at ruby code and said wow, this is so readable, I can use &lt;em&gt;and&lt;/em&gt; instead of &lt;em&gt;&amp;amp;&amp;amp;&lt;/em&gt;, how cool! Well, not quite. There are differences and pretty important ones to consider. Here, let&amp;#8217;s see:&lt;/p&gt;

&lt;p&gt;The most basic use of and:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;  &lt;span class='n'&gt;a&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;b&amp;quot;&lt;/span&gt; &lt;span class='ow'&gt;and&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;c&amp;quot;&lt;/span&gt;
  &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='n'&gt;a&lt;/span&gt; &lt;span class='c1'&gt;# =&amp;gt; &amp;quot;b&amp;quot;&lt;/span&gt;
  &lt;span class='n'&gt;a&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;b&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;c&amp;quot;&lt;/span&gt;
  &lt;span class='nb'&gt;p&lt;/span&gt; &lt;span class='n'&gt;a&lt;/span&gt; &lt;span class='c1'&gt;# =&amp;gt; &amp;quot;c&amp;quot;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Notice the precedence issue? With &lt;em&gt;and&lt;/em&gt;, the precedence is on the left-hand side while &lt;em&gt;&amp;amp;&amp;amp;&lt;/em&gt; runs through the entire phrase.&lt;/p&gt;

&lt;p&gt;Why is this important? And and &amp;amp;&amp;amp; phrases, in practice are generally used in if statements and this would cause a big issue with &lt;em&gt;and&lt;/em&gt; statements. Why? (Example time)&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;  &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt; &lt;span class='ow'&gt;and&lt;/span&gt; &lt;span class='kp'&gt;true&lt;/span&gt; &lt;span class='c1'&gt;# false&lt;/span&gt;
  &lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='kp'&gt;true&lt;/span&gt;  &lt;span class='c1'&gt;# false&lt;/span&gt;
  &lt;span class='kp'&gt;true&lt;/span&gt; &lt;span class='ow'&gt;and&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt; &lt;span class='c1'&gt;# true&lt;/span&gt;
  &lt;span class='kp'&gt;true&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;  &lt;span class='c1'&gt;# false&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Did you catch that?&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;  &lt;span class='kp'&gt;true&lt;/span&gt; &lt;span class='ow'&gt;and&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt; &lt;span class='c1'&gt;# true&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;It&amp;#8217;s clearly not the logic you&amp;#8217;d expect when you are using and&amp;#8230; One more just to prove my point&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;  &lt;span class='s2'&gt;&amp;quot;hello&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='n'&gt;e&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;world&amp;quot;&lt;/span&gt;  &lt;span class='c1'&gt;# world + world&lt;/span&gt;
  &lt;span class='s2'&gt;&amp;quot;hello&amp;quot;&lt;/span&gt; &lt;span class='ow'&gt;and&lt;/span&gt; &lt;span class='n'&gt;e&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;world&amp;quot;&lt;/span&gt;   &lt;span class='c1'&gt;# hello + world&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;</content>
    </entry>
  
    <entry>
      <title>AWS releases MapReduce</title>
      <link href="http://xnot.org/2009/04/02/AWS-elastic-mapreduce"/>
      <updated>2009-04-02T00:00:00-07:00</updated>
      <id>http://xnot.org/2009/04/02/AWS-elastic-mapreduce</id>
      <content type="html">&lt;p&gt;Amazon Webservices (AWS) have just announced their &lt;a href='http://aws.amazon.com/elasticmapreduce/'&gt;Elastic Mapreduce&lt;/a&gt; webservice. With their massive architecture, cloud-monopoly (not quite) and the apparent ease of use of the service, the only way this can possibly fail is that the average consumer probably has no idea what mapreduce is&amp;#8230; You can catch me playing it with later this week (after &lt;a href='http://larubyconf.com/'&gt;http://larubyconf.com/&lt;/a&gt;)&lt;/p&gt;</content>
    </entry>
  
    <entry>
      <title>Happy Squared Day</title>
      <link href="http://xnot.org/2009/03/03/happy-squared-day"/>
      <updated>2009-03-03T00:00:00-08:00</updated>
      <id>http://xnot.org/2009/03/03/happy-squared-day</id>
      <content type="html">&lt;p&gt;Today is 3^2 = 9 day!&lt;/p&gt;

&lt;p&gt;Math nerds celebrate&lt;/p&gt;</content>
    </entry>
  
    <entry>
      <title>Easy configuration with erlang</title>
      <link href="http://xnot.org/2009/02/19/easy-configuration-with-erlang"/>
      <updated>2009-02-19T00:00:00-08:00</updated>
      <id>http://xnot.org/2009/02/19/easy-configuration-with-erlang</id>
      <content type="html">&lt;p&gt;Erlang isn&amp;#8217;t the easiest of languages to pass around a set of configuration. You can always write a gen_server to handle holding configuration for you, but why? That&amp;#8217;s just another running process and what happens if it dies? You have to account for that, etc.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve been working on a framework stack in Erlang for a current project of mine and I&amp;#8217;m delighted to share it for posterity.&lt;/p&gt;

&lt;p&gt;Introducing: &lt;a href='http://github.com/auser/configerl/tree/master'&gt;Configerl&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Configerl is my library I use for projects to pull out configuration. I&amp;#8217;ll show you what I mean:&lt;/p&gt;

&lt;p&gt;Say I have a list of tuples intended for configuration purposes, like so:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='nv'&gt;Config&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;[{&lt;/span&gt;&lt;span class='n'&gt;port&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;12345&lt;/span&gt;&lt;span class='p'&gt;},&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='n'&gt;name&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;converse&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;}].&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;With configerl you can pull out and parse the different configurations easily:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='nn'&gt;config&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='n'&gt;parse&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;port&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;Config&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='mi'&gt;12345&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;What about getting with a default?&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='nn'&gt;config&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='n'&gt;parse_or_default&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;port&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;Config&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;ted&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Yes yes, nothing so grand about that, but what about if you want to merge configurations?&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='nn'&gt;config&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='n'&gt;append&lt;/span&gt;&lt;span class='p'&gt;([{&lt;/span&gt;&lt;span class='n'&gt;port&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;12345&lt;/span&gt;&lt;span class='p'&gt;},&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='n'&gt;name&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;converse&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;}],&lt;/span&gt; &lt;span class='p'&gt;[{&lt;/span&gt;&lt;span class='n'&gt;friends&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;whisper&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;}]).&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;What about updating configurations:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='nn'&gt;config&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='n'&gt;update&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt;&lt;span class='n'&gt;port&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;54321&lt;/span&gt;&lt;span class='p'&gt;},&lt;/span&gt; &lt;span class='nv'&gt;Config&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;How about removing a configuration:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='nn'&gt;config&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='n'&gt;delete&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;port&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;Config&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;And now we get to the really fun stuff:&lt;/p&gt;

&lt;p&gt;Fetching multiple keys&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;Port&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;Name&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nn'&gt;config&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='n'&gt;fetch&lt;/span&gt;&lt;span class='p'&gt;([&lt;/span&gt;&lt;span class='n'&gt;port&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;name&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt; &lt;span class='nv'&gt;Config&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Fetching multiple keys with defaults&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;Port&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;Name&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nn'&gt;config&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='n'&gt;fetch_with_default&lt;/span&gt;&lt;span class='p'&gt;([&lt;/span&gt;&lt;span class='n'&gt;port&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;name&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt; &lt;span class='nv'&gt;Config&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;12345&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;converse&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;]).&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Fetching multiple keys with a default configuration&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='nv'&gt;DefaultConfig&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;[{&lt;/span&gt;&lt;span class='n'&gt;port&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;12345&lt;/span&gt;&lt;span class='p'&gt;},&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='n'&gt;name&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;whisper&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;}].&lt;/span&gt;
&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;Port&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;Name&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nn'&gt;config&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='n'&gt;fetch_with_default_config&lt;/span&gt;&lt;span class='p'&gt;([&lt;/span&gt;&lt;span class='n'&gt;port&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;name&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt; &lt;span class='nv'&gt;Config&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;DefaultConfig&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The project is still growing quite a bit and is fully tested up to this point. Please feel free to add to the library or do with what you please.&lt;/p&gt;

&lt;p&gt;Awesome!&lt;/p&gt;</content>
    </entry>
  
    <entry>
      <title>Hello AT&T interactive</title>
      <link href="http://xnot.org/2009/01/14/hello-att-interactive"/>
      <updated>2009-01-14T00:00:00-08:00</updated>
      <id>http://xnot.org/2009/01/14/hello-att-interactive</id>
      <content type="html">&lt;p&gt;Yes, I know it has been quite a while since I&amp;#8217;ve written a post and for good reason. I&amp;#8217;ve been quite busy.&lt;/p&gt;

&lt;p&gt;Starting at the end of this &lt;a href='http://www.timeanddate.com/calendar/monthly.html?year=2009&amp;amp;month=1&amp;amp;country=1'&gt;month&lt;/a&gt;, I will be taking a new step in my programming career as a Lead Software Engineer at &lt;a href='http://yellowpages.com/'&gt;AT&amp;T Interactive&lt;/a&gt;&amp;#8217;s R&amp;amp;D department, continuing development on &lt;a href='http://poolpartyrb.com'&gt;PoolParty&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;CitrusByte has been a great company to work with, the developers are super smart, the culture is fun and the work is dynamic. It was not an easy decision to make as I have thoroughly enjoyed my experience and I will miss working with the crew.&lt;/p&gt;

&lt;p&gt;I look forward to continuing my work on PoolParty with &lt;a href='http://yellowpages.com/'&gt;AT&amp;T Interactive&lt;/a&gt; and will soon resume my blogging at regular intervals once again.&lt;/p&gt;</content>
    </entry>
  
    <entry>
      <title>Introducing DSLify</title>
      <link href="http://xnot.org/2008/12/21/introducing-dslify"/>
      <updated>2008-12-21T00:00:00-08:00</updated>
      <id>http://xnot.org/2008/12/21/introducing-dslify</id>
      <content type="html">&lt;p&gt;One of the earliest piece of functionality I started working on when I started working on &lt;a href='http://poolpartyrb.com'&gt;PoolParty&lt;/a&gt; was the DSL syntax. Because I wanted the syntax to be light enough where &lt;a href='http://blog.xnot.org/2008/11/27/inherited-resourcing-and-the-power-of-subclassing/'&gt;simple inheritance&lt;/a&gt; would allow you to introduce new class types and parented models, I wanted to be able to give any method on any object and be able to retrieve it later. The syntax, which looks something like:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='n'&gt;cloud&lt;/span&gt; &lt;span class='ss'&gt;:name&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
 &lt;span class='n'&gt;instances&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;.&lt;/span&gt;&lt;span class='mi'&gt;5&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;is so terse and readable, I&amp;#8217;ve extracted the functionality into a &lt;a href='http://github.com/auser/dslify/tree/master'&gt;gem&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Now, you can add your own DSL syntax to any class by adding 1 line to your class! And, you get default syntaxes for free!&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s add one for a fake class that we can use to look up showtimes!&lt;/p&gt;

&lt;p&gt;First, the class used to look like this:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;MovieFone&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;To add the DSL syntax, we add the 1 line:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;MovieFone&lt;/span&gt;
 &lt;span class='kp'&gt;include&lt;/span&gt; &lt;span class='no'&gt;Dslify&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now, any method that is called on the class MovieFone that doesn&amp;#8217;t exist, will be called on the instance. These methods and their attributes are all stored in a method called: __options (double underscores to avoid any collisions with user defined option methods). Now you can fetch any method called on your instance (with or without using =) on the options, or simply by calling the method.&lt;/p&gt;

&lt;p&gt;Example? Of course!&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;MovieFone&lt;/span&gt;
 &lt;span class='kp'&gt;include&lt;/span&gt; &lt;span class='no'&gt;Dslify&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;

&lt;span class='n'&gt;mf&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;MovieFone&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;new&lt;/span&gt;
&lt;span class='n'&gt;mf&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;movie&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;Can&amp;#39;t buy me love&amp;quot;&lt;/span&gt;
&lt;span class='n'&gt;mf&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;times&lt;/span&gt; &lt;span class='mi'&gt;8&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;pm&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;.&lt;/span&gt;&lt;span class='mi'&gt;10&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;pm&lt;/span&gt;

&lt;span class='c1'&gt;# Or, my preferred syntax:&lt;/span&gt;

&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;MovieFone&lt;/span&gt;
 &lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;initialize&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;block&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
  &lt;span class='nb'&gt;instance_eval&lt;/span&gt; &lt;span class='n'&gt;block&lt;/span&gt; &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='n'&gt;block&lt;/span&gt;
 &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;

&lt;span class='no'&gt;MovieFone&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;new&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
 &lt;span class='n'&gt;movie&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;Lucas&amp;quot;&lt;/span&gt;
 &lt;span class='n'&gt;times&lt;/span&gt; &lt;span class='mi'&gt;8&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;pm&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;.&lt;/span&gt; &lt;span class='mi'&gt;10&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;pm&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;One neat feature that may not be apparent is that you can support different runtime methods with the same call, but only have to evaluate it at the runtime. For instance, say you want to give either a range of times (like above) or accept an array of times you are available:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='n'&gt;mf&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;times&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;8&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;pm&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;10&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;pm&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;12&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;am&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Simple! When you setup the search method, the argument will be of the class type you send it! Cake!&lt;/p&gt;

&lt;p&gt;Find the gem here: &lt;a href='http://github.com/auser/dslify/tree/master'&gt; http://github.com/auser/dslify/tree/master&lt;/a&gt;!&lt;/p&gt;</content>
    </entry>
  
    <entry>
      <title>Using Capistrano with EC2</title>
      <link href="http://xnot.org/2008/12/17/using-capistrano-with-ec2"/>
      <updated>2008-12-17T00:00:00-08:00</updated>
      <id>http://xnot.org/2008/12/17/using-capistrano-with-ec2</id>
      <content type="html">&lt;p&gt;Capistrano has made it somewhat difficult to use cap with ec2. &lt;a href='http://www.clipclip.org/activity/view/1307/play-with-amazons-ec2'&gt;It &lt;/a&gt; has &lt;a href='http://niblets.wordpress.com/2007/02/12/capistrano-ec2-sitting-in-a-tree-k-i-s-s-i-n-g/'&gt;long&lt;/a&gt; been &lt;a href='http://ec2onrails.rubyforge.org/'&gt;known&lt;/a&gt; that &lt;a href='http://www.capify.org/'&gt;capistrano&lt;/a&gt; is &lt;a href='http://groups.google.com/group/ec2-on-rails-discuss/browse_thread/thread/842e632a39d3abc4'&gt;borked&lt;/a&gt; when using &lt;a href='http://aws.amazon.com/ec2'&gt;EC2&lt;/a&gt; because it requires the public key.&lt;/p&gt;

&lt;p&gt;The work-around has been to download the public key from EC2 before running capistrano, a very ugly solution indeed. Well, after digging into the net-ssh &lt;a href='http://github.com/jamis/net-ssh/tree/master'&gt;source&lt;/a&gt;, it&amp;#8217;s obvious that the public key was only used to hold &lt;a href='http://github.com/jamis/net-ssh/tree/master/lib/net/ssh/key_factory.rb#L73-83'&gt;identities&lt;/a&gt; in a hash. Because net/ssh uses ruby&amp;#8217;s &lt;a href='http://www.ruby-doc.org/stdlib/libdoc/openssl/rdoc/index.html'&gt;openssl library&lt;/a&gt;, we can call the public key to be generated from the private key, rather than requiring it from the user!&lt;/p&gt;

&lt;p&gt;So, without further ado, no longer do you need to snatch up the public key from your EC2 instance. The fork is located at: &lt;a href='http://github.com/auser/net-ssh/tree/master'&gt;http://github.com/auser/net-ssh/tree/master&lt;/a&gt;&lt;/p&gt;</content>
    </entry>
  
    <entry>
      <title>Git-style binaries</title>
      <link href="http://xnot.org/2008/12/16/git-style-binaries"/>
      <updated>2008-12-16T00:00:00-08:00</updated>
      <id>http://xnot.org/2008/12/16/git-style-binaries</id>
      <content type="html">&lt;p&gt;In this version of PoolParty internals, we&amp;#8217;ll check out the git-style binaries used in PoolParty. Note, for this episode, I may move a little fast as there is a lot to cover.&lt;/p&gt;

&lt;p&gt;Git, if you don&amp;#8217;t already know is a super sleek SCM (Source control management system). It gives you hundreds of binaries using the idiom: git &lt;em&gt;action&lt;/em&gt; options command&amp;#8230; One big benefit to this is that all the binaries are self-contained, but function together.&lt;/p&gt;

&lt;p&gt;With PoolParty, it makes sense to contain the binaries, both to enable quick development and to target the action the command-line method will be doing. This enables us to do cloud &lt;em&gt;action&lt;/em&gt;, such as cloud start and cloud ssh. How do we do this? Let&amp;#8217;s dive in!&lt;/p&gt;

&lt;p&gt;Opening poolparty/bin/cloud, we see the following&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='c1'&gt;#!/usr/bin/env ruby&lt;/span&gt;
&lt;span class='nb'&gt;require&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;poolparty&amp;quot;&lt;/span&gt;
&lt;span class='nb'&gt;require&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;poolpartycl&amp;quot;&lt;/span&gt;

&lt;span class='nb'&gt;name&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;ARGV&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;select&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;arg&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;arg&lt;/span&gt; 
    &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='no'&gt;Binary&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;available_binaries_for&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;cloud&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;include?&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;arg&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;first&lt;/span&gt;

&lt;span class='c1'&gt;# Hiding methods here that strip out actions that aren&amp;#39;t included&lt;/span&gt;
&lt;span class='c1'&gt;# in the PoolParty list of available command-line actions&lt;/span&gt;
&lt;span class='c1'&gt;# for brevity&lt;/span&gt;

&lt;span class='c1'&gt;# If no command is passed in, show help&lt;/span&gt;
&lt;span class='n'&gt;new_args&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;push&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;-h&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='k'&gt;unless&lt;/span&gt; &lt;span class='nb'&gt;name&lt;/span&gt;

&lt;span class='n'&gt;o&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;PoolParty&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Optioner&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;new&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;new_args&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; 
  &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='ss'&gt;:extra_help&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;Cloud actions&lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='no'&gt;Binary&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;list_binaries_for&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;cloud&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; 
  &lt;span class='ss'&gt;:abstract&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='kp'&gt;true&lt;/span&gt;&lt;span class='p'&gt;})&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;opts&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;optioner&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;  
  &lt;span class='n'&gt;opts&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;on&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;-n cloudname&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;--name name&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;Address this cloud&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;    
    &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;c&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;optioner&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;cloudname&lt;/span&gt; &lt;span class='n'&gt;c&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;

&lt;span class='n'&gt;program_name&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;basename&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='vg'&gt;$0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;-&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='nb'&gt;name&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;
&lt;span class='n'&gt;program_location&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;join&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='no'&gt;Binary&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;binary_directory&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;program_name&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;

&lt;span class='n'&gt;command_line&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;program_location&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;

&lt;span class='c1'&gt;# Run it from the command-line first&lt;/span&gt;
&lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='no'&gt;Binary&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;available_binaries_for&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;cloud&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;include?&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;name&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
  &lt;span class='nb'&gt;system&lt;/span&gt; &lt;span class='n'&gt;command_line&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='no'&gt;ARGV&lt;/span&gt;
&lt;span class='k'&gt;else&lt;/span&gt;
  &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;Unknown poolparty binary: &lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='nb'&gt;name&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Phew, that&amp;#8217;s a lot. It&amp;#8217;s super simple, the first few lines are ensuring that the action is contained in the list of available actions.&lt;/p&gt;

&lt;p&gt;These are gathered just by looking in the directory with the binaries that start with &amp;#8220;cloud,&amp;#8221; in this case:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='no'&gt;Dir&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;binary_directory&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;/&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;ty&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;-*&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;].&lt;/span&gt;&lt;span class='n'&gt;map&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;a&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;basename&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;a&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;gsub&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='sr'&gt;/&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;ty&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='sr'&gt;-/&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;sort&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Moving on, the Optioner is a custom optsparser class that sits inside of PoolParty that gives PoolParty the ability to extend it&amp;#8217;s own option parser. Not much to the class really, but I urge you to check out the class if you are interested on knowing how it works.&lt;/p&gt;

&lt;p&gt;Finally, we are going to call the command! We have to rebuild the arguments sent in such that the arguments are parsed properly by the next binary that will consume them. We can use the splat operator so that when the optsparser reads them again, it&amp;#8217;s as though the arguments were entered on the command-line.&lt;/p&gt;

&lt;p&gt;Phew, that was quite a bit! As always, I urge you to check out PoolParty if you haven&amp;#8217;t already. It&amp;#8217;s pretty spiffy and super fun!&lt;/p&gt;</content>
    </entry>
  
    <entry>
      <title>Talk to your cloud directly with ruberl</title>
      <link href="http://xnot.org/2008/12/04/talk-to-your-cloud-directory-with-ruberl"/>
      <updated>2008-12-04T00:00:00-08:00</updated>
      <id>http://xnot.org/2008/12/04/talk-to-your-cloud-directory-with-ruberl</id>
      <content type="html">&lt;p&gt;Want to communicate with your cloud quickly?&lt;/p&gt;

&lt;p&gt;Easy! First, download the gem ruberl &lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='n'&gt;gem&lt;/span&gt; &lt;span class='n'&gt;install&lt;/span&gt; &lt;span class='n'&gt;auser&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;ruberl&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Now you just have to set host and port and you can communicate with your gen_tcp server (or, in PoolParty&amp;#8217;s case, the messenger) with either messenger_send! or messenger_cast! like so:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='nb'&gt;require&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;ruberl&amp;quot;&lt;/span&gt;

&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;Test&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='no'&gt;Ruberl&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Base&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;

&lt;span class='vi'&gt;@t&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;Test&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;new&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;75.101.162.232&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;7050&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='kp'&gt;loop&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
  &lt;span class='n'&gt;nodes&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='vi'&gt;@t&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;messenger_send!&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;get_current_nodes&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;  
  &lt;span class='nb'&gt;load&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='vi'&gt;@t&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;messenger_send!&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;get_current_load cpu&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;to_f&lt;/span&gt;
  &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;Load on nodes &lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;nodes&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;: &lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='nb'&gt;load&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;
  &lt;span class='nb'&gt;sleep&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;10&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Alternatively, you can just set the attr_accessors host and port within your class and do the same thing, for instance&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;Test&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='no'&gt;Ruberl&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Base&lt;/span&gt;
 &lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;.&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='c1'&gt;# some more methods&lt;/span&gt;
 &lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;get_load&lt;/span&gt;
  &lt;span class='vi'&gt;@host&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;host&amp;quot;&lt;/span&gt;
  &lt;span class='vi'&gt;@port&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;port&amp;quot;&lt;/span&gt;
  &lt;span class='n'&gt;messenger_send!&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;get_current_load cpu&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
 &lt;span class='k'&gt;end&lt;/span&gt;
 &lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;.&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Stay tuned for more quick tips, internals and discussions!&lt;/p&gt;</content>
    </entry>
  
    <entry>
      <title>Inherited resourcing and the power of subclassing</title>
      <link href="http://xnot.org/2008/11/27/Inherited-resourcing-and-the-power-of-subclassing"/>
      <updated>2008-11-27T00:00:00-08:00</updated>
      <id>http://xnot.org/2008/11/27/Inherited-resourcing-and-the-power-of-subclassing</id>
      <content type="html">&lt;p&gt;In this edition of PoolParty internals, I&amp;#8217;m going to show you how the basic resourcing is done. Virtual resourcing is out of the scope of this blog post, but we&amp;#8217;ll come back to that on another blog post.&lt;/p&gt;

&lt;p&gt;If you are not familiar with &lt;a href='http://poolpartyrb.com'&gt;PoolParty&lt;/a&gt;, I urge you to check it &lt;a href='http://poolpartyrb.com'&gt;out&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From within PoolParty, resources are a cornerstone. Most all the resources implemented in PoolParty have the same basic structure of each other, but require different parameters. For instance, a file resource can have content associated with it, while an exec cannot. However, they both behave like each other in the context of usage.&lt;/p&gt;

&lt;p&gt;Most of the resource classes in PoolParty are tiny. For instance, the Host resource is 4 lines long without a method defined.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='k'&gt;module&lt;/span&gt; &lt;span class='nn'&gt;PoolParty&lt;/span&gt;
  &lt;span class='k'&gt;module&lt;/span&gt; &lt;span class='nn'&gt;Resources&lt;/span&gt;        

    &lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;Host&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='no'&gt;Resource&lt;/span&gt;
      &lt;span class='n'&gt;default_options&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt;
        &lt;span class='ss'&gt;:name&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;$hostname&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
        &lt;span class='ss'&gt;:ip&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;$ipaddress&amp;quot;&lt;/span&gt;
      &lt;span class='p'&gt;})&lt;/span&gt;
    &lt;span class='k'&gt;end&lt;/span&gt;

  &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;When the following code is in the pool.spec, the a new host resource is created (we&amp;#8217;ll see later that it means a new instance of the Host class is instantiated) and stored in the containing class.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;	&lt;span class='n'&gt;has_host&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:name&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;orca&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:ip&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;67.125.84.125&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
	&lt;span class='c1'&gt;# Note that this is the same as calling&lt;/span&gt;
	&lt;span class='n'&gt;host&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:name&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;orca&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:ip&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;67.125.84.125&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Almost all of the resources implementation are that small. So how do we do this?&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;	&lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nc'&gt;self&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nf'&gt;inherited&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;subclass&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
	&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Because we already use the method_missing to create methods from on the cloud to keep our DSL clean, we will use inherited to create the methods we want on our containing class as well as to build a list of the available resources. Let&amp;#8217;s look at the method currently implemented in PoolParty:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nc'&gt;self&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nf'&gt;inherited&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;subclass&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
  &lt;span class='n'&gt;subclass&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;subclass&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;to_s&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;split&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;::&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='o'&gt;[-&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt; &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='n'&gt;subclass&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;to_s&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;index&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;::&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
  &lt;span class='n'&gt;lowercase_class_name&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;subclass&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;to_s&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;underscore&lt;/span&gt;

  &lt;span class='c1'&gt;# Add add resource method to the Resources module&lt;/span&gt;
  &lt;span class='k'&gt;unless&lt;/span&gt; &lt;span class='no'&gt;PoolParty&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Resources&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;respond_to?&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;lowercase_class_name&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;to_sym&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='nb'&gt;method&lt;/span&gt; &lt;span class='o'&gt;=&amp;lt;&amp;lt;-&lt;/span&gt;&lt;span class='no'&gt;EOE&lt;/span&gt;
&lt;span class='sh'&gt;      def #{lowercase_class_name}(opts={}, parent=self, &amp;amp;amp;blk)&lt;/span&gt;
&lt;span class='sh'&gt;        add_resource(:#{lowercase_class_name}, opts, parent, &amp;amp;amp;blk)&lt;/span&gt;
&lt;span class='sh'&gt;      end&lt;/span&gt;
&lt;span class='sh'&gt;      def get_#{lowercase_class_name}(name)&lt;/span&gt;
&lt;span class='sh'&gt;        get_resource(:#{lowercase_class_name}, name) if in_a_resource_store?(:#{lowercase_class_name}, name)&lt;/span&gt;
&lt;span class='sh'&gt;      end&lt;/span&gt;
&lt;span class='no'&gt;    EOE&lt;/span&gt;
    &lt;span class='no'&gt;PoolParty&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Resources&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;module_eval&lt;/span&gt; &lt;span class='nb'&gt;method&lt;/span&gt;
    &lt;span class='no'&gt;PoolParty&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Resources&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;add_has_and_does_not_have_methods_for&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;lowercase_class_name&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;to_sym&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;

    &lt;span class='n'&gt;available_resources&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;subclass&lt;/span&gt;
  &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nc'&gt;self&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nf'&gt;add_has_and_does_not_have_methods_for&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nb'&gt;type&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='ss'&gt;:file&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
  &lt;span class='nb'&gt;module_eval&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&amp;lt;-&lt;/span&gt;&lt;span class='no'&gt;EOE&lt;/span&gt;
&lt;span class='sh'&gt;    def has_#{type}(opts={}, parent=self, &amp;amp;amp;block)&lt;/span&gt;
&lt;span class='sh'&gt;      #{type}(#{type == :exec ? &amp;quot;opts&amp;quot; : &amp;quot;{:is_present =&amp;gt; &amp;#39;&amp;#39;}.merge(opts)&amp;quot;}, parent, &amp;amp;amp;block)&lt;/span&gt;
&lt;span class='sh'&gt;    end&lt;/span&gt;
&lt;span class='sh'&gt;    def does_not_have_#{type}(opts={}, parent=self, &amp;amp;amp;block)&lt;/span&gt;
&lt;span class='sh'&gt;      #{type}(#{type == :exec ? &amp;quot;opts&amp;quot; : &amp;quot;{:is_absent =&amp;gt; &amp;#39;&amp;#39;}.merge(opts)&amp;quot;}, parent, &amp;amp;amp;block)&lt;/span&gt;
&lt;span class='sh'&gt;    end&lt;/span&gt;
&lt;span class='no'&gt;  EOE&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;I&amp;#8217;m going to make this quick, but feel free to stop me and ask me if something is confusing&amp;#8230;&lt;/p&gt;

&lt;p&gt;Whenever a class is subclassed, the parent class receives a callback hook called &amp;#8220;inherited.&amp;#8221; This method is called on any class that gets subclassed, for instance:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;A&lt;/span&gt;
  &lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nc'&gt;self&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nf'&gt;inherited&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;sublcass&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;inherited from &lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;sublcass&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;
  &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;B&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;A&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;

&lt;span class='c1'&gt;# inherited from B&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This way, in order to add a resource to PoolParty, all we have to do is subclass the PoolParty::Resources::Resource class.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m making sure that we only have to run this method once, so that both the method doesn&amp;#8217;t get uselessly overwritten and second that it&amp;#8217;s nicer on GC. Second, we are adding two methods at the time to the resources (note, that clouds, pools, and plugins all include the Resources module, thus all these methods are allowed within those contexts.&lt;/p&gt;

&lt;p&gt;Finally, we add the methods onto the class, add the add_has_and_does_not_have_methods_for methods to the class (this is where the has_ and does_not_have methods get added).&lt;/p&gt;

&lt;p&gt;One thing you&amp;#8217;ll note from this is that every single resource created can be called 3 ways, resource_name, has_resource_name and does_not_have_resource_name. Finally, we add it to the available_resources array just so we keep track of these.&lt;/p&gt;

&lt;p&gt;I hope that works for you and that you can find a use for self.inherited.&lt;/p&gt;

&lt;h3 id='update'&gt;Update&lt;/h3&gt;

&lt;p&gt;Stay tuned for a special inside PoolParty about rspec extensions&amp;#8230; pretty hot stuff, IMHO.&lt;/p&gt;</content>
    </entry>
  
    <entry>
      <title>Daemonizing ruby</title>
      <link href="http://xnot.org/2008/11/21/daemonizing-ruby"/>
      <updated>2008-11-21T00:00:00-08:00</updated>
      <id>http://xnot.org/2008/11/21/daemonizing-ruby</id>
      <content type="html">&lt;p&gt;This edition of PoolParty internals is going to show you how to run a block of ruby. Considering that you know a little bit of ruby, I&amp;#8217;ll be going a little faster in this post.&lt;/p&gt;

&lt;p&gt;There are a few commands right now in PoolParty that allow you to daemonize the process with the -d flag. (Future post on extending the OptionParser). This will place the block of code in the binary into the daemonized mode.&lt;/p&gt;

&lt;p&gt;From within PoolParty, this command looks like:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;      
&lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;daemonize&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;block&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='n'&gt;vputs&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;Daemonizing...&amp;quot;&lt;/span&gt;

        &lt;span class='n'&gt;pid&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;fork&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
          &lt;span class='no'&gt;Signal&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;trap&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;HUP&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;IGNORE&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='c1'&gt;# Don&amp;#39;t die upon logout&lt;/span&gt;
          &lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;open&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;/dev/null&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;r+&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;devnull&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
            &lt;span class='vg'&gt;$stdout&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;reopen&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;devnull&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
            &lt;span class='vg'&gt;$stderr&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;reopen&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;devnull&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
            &lt;span class='vg'&gt;$stdin&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;reopen&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;devnull&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='k'&gt;unless&lt;/span&gt; &lt;span class='vi'&gt;@use_stdin&lt;/span&gt;
          &lt;span class='k'&gt;end&lt;/span&gt;
          &lt;span class='n'&gt;block&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;call&lt;/span&gt; &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='n'&gt;block&lt;/span&gt;
        &lt;span class='k'&gt;end&lt;/span&gt;
        &lt;span class='no'&gt;Process&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;detach&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;pid&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='n'&gt;pid&lt;/span&gt;
      &lt;span class='k'&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;I&amp;#8217;ll walk through this snippet of ruby with you.&lt;/p&gt;

&lt;p&gt;First off, vputs is a PoolParty internal to print verbosely, so we can ignore that for now. Basically, it calls put if verbose is set on the containing object. Until the post referenced above is written, just trust that it puts if verbose is set.&lt;/p&gt;

&lt;p&gt;Second, we use &lt;a href='http://www.ruby-doc.org/core/classes/Kernel.html#M005980'&gt;Kernel.fork&lt;/a&gt; to create a subprocess from within ruby. Second, we tell the subprocess not to quit if it receives the linux signal &amp;#8216;HUP.&amp;#8217; This way, we can safely ignore the process and assume it will continue to run even if we do log out or our OS sends it a HUP signal.&lt;/p&gt;

&lt;p&gt;Then we&amp;#8217;ll pipe the output to /dev/null so that we don&amp;#8217;t see any output on the daemonzied process. It would be odd to daemonize a process and see output after we&amp;#8217;ve forked it off.&lt;/p&gt;

&lt;p&gt;Finally, we&amp;#8217;ll use the block that we&amp;#8217;ll send it when calling daemonize before detaching the process from this process. Detaching the process will set the process apart from this parent process and assume that it is it&amp;#8217;s own parent process. This way, our process won&amp;#8217;t receive any errors if the forked one does.&lt;/p&gt;

&lt;p&gt;You can call daemonize with a block, like so&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;  &lt;span class='n'&gt;daemonize&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
    &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;.&lt;/span&gt;&lt;span class='mi'&gt;12000000&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;inject&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;sum&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
     &lt;span class='n'&gt;sum&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt;
    &lt;span class='k'&gt;end&lt;/span&gt;

    &lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;open&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;/tmp/sum&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;w+&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;f&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;f&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;lt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;&lt;span class='o'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;lt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;sum&lt;/span&gt;&lt;span class='p'&gt;}&lt;/span&gt;
  &lt;span class='k'&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;That completes this edition of inside PoolParty. Stay tuned for the next one!&lt;/p&gt;

&lt;p&gt;Code has been attached &lt;a href='http://blog.xnot.org/wp-content/uploads/2008/11/damonize.rb'&gt;daemonize&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id='update'&gt;Update&lt;/h3&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;daemonize&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;block&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
  &lt;span class='nb'&gt;trap&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;CHLD&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='no'&gt;Process&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;wait&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='no'&gt;Process&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;WNOHANG&lt;/span&gt;&lt;span class='p'&gt;)}&lt;/span&gt;
  &lt;span class='nb'&gt;fork&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
    &lt;span class='no'&gt;Signal&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;trap&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;HUP&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;IGNORE&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='c1'&gt;# Don&amp;#39;t die upon logout&lt;/span&gt;
    &lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;open&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;/dev/null&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;r+&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;devnull&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
      &lt;span class='vg'&gt;$stdout&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;reopen&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;devnull&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
      &lt;span class='vg'&gt;$stderr&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;reopen&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;devnull&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
      &lt;span class='vg'&gt;$stdin&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;reopen&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;devnull&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='k'&gt;unless&lt;/span&gt; &lt;span class='vi'&gt;@use_stdin&lt;/span&gt;
    &lt;span class='k'&gt;end&lt;/span&gt;
    &lt;span class='n'&gt;block&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;call&lt;/span&gt; &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='n'&gt;block&lt;/span&gt;
  &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This sets the flag ruby to not block if no child is available and waits for any child process of the current execution block (see &lt;a href='http://www.ruby-doc.org/core/classes/Process.html#M003184'&gt;Process&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Also, one more note: my MacBook is officially dead and en route to Apple, so updates to PoolParty may be slow this week.&lt;/p&gt;</content>
    </entry>
  
    <entry>
      <title>Communicating from Ruby to Erlang</title>
      <link href="http://xnot.org/2008/11/16/communicating-from-ruby-to-erlang"/>
      <updated>2008-11-16T00:00:00-08:00</updated>
      <id>http://xnot.org/2008/11/16/communicating-from-ruby-to-erlang</id>
      <content type="html">&lt;p&gt;I&amp;#8217;ve been working pretty hard on &lt;a href='http://poolpartyrb.com'&gt;PoolParty&lt;/a&gt; lately. PoolParty is a combination of ruby and erlang and gives full access to the cloud using a console. &lt;div class='highlight'&gt;&lt;pre&gt;  pool console
&lt;/pre&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m going to show you how I implemented the console, which is a container for irb and lightweight socket communication to the messenger written in erlang.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll assume that you know enough about erlang to get through the code as beginning erlang is out of scope for this tutorial.&lt;/p&gt;

&lt;p&gt;First, let&amp;#8217;s look at the erlang messenger&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='p'&gt;-&lt;/span&gt;&lt;span class='ni'&gt;module&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;server&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;
&lt;span class='p'&gt;-&lt;/span&gt;&lt;span class='ni'&gt;export&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;start&lt;/span&gt;&lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;

&lt;span class='nf'&gt;start&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='n'&gt;ok&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;LSock&lt;/span&gt;&lt;span class='p'&gt;}&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nn'&gt;gen_tcp&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='n'&gt;listen&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;5678&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;binary&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='n'&gt;packet&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;},&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='n'&gt;active&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;false&lt;/span&gt;&lt;span class='p'&gt;}]),&lt;/span&gt;
    &lt;span class='n'&gt;active&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;LSock&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;

&lt;span class='nf'&gt;accept&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;Socket&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;
  &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='n'&gt;ok&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;Sock&lt;/span&gt;&lt;span class='p'&gt;}&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nn'&gt;gen_tcp&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='n'&gt;accept&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;Socket&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;
  &lt;span class='nb'&gt;spawn&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='k'&gt;fun&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='o'&gt;-&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;loop&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;do_recv&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;Sock&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='k'&gt;end&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;
  &lt;span class='n'&gt;accept&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;Socket&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;

&lt;span class='nf'&gt;do_recv&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;Sock&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class='k'&gt;case&lt;/span&gt; &lt;span class='nn'&gt;gen_tcp&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='n'&gt;recv&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;Sock&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='k'&gt;of&lt;/span&gt;
        &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='n'&gt;ok&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;B&lt;/span&gt;&lt;span class='p'&gt;}&lt;/span&gt; &lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;
          &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;Meth&lt;/span&gt;&lt;span class='p'&gt;|&lt;/span&gt;&lt;span class='nv'&gt;Args&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nn'&gt;string&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='n'&gt;tokens&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nn'&gt;erlang&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='nb'&gt;binary_to_list&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;Data&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='s'&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;
          &lt;span class='k'&gt;case&lt;/span&gt; &lt;span class='nv'&gt;Meth&lt;/span&gt; &lt;span class='k'&gt;of&lt;/span&gt;
            &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='n'&gt;time&lt;/span&gt;&lt;span class='p'&gt;}&lt;/span&gt; &lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;
              &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='nv'&gt;Date&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='nv'&gt;Year&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='nv'&gt;Month&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='nv'&gt;Day&lt;/span&gt;&lt;span class='p'&gt;},&lt;/span&gt;&lt;span class='nv'&gt;Time&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='nv'&gt;Hour&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='nv'&gt;Minutes&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='nv'&gt;Seconds&lt;/span&gt;&lt;span class='p'&gt;}}&lt;/span&gt;
                &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nn'&gt;erlang&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='n'&gt;localtime&lt;/span&gt;&lt;span class='p'&gt;(),&lt;/span&gt;
              &lt;span class='nv'&gt;IntString&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt;
                &lt;span class='p'&gt;[&lt;/span&gt; &lt;span class='nn'&gt;erlang&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='nb'&gt;integer_to_list&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;A&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;||&lt;/span&gt; &lt;span class='nv'&gt;A&lt;/span&gt; &lt;span class='err'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;lt&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;Hour&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;Minutes&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;Seconds&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;],&lt;/span&gt;
              &lt;span class='nv'&gt;ResponseString&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nn'&gt;lists&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='n'&gt;append&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;IntString&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;
              &lt;span class='nn'&gt;gen_tcp&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='nb'&gt;send&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;Sock&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;ResponseString&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;
              &lt;span class='n'&gt;do_recv&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;Sock&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
            &lt;span class='p'&gt;_&lt;/span&gt; &lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;
              &lt;span class='nn'&gt;gen_tcp&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='nb'&gt;send&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;Sock&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;B&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt;
              &lt;span class='n'&gt;do_recv&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;Sock&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
          &lt;span class='k'&gt;end&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='n'&gt;error&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;closed&lt;/span&gt;&lt;span class='p'&gt;}&lt;/span&gt; &lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;
          &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='n'&gt;ok&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nb'&gt;list_to_binary&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;Bs&lt;/span&gt;&lt;span class='p'&gt;)}&lt;/span&gt;
    &lt;span class='k'&gt;end&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now we have a spawning server that spawns off responses to respond to the requests that comes into the server, handles them and sends back their responses to the caller (using &lt;a href='http://www.erlang.org/doc/man/gen_tcp.html'&gt;gen_tcp&lt;/a&gt;). In our case, we&amp;#8217;ll be calling the contrived time method that will send us back the hour minutes and seconds&lt;/p&gt;

&lt;p&gt;We can start the server like this&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='n'&gt;auser&lt;/span&gt; &lt;span class='err'&gt;~&lt;/span&gt; &lt;span class='sc'&gt;$ &lt;/span&gt;&lt;span class='n'&gt;erl&lt;/span&gt;
&lt;span class='nv'&gt;Erlang&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nv'&gt;BEAM&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='n'&gt;emulator&lt;/span&gt; &lt;span class='n'&gt;version&lt;/span&gt; &lt;span class='mi'&gt;5&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='mi'&gt;6&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;source&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;async&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='nn'&gt;threads&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='n'&gt;kernel&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='nn'&gt;poll&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='n'&gt;false&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt;

&lt;span class='nv'&gt;Eshell&lt;/span&gt; &lt;span class='nv'&gt;V5&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='mi'&gt;6&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt;  &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;abort&lt;/span&gt; &lt;span class='n'&gt;with&lt;/span&gt; &lt;span class='err'&gt;^&lt;/span&gt;&lt;span class='nv'&gt;G&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;c&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;server&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='n'&gt;erl&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;
&lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='nn'&gt;server&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='n'&gt;start&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;7050&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now that we have the server running, let&amp;#8217;s get our ruby side talking. Our gen_tcp-based server above starts a listener at the port 5678, sounds like something we can hook up using ruby&amp;#8217;s TCPSocket class. Which is exactly what we will do: &lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='nb'&gt;require&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;socket&amp;quot;&lt;/span&gt;
  &lt;span class='k'&gt;module&lt;/span&gt; &lt;span class='nn'&gt;Messenger&lt;/span&gt;
    &lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;initialize&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;host&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;port&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='mi'&gt;5678&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
      &lt;span class='vi'&gt;@host&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;host&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;&lt;span class='vi'&gt;@port&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;port&lt;/span&gt;
    &lt;span class='k'&gt;end&lt;/span&gt;
    &lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;with_socket&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;&amp;amp;&lt;/span&gt;&lt;span class='n'&gt;amp&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;&lt;span class='n'&gt;block&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
      &lt;span class='k'&gt;begin&lt;/span&gt;
        &lt;span class='n'&gt;socket&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;TCPSocket&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;open&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='vi'&gt;@host&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='vi'&gt;@port&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='n'&gt;out&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;yield&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;socket&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='n'&gt;socket&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;close&lt;/span&gt;
        &lt;span class='n'&gt;out&lt;/span&gt;
      &lt;span class='k'&gt;rescue&lt;/span&gt; &lt;span class='no'&gt;Exception&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;e&lt;/span&gt;
      &lt;span class='k'&gt;end&lt;/span&gt;
    &lt;span class='k'&gt;end&lt;/span&gt;
    &lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;call!&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;msg&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;time&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
      &lt;span class='n'&gt;with_socket&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;sock&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
        &lt;span class='n'&gt;sock&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;send&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;msg&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
        &lt;span class='vi'&gt;@str&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;sock&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;recv&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;2000&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
      &lt;span class='k'&gt;end&lt;/span&gt;
      &lt;span class='vi'&gt;@str&lt;/span&gt;
    &lt;span class='k'&gt;end&lt;/span&gt;
    &lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;cast!&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;msg&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;list&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
      &lt;span class='n'&gt;with_socket&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;sock&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
        &lt;span class='n'&gt;sock&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;send&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;msg&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
      &lt;span class='k'&gt;end&lt;/span&gt;
    &lt;span class='k'&gt;end&lt;/span&gt;
  &lt;span class='k'&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;So we can call call! on any class that includes Messenger and it will send the data using a socket we open with the with_socket method. Upon sending the message, we also immediately open a socket to listen for the response. If we just want to send a message to the erlang messenger, then we can just call cast! with the message we want to send&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;Test&lt;/span&gt;
    &lt;span class='kp'&gt;include&lt;/span&gt; &lt;span class='no'&gt;Messenger&lt;/span&gt;
  &lt;span class='k'&gt;end&lt;/span&gt;

&lt;span class='vi'&gt;@t&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;Test&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;new&lt;/span&gt;
&lt;span class='vi'&gt;@t&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;call!&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;time&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;That about wraps up this edition of inside PoolParty, check out &lt;a href='http://labs.citrusbyte.com'&gt;Labs at CitrusByte&lt;/a&gt; for more information about PoolParty.&lt;/p&gt;

&lt;p&gt;Have fun! -Ari&lt;/p&gt;</content>
    </entry>
  
    <entry>
      <title>PoolParty</title>
      <link href="http://xnot.org/2008/11/13/PoolParty"/>
      <updated>2008-11-13T00:00:00-08:00</updated>
      <id>http://xnot.org/2008/11/13/PoolParty</id>
      <content type="html">&lt;p&gt;Obviously I have not posted in quite some time because I have been super busy.&lt;/p&gt;

&lt;p&gt;What have you been doing Ari?&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m glad you asked! Announcing the new &lt;strong&gt;PoolParty&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quickstart: &lt;div class='highlight'&gt;&lt;pre&gt;  &lt;span class='n'&gt;gem&lt;/span&gt; &lt;span class='n'&gt;install&lt;/span&gt; &lt;span class='n'&gt;poolparty&lt;/span&gt;
  &lt;span class='n'&gt;pool&lt;/span&gt; &lt;span class='n'&gt;spec&lt;/span&gt; &lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='nb'&gt;name&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;
  &lt;span class='n'&gt;cloud&lt;/span&gt; &lt;span class='n'&gt;start&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s it?&lt;/p&gt;

&lt;p&gt;What did I just do?&lt;/p&gt;

&lt;p&gt;Installed poolparty, generated a pool spec(ification) file, and launched an autoscaling, auto-maintained, highly monitored and load-balanced cloud of instances ready and booting up.&lt;/p&gt;

&lt;p&gt;Yup! That&amp;#8217;s it. The last 4 months of work between 11pm and 3am and the last few weeks full-time thanks to CitrusByte.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve learned a lot in the past few months writing PoolParty, including erlang and a ton about DSLs. The code base is super and clean and only looks to get better and better. For more information, check out the site at: &lt;a href='http://poolpartyrb.com'&gt;http://poolpartyrb.com&lt;/a&gt;&lt;/p&gt;</content>
    </entry>
  
</feed>
