<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>Millarian - Home</title>
  <id>tag:www.millarian.com,2008:mephisto/</id>
  <generator version="0.7.3" uri="http://mephistoblog.com">Mephisto Noh-Varr</generator>
  <link href="http://www.millarian.com/feed/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://www.millarian.com/" rel="alternate" type="text/html"/>
  <updated>2008-08-13T01:00:10Z</updated>
  <entry xml:base="http://www.millarian.com/">
    <author>
      <name>curtis</name>
    </author>
    <id>tag:www.millarian.com,2008-08-13:284</id>
    <published>2008-08-13T00:59:00Z</published>
    <updated>2008-08-13T01:00:10Z</updated>
    <category term="Blog"/>
    <category term="Culture"/>
    <category term="Personal"/>
    <category term="Software"/>
    <category term="agile"/>
    <category term="integrum"/>
    <category term="pair programming"/>
    <link href="http://www.millarian.com/2008/8/13/an-experiment-in-remote-pairing" rel="alternate" type="text/html"/>
    <title>An Experiment in Remote Pairing</title>
<content type="html">
            &lt;p&gt;Recently, my employer, Integrum Technologies, has allowed me to work from home one day a week.  This is due to rising gasoline prices combined with my distance from work.  It&#8217;s great for me as I&#8217;ll save quite a bit of money each week as well as reduce my overall emissions.  However, this has presented us with a slight dilemma: how do we remote pair effectively?&lt;/p&gt;


	&lt;h2&gt;Pair Programming&lt;/h2&gt;


	&lt;p&gt;Integrum subscribes to a variety of Agile practices.  Perhaps the most prominent is working in pairs, a.k.a pair programming.  I was first introduced to the idea of pair programming around 1999 when I was at the University of Arizona &amp;lt;strike&gt;learning how to&amp;lt;/strike&gt; completing my BS. At that time we simply learned the theory from a professor, but didn&#8217;t actually try it.&lt;/p&gt;


	&lt;p&gt;About 16 months ago I was working in a contract position with my friend and &lt;a href=&quot;http://joshhuckabee.com&quot;&gt;phoenix Ruby on Rails developer&lt;/a&gt;, Josh.  Toward the end of our time at that contract we attempted pairing and found it worked really well.  When we were hired as contractors at Integrum we paired on a project form start to finish and then later, when we went full-time, we paired with the rest of the team members.  These positive experiences with pair programming have convinced me of it&#8217;s usefulness.&lt;/p&gt;


	&lt;p&gt;Now that I work a day from home, how will I pair with my various teammates?&lt;/p&gt;


	&lt;h2&gt;Remote Pairing&lt;/h2&gt;


	&lt;p&gt;I&#8217;m sure there are many, many ways to pair remotely, but here I will describe our first attempts at pairing remotely. It may help that we&#8217;re an all Mac shop, but we found it rather easy to get up and running quickly.&lt;/p&gt;


	&lt;h3&gt;Systems&lt;/h3&gt;


	&lt;p&gt;At home and at work we are using iMacs running &lt;span class=&quot;caps&quot;&gt;OS X 10&lt;/span&gt;.5.4.  The built in iSight and microphone are great for what we need right now.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Complaint:&lt;/strong&gt; Noise. It&#8217;s everywhere, seriously. The mic picks up everything.&lt;/p&gt;


	&lt;p&gt;&lt;img src=&quot;http://millarian.com/assets/2008/8/13/remote-pairing.jpg&quot; alt=&quot;Remote Pairing using iChat&quot; width=&quot;250px&quot; /&gt;&lt;/p&gt;


	&lt;h3&gt;iChat&lt;/h3&gt;


	&lt;p&gt;Yep, that&#8217;s right, iChat &#8211; video chat specifically.  We simply fire up our iChat instances using our Integrum Jabber IDs and request a video session.  Seriously, that&#8217;s all we do. The sound and video quality have been more than adequate for pair programming 7 hours a day.&lt;/p&gt;


	&lt;p&gt;Our first attempt at this was flawless, well&#8230; until it just stopped working that is. After a little research we found that I probably needed to open the right ports to maintain a consistent connection (this post on &lt;a href=&quot;http://www.ralphjohnsuk.dsl.pipex.com/page4.html&quot;&gt;iChat Routing Problems&lt;/a&gt; helped).  After I did that we haven&#8217;t had a problem.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Complaint:&lt;/strong&gt; Video chat over iChat can sometimes lag or have artifacts, especially during peak times.  It&#8217;s good enough, but would be nice if it were smoother and clearer.&lt;/p&gt;


	&lt;h3&gt;Screen Sharing&lt;/h3&gt;


	&lt;p&gt;While we&#8217;re pairing we share the screen on one of the computers.  When we&#8217;re done we turn it off.  This allows us to both have control of the keyboard/mouse if we need it and has helped immensely in making us feel like we&#8217;re both working. We take turns driving while the other gives advice or comments and we can smoothly transition from one driver to the other.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Complaint:&lt;/strong&gt; From my end the connection latency can sometimes hinder progress.  If I hit one of the Exposé areas of the screen and all the windows separate it can almost bring rendering on my side to a halt. There also seems to be a problem with select via the mouse.  When I click and drag to select some text the screen jumps to the top or bottom immediately, selecting all text between. I&#8217;ve had to get better with the keyboard.&lt;/p&gt;


	&lt;h2&gt;iSight + built-in microphone + iChat + Screen Sharing = Adequate Pairing&lt;/h2&gt;


	&lt;p&gt;I do have some complaints about the current setup, but I&#8217;m willing to keep going until we find better solutions. Perhaps we should try using Xbox Live as I&#8217;ve heard some people suggest.&lt;/p&gt;


	&lt;p&gt;I think the next steps are to secure some good microphone headsets that will reduce the noise and allow us to hear one another more clearly. Then we can look at replacing iChat and Screen Sharing.&lt;/p&gt;


	&lt;p&gt;As tools for remote pairing progress I can see more developers turning to this as a solution to save money and time while still retaining their communication with their team, especially with their pair. Pairing remotely can reduce cost for the developer and the company, save time and reduce emissions because the developer no longer commutes. And if their whole company is remote then all the better!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.millarian.com/">
    <author>
      <name>curtis</name>
    </author>
    <id>tag:www.millarian.com,2008-08-06:285</id>
    <published>2008-08-06T04:26:00Z</published>
    <updated>2008-08-06T04:31:03Z</updated>
    <category term="Blog"/>
    <category term="Culture"/>
    <category term="Personal"/>
    <category term="Software"/>
    <category term="agile"/>
    <category term="culture"/>
    <category term="integrum"/>
    <category term="pair programming"/>
    <link href="http://www.millarian.com/2008/8/6/everything-i-need-to-know-about-pair-programming-etiquette-i-learned-from-my-4-year-old" rel="alternate" type="text/html"/>
    <title>Everything I Need to Know About Pair Programming Etiquette, I Learned From My 4 Year Old</title>
