<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Passionate Development]]></title>
  <link href="http://passionatedevelopment.com/atom.xml" rel="self"/>
  <link href="http://passionatedevelopment.com/"/>
  <updated>2012-02-17T23:28:05+11:00</updated>
  <id>http://passionatedevelopment.com/</id>
  <author>
    <name><![CDATA[Felix Tjandrawibawa]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Flash Builder Dark Background]]></title>
    <link href="http://passionatedevelopment.com/blog/2012/02/17/flash-builder-dark-background/"/>
    <updated>2012-02-17T22:09:00+11:00</updated>
    <id>http://passionatedevelopment.com/blog/2012/02/17/flash-builder-dark-background</id>
    <content type="html"><![CDATA[<p>Ok, let me start by saying this - I hate working with <a href="http://www.adobe.com/products/flash-builder.html">Flash Builder</a>.
Being an <a href="http://eclipse.org">Eclipse</a> based software - of course it is bound to be slow and resource hungry.
I can only get it to work just below my frustration threshold after I installed it on an SSD.</p>

<p>Now that being said - this week, I managed to get a little bit happier by installing a dark background/theme.</p>

<p>First of all - I came across this plugin (and site) that has a repository of themes for Eclipse, the site is
<a href="http://www.eclipsecolorthemes.org/">Eclipse Color Themes</a>.
Follow the instruction on how to install the plugin
to your Eclipse/Flash Builder: <a href="http://www.eclipsecolorthemes.org/?view=plugin">plugin install</a></p>

<p>That bit is straight forward - now if you try to apply any of the dark themes, you&#8217;d notice that something isn&#8217;t quite
right:</p>

<p><img src="http://passionatedevelopment.com/files/2012/02/17/before.png" alt="" /></p>

<p>Now, I&#8217;m not sure, why the syntax highlighting isn&#8217;t updated straight away. But fortunatelly this is an
easy fix. Open Preferences and search for the word syntax, on the left pane - select Flash Builder > Editors > Syntax Coloring.
Go to MXML on the right pane, and go through the elements and hit Apply button - this somehow activates the
syntax coloring of the theme.</p>

<p><img src="http://passionatedevelopment.com/files/2012/02/17/syntax.png" alt="" /></p>

<p>Final result - a less sucky Flash Builder!
<img src="http://passionatedevelopment.com/files/2012/02/17/after.png" alt="" /></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Learning Notes #1]]></title>
    <link href="http://passionatedevelopment.com/blog/2012/02/08/learning-notes-number-1/"/>
    <updated>2012-02-08T08:10:00+11:00</updated>
    <id>http://passionatedevelopment.com/blog/2012/02/08/learning-notes-number-1</id>
    <content type="html"><![CDATA[<p>Last week at work, we had to rewrite the reporting module for our application,
as there were some issues with the old report and the complexity of the code
makes it hard to work out the cause of the issues.</p>

<p>Firstly, we pair programmed until we worked out the general direction for the
implementation and then I took over the implementation while my colleague
working on investigating the data source.</p>

<p>This report work forced me to learn more about ActiveRecord scope.
What&#8217;s an ActiveRecord scope? According to Rails guide:</p>

<blockquote><p>Scoping allows you to specify commonly-used ARel queries which can be
referenced as method calls on the association objects or models.
With these scopes, you can use every method previously covered such as
where, joins and includes.
All scope methods will return an
ActiveRecord::Relation object which will allow for
further methods (such as other scopes) to be called on it.</p></blockquote>

<p>These two Rails guides on ActiveRecord helped me quite a bit:</p>

<ul>
<li><a href="http://guides.rubyonrails.org/active_record_querying.html">Active Record Querying</a></li>
<li><a href="http://guides.rubyonrails.org/association_basics.html">Active Record Association</a></li>
</ul>


<p>Given that our report query is a little bit more complex than usual - it was
quite difficult to get the scoping right. But after a lot of trial and error and
re-reading the guides so many times - I managed to get the code that I am happy with.</p>

<p>I also found out about HashWithIndifferentAccess - by accident..
Having worked with Rails for awhile, I was under the impression that a string key
for a hash is interchangable with a symbol key.</p>

<p>This is where I got Ruby and Rails mixed up. Lucky before I spent too much time
ripping out my hairs - my colleague told me that I was thinking about Rails&#8217;
special hash not Ruby&#8217;s normal hash. This magical hash is called
<a href="http://as.rubyonrails.org/classes/HashWithIndifferentAccess.html">HashWithIndifferentAccess</a>.
Thank Rails. Anyway code speaks a thousand word:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>&gt;hash = { "hello" =&gt; "world" }
</span><span class='line'>&gt;p hash["hello"]
</span><span class='line'>=&gt; "world"
</span><span class='line'>&gt;p hash[:hello]
</span><span class='line'>=&gt;nil
</span><span class='line'>&gt;hash = HashWithIndifferentAccess.new
</span><span class='line'>&gt;hash["hello"] = "world"
</span><span class='line'>&gt;p hash[:hello]
</span><span class='line'>=&gt; "world"</span></code></pre></td></tr></table></div></figure>


<p></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Realization]]></title>
    <link href="http://passionatedevelopment.com/blog/2012/01/31/realization/"/>
    <updated>2012-01-31T23:35:00+11:00</updated>
    <id>http://passionatedevelopment.com/blog/2012/01/31/realization</id>
    <content type="html"><![CDATA[<p>I came to the realization that I am a long way away from where I am now to where I want
to be with regards to mastering Ruby.</p>

<!-- more -->


<p>There are just so much to learn and the wealth of information out there can be overwhelming sometimes.
It&#8217;s not just the language that I need to learn but also the pratices (BDD, TDD), the frameworks
(Rails - y u so black magic?), patterns (Ruby is NOT Java).</p>

<p>But that&#8217;s OK - this journey will take me longer than I expected and I can live with that.
What I really need is focus and ignore all distractions.</p>

<p>What are the distractions? Latest trends - looking at you JS stuffs - Node, CoffeeScript
and friends. Information overload - I have taken steps to fix this:</p>

<ul>
<li>Unsubscribed from ColdFusion bloggers feed and mailing lists - not relevant for me at this point of time</li>
<li>Trim the noise from Twitter by unfollowing people - wasted a lot of time reading tweets that I don&#8217;t care from people that I don&#8217;t know. I intend to cap
my follow number to 100.</li>
<li>Filtering Ruby information to my level - for example: some of Ruby Rogues episodes (metaprogramming) is just beyond my comprehension at this time.</li>
</ul>


<p>Focus on what specifically? Well, Ruby of course!
Goalwise, this year:</p>

<ul>
<li>Getting better at TDD especially getting better at writing specs</li>
<li>Understanding Ruby and OOP in Ruby better</li>
<li>Understanding Rails better especially ActiveRecord (maybe enroll in owning rails course)</li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[From WordPress to Octopress]]></title>
    <link href="http://passionatedevelopment.com/blog/2012/01/22/from-wordpress-to-octopress/"/>
    <updated>2012-01-22T22:05:00+11:00</updated>
    <id>http://passionatedevelopment.com/blog/2012/01/22/from-wordpress-to-octopress</id>
    <content type="html"><![CDATA[<p>Just switched from <a href="http://wordpress.com">WordPress</a> to a static blogging platform called
<a href="http://octopress.org">Octopress</a>. Kind of taking
the opposite direction from <a href="http://passionatedevelopment.com/blog/2011/02/08/giving-some-long-overdue-love-for-wordpress/">last year</a>
when I was loving WordPress more.</p>

<!-- more -->


<p>As I have been trying to blog during my commute, I found that WordPress blogging with
little internet access is just painful. Main culprit is the bloated wp-admin and oh
that dreadful TinyMCE editor.</p>

<p>Why can&#8217;t I just use an offline editor? Well, I can - in fact back on my Windows days,
<a href="http://explore.live.com/windows-live-essentials-other-programs?T1=t5">Live Writer</a> is the primary tool for my blogging. But I am not on Windows anymore, and I
couldn&#8217;t see anything on Mac that comes close to Live Writer.</p>

<p>WordPress has just become too complicated and too distracting to me (with thousands
of plugins and themes to choose from). Also I got lots of spammers trying to find some holes
on my WordPress installation - evidence: 80% of traffic goes to wp-comments.php.</p>

<p>I then decided to give Octopress a go. Some things that I like about Octopress or static blogging
platform in general:</p>

<ul>
<li>Better offline experience. You&#8217;d always have a local version of your blog to play around.</li>
<li>Simpler platform, no database, simple rsync for deployment.</li>
<li>Complete control - no need to rely on crappy WYSIWYG editor.</li>
<li>Octopress is based on Jekyll - both are Ruby projects. A language that I love and use daily - I don&#8217;t have to mess with PHP anymore.</li>
<li>Writing blog posts on vim - awesome!</li>
</ul>


<p>I think I will also not bother with comments at this point.</p>

<p>At the end of the day - I just want something simple, Octopress seems to fit the bill.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Employees are temporary]]></title>
    <link href="http://passionatedevelopment.com/blog/2011/12/18/employees-are-temporary/"/>
    <updated>2011-12-18T00:00:00+11:00</updated>
    <id>http://passionatedevelopment.com/blog/2011/12/18/employees-are-temporary</id>
    <content type="html"><![CDATA[<p>Stumbled upon Tamer Saleh&#8217;s (VP Engineering of Engine Yard) post: <a href="http://tammersaleh.com/posts/jobs-are-temporary-teams-are-for-life">Jobs are temporary, teams are for life</a> - which I found worth reading. If I were in a management/leadership position, that&#8217;s how I would see my developers - by helping them reaching their long term goals.</p>

<!-- more -->


<p>But company is all about bottom line right? Focusing on the individuals want seem inappropriate. Not necessarily. Paraphrasing my previous manager&#8217;s statement on our first one on one session: we (you and the company) will get the best of each other where there is big intersection between what the company wants to achieve and what you personally want to achieve careerwise.</p>

<p>A quote from Tamer&#8217;s post:</p>

<blockquote>People move on, and the team as a whole constantly grows and evolves with those changes. This is healthy, as long as it’s strongly embraced.</blockquote>


<p>Embraced is the keyword, do expect people to move on, help them to go where they want to. Have strategies in place to deal with changes. Avoid over reliance on your current developers.</p>

<p>Do it right - know what your developers aspire to, work out how you can help them in a way that is also bring benefit the company, look after them and keep them motivated and challenged, so that they will stay long and happy. But also always have a succession plan - employees are temporary.</p>

<p>A manager with this insight is worth hiring and working for.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Coding Cubicle Again]]></title>
    <link href="http://passionatedevelopment.com/blog/2011/12/18/coding-cubicle-again/"/>
    <updated>2011-12-18T00:00:00+11:00</updated>
    <id>http://passionatedevelopment.com/blog/2011/12/18/coding-cubicle-again</id>
    <content type="html"><![CDATA[<p>Although strictly speaking, I am not in working in a cubicle, 
but rather sharing a small room with the senior developer here.</p>


<p>Now some pictures.</p>


<!-- more -->


<p>Below shows my lovely MacBook Pro (very nice machine and oh working on Mac is sooo much better compared to Windows). 
The company looks after me very well, they provided me with brand new 24&#8221; LG monitor. 
I use MacVIm for my Ruby on Rails coding (a joy) and Flash Builder for Flex coding 
(don&#8217;t like Eclipse - so sluggish). Lately, I&#8217;m using my MacBook Pro in clamshell mode (i.e.; just using the secondary display and keep the MacBook closed) - I found the large screen area is enough.</p>


<p><img src="http://passionatedevelopment.com/blog/files/2011/12/IMG_2332.jpg" border="0" alt="IMG 2332" width="600" height="448" /></p>


<p>My colleague collection of books - bah, I didn&#8217;t notice that my iPhone camera was out of focus, so sorry for this blurry picture. There are a LOT of Ruby and Rails books here. And he&#8217;s got more digital books.</p>


<p><img src="http://passionatedevelopment.com/blog/files/2011/12/IMG_2336.jpg" border="0" alt="IMG 2336" width="600" height="448" /></p>


<p>Ah more books, the first two belongs to my colleagues, the rest belongs the rest belongs to me. Oh, I love Eclipse mints!! My previous colleague got me to it and before long almost every developers in the office were chewing mints on daily basis.</p>


<p><img src="http://passionatedevelopment.com/blog/files/2011/12/IMG_2333.jpg" border="0" alt="IMG 2333" width="600" height="448" /></p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[On Telecommuting (and Shorter Working Hours)]]></title>
    <link href="http://passionatedevelopment.com/blog/2011/11/06/on-telecommuting-and-shorter-working-hours/"/>
    <updated>2011-11-06T00:00:00+11:00</updated>
    <id>http://passionatedevelopment.com/blog/2011/11/06/on-telecommuting-and-shorter-working-hours</id>
    <content type="html"><![CDATA[<p>And so I have been working at the new work place for about a month now - which located quite far away from where I live.</p>

<!-- more -->


<p>Commuting to work involves bus trip to the Central Station, followed by train from Central to Blacktown and another bus trip from Blacktown station to the office. All up it&#8217;s about 1h 40m one way. Previously work was located conveniently 8km away from where I live, which normally takes 30-40 mins commuting by bus. So naturally, at first it was a major concern for me and my wife - we weren&#8217;t sure how this would affect our family life.</p>

<p>However after been doing it for 4 weeks now - it&#8217;s actually not too bad, in fact it works quite well.</p>

<p>First of all, the whole longer time commute works because of:</p>

<ul>
    <li>Shorter work hour (9-5) as opposed to 9-6 previously</li>
    <li>Flexible working hours arrangement.</li>
</ul>


<p>Because of the earlier finishing time - I ended coming home about the same time as before. I do have to leave home 45 minutes earlier than before though - so morning is more hectic than before. But there&#8217;s a solution to that.
This is where point no 2 kicks in - the folks there are quite relaxed about starting time and even with how many hours per week. I don&#8217;t have to work 37.5 hours week if I don&#8217;t want to. Since I am a contractor I got paid based on the hours that I worked.</p>

<p>I also found that 9 to 5 working hour (with 30 mins lunch + 2 x 10mins coffee breaks) feels right with the way my body and mind work. I am usually quite intense when coding and my limit is usually around 5 hours after that my concentration deteriorates and I won&#8217;t be as productive.
That&#8217;s why working long hour (especially overtime) will not work with me - I will take note to myself to never take a role that requires long working hour (if possible).</p>

<p>Another plus point - telecommuting time gives me opportunity to be efficient with my time. Now I have about an hour a day in train that I can use for something productive. Naturally, I use the time for my personal development time mostly - now the good thing about it is, when I got home I am really done - I have done both my professional work and my own personal learning - so I can just wind down without feeling any guilt.</p>

<p>Now the learning bit is very important as I am working with 2 technologies that I have limited experience in (Flex and Ruby).
My learning so far take in the following forms:</p>

<ul>
    <li>Watching <a href="http://www.adobe.com/devnet/flex/videotraining.html">Flex in a week</a> video training</li>
    <li>Watching various screencasts in particular <a href="http://vimcasts.org/">Vimcasts</a> and <a href="http://railscasts.com">Railscasts</a></li>
    <li>Coding Ruby - doing <a href="http://rubykoans.com/">Ruby koans</a>, just hacking around, playing around with IRB/PRY</li>
    <li>Reading Ruby and Rails books - still reading Well Grounded Rubyist.</li>
    <li>Doing some work, very rarely that I feel the need to do extra work outside the 9-5 block (which I do for free and I don&#8217;t mind doing since it&#8217;s helping me with my personal learning anyway)</li>
</ul>


<p>Beside learning - I&#8217;m also using the time to work on the backlog of my (non-technical) books to read - the latest being <a href="http://timothykeller.com/books/counterfeit_gods/">this one</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Moving On]]></title>
    <link href="http://passionatedevelopment.com/blog/2011/10/23/moving-on/"/>
    <updated>2011-10-23T00:00:00+11:00</updated>
    <id>http://passionatedevelopment.com/blog/2011/10/23/moving-on</id>
    <content type="html"><![CDATA[<p>Roughly 2 weeks ago I finished up my time with the young (as in the average age of the employees) and funky digital agency - <a href="http://www.gruden.com">Gruden</a>. I can&#8217;t believe it had been 1 year and 10 months.</p>

<!-- more -->


<p>The move is kind of significant point in my working life - as I have finally transitioned from being primarily a ColdFusion developer to something else (but that&#8217;s for another post).</p>

<p>It was a blessing to be working with folks at Gruden, made quite a few good friends over there whom I am really keen to stay in touch.</p>

<p>Interestingly, I was kind of stumbled upon the role at Gruden. At the end of 2009 - I was burnt out quite badly from my previous employment that led me to taking a few months career break. I was trying to cross skill myself in Java and Ruby on Rails at that time and wasn&#8217;t really looking for a pure ColdFusion role.</p>

<p>However, my ex-colleague was interviewing for a .NET role with Gruden and he mentioned me to Gruden. Long story short, I was offered a 3 month contract position. And yes it is a ColdFusion contract role - but I thought it&#8217;s only for 3 months and I have heard good things about Gruden before.</p>

<p>After 3 months - we liked each other and the contract became a permanent gig.</p>

<p>I can confidently say that they are one of the the best guys to work with if you are a ColdFusion developer. The ColdFusion applications that I worked at at Gruden are well architected - with best practices in mind. OOP all the way through - with Mach-II, Reactor and ColdSpring as the foundation. It was very refreshing to me as developer - that I didn&#8217;t have to convince and fight people about the benefits of OOP (as what I had done at my previous jobs).</p>

<p>It was interesting to me as well as I had the opportunity to be the lead developer in some projects, doing lots of analysis, costing (which I don&#8217;t particularly like), training and mentoring - AND handling support issues. It was full on - but I learned heaps in the process.</p>

<p>I will miss the bi-weekly development meetings (when we take turn to present on interesting topics), the soccer competition, the coffee, the scenic Circular Quay, the ping pong and the pool games - and the people of course!</p>

<p>So bye for now (professionally). If you are looking for ColdFusion gig - I do recommend get in touch with Gruden, they are a bunch of creative, honest, friendly and hardworking people.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[5 Minutes of Fame]]></title>
    <link href="http://passionatedevelopment.com/blog/2011/09/15/5-minutes-of-fame/"/>
    <updated>2011-09-15T00:00:00+10:00</updated>
    <id>http://passionatedevelopment.com/blog/2011/09/15/5-minutes-of-fame</id>
    <content type="html"><![CDATA[<p>And I have done it - on my 5th <a href="http://rubyonrails.com.au">RORO</a> meeting this year - I gave a lighting talk!</p>

<!-- more -->


<p>I did a 5 minute book review on <a href="http://www.manning.com/black2/">Well Grounded Rubyist</a> - yes the book that I have always talked about in this blog.</p>

<p>Back to the lighting talk - I must have at least put in 10 hours of preparation on it, yeah so much effort just for such a short talk. But I am glad that I did it - I&#8217;ve learned a lot both on the preparation and on the delivery. This is my first user group presentation ever - although I have done a couple team pressos for companies that I worked for.</p>

<p>My aims for the talk were:</p>

<ul>
    <li>Sharing what I like about the book aimed especially for the new people (to my disappointment - not that many new people that night).</li>
    <li>Making people who are new to Ruby welcomed. At least they&#8217;d know that not all of them who come to the meetup is expert.</li>
</ul>


<p>Some of the things that I&#8217;ve learned:</p>

<ul>
    <li>I need to speak clearer (even with my thick Indonesian accent)</li>
    <li>I need to speak slower and maybe less material for a lighting talk.</li>
    <li>My slides looked terrible compared to other presenters.</li>
</ul>


<p>In the subject of new people - I think I kind of work out how I want to be involved in Ruby community. And that is to help new people be involved in the community and help them learn at the same time.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Utopia]]></title>
    <link href="http://passionatedevelopment.com/blog/2011/08/27/the-utopia/"/>
    <updated>2011-08-27T00:00:00+10:00</updated>
    <id>http://passionatedevelopment.com/blog/2011/08/27/the-utopia</id>
    <content type="html"><![CDATA[<p>I have been doing some thinking on the &#8220;perfect&#8221; place to work - perfect (or closest to) according to me anyway.</p>

<!-- more -->


<p>This the place would look like if I am in charge of the company (or at least for the development department) and I am given unlimited freedom and unlimited resources to realize it.</p>

<p>The place would look like this: <a href="https://gist.github.com/f63f2d60f2bf270dfbb5">https://gist.github.com/f63f2d60f2bf270dfbb5</a></p>

<p>I intend to refine this as continue on my career and I will expand some of the points through this blog.</p>

<p>That&#8217;s how the dream work will look like - how about yours? What&#8217;s your dream work look like? I dare you to dream :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Putting TDD into Practice]]></title>
    <link href="http://passionatedevelopment.com/blog/2011/08/27/putting-tdd-into-practice/"/>
    <updated>2011-08-27T00:00:00+10:00</updated>
    <id>http://passionatedevelopment.com/blog/2011/08/27/putting-tdd-into-practice</id>
    <content type="html"><![CDATA[<p>A couple of weeks ago, I was given a couple of programming tasks to complete.</p>

<p>When I looked at the tasks&#8217; description - I realised Test Driven Development (TDD would be a good fit to approach them. Another plus for me is, I have never used TDD before - although I have been reading and hearing it quite a lot, so it is a good opportunity to give it a try.</p>

<!-- more -->


<p>One of the tasks is to write a cheque writer program - a program that converts a dollar value in number to its text representation (if it were written for a cheque), for example: given an input 2.50, the output should be a string &#8220;two DOLLARS and fifty CENTS&#8221;.</p>

<p>I chose to implement the solution in Java since I&#8217;m quite comfortable with it. And I am using <a href="http://www.junit.org">JUnit</a> to assist with TDD.</p>

<p>By employing TDD - I was writing my unit tests <strong>BEFORE</strong> I wrote the implementation.</p>

<p>Below is a snippet of my JUnit test (the first time I wrote JUnit test for a long time - so definitely can be done better):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
</pre></td><td class='code'><pre><code class='java'><span class='line'><span class="kn">package</span> <span class="n">org</span><span class="o">.</span><span class="na">tjandrawibawa</span><span class="o">.</span><span class="na">testcase</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.junit.Test</span> <span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">static</span> <span class="n">org</span><span class="o">.</span><span class="na">junit</span><span class="o">.</span><span class="na">Assert</span><span class="o">.*</span> <span class="o">;</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">org.tjandrawibawa.task.*</span><span class="o">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">public</span> <span class="kd">class</span> <span class="nc">TestChequeWriter</span> <span class="o">{</span>
</span><span class='line'>  <span class="n">ChequeWriter</span> <span class="n">writer</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ChequeWriter</span><span class="o">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="nd">@Test</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testSimple</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Test input: 1&quot;</span><span class="o">);</span>
</span><span class='line'>      <span class="n">assertTrue</span><span class="o">(</span> <span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="s">&quot;1&quot;</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;one DOLLARS&quot;</span><span class="o">));</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nd">@Test</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testSimpleDecimal</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Test input: 41.01&quot;</span><span class="o">);</span>
</span><span class='line'>      <span class="n">assertTrue</span><span class="o">(</span> <span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="s">&quot;41.01&quot;</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;forty one DOLLARS AND one CENTS&quot;</span><span class="o">));</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nd">@Test</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testHundreds</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Test input: 151.59&quot;</span><span class="o">);</span>
</span><span class='line'>      <span class="n">assertTrue</span><span class="o">(</span> <span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="s">&quot;151.59&quot;</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;one hundred and fifty one DOLLARS AND fifty nine CENTS&quot;</span><span class="o">));</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  
</span><span class='line'>  <span class="cm">/* BEGIN: Boundary Tests */</span>
</span><span class='line'>  <span class="nd">@Test</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testBoundary1</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Test input: 99.99&quot;</span><span class="o">);</span>
</span><span class='line'>      <span class="n">assertTrue</span><span class="o">(</span> <span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="s">&quot;99.99&quot;</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;ninety nine DOLLARS AND ninety nine CENTS&quot;</span><span class="o">));</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nd">@Test</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testBoundary2</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Test input: 100.99&quot;</span><span class="o">);</span>
</span><span class='line'>      <span class="n">assertTrue</span><span class="o">(</span> <span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="s">&quot;100.99&quot;</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;one hundred DOLLARS AND ninety nine CENTS&quot;</span><span class="o">));</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  
</span><span class='line'>  <span class="nd">@Test</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testBoundary3</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Test input: 999.99&quot;</span><span class="o">);</span>
</span><span class='line'>      <span class="n">assertTrue</span><span class="o">(</span> <span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="s">&quot;999.99&quot;</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;nine hundred and ninety nine DOLLARS AND ninety nine CENTS&quot;</span><span class="o">));</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  
</span><span class='line'>  <span class="nd">@Test</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testBoundary4</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Test input: 1000.99&quot;</span><span class="o">);</span>
</span><span class='line'>      <span class="n">assertTrue</span><span class="o">(</span> <span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="s">&quot;1000.99&quot;</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;one thousand DOLLARS AND ninety nine CENTS&quot;</span><span class="o">));</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nd">@Test</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testBoundary6</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Test input: 999999.99&quot;</span><span class="o">);</span>
</span><span class='line'>      <span class="n">assertTrue</span><span class="o">(</span> <span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="s">&quot;999999.99&quot;</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;nine hundred and ninety nine thousand, nine hundred and ninety nine DOLLARS AND ninety nine CENTS&quot;</span><span class="o">));</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  
</span><span class='line'>  <span class="nd">@Test</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testBoundary7</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Test input: 1000000.99&quot;</span><span class="o">);</span>
</span><span class='line'>      <span class="n">assertTrue</span><span class="o">(</span> <span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="s">&quot;1000000.99&quot;</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;one million DOLLARS AND ninety nine CENTS&quot;</span><span class="o">));</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nd">@Test</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testBoundary8</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Test input: 9999999.99&quot;</span><span class="o">);</span>
</span><span class='line'>      <span class="n">assertTrue</span><span class="o">(</span> <span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="s">&quot;999999999.99&quot;</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;nine hundred and ninety nine million, nine hundred and ninety nine thousand, nine hundred and ninety nine DOLLARS AND ninety nine CENTS&quot;</span><span class="o">));</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  
</span><span class='line'>  <span class="nd">@Test</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testBoundary9</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Test input: 10000000.99&quot;</span><span class="o">);</span>
</span><span class='line'>      <span class="n">assertTrue</span><span class="o">(</span> <span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="s">&quot;1000000000.99&quot;</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;one billion DOLLARS AND ninety nine CENTS&quot;</span><span class="o">));</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  
</span><span class='line'>  <span class="cm">/* END: Boundary Tests */</span>
</span><span class='line'>  
</span><span class='line'>  <span class="cm">/* BEGIN: Test failures */</span>
</span><span class='line'>  <span class="nd">@Test</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testAmountNegative</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Test input: -1&quot;</span><span class="o">);</span>
</span><span class='line'>      <span class="n">assertTrue</span><span class="o">(</span> <span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="s">&quot;-1&quot;</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;-1 is invalid - valid amount is between 0 to 2 billions dollars (inclusive)&quot;</span><span class="o">));</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nd">@Test</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testAmountGreaterThanTwoBillion</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Test input: 2000000001&quot;</span><span class="o">);</span>
</span><span class='line'>      <span class="n">assertTrue</span><span class="o">(</span> <span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="s">&quot;2000000001&quot;</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;2000000001 is invalid - valid amount is between 0 to 2 billions dollars (inclusive)&quot;</span><span class="o">));</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nd">@Test</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testDecimalPrecision</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Test input: 1.222&quot;</span><span class="o">);</span>
</span><span class='line'>      <span class="n">assertTrue</span><span class="o">(</span> <span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="s">&quot;1.222&quot;</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;1.222 is invalid - only up to 2 decimal places is accepted&quot;</span><span class="o">));</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nd">@Test</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testNonNumberInput1</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Test input: 1.22.2&quot;</span><span class="o">);</span>
</span><span class='line'>      <span class="n">assertTrue</span><span class="o">(</span> <span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="s">&quot;1.22.2&quot;</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;1.22.2 is not a valid number format&quot;</span><span class="o">));</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nd">@Test</span>
</span><span class='line'>  <span class="kd">public</span> <span class="kt">void</span> <span class="nf">testNonNumberInput2</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">&quot;Test input: xx&quot;</span><span class="o">);</span>
</span><span class='line'>      <span class="n">assertTrue</span><span class="o">(</span> <span class="n">writer</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="s">&quot;xx&quot;</span><span class="o">).</span><span class="na">equals</span><span class="o">(</span><span class="s">&quot;xx is not a valid number format&quot;</span><span class="o">));</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>  <span class="cm">/* END: Test failures */</span>
</span><span class='line'>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The steps that I went through to solve the task:</p>