<content type="html">
            &lt;p&gt;The folks at Integrum recently had a discussion about avoiding distractions while pair programming. We all know how many distractions there are in today&#8217;s world, everything from email to blogs to Twitter. It&#8217;s hard to not get distracted by all of these things, as they have become so prevalent in our lives.  We want to be in the know and there are many tools out there that let us do just that. They constantly run in the background or popup, they email us, they text message us, they &lt;strong&gt;demand&lt;/strong&gt; our attention&#8230;&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Look at me, I&#8217;m a tweet!!&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;No, I&#8217;m working.&lt;/em&gt;&lt;br /&gt;
&lt;strong&gt;But I&#8217;m a direct message from iJustine!&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;Well&#8230; okay, just this once!&lt;/em&gt;&lt;/p&gt;


	&lt;p&gt;But it&#8217;s not once, it&#8217;s all the time&#8230; constantly interrupting (seriously Justine, stop, I&#8217;m not going to respond). When someone is paying you for your time, they don&#8217;t want to be competing with all these distractions.&lt;/p&gt;


	&lt;p&gt;So what&#8217;s appropriate etiquette for a person working in a pair programming environment? I asked my 4 year old over dinner to see what he thought.&lt;/p&gt;


	&lt;h2&gt;The Interview&lt;/h2&gt;


	&lt;p&gt;me. &lt;em&gt;Do you know what it means to work in a pair?&lt;/em&gt;&lt;br /&gt;
ethan. &lt;strong&gt;When 2 people are working together.&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;me. &lt;em&gt;Good. What about focus? Do you know what that means?&lt;/em&gt;&lt;br /&gt;
ethan. &lt;strong&gt;Stay on track. Concentrate. Keep an eye on what you&#8217;re doing.&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;me. &lt;em&gt;How about respect, do you know what that means?&lt;/em&gt;&lt;br /&gt;
ethan. &lt;strong&gt;Be nice?&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;me. &lt;em&gt;Okay good, let&#8217;s get started.&lt;/em&gt;&lt;/p&gt;


	&lt;p&gt;me. &lt;em&gt;When you&#8217;re working with someone as a pair is it okay to check your email, instant messenger or twitter?&lt;/em&gt;&lt;br /&gt;
ethan. &lt;strong&gt;No.&lt;/strong&gt;&lt;br /&gt;
me. &lt;em&gt;Why is it not okay?&lt;/em&gt;&lt;br /&gt;
ethan. &lt;strong&gt;Cause we might lose focus.&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;me. &lt;em&gt;If we were working together and I was having trouble solving a problem, how could you help me?&lt;/em&gt;&lt;br /&gt;
ethan. &lt;strong&gt;I could tell you how to do it.&lt;/strong&gt;&lt;br /&gt;
me. &lt;em&gt;What if you didn&#8217;t know how to do it?&lt;/em&gt;&lt;br /&gt;
ethan. &lt;strong&gt;We could think of an idea and do it.&lt;/strong&gt;&lt;br /&gt;
me. &lt;em&gt;Should we think by ourselves?&lt;/em&gt;&lt;br /&gt;
ethan. &lt;strong&gt;No we should talk and hear&#8230; and choose what we want to do.&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;me. &lt;em&gt;If were working together and I get distracted, what should you do?&lt;/em&gt;&lt;br /&gt;
ethan. &lt;strong&gt;Daddy, what are you doing? Please pay attention.  You made me distracted and I don&#8217;t know what I was working on.&lt;/strong&gt;&lt;/p&gt;


	&lt;h2&gt; Conclusion&lt;/h2&gt;


	&lt;p&gt;This interview proves beyond a doubt that my 4 year old knows what it takes to work in a pair programming environment. He was polite, but forceful in his remonstration of my lack of focus. His answers were not overly complex, he kept it simple.  Which is as it should be since it really isn&#8217;t all that complex &#8211; there&#8217;s a reason the acronym &lt;span class=&quot;caps&quot;&gt;KISS&lt;/span&gt; exists.&lt;/p&gt;


	&lt;p&gt;So there you have it, think like a 4 year old and you&#8217;ll do just fine in any pair programming environment :)&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.millarian.com/">
    <author>
      <name>curtis</name>
    </author>
    <id>tag:www.millarian.com,2008-06-26:279</id>
    <published>2008-06-26T06:03:00Z</published>
    <updated>2008-06-26T06:09:48Z</updated>
    <category term="Personal"/>
    <category term="dance"/>
    <category term="ethan"/>
    <category term="family"/>
    <category term="video"/>
    <link href="http://www.millarian.com/2008/6/26/ethan-s-dance-recital" rel="alternate" type="text/html"/>
    <title>Ethan's Dance Recital</title>