<ul>
    <li>Scribble the solution in paper. I found this practice generally helps my thinking a lot.</li>
    <li>I then write the skeleton for the solution - which is mainly a class with methods that don&#8217;t do anything as yet.</li>
    <li>I then write unit tests for the main method in JUnit.</li>
    <li>I then write the implementation, run the test and repeat until I got all green (all tests passed)</li>
</ul>


<p>I found that this approach worked very well for this particular task. Especially the boundary tests exposed the wrong approach that I took when developing the solution.</p>

<p><strong>Refactoring</strong> has also become very easy as well.</p>

<p>While I am not convinced writing tests first and code the implementation to the test is applicable and beneficial all the time. One thing that I am sold of is: having test coverage is awesome. Particularly with refactoring - there is no way that you can confidently refactor without having a good enough test coverage.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The First Pull Request]]></title>
    <link href="http://passionatedevelopment.com/blog/2011/08/05/the-first-pull-request/"/>
    <updated>2011-08-05T00:00:00+10:00</updated>
    <id>http://passionatedevelopment.com/blog/2011/08/05/the-first-pull-request</id>
    <content type="html"><![CDATA[<p>As you may recall (speaking as if I have regular visitors) - about <a href="http://passionatedevelopment.com/blog/2011/06/30/ror-journey-continues/">a month ago</a> I decided to adding features to <a href="https://github.com/dailymile/dailymile-ruby">dailymile-ruby</a> library. As expected - working on it, has helped me in my Ruby learning journey.</p>

<!-- more -->


<p>So today - I made a pull request and hopefully it will be accepted. But accepted or not - that&#8217;s not really the point - I am just happy at the moment that I have made my first contribution to an open source project.</p>

<div><a href="http://passionatedevelopment.com/blog/files/2011/08/Screen-shot-2011-08-04-at-10.59.35-PM.png"><img class="alignleft size-full wp-image-625" src="http://passionatedevelopment.com/blog/files/2011/08/Screen-shot-2011-08-04-at-10.59.35-PM.png" alt="Felix's First Pull Request" width="690" height="298" /></a>
</div>


<div style="clear:both"></div>


<div style="clear:both"></div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Why Ruby (on Rails)?]]></title>
    <link href="http://passionatedevelopment.com/blog/2011/08/03/why-ruby-on-rails/"/>
    <updated>2011-08-03T00:00:00+10:00</updated>
    <id>http://passionatedevelopment.com/blog/2011/08/03/why-ruby-on-rails</id>
    <content type="html"><![CDATA[<p>I have been asked that question and have asked the question myself a couple of times. There are so many different technologies that I can choose to complement my current skill set, why Ruby?</p>

<p>Well, I came across an interview from <a href="http://www.engineyard.com/blog/">EngineYard blog</a> recently - <a href="http://www.engineyard.com/blog/2011/chicks-that-rip-ines-sombra/">Chicks That Rip: Ines Sombra</a>.</p>

<p>Ines&#8217; answer is almost exactly word for word of my own answer to the question:</p>

<blockquote>What attracted me most to the Ruby on Rails community is how bold it is. This community is not afraid to experiment and innovate. What I find especially interesting is the prevalence of polyglot systems and cutting-edge data store solutions. Databases are put to the test in Ruby on Rails, and these applications are defining the future of how systems will be constructed. It’s amazing.

&#8230;</blockquote>


<p>The community, the rate of innovation and polyglot systems - this gets the geek in me excited.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Got MacBook Pro]]></title>
    <link href="http://passionatedevelopment.com/blog/2011/08/03/got-macbook-pro/"/>
    <updated>2011-08-03T00:00:00+10:00</updated>
    <id>http://passionatedevelopment.com/blog/2011/08/03/got-macbook-pro</id>
    <content type="html"><![CDATA[<p><img class="alignleft size-medium wp-image-614" style="margin: 10px" src="http://passionatedevelopment.com/blog/files/2011/08/my-comps-300x224.jpg" alt="My three mean machines" width="300" height="224" />And so after contemplating for half a year or more - I finally decided that it&#8217;s time to get a Mac.</p>

<p>I bought the Feb 2011 model - second hand from Ebay and it looks like to be a good purchase so far (well it&#8217;s only been few days). To sidetrack a bit - it was quite scary experience buying something expensive from Ebay - it took three weeks for the thing to arrive due to seller being slow in posting, AusPost messed up (or maybe it was the seller&#8217;s fault all along), the item had to be returned to sender, and then re-sent back to me - just a mess!! But thank God - it&#8217;s here.</p>

<p>And yes - people were asking why - even today someone at work compares Mac with Dell - which he thinks it&#8217;s the best value for money. Well, everyone is entitled to their opinions I guess.</p>

<p>To me the reasons for getting a Mac is as follow:</p>

<ul>
    <li>I just want to see and to experience what the hype is all about. I have been to user group meetings and conferences and Macs dominated the development scene - why???</li>
    <li>Still related to the above, Mac seems to be the de facto platform for Ruby coder (although apparently in Japan - Rubyists are more likely to be on Windows). One of the famous Ruby IDE - Textmate runs only Mac.</li>
    <li>And hopefully sometimes in the future (I am not holding my breath though) - I will get into native iPhone/iPad development as well.</li>
</ul>


<p>Now the OS war - some people are just M$ haters - I am not, I have been using Windows for ages and things have been improving, in fact Windows 7 is pretty good. But I have never been comfortable with Windows as a platform for development. I mean I use it at work because I need the other M$ softwares like Outlook, Word and Project - but I won&#8217;t do my personal coding on Windows.</p>

<p>For fun coding things - I have been using Ubuntu. This is especially true for my Ruby and Rails learning. And I am quite happy with it - for dev-ing Linux is certainly way more enjoyable than Windows.</p>

<p>I&#8217;m quite excited to see how my experience will be different with Mac OS. As of now, I am looking into settling to an IDE for my Ruby dev - Sublime Text looks to be most likely candidate at the moment - followed by MacVim. A couple of recommendations from friends: TextMate (of course), TextWrangler (BBEdit).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Knowing Self]]></title>
    <link href="http://passionatedevelopment.com/blog/2011/07/29/knowing-self/"/>
    <updated>2011-07-29T00:00:00+10:00</updated>
    <id>http://passionatedevelopment.com/blog/2011/07/29/knowing-self</id>
    <content type="html"><![CDATA[<p>This is an attempt on consolidating my thoughts on Ruby&#8217;s self, taken from <a href="http://www.manning.com/black2/">Well Grounded Rubyist</a> chapter 5.</p>

<p>Another crucial point of Ruby to understand is the notion of self. Self is used to refer to the current object or the default object at a given time. At every point of your program there is one and only self.</p>

<p>Self inside Class and Module is straight forward. Self in method is also not too hard to understand, but you need to understand the context of the method.</p>

<p>Method can belong to class, self in method class will return the class object itself (remember that class IS object in Ruby).
Method can belong to an instance of a class, self in that context will surprise2 return the instance.
Method can be a singleton - in this case, calling self will also return the instance of a class.</p>

<p>Another point about self is: it is the default receiver of messages (see the code snippet below - it is explained there).</p>

<p>Below is code snippet that I hope illustrate the points above (stitched together from the examples in the book):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">C</span>
</span><span class='line'>  <span class="k">module</span> <span class="nn">M</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;Inside module C::M&quot;</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="nb">self</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># class method</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">stuff</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;Inside class method&quot;</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="nb">self</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># instance method</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">stuff</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;Inside instance method&quot;</span>   
</span><span class='line'>    <span class="nb">puts</span> <span class="nb">self</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># calling the class method (and module)</span>
</span><span class='line'><span class="n">C</span><span class="o">.</span><span class="n">stuff</span>
</span><span class='line'><span class="n">C</span><span class="o">::</span><span class="n">M</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># calling the class method</span>
</span><span class='line'><span class="n">c</span> <span class="o">=</span> <span class="n">C</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'><span class="n">c</span><span class="o">.</span><span class="n">stuff</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># singleton method</span>
</span><span class='line'><span class="k">def</span> <span class="nc">c</span><span class="o">.</span><span class="nf">stuff_it</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;Inside singleton method&quot;</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="nb">self</span> <span class="c1">#instance C</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#calling the singleton method</span>
</span><span class='line'><span class="n">c</span><span class="o">.</span><span class="n">stuff_it</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Self as the default receiver of messages</span>
</span><span class='line'><span class="k">class</span> <span class="nc">B</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">no_dot</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;self no dot&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">#no need to explicitly specify self.no_dot - self is the default receiver of no_dot message</span>
</span><span class='line'>  <span class="n">no_dot</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>And here is the output:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">Inside</span> <span class="k">module</span> <span class="nn">C</span><span class="p">:</span>
</span><span class='line'><span class="n">C</span><span class="o">::</span><span class="n">M</span>
</span><span class='line'><span class="no">Inside</span> <span class="k">class</span> <span class="n">met</span>
</span><span class='line'><span class="n">C</span>
</span><span class='line'><span class="no">Inside</span> <span class="n">instance</span>
</span><span class='line'><span class="c1">#</span>
</span><span class='line'><span class="no">Inside</span> <span class="n">singleton</span>
</span><span class='line'><span class="c1">#</span>
</span><span class='line'><span class="nb">self</span> <span class="n">no</span> <span class="n">dot</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[RORO Hack Night 26/07 - A Newbie Perspective]]></title>
    <link href="http://passionatedevelopment.com/blog/2011/07/27/roro-hack-night-a-newbie-perspective/"/>
    <updated>2011-07-27T00:00:00+10:00</updated>
    <id>http://passionatedevelopment.com/blog/2011/07/27/roro-hack-night-a-newbie-perspective</id>
    <content type="html"><![CDATA[<p>I had the pleasure of attending my first ever Sydney <a href="https://github.com/rails-oceania/roro/wiki/rorosyd-hack-night">RORO Hack Night</a> last night and it was a great experience for a newbie for me.
Place, pizzas and beers were provided by the kind folks at <a href="http://ninefold.com">Ninefold</a> (<a href="http://twitter.com/#!/lachlanhardy">@lachlanhardy</a> was the host of the night) - thanks guys!</p>

<p>I went there with <a href="http://filippovitale.it/">Filippo </a>and <a href="http://technophile.it/">Ronaldo </a>who are (ex) colleagues and friends. I also finally met Glenn (<a href="http://passionatedevelopment.com//twitter.com/#!/glennmartin76">@glennmartin76</a>) in person.</p>

<p>Glenn like me is new to Ruby - not sure how he found my blog and my RORO meetup post - but he did. And he contacted me via my blog asking questions about Sydney RORO. And then we exchanged emails couple of times - he&#8217;s got some good questions about all things Ruby (note to self: I should create a list of things that helped me get started and &#8220;stay&#8221; motivated to learn Ruby).</p>

<p>Hopefully I did some part to encourage him to come on the night.</p>

<p>Ok about the night itself - the night began with food and beers and casual chat.</p>

<p>I took a quick glance on people&#8217;s machines - the three newbies have Windows laptop (hey I do my Ruby dev on Ubuntu VM - so not that bad!) and the rest is on their shiny Macs.</p>

<p>And then Lachlan asked if people have interesting projects that they are working on or need help on. Some people put their hands up - some interesting stuffs being mentioned - Backbone.js, MongoDB, XML/XSLT(?) etc.</p>

<p>I then put my hands up for my <a href="https://github.com/cemeng/dailymile-ruby">dailymile-ruby</a> gem fork that I am working on, I basically wanted to someone with more Ruby experience to review my code and to provide some feedbacks.</p>

<p>And I was fortunate enough to get Ryan Bigg (<a href="http://twitter.com/ryanbigg">@ryanbigg</a>) to help with that. Working with someone with Ryan&#8217;s experience was really cool - I got some good feedbacks and good tips on coding standard as well.</p>

<p>I got to ask questions like how would certain things be done in Ruby, like the good practice for raising exceptions, parameter type checking (I am a bit paranoid with type checking coming from ColdFusion/Java background).</p>

<p>I then asked Ryan on how to build a test for the feature that implemented. I did actually have a stand alone Ruby script to test but I wanted to make a proper Test Unit out of it. And he showed me exactly how to do that - and as bonus point I was pointed to to <a href="https://github.com/bblimke/webmock">WebMock</a> which looks like to be very handy for API testing.</p>

<p>So hopefully another few hours worth of work and my work is ready for a pull request (oh that elusive first pull request.. ).</p>

<p>I then sat with Damien (<a href="http://twitter.com/its_damo">@its_damo</a>) - he was working on fixing a bug on his <a href="http://somanyfeeds.com/">somanyfeeds</a> app and he was kind enough to explain how he implemented the app. I was quite impressed on the effort and the thoughts he put on this - things like JavaScript minification and fingerprinting, caching and queues using RabbitMQ.</p>

<p>Somanyfeeds is an Sinatra app by the way and he implemented some of Rails-inspired features to his app. Do check the <a href="https://github.com/dam5s/somanyfeeds">app&#8217;s code out on GitHub</a> - he showed me some documentations that he&#8217;s written for the app which looks like a solid piece of work as well.</p>

<p>And just by talking to him - I got free lesson on Ruby symbol. I actually haven&#8217;t got to the part of learning symbols yet and I always wonder what they are. Ruby symbol behaves like Java string - they are immutable while apparently Ruby string is not.</p>

<p>At some point - an accident happened - Ryan accidentally spilled beer on Ron&#8217;s Mac. But Ron was complaining about his old MacBook before the hack night started - so I am slightly suspicious that this is staged so that he can upgrade his Mac :)</p>

<p>I then sit with Filippo looking at his Python project. He kept on telling me not to mention Python loudly - and I don&#8217;t understand why :) Filippo was working on an app similar to <a href="http://athlinks.com">athlinks.com</a>. Got introduced to <a href="http://www.tipfy.org/">TipFy</a> library and stuffs.</p>

<p>Went home around 10pm - some people were still hacking away. So yeah I had a great time last night - meeting great and friendly people from the Ruby (and JavaScript) community.</p>

<p>I think if you are new to Ruby - all the more reason to attend the hack night.</p>

<p><a href="http://www.flickr.com/photos/lachlanhardy/5977622898/">Photo from the night</a> courtesy of Lachlan.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A Thing or Two About Ruby Module]]></title>
    <link href="http://passionatedevelopment.com/blog/2011/07/21/a-thing-or-two-about-ruby-module/"/>
    <updated>2011-07-21T00:00:00+10:00</updated>
    <id>http://passionatedevelopment.com/blog/2011/07/21/a-thing-or-two-about-ruby-module</id>
    <content type="html"><![CDATA[<p>And so I am at Chapter 4 - Modules and program organisation of <a href="http://www.manning.com/black2/">Well-Grounded Rubyist</a>. When going through the chapter - the first impression that I&#8217;ve got is: Module is very similar to Java Interface.</p>

<p>At the surface it does seem like it. You can include multiple modules on your Ruby class - just like you can implement multiple interfaces in your Java class. Both also seems to be useful for implementing behavior that is shared among classes. So in the book, David gave an example of module &#8220;Stackability&#8221;.</p>

<p>But the similarities ends there.</p>

<p>Java Interface is a contract, if you &#8220;implement&#8221; an interface, you are promising that you will implement the methods in the interface in your class. Java will be unhappy if you break this contract. The interface itself does not contain any implementation details - it is simply a stub.</p>

<p>Ruby Module is not like this, methods in the module are fully working methods - I guess the closest thing that I can think of - module is like a library (I&#8217;ll see in few weeks time whether my understanding is correct).</p>

<p>Method lookup path is also interesting - if your class extends a class (which extends another class and so on) and includes a couple of modules - and just so happen every one of them have a method with the same name - which will get called first?</p>

<p>Rather that giving my own sub standard explanation, I would instead copy from this excellent blog post: <a href="http://blog.rubybestpractices.com/posts/gregory/030-issue-1-method-lookup.html">Method Lookup</a> by <a href="http://blog.rubybestpractices.com/about/gregory.html">Gregory Brown</a></p>

<blockquote>
1) Methods defined in the object’s singleton class (i.e. the object itself)    
2) Modules mixed into the singleton class in reverse order of inclusion    
3) Methods defined by the object’s class     
4) Modules included into the object’s class in reverse order of inclusion    
5) Methods defined by the object’s superclass.</blockquote>


<p>Checkout Gregory&#8217;s <a href="http://university.rubymendicant.com/">Ruby Mendicant University</a> as well - while you are at it. This guy has done a lot for the Ruby community - ah, this is why I am really intrigued with Ruby and its community.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[RORO Meetup 12/07]]></title>
    <link href="http://passionatedevelopment.com/blog/2011/07/13/roro-meetup-1207/"/>
    <updated>2011-07-13T00:00:00+10:00</updated>
    <id>http://passionatedevelopment.com/blog/2011/07/13/roro-meetup-1207</id>
    <content type="html"><![CDATA[<p>I have made it to<a href="https://github.com/rails-oceania/roro/wiki/rorosyd-topics"> RORO (Ruby on Rails Oceania) Meetup </a>for 3 meetings in a row now. Last night was particularly interesting - interesting because I finally can understand most of the presentations :).</p>

<p>Anyway quick round up and my thoughts from last night meetup..</p>

<!--more-->


<p><strong>Sneak peek into Westfield and Ruby in the enterprise by Lightning Dave Bolton <a href="http://twitter.com/#!/lightningdb">@lightningdb</a></strong>
Dave explained challenges running Ruby in an enterprise setup (Westfield being the enterprise). Not only technological challenge but also organizational as well - enterprise = more internal stakeholders to take into account.</p>

<p>One of the quotables quote of the day was &#8220;Everyday we are committing legacy code&#8221; - so as developer we should write code with the mind of people who will maintain our code down the track.</p>

<p>One point Dave mentioned that is close to my heart is: in order for Ruby to continue to flourish, it needs new developers coming to it (exactly my thoughts with <a href="http://passionatedevelopment.com/blog/2008/08/18/the-downside-of-being-a-coldfusion-developer-in-australia/">the problem of ColdFusion in Australia</a>).</p>

<h3>Test Driven Search Development by Andrew Harvey <a href="http://twitter.com/#!/mootpointer">@mootpointer</a></h3>


<p>Andrew explained the test harness (test tool?) that he built to test search result. In essence (I think) - his tool does comparison of search result in development and search result from production. The point of the comparison is to see whether the tweak on the <a href="http://lucene.apache.org/solr/">Solr</a> config (the engine that they use) produces better matches or not.</p>

<p>It is quite interesting to me as at work, we have been thinking of moving away from Lucene to Solr - with a testing tool such what Andrew presented, we can at least test the search result before and after.</p>

<h3>There be magic in Rails (multiple dynamic per instance database connections) by Mikel Lindsaar <a href="http://twitter.com/#!/raasdnil">@raasdnil</a></h3>


<p>Mikel shows how he built an app that can connect to unknown number databases with unknown schema (not the usual Rails app where you give the database config to Rails beforehand).</p>

<p>Nice to see ActiveAdmin in action as well - been wanting to try it out.</p>

<h3>Unicorn by Richard Heycock</h3>


<p>A passionate presentation on why Unicorn rules - Unicorn follows Unix philosophy - do one thing and do it well. It looks like Unicorn is really nice from Sys Admin point of view compared to Passenger for instance.</p>

<h3>Ruby metaprogramming&#8230; by Nicholas Jefferson</h3>


<p>I was very tired by this point (this was the longest RORO for me) so the following might be wrong!! - but I&#8217;ll try.. Nicholas presented his markup project which translates the markup to Java bytecode - this has proven to be way faster than Markaby and closer to Erubis (?). Nicholas prefers metaprogramming that translates to something readable as the product..</p>

<p>All in all a very nice night - managed to drag <a href="http://filippovitale.it/">Filippo Vitale</a> along and I think he had a great time too (he even asked me to go to <a href="https://github.com/rails-oceania/roro/wiki/rorosyd-hack-night">the hack night</a> with him!). Got to know few people as well - which is great.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Class and Object Relationship in Ruby]]></title>
    <link href="http://passionatedevelopment.com/blog/2011/07/07/class-and-object-relationship-in-ruby/"/>
    <updated>2011-07-07T00:00:00+10:00</updated>
    <id>http://passionatedevelopment.com/blog/2011/07/07/class-and-object-relationship-in-ruby</id>
    <content type="html"><![CDATA[<p>I am about to finish Chapter 3 of <a href="http://www.manning.com/black2/">Well Grounded Rubyist</a>.</p>

<p>The book is excellent, I really enjoy reading it - in fact as far as I can remember this is the first technical book that I just can&#8217;t put down. I finally understood some of the Ruby concepts that I failed to grasp from the previous two Ruby books that I read. At least it helped me <span style="text-decoration: line-through">hacking</span> adding features to <a href="https://github.com/cemeng/dailymile-ruby">dailymile ruby gem</a>.</p>

<p>Let&#8217;s talk about Object Oriented Programming for second. In a way, all of Object Oriented languages are the same: you build this class, instantiate it, make the class extends other class etc2. Traditionally also (taking from Java perspective here) - Class is a blue print of objects.</p>

<p>I&#8217;m going to try an analogy here. Think of a factory producing a certain product, let&#8217;s say a helmet. The product designer designed the helmet and documented in the specification (ie: the blue print) - the factory/the machine will then produce helmet as the blue print dictates. And so every individual helmets should be similar to each other. And here my analogy fails - since individual objects can have their own states - so they are not exactly the same - but <strong>behaviorly the should be the same.</strong></p>

<p>In Ruby, it&#8217;s different. Yes, Class does dictate objects&#8217; behavior - but <strong>only initially</strong>. In Ruby, you can inject behaviors into object instances.</p>

<p>This is an example from the book:</p>

<p>[ruby]
mag = Magazine.new
def mag.wings</p>

<pre><code>puts &amp;quot;Look! I can fly!&amp;quot;
</code></pre>

<p>end
[/ruby]</p>

<p>Sidetracking a bit - example like above that I really like about this book - looks silly but drives the point home clearly.</p>

<p>Quoting from the book:</p>

<blockquote>The inheritance tree - the upward cascade of class to superclass and super superclass - isn&#8217;t the only determinant of an object&#8217;s behavior.</blockquote>


<p>I am yet to see how this might be useful in designing a solution. It looks powerful and dangerous.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ruby on Rails Journey Continues]]></title>
    <link href="http://passionatedevelopment.com/blog/2011/06/30/ror-journey-continues/"/>
    <updated>2011-06-30T00:00:00+10:00</updated>
    <id>http://passionatedevelopment.com/blog/2011/06/30/ror-journey-continues</id>
    <content type="html"><![CDATA[<p>I have finally finished reading <a href="http://pragprog.com/titles/rails4/agile-web-development-with-rails">Agile Web Development with Rails</a> today - three months since I have started it.</p>

<p>I think the book does a good job in laying down the foundation of Rails. And as explained earlier, I like the book&#8217;s approach of: build something first and learn later.</p>

<p>I thought after I finishing this book, I would become a Rails warrior and I can just raise my hand on <a title="Sydney Ruby on Rails" href="http://rubyonrails.com.au/">Sydney Rails Meetup</a> and say &#8220;hey folks I have coded in Rails for 3 months and finished this book, let&#8217;s talk&#8221;.  But I am still far from being a warrior, at best I am just a noob who happens to have finished a Rails book.</p>

<p>Why do I feel this way? Well, although I feel that the book has given me a good high level view of building application in Ruby on Rails - but I am still severely lacking in the basics. What basics that I am talking about here? There are a couple - things like Test Driven Development for instance - but to me my biggest shortfall at the moment is my understanding of the Ruby language itself.</p>

<p>Last week, I thought of working on solving a problem that has been bugging me for awhile. Basically I am trying to get <a href="http://runkeeper.com">RunKeeper</a> to talk to <a href="http://dailymile.com">DailyMile </a>and so just like a Rubyist do - I go to <a href="http://github.com">github</a> to find whether people have done something in the area.</p>

<p>I found out two gems that talk to RunKeeper and DailyMile API respectively and so my plan was to connect them together in a <a href="http://www.sinatrarb.com/">Sinatra</a> application. The <a href="https://github.com/arvida/runkeeper-activities">RunKeeper gem</a> is fine, I can just use it as it is - the<a href="https://github.com/dailymile/dailymile-ruby"> DailyMile gem</a> however looks like missing a couple of functionality that I would need to make my application work. And so just like a true Rubyist - I forked the DailyMile gem and try to implement the missing functionality myself. And after looking at the source code for awhile - it dawns me that I actually need to know enough Ruby to do this!! I have actually finished reading <a href="http://humblelittlerubybook.com/">Humble Little Ruby</a> book a while back, but it looks like I have forgotten most of it..</p>

<p>And so I was brought down to earth again after flying high in hope. But not all is lost though, my copy of <a href="http://www.manning.com/black2/">Well Grounded Rubyist</a> is on the way, going through this would hopefully get me more grounded. I am also toying with the idea of approaching<a href="https://github.com/rails-oceania/roro/wiki/Available-mentors"> one of these guys</a> to mentor me and/or attending the <a href="https://github.com/rails-oceania/roro/wiki/rorosyd-hack-night">hack nights</a>, there&#8217;s only so much you can learn by yourselves - I believe pair programming will get you a lot further. And my another secret wish is, to actually finish this project so I can present it on <a href="http://twitter.com/#!/search/rorosyd">#rorosyd</a> meetup - looks unlikely but hey..</p>

<p>I have also bought <a href="http://www.manning.com/katz/">Rails 3 in Action</a> which is co-written by fellow aussie <a href="http://twitter.com/ryanbigg">Ryan Bigg</a> - just by looking at the table of content alone, I feel this will be a meatier read compared to Agile Web Development with Rails. And yes I do hope to<a href="http://twitter.com/#!/ryanbigg/status/85977045598871552"> learn a thing or two about Engines</a>.</p>

<p>So there is still a long way to go for me to become an actual Rubyist 0r RoRist - but I feel I am on the right path.</p>

<p>The other path is .NET - but the journey has just been a disappointment after a disappointment .. let&#8217;s just not go there&#8230;</p>

<p>Oh by the way - I managed to deploy <a href="http://keeper-mile.heroku.com">my Sinatra toy app</a> to <a href="http://heroku.com">Heroku</a>!</p>
]]></content>
  </entry>
  
</feed>