<content type="html">
            &lt;p&gt;Ethan had a hip-hop, tap dance recital recently.  Here&#8217;s a video of him, he&#8217;s the fourth from the left in the front row with his hat backward.&lt;/p&gt;


&amp;lt;object height=&quot;350&quot; width=&quot;425&quot;&gt;
  &amp;lt;param&gt;&amp;lt;/param&gt;
  &amp;lt;embed src=&quot;http://www.youtube.com/v/vbxyHmh6kvg&quot; height=&quot;350&quot; width=&quot;425&quot;&gt;&amp;lt;/embed&gt;
&amp;lt;/object&gt;
          </content>  </entry>
  <entry xml:base="http://www.millarian.com/">
    <author>
      <name>curtis</name>
    </author>
    <id>tag:www.millarian.com,2008-06-12:271</id>
    <published>2008-06-12T06:24:00Z</published>
    <updated>2008-06-12T06:32:47Z</updated>
    <category term="Personal"/>
    <category term="Ruby on Rails"/>
    <category term="Software"/>
    <category term="gem"/>
    <category term="integrum"/>
    <category term="rails"/>
    <category term="ruby"/>
    <category term="rubyonrails"/>
    <category term="twitter"/>
    <category term="twitter_bot"/>
    <link href="http://www.millarian.com/2008/6/12/twitterbot-gem-released" rel="alternate" type="text/html"/>
    <title>TwitterBot Gem Released</title>
<content type="html">
            &lt;p&gt;Tonight, at one of our (in)famous &lt;a href=&quot;http://integrumbles.com/2008/5/1/hack-with-integrum&quot;&gt;hack-a-mania nights at Integrum&lt;/a&gt;, we released a gem for accessing Twitter through &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt;.  Read the full &lt;a href=&quot;http://integrumbles.com/2008/6/12/get-your-twitter-on&quot;&gt;Integrum release article&lt;/a&gt; and then go get hacking!&lt;/p&gt;


	&lt;p&gt;I&#8217;m excited because not only did I have a hand in the creation of the twitter_bot gem, but I also helped in the development of &lt;a href=&quot;http://twitterprops.com&quot;&gt;Props &#38; Drops&lt;/a&gt;, aka. TwitterProps, a Twitter application that uses this gem.  So If you want to see it in action, give someone props (or drops) via twitter:&lt;/p&gt;


	&lt;p&gt;props @username for doing something cool&lt;/p&gt;


	&lt;p&gt;OR&lt;/p&gt;


	&lt;p&gt;drops @username for being a jerk&lt;/p&gt;


	&lt;p&gt;Go try it out!&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;DISCLAIMER&lt;/span&gt;&lt;/strong&gt;: TwitterProps and twitter_bot only work when Twitter has their track feature enabled, which recently has been scarce&#8230;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.millarian.com/">
    <author>
      <name>curtis</name>
    </author>
    <id>tag:www.millarian.com,2008-05-27:263</id>
    <published>2008-05-27T06:33:00Z</published>
    <updated>2008-05-27T06:42:59Z</updated>
    <category term="Personal"/>
    <category term="Ruby on Rails"/>
    <category term="Software"/>
    <category term="integrum"/>
    <category term="portland"/>
    <category term="railsconf"/>
    <category term="railsconf2008"/>
    <category term="rubyonrails"/>
    <link href="http://www.millarian.com/2008/5/27/railsconf-2008" rel="alternate" type="text/html"/>
    <title>RailsConf 2008</title>
<content type="html">
            &lt;p&gt;I&#8217;ll be heading to &lt;a href=&quot;http://en.oreilly.com/rails2008&quot;&gt;RailsConf 2008&lt;/a&gt; this week in beautiful Portland, OR.  I can&#8217;t wait to be in one of my favorite cities again.  Especially because I&#8217;ll not only be enjoying the city, but also learning from and interacting with the Rails community.  If you&#8217;re going to be in Portland this weekend, then feel free to contact me.&lt;/p&gt;


	&lt;p&gt;This trip is brought to me by the &lt;a href=&quot;http://integrumtech.com&quot;&gt;awesomest rails development shop&lt;/a&gt;, Integrum! And if you see any of the other Integremlins there, say &#8220;Hi&#8221;, you never know what could happen. That&#8217;s what I did last year and now I get to work there building amazing Rails applications every day. Oh, and we have stickers.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.millarian.com/">
    <author>
      <name>curtis</name>
    </author>
    <id>tag:www.millarian.com,2008-04-29:262</id>
    <published>2008-04-29T02:27:00Z</published>
    <updated>2008-04-29T02:29:24Z</updated>
    <category term="Culture"/>
    <category term="Personal"/>
    <category term="Ruby on Rails"/>
    <category term="Software"/>
    <category term="Startup"/>
    <category term="goruco2008"/>
    <category term="ruby"/>
    <link href="http://www.millarian.com/2008/4/29/goruco-2008-wrap-up" rel="alternate" type="text/html"/>
    <title>GoRuCo 2008 Wrap-up</title>
<content type="html">
            &lt;p&gt;As I stated in a previous post, I attended the &lt;a href=&quot;http://2008.goruco.com&quot;&gt;Gotham Ruby Conference&lt;/a&gt; this past weekend in &lt;span class=&quot;caps&quot;&gt;NYC&lt;/span&gt;.  It was a great time with many interesting talks.  The weather was amazing as well.  I don&#8217;t want to spend a lot of time rehashing the conference because you can view the &lt;a href=&quot;http://goruco2008.confreaks.com&quot;&gt;GoRuCo 2008 presentations&lt;/a&gt; for yourself, but I did want to mention a few things I got out of it.&lt;/p&gt;


	&lt;p&gt;Bryan Helmkamp gave an interesting introduction to story driven development using rspec and story runner.  This is something we&#8217;ve been talking about at Integrum, but haven&#8217;t had a chance to use in a real setting yet.  Derek and I got to spend some time at the &lt;a href=&quot;http://weplay.com&quot;&gt;WePlay&lt;/a&gt; offices (where Bryan works) and they showed us some of the stuff they&#8217;re doing, including using story runner.  It was awesome to hear about their experiences and hopefully we&#8217;ll get a chance to use it soon.&lt;/p&gt;


	&lt;p&gt;Next up was &#8220;Archaeopteryx: A Ruby &lt;span class=&quot;caps&quot;&gt;MIDI&lt;/span&gt; Generator.&#8221; I was skeptical about this one, but was blown away by Giles Bowkett&#8217;s presentation. From recounting his life adventures, including a &#8220;psycho throwing rocks at his dad until he threatened him with a piece of rebar&#8221; to calling venture capitalists &#8220;weasel-brained muppet fuckers&#8230; they&#8217;re not fools, they&#8217;re liars.&#8221;  He kept the crowd well entertained, but threw in some really interesting and well-delivered points about startups and life.  It is well worth watching.&lt;/p&gt;


	&lt;p&gt;Another one that really stood out was Ryan Davis&#8217; presentation about &#8220;Hurting code for fun and profit.&#8221; He had a lot of really great things to say about being a developer, so go watch it already!&lt;/p&gt;


	&lt;p&gt;These speakers helped me to become aware of a few things:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;I don&#8217;t read enough.  Ryan mentioned that the average developer reads 1 book a year. Is one book a month really so hard?&lt;/li&gt;
		&lt;li&gt;I don&#8217;t hurt my code enough.  I don&#8217;t use flog or heckle consistently and I often don&#8217;t take the time to correct code that I know should be improved.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;I definitely have some things to work on&#8230; how about you?&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.millarian.com/">
    <author>
      <name>curtis</name>
    </author>
    <id>tag:www.millarian.com,2008-04-23:259</id>
    <published>2008-04-23T20:58:00Z</published>
    <updated>2008-04-23T21:02:05Z</updated>
    <category term="Ruby on Rails"/>
    <category term="Software"/>
    <category term="caching"/>
    <category term="javascript"/>
    <category term="rails"/>
    <category term="ruby"/>
    <category term="rubyonrails"/>
    <link href="http://www.millarian.com/2008/4/23/caching-locale-specific-dynamic-javascript-files" rel="alternate" type="text/html"/>
    <title>Caching Locale-specific Dynamic JavaScript Files</title>
<content type="html">
            &lt;p&gt;I was recently inspired to create some cached, dynamic JavaScript files for a project I am working on after watching &lt;a href=&quot;http://railscasts.com&quot;&gt;Ryan Bates Railscasts&lt;/a&gt; episodes 88 and 89.&lt;/p&gt;


	&lt;p&gt;The basic concept is to create a JavaScript controller that dynamically renders some JavaScript file(s).  This allows you to take advantage of &lt;span class=&quot;caps&quot;&gt;ERB&lt;/span&gt; in your JavaScript files.  However, this can become slow as every request for that JavaScript file must be processed by Rails.  In episode 89, Ryan showed how to cache the dynamic JavaScript file to improve performance.  These episodes were great, except I had one problem&#8230; The dynamic portion of the JavaScript files I was working with were translated strings.&lt;/p&gt;


	&lt;p&gt;This meant that I couldn&#8217;t just cache the JavaScript file because the translation would need to be different based on the locale setting of the user.  It turns out there&#8217;s a pretty easy solution to this.  If you follow the lessons from the episodes then you will have a general caching mechanism for the dynamic JavaScript files.  Assuming you are using a translation mechanism like &lt;a href=&quot;http://www.globalize-rails.org&quot;&gt;Globalize&lt;/a&gt; then you have access to a locale for the current session.  Simply use this locale when including the JavaScript file (e.g., dynamic_states):&lt;/p&gt;


&lt;strong&gt;Your layout file&lt;/strong&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&amp;lt;%= javascript_include_tag &quot;#{locale}/dynamic_states&quot; -%&amp;gt;&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;This will try to include the dynamic_states.js file from the javascripts/locale directory where locale is something like en, es, zh, etc.  The only other thing to do is define a custom route to handle this new pattern.&lt;/p&gt;


&lt;strong&gt;routes.rb&lt;/strong&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;map.connect ':controller/:locale/:action.:format'&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;That&#8217;s it.  You should now have locale-specific dynamic JavaScript files.  For what I was working on, I also nested the locale directory within another directory (e.g., cache) just for ease of removal in case you need to wipe out the entire cache of dynamic JS.&lt;/p&gt;


	&lt;h3&gt;Resources&lt;/h3&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://railscasts.com/episodes/88&quot;&gt;Dynamic Select Menus&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://railscasts.com/episodes/89&quot;&gt;Page Caching&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;
          </content>  </entry>
  <entry xml:base="http://www.millarian.com/">
    <author>
      <name>curtis</name>
    </author>
    <id>tag:www.millarian.com,2008-04-16:255</id>
    <published>2008-04-16T05:02:00Z</published>
    <updated>2008-04-16T05:10:47Z</updated>
    <category term="Personal"/>
    <category term="Ruby on Rails"/>
    <category term="Software"/>
    <category term="goruco"/>
    <category term="rails"/>
    <category term="ruby"/>
    <category term="rubyonrails"/>
    <link href="http://www.millarian.com/2008/4/16/goruco-2008" rel="alternate" type="text/html"/>
    <title>GoRuCo 2008</title>
<content type="html">
            &lt;p&gt;Next week I will be traveling to New York for the &lt;a href=&quot;http://2008.goruco.com&quot;&gt;Gotham Ruby Conference&lt;/a&gt; courtesy of my favorite &lt;a href=&quot;http://integrumtech.com&quot;&gt;Ruby on Rails consulting company in Phoenix&lt;/a&gt;.  I&#8217;ll be attending with Integrum&#8217;s resident &lt;a href=&quot;http://derekneighbors.com&quot;&gt;Agile methodology expert&lt;/a&gt;.  If you&#8217;re in NY or attending the conference, be sure to look us up &#8211; see my &lt;a href=&quot;http://millarian.com/about&quot;&gt;contact information&lt;/a&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.millarian.com/">
    <author>
      <name>curtis</name>
    </author>
    <id>tag:www.millarian.com,2008-04-11:253</id>
    <published>2008-04-11T20:40:00Z</published>
    <updated>2008-04-20T05:42:24Z</updated>
    <category term="Ruby on Rails"/>
    <category term="Software"/>
    <category term="counter_cache"/>
    <category term="rubyonrails"/>
    <link href="http://www.millarian.com/2008/4/11/rails-counter_cache-problem" rel="alternate" type="text/html"/>
    <title>Rails counter_cache problem</title>
<content type="html">
            &lt;p&gt;I ran into a strange Ruby on Rails &lt;a href=&quot;http://api.rubyonrails.com/classes/ActiveRecord/Associations/ClassMethods.html#M001105&quot;&gt;counter_cache&lt;/a&gt; problem today. Given the following example models:&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;class Poll &amp;lt; ActiveRecord::Base
  has_many :poll_choices
  has_many :poll_votes
end

class PollChoice &amp;lt; ActiveRecord::Base
  belongs_to :poll
  has_many :poll_votes
end

class PollVote &amp;lt; ActiveRecord::Base
  belongs_to :poll, :counter_cache =&amp;gt; :votes_count
  belongs_to :poll_choice, :counter_cache =&amp;gt; :votes_count
end&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;We want to ensure that the Poll maintains the total vote count.  We also want the PollChoice to maintain the votes for that specific choice.  In our controller we might be tempted to add a PollVote through either the Poll or PollChoice association with PollVote, but that&#8217;s where the problem appears.&lt;/p&gt;


	&lt;p&gt;It turns out that both of the following approaches will only update the votes_count for one or the other instance, but not both.&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;@poll.poll_votes.create(:poll_choice_id =&amp;gt; @poll_choice.id)&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;OR&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;@poll_choice.poll_votes.create(:poll_id =&amp;gt; @poll.id)&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Instead, if we create the PollVote directly we will get the desired result of both the Poll and PollChoice having their votes_count updated appropriately.&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;PollVote.create(:poll_id =&amp;gt; @poll.id, :poll_choice_id =&amp;gt; @poll_choice.id)&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Strange behavior or expected result?&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Another solution is to not assign using the ID, but instead assign using the object itself.&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;@poll.poll_votes.create(:poll_choice =&amp;gt; @poll_choice)&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;OR&lt;/p&gt;


&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;@poll_choice.poll_votes.create(:poll =&amp;gt; @poll)&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;A quick test showed this worked as well. (Thanks &lt;a href=&quot;http://unboundimagination.com/&quot;&gt;Arya A&lt;/a&gt;)&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.millarian.com/">
    <author>
      <name>curtis</name>
    </author>
    <id>tag:www.millarian.com,2008-03-23:252</id>
    <published>2008-03-23T20:45:00Z</published>
    <updated>2008-03-24T04:09:54Z</updated>
    <category term="Blog"/>
    <category term="Personal"/>
    <category term="fishing"/>
    <link href="http://www.millarian.com/2008/3/23/first-fishing-trip-with-ethan" rel="alternate" type="text/html"/>
    <title>First Fishing Trip with Ethan</title>
<content type="html">
            &lt;p&gt;This weekend my Dad and I took my four year old, Ethan, on his first fishing trip.  He had a blast and even caught two fish!&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/curtm95/sets/72157604225068977/&quot;&gt;Ethan&#8217;s First Fishing Trip Photos&lt;/a&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.millarian.com/">
    <author>
      <name>curtis</name>
    </author>
    <id>tag:www.millarian.com,2008-03-23:248</id>
    <published>2008-03-23T17:07:00Z</published>
    <updated>2008-03-23T17:12:19Z</updated>
    <category term="Blog"/>
    <category term="Personal"/>
    <category term="backyard"/>
    <link href="http://www.millarian.com/2008/3/23/creating-a-backyard" rel="alternate" type="text/html"/>
    <title>Creating a Backyard</title>
<content type="html">
            &lt;p&gt;My latest project around the house is to turn our dirt-pit of a backyard into a nice space for Kelly and I to relax and for the kids to play.  We started last weekend and should be finished by late April. We&#8217;re doing it all ourselves with the help of my Dad and whoever else wants to help.  I&#8217;ve created a Flickr set to follow the progress of the backyard over time.&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://flickr.com/photos/curtm95/sets/72157604137543907/&quot;&gt;Backyard Progress on Flickr&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Let me know what you think!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.millarian.com/">
    <author>
      <name>curtis</name>
    </author>
    <id>tag:www.millarian.com,2008-03-08:247</id>
    <published>2008-03-08T08:33:00Z</published>
    <updated>2008-03-08T08:36:45Z</updated>
    <category term="Personal"/>
    <category term="Ruby on Rails"/>
    <category term="Software"/>
    <category term="Startup"/>
    <category term="conference"/>
    <category term="integrum"/>
    <category term="sxsw"/>
    <link href="http://www.millarian.com/2008/3/8/integrum-trip-sxsw-day-1" rel="alternate" type="text/html"/>
    <title>Integrum Trip - SxSW day 1</title>
<content type="html">
            &lt;p&gt;The first real day of the conference.  I&#8217;m not gonna lie to you, the first day seemed pretty light.  Registration was from 10:00am until 2:30pm with no panels, sessions, etc. scheduled during that time.&lt;/p&gt;


	&lt;p&gt;We got to the convention center in Austin at about 11:00am, registered with ease and proceeded to &lt;a href=&quot;http://www.bdrileys.com&quot;&gt;B. D. Riley&#8217;s Irish Pub&lt;/a&gt; for an Austin Refresh meetup.  Not wanting to partake in the suds before noon, &lt;a href=&quot;http://workingwithrails.com/person/7441-matthew-gist&quot;&gt;Gist&lt;/a&gt; and I headed for Starbucks for some early afternoon pick-me-up.&lt;/p&gt;


	&lt;p&gt;After the Refresh meeting we headed back to the convention center to prepare for the first panel of the day.  Then a strange thing happened&#8230; While we were shooting the shit, Gist comes up with a great idea for a simple application for Twitter.  We laugh about it, throw some ideas around and viola we have the beginnings of a new project.  After taking a poll amongst the others, we decided to devote a triple to working on a first release &#8211; me, &lt;a href=&quot;http://workingwithrails.com/person/6973-jade-meskill&quot;&gt;Jade&lt;/a&gt;, and Gist.&lt;/p&gt;


	&lt;p&gt;While Gist drew some sketches, Jade and I borrowed a laptop from &lt;a href=&quot;http://workingwithrails.com/person/7204-matthew-heidemann&quot;&gt;Heidmo&lt;/a&gt; to begin development. Just a few short hours later we have our first version of an app we are calling &#8220;Props and Drops&#8221;.  It is a way for people to give props (or drops) via Twitter.  It&#8217;s pretty easy to get started, just visit &lt;a href=&quot;http://props.integrumtech.com&quot;&gt;http://props.integrumtech.com&lt;/a&gt; and click &#8216;About&#8217; to get started.  It also has a nifty iPhone interface, so if you&#8217;re lucky enough to have an iPhone check it out!&lt;/p&gt;


	&lt;p&gt;It was really awesome to see an idea progress so quickly.  Here is a brief timeline of the day (totally estimated):&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;1:00pm &#8211; Mother jokes&lt;/li&gt;
		&lt;li&gt;1:07pm &#8211; Gist mentions way to vote people up or down via Twitter&lt;/li&gt;
		&lt;li&gt;1:08pm &#8211; Someone says props&lt;/li&gt;
		&lt;li&gt;1:12pm &#8211; More mother jokes&lt;/li&gt;
		&lt;li&gt;1:17pm &#8211; The idea turns serious and Jade, Gist and I volunteer to build it in the few hours before the 5:00pm panel&lt;/li&gt;
		&lt;li&gt;1:21pm &#8211; Another mom joke&#8230;&lt;/li&gt;
		&lt;li&gt;1:35pm &#8211; Gist sketches interface&lt;/li&gt;
		&lt;li&gt;1:30pm to 3:30pm &#8211; Jade controls laptop while I pair and we write the app in under 2 hours&lt;/li&gt;
		&lt;li&gt;3:30pm to 4:52pm &#8211; Deployment takes about another hour, including minor tweaks discovered on deployment&lt;/li&gt;
		&lt;li&gt;5:00pm &#8211; People begin to use &#8216;Props and Drops&#8217; during the 5:00pm panel&lt;/li&gt;
		&lt;li&gt;5:45pm &#8211; Strebel gains a substantial props lead over all others&lt;/li&gt;
		&lt;li&gt;6:10pm &#8211; High fives are exchanged amongst Integremlins&lt;/li&gt;
		&lt;li&gt;6:11pm &#8211; Mother jokes resume&lt;/li&gt;
		&lt;li&gt;6:40pm to 2:00am &#8211; Alcohol is consumed&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;What a completely awesome day.  Thanks to Jade and Gist for kicking ass to get this app out there and ready for use.  Thanks to everyone already partaking of the Twitter Props and Drops goodness.  Send us feature requests!!&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://props.integrumtech.com&quot;&gt;Props and Drops&lt;/a&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.millarian.com/">
    <author>
      <name>curtis</name>
    </author>
    <id>tag:www.millarian.com,2008-03-06:246</id>
    <published>2008-03-06T08:04:00Z</published>
    <updated>2008-03-08T08:05:32Z</updated>
    <category term="Culture"/>
    <category term="Personal"/>
    <category term="Politics"/>
    <category term="Ruby on Rails"/>
    <category term="Software"/>
    <category term="conference"/>
    <category term="integrum"/>
    <category term="sxsw"/>
    <link href="http://www.millarian.com/2008/3/6/integrum-trip-sxsw-day-0" rel="alternate" type="text/html"/>
    <title>Integrum trip - SxSW Day 0</title>
<content type="html">
            &lt;p&gt;What a long day!  We traveled by RV from Phoenix, AZ to Austin, TX in just about 19 hours.  Not record time by any means, but we had a blast.  &lt;a href=&quot;http://workingwithrails.com/person/8273-josh-huckabee&quot;&gt;Josh&lt;/a&gt; provided the RV and both he and &lt;a href=&quot;http://workingwithrails.com/person/7439-derek-neighbors&quot;&gt;Derek&lt;/a&gt; drove.&lt;/p&gt;


	&lt;p&gt;Highlights of the trip include stopping to discover the mysteries of &#8216;The Thing&#8217;, talking politics and religion with &lt;a href=&quot;http://workingwithrails.com/person/6973-jade-meskill&quot;&gt;Jade&lt;/a&gt; and &lt;a href=&quot;http://ericalucci.com&quot;&gt;Erica&lt;/a&gt;, &lt;a href=&quot;http://workingwithrails.com/person/7484-curtis-edmond&quot;&gt;Curtis&lt;/a&gt; hacking on a new side project and me hacking on a side project (details soon).&lt;/p&gt;


	&lt;p&gt;It was really nice to spend some quality time with some of my co-workers outside of work and the pressures and demands of customers.  Looking forward to participating in SxSW!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.millarian.com/">
    <author>
      <name>curtis</name>
    </author>
    <id>tag:www.millarian.com,2008-02-11:238</id>
    <published>2008-02-11T09:30:00Z</published>
    <updated>2008-02-12T18:03:54Z</updated>
    <link href="http://www.millarian.com/2008/2/11/wireless-amber-alerts" rel="alternate" type="text/html"/>
    <title>Wireless Amber Alerts</title>
<content type="html">
            &lt;p&gt;Sign up to receive Amber Alerts in your area via text message. It’s easy and (if you have unlimited text messages) free. The site asks for your cell phone number and up to five zip codes in which you would like to receive alerts.&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://www.wirelessamberalerts.org/&quot;&gt;Wireless Amber Alerts&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;It’s a very interesting use of &lt;span class=&quot;caps&quot;&gt;SMS&lt;/span&gt; text messages. I wonder what impact this will have on nabbing child abductors; I hope someone is studying that :)&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://www.millarian.com/">
    <author>
      <name>curtis</name>
    </author>
    <id>tag:www.millarian.com,2008-02-09:237</id>
    <published>2008-02-09T22:20:00Z</published>
    <updated>2008-02-09T22:22:03Z</updated>
    <category term="Personal"/>
    <category term="Ruby on Rails"/>
    <category term="Software"/>
    <category term="Startup"/>
    <category term="contracting"/>
    <category term="experience"/>
    <category term="integrum"/>
    <category term="programming"/>
    <category term="railsconf"/>
    <category term="reflection"/>
    <category term="ruby"/>
    <category term="rubyonrails"/>
    <link href="http://www.millarian.com/2008/2/9/integrum-and-me" rel="alternate" type="text/html"/>
    <title>Integrum and me</title>
<content type="html">
            &lt;p&gt;In August 2006, I left my employer to embark on a journey to change my skill set and mind set.  My previous employer was a very large defense contractor who offered a decent workplace, average salary, excellent benefits, and, of course, job stability.  I announced to my friends and family that I would be leaving this employer, returning to Arizona and leaving the ranks of the employed for an undetermined amount of time.  It seemed ludicrous to most people at the time, myself included.  I was sure of only one thing at that time: I intended to refocus my career goals in an entirely different direction.&lt;/p&gt;


	&lt;h2&gt;Unemployment&lt;/h2&gt;


	&lt;p&gt;I had attempted to take my career in a different direction while still working, but I found that after 60-80 hour work weeks, a &lt;a href=&quot;http://cs.fullerton.edu&quot;&gt;Master&#8217;s program in Computer Science&lt;/a&gt; and a wife and two young children, I didn&#8217;t have the energy.  Voluntary unemployment was a calculated risk that I could learn what I needed to enter my newly chosen career path before I was forced to declare bankruptcy.&lt;/p&gt;


	&lt;p&gt;Unemployment is not really as bad as I thought it would be.  I was able to spend time learning the things I was truly interested in, including Ruby on Rails. I spent a lot of time with my family and generally enjoyed myself.  I found that I could actually work longer with more focus that I ever did at a previous employer without feeling tired or burnt out.&lt;/p&gt;


	&lt;p&gt;Eventually, our finances drained to the point of alarm and I began to look for a professional position working with Ruby on Rails.&lt;/p&gt;


	&lt;h2&gt;Contracting&lt;/h2&gt;


	&lt;p&gt;Since early 2007, I have been contracting my Ruby on Rails services to various employers.  While this was lucrative it was also very frustrating.  During that time I learned a little about myself and the environment in which I work best.  I invest myself in what I do and as a contractor I found it hard to not get involved beyond what was required of me.&lt;/p&gt;


	&lt;p&gt;My first contract position was a fixed bid contract that was referred to me by my brother. It allowed me to choose the technology and create a simple student tracking system for a wellness center.  It was deployed internally in January of 2007 and as far as I know it is still being used.  My first real, deployed and used application!  With that experience under my belt, I placed my resume on various websites advertising my interest in Ruby on Rails development positions.  In a few short days I was contacted.&lt;/p&gt;


	&lt;p&gt;My second contracting position was an 18 month contract to create an &lt;acronym title=&quot;Electronic Medical Record&quot;&gt;EMR&lt;/acronym&gt; system for a local, privately held behavioral health organization.  This was the big test for me to gauge if my calculated risk would pay off.  Unlike the previous contract I was interviewed about my knowledge of Ruby on Rails, databases and Agile development.  Two weeks after advertising my resume, I was hired to work professionally with Ruby on Rails.  I learned a lot during my time contracting for that company, including how much I didn&#8217;t know, and met a great &lt;a href=&quot;http://joshhuckabee.com&quot;&gt;Phoenix Ruby on Rails developer&lt;/a&gt;, &lt;a href=&quot;http://www.workingwithrails.com/person/8273-josh-huckabee&quot;&gt;Josh Huckabee&lt;/a&gt;. I also attended my first RailsConf in Portland, OR in May with Josh and a few of the full-time employees.&lt;/p&gt;


	&lt;p&gt;Attending RailsConf was a real turning point for me, in many ways.  Part of what I was missing as a lone wolf developer was the sense of community and interaction with other Rubyists &#8211; I met some great people at RailsConf!  Upon returning, I began attending the &lt;a href=&quot;http://rubyaz.org/groups/prug/&quot;&gt;Ruby User&#8217;s Group in Phoenix&lt;/a&gt;, &lt;a href=&quot;http://phxrails.com&quot;&gt;Phoenix Rails Group&lt;/a&gt; and &lt;a href=&quot;http://refreshphoenix.org&quot;&gt;Refresh Phoenix&lt;/a&gt; to connect at a local level with other enthusiastic Rubyists, developers and designers.&lt;/p&gt;


	&lt;p&gt;This was the beginning of the end of my time at my current contract.  As I discovered more about agile Ruby on Rails projects I realized that it would be highly improbable to influence the current direction of my contract employer.  For three more months Josh and I attempted to influence the direction of our project and rescue it from impending failure.  In August, we made our exit and, because of RailsConf and local networking, we began contracting for a &lt;a href=&quot;http://integrumtech.com&quot;&gt;Phoenix Ruby on Rails consulting&lt;/a&gt; company, Integrum Technologies.&lt;/p&gt;


	&lt;h2&gt;Integrum and Me&lt;/h2&gt;


	&lt;p&gt;In January 2008, Josh and I became full-time &lt;a href=&quot;http://integrumbles.com/2008/1/3/integrum-is-growing&quot;&gt;Integrum code monkeys&lt;/a&gt;.  Integrum is an amazing place to work and completely unlike any company I&#8217;ve worked for.  There is a level of openness and transparency that I have only read and dreamed about.  Of course, Integrum is not perfect, but we are working hard to constantly improve ourselves while still having a blast.  My wife constantly reminds me that &lt;strong&gt;Integrum is fueled by fun&lt;/strong&gt; :)  I believe that this year will be an important one for our company.  You can keep up on what&#8217;s going on with us by reading, or subscribing to, the &lt;a href=&quot;http://integrumbles.com&quot;&gt;Integrum blog&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;A year and a half has passed since I resigned my comfortable, full-time position in California.  In that time I have accomplished more that I could have hoped for and am happier than I&#8217;ve been in some time &#8211; my calculated risk paid off.&lt;/p&gt;
          </content>  </entry>
</feed>
