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

  <title><![CDATA[Programming ≈ Fun]]></title>
  <link href="http://kresimirbojcic.com/atom.xml" rel="self"/>
  <link href="http://kresimirbojcic.com/"/>
  <updated>2012-02-19T15:50:06+01:00</updated>
  <id>http://kresimirbojcic.com/</id>
  <author>
    <name><![CDATA[Kresimir Bojcic]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[OLAP for The Masses]]></title>
    <link href="http://kresimirbojcic.com/2012/02/19/olap-for-the-masses.html"/>
    <updated>2012-02-19T14:40:00+01:00</updated>
    <id>http://kresimirbojcic.com/2012/02/19/olap-for-the-masses</id>
    <content type="html"><![CDATA[<p>In the small database that contains about one million records the need for some reporting arose. Since the system will work for at least 5 more years I was reluctant to just &#8220;winging it with recapitulation tables and some SQL&#8221; approach. <blockquote>The green pastures of OLAP have lured me long enough. My hopes where high, and my knowledge non existing. This is a tale of a man vs. the elements.</blockquote></p>

<!-- more -->


<h2>In particular free OLAP for the Masses</h2>

<p>The &#8220;free&#8221; part complicated the issue because this is the only choice:</p>

<ul>
<li>Mondrian</li>
<li>icCube</li>
<li>Palo</li>
</ul>


<p>I didn&#8217;t check out Palo since I was not able to see bigger picture of their system on the site. (I am shallow I know).
For the other two it seems to me that name of the game is get-backend-for-free-and-pay-for-reporting. This is particularly true for icCube.</p>

<p>I understand and appreciate the fact that since OLAP is mostly big business it is fair for them to pay up. I didn&#8217;t like that there was no clear formula on pricing. All in all it felt like I am not in that category with my needs to justify buying.</p>

<h2>Installation</h2>

<p>icCube installer is a breeze. Downside is that what you get (community server) is really just a bait for buying the real deal. I was unable to figure out how could I use this in production when you have to manually reload scheme after each restart. That aside, their web based approach is great. If you are unfamiliar with how to build OLAP cubes it is really helpful to play with their examples.</p>

<p>Mondrian installation was terrible. At one point I wanted to jump out of the window and end my misery. But after you realize that you have Tomcat x and Mondrian y and Java runtime z you can figure out what part of original documentation changed in what version and get the thing going.<blockquote>Biggest hurdle for me was just being unfamiliar with Java .jar system. And I&#8217;ll tell you, it one fine system(really? NO!)</blockquote></p>

<h2>Building the cube</h2>

<p>icCube has a web based interface for running the server, building the cube and querying the system.
For Mondrian you have to download &#8220;Schema Workbench&#8221;. Other then looking vintage it does what it is supposed to do. Sometimes if you push it too hard, the file that contains the cube definition will get messed up and you won&#8217;t be able to load it (not before manually fixing the .xml).</p>

<h2>Fronted</h2>

<ul>
<li>JPivot - looks like 1960</li>
<li>Saiku - looks really good, it is basically a new JPivot. I didn&#8217;t want to use it because I don&#8217;t have a need for a BI solution (with drill downs and defining of a reports on the fly) and I wanted something that is fully integrated with my solution</li>
<li>XMLA client + graphing library</li>
</ul>


<h2>Ruby support for XMLA client</h2>

<p>To my dismay I was unable to find ruby gem that would fit my needs. There is only mondrain-olap. It looks like great stuff, you even get a wrapper for cube definition. Under the hood it is using olap4j so you have to use jRuby. The jRuby part was a deal breaker for me.</p>

<blockquote>
..!!!$%# nothing else that I could find
</blockquote>


<p>I was forced to slap just enough code to be able to send an MDX request to OLAP server and get the result. No Java dependencies since it is utilising XMLA provider that in theory every OLAP server has. Gem is called &#8220;cube&#8221; and it is available at github for your pleasure and profit.</p>

<h2>Benefits for using OLAP</h2>

<ul>
<li>peace of mind</li>
<li>not clogging the transactional system with reports</li>
<li>it is fast! (climbing on the shoulders of a giant always pays off)</li>
<li>MDX is really sql-on-steroids-and-then-some made especially for reporting</li>
<li>you build a multidimensional cube and effortlessly look at the data from every possible angle - brilliant stuff not to mess with SQL for this</li>
</ul>


<h2>Downsides</h2>

<ul>
<li>Another dependency that can stop working</li>
</ul>


<h2>Verdict</h2>

<p>Do the right thing, don&#8217;t turn a blind eye and hope not to mess up your transactional system with annoying mega SQL queries&#8230; Let the OLAP machinery roar in your application.</p>

<blockquote>
My reports turned out so much better than I&#8217;ve expected. The biggest benefit is (other than speed) that when you start to look at data from the multidimensional cube perspective, the sky is the limit.
</blockquote>


<p>If you are new to all this it might be a little overwhelming : OLAP, XMLA, MDX, multidimensional cube&#8230;. But trust me it is worth it.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Let it be]]></title>
    <link href="http://kresimirbojcic.com/2012/01/28/let-it-be.html"/>
    <updated>2012-01-28T14:24:00+01:00</updated>
    <id>http://kresimirbojcic.com/2012/01/28/let-it-be</id>
    <content type="html"><![CDATA[<p>Lately pet peeve of mine is how to make small methods look more elegant. One idea was to use &#8220;indentation&#8221; for implicit end of <a href="http://kresimirbojcic.com/2011/12/27/i-would-love-to-see-this-in-ruby.html">small methods</a>. Big problem with this is that this is only a wish. I was forced to just cram the method to one line and curse the destiny. For a while I was torn. I loved cramming small methods and hated the impact on readability it had.</p>

<p>Couple of days ago it came to my attention that you can use define_method to get a job done.
If we start with this:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">stupid?</span>
</span><span class='line'>  <span class="vi">@pretty</span> <span class="p">?</span> <span class="s2">&quot;NO&quot;</span> <span class="p">:</span> <span class="s2">&quot;YES&quot;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<!--more -->


<p>It can be written even uglier like this (bear with me):</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">define_method</span> <span class="ss">:stupid?</span> <span class="k">do</span>
</span><span class='line'>  <span class="vi">@pretty</span> <span class="p">?</span> <span class="s2">&quot;NO&quot;</span> <span class="p">:</span> <span class="s2">&quot;YES&quot;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>BUT if we create alias for define_method (called something short like &#8216;let&#8217;) and use {} instead of &#8220;do end&#8221; we end up with this:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">let</span><span class="p">(</span><span class="ss">:stupid?</span><span class="p">)</span> <span class="p">{</span> <span class="vi">@pretty</span> <span class="p">?</span> <span class="s2">&quot;NO&quot;</span> <span class="p">:</span> <span class="s2">&quot;YES&quot;</span> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote>
I find this great. I was using define_method before for &#8220;meta programming&#8221; but it never occurred to me that this is possible use.
</blockquote>


<p>This:</p>

<!-- more -->


<p></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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">numbered?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>  <span class="n">line_numbering_style</span>  <span class="o">==</span> <span class="ss">:all_lines</span> <span class="o">||</span> <span class="n">significant?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">significant?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>  <span class="n">line_numbering_style</span> <span class="o">==</span> <span class="ss">:significant_lines</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">blank?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>can become this:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">let</span><span class="p">(</span><span class="ss">:numbered?</span><span class="p">)</span> <span class="p">{</span> <span class="o">|</span><span class="n">line</span><span class="o">|</span> <span class="n">line_numbering_style</span> <span class="o">==</span> <span class="ss">:all_lines</span> <span class="o">||</span> <span class="n">significant?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'><span class="n">let</span><span class="p">(</span><span class="ss">:significant?</span><span class="p">)</span> <span class="p">{</span> <span class="o">|</span><span class="n">line</span><span class="o">|</span> <span class="n">line_numbering_style</span> <span class="o">==</span> <span class="ss">:significant_lines</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">blank</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>I did a bit of usability testing yesterday( read - refactoring of a medium sized class to the death) and I really like the results. Class lines went from 145 to 78 while readability was increased, and I even added lines is some places where I felt that they increase readability.</p>

<figure class='code'><figcaption><span> (before.rb)</span> <a href='http://kresimirbojcic.com/downloads/code/let_it_be/before.rb'>download</a></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>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
<span class='line-number'>124</span>
<span class='line-number'>125</span>
<span class='line-number'>126</span>
<span class='line-number'>127</span>
<span class='line-number'>128</span>
<span class='line-number'>129</span>
<span class='line-number'>130</span>
<span class='line-number'>131</span>
<span class='line-number'>132</span>
<span class='line-number'>133</span>
<span class='line-number'>134</span>
<span class='line-number'>135</span>
<span class='line-number'>136</span>
<span class='line-number'>137</span>
<span class='line-number'>138</span>
<span class='line-number'>139</span>
<span class='line-number'>140</span>
<span class='line-number'>141</span>
<span class='line-number'>142</span>
<span class='line-number'>143</span>
<span class='line-number'>144</span>
<span class='line-number'>145</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1">#endcoding : utf-8</span>
</span><span class='line'><span class="k">class</span> <span class="nc">Kvar</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">searchable</span> <span class="k">do</span>
</span><span class='line'>   <span class="n">text</span> <span class="ss">:napomena</span><span class="p">,</span> <span class="ss">:naselje_naziv</span><span class="p">,</span> <span class="ss">:ulica_naziv</span><span class="p">,</span> <span class="ss">:ulica_sluzbeni_naziv</span><span class="p">,</span> <span class="ss">:izvodjac_naziv</span><span class="p">,</span>
</span><span class='line'>     <span class="ss">:otklonio_naziv</span><span class="p">,</span> <span class="ss">:datum_prijave</span><span class="p">,</span> <span class="ss">:mjesec_prijave</span><span class="p">,</span> <span class="ss">:razlog_prijave_opis</span><span class="p">,</span> <span class="ss">:uzrok_kvara_opis</span><span class="p">,</span> <span class="ss">:status</span><span class="p">,</span> <span class="ss">:opis_kvara</span><span class="p">,</span> <span class="ss">:godina_prijave</span><span class="p">,</span> <span class="ss">:gradska_cetvrt_naziv</span><span class="p">,</span> <span class="ss">:oznaka</span><span class="p">,</span> <span class="ss">:kategorija_prijave_naziv</span><span class="p">,</span> <span class="ss">:broj_naljepnice</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">solr_info</span> <span class="s1">&#39;naselje#naziv&#39;</span><span class="p">,</span> <span class="s1">&#39;ulica#naziv&#39;</span> <span class="p">,</span><span class="s1">&#39;ulica#sluzbeni_naziv&#39;</span> <span class="p">,</span><span class="s1">&#39;izvodjac#naziv&#39;</span> <span class="p">,</span><span class="s1">&#39;gradska_cetvrt#naziv&#39;</span> <span class="p">,</span><span class="s1">&#39;otklonio#naziv&#39;</span> <span class="p">,</span><span class="s1">&#39;razlog_prijave#opis&#39;</span> <span class="p">,</span><span class="s1">&#39;uzrok_kvara#opis&#39;</span>
</span><span class='line'>  <span class="n">default_value_for</span> <span class="ss">:vrijeme_prijave</span>  <span class="k">do</span>
</span><span class='line'>    <span class="no">RadnoVrijeme</span><span class="o">.</span><span class="n">zavrseno?</span> <span class="p">?</span> <span class="no">RadnoVrijeme</span><span class="o">.</span><span class="n">pocetak_sutra</span> <span class="p">:</span> <span class="no">DateTime</span><span class="o">.</span><span class="n">now</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">has_many</span> <span class="ss">:obavljeni_rads</span>
</span><span class='line'>  <span class="n">has_many</span> <span class="ss">:zamijenjeni_dijelovi</span><span class="p">,</span> <span class="ss">:class_name</span> <span class="o">=&gt;</span> <span class="s1">&#39;ZamijenjeniDio&#39;</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:rasvjetno_mjesto</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:naselje</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:razlog_prijave</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:ulica</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:gradska_cetvrt</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:izvodjac</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:otklonio</span><span class="p">,</span> <span class="ss">:class_name</span> <span class="o">=&gt;</span> <span class="s2">&quot;NositeljEkipe&quot;</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:uzrok_kvara</span>
</span><span class='line'>  <span class="n">validate</span> <span class="ss">:mora_biti_unesena_lokacija</span>
</span><span class='line'>  <span class="n">validates_presence_of</span> <span class="ss">:vrijeme_prijave</span><span class="p">,</span> <span class="ss">:gradska_cetvrt_id</span>
</span><span class='line'>  <span class="n">validate</span> <span class="ss">:mora_biti_tko_je_otklonio_kada_je_kvar_otklonjen</span>
</span><span class='line'>  <span class="n">validate</span> <span class="ss">:mora_biti_broj_naljepnice_kada_je_kvar_otklonjen</span>
</span><span class='line'>  <span class="n">validate</span> <span class="ss">:datum_otklona_mora_biti_nakon_datuma_prijave</span>
</span><span class='line'>  <span class="n">validate</span> <span class="ss">:oznaka_rasvjetnog_mjesta_mora_biti_kod_otklona_osim_ako_nije_numerirana</span>
</span><span class='line'>  <span class="n">validate</span> <span class="ss">:mora_postojati_dnevnik_rada_za_unos_u_proslosti_preko_tjedan_dana</span>
</span><span class='line'>  <span class="n">validates_uniqueness_of</span> <span class="ss">:broj_naljepnice</span><span class="p">,</span> <span class="ss">:allow_nil</span> <span class="o">=&gt;</span> <span class="kp">true</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">scope</span> <span class="ss">:aktivni</span><span class="p">,</span>  <span class="n">where</span><span class="p">(</span><span class="s1">&#39;kvarovi.datum_storna is NULL&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">scope</span> <span class="ss">:gradska_cetvrt</span><span class="p">,</span> <span class="nb">lambda</span> <span class="p">{</span> <span class="o">|</span><span class="n">gradska_cetvrt_id</span><span class="o">|</span> <span class="n">where</span><span class="p">(</span><span class="s1">&#39;gradska_cetvrt_id = ? &#39;</span><span class="p">,</span> <span class="n">gradska_cetvrt_id</span> <span class="p">)</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="vi">@povratna_prijava</span> <span class="o">=</span> <span class="kp">false</span>
</span><span class='line'>  <span class="kp">attr_accessor</span> <span class="ss">:povratna_prijava</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">mora_postojati_dnevnik_rada_za_unos_u_proslosti_preko_tjedan_dana</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">vrijeme_prijave</span> <span class="o">+</span> <span class="mi">7</span><span class="o">.</span><span class="n">days</span> <span class="o">&lt;</span> <span class="no">DateTime</span><span class="o">.</span><span class="n">now</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">vrijeme_prijave</span> <span class="o">-</span> <span class="mi">7</span><span class="o">.</span><span class="n">days</span> <span class="o">&gt;</span> <span class="no">DateTime</span><span class="o">.</span><span class="n">now</span><span class="p">)</span>
</span><span class='line'>      <span class="k">if</span> <span class="o">!</span><span class="no">RadniNalog</span><span class="o">.</span><span class="n">postoji_dnevnik_rada</span><span class="p">(</span><span class="n">datum_prijave</span><span class="p">)</span>
</span><span class='line'>          <span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="ss">:vrijeme_prijave</span><span class="p">,</span> <span class="s2">&quot;nije ispravno, ne postoji dnevnik rada otvoren za taj dan&quot;</span><span class="p">)</span>
</span><span class='line'>      <span class="k">end</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="k">def</span> <span class="nf">oznaka_rasvjetnog_mjesta_mora_biti_kod_otklona_osim_ako_nije_numerirana</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">is_otklonjen</span> <span class="o">==</span> <span class="kp">true</span>  <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">povratna_prijava</span>
</span><span class='line'>     <span class="k">if</span>  <span class="n">oznaka_rasvjetnog_mjesta</span><span class="o">.</span><span class="n">blank?</span>  <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">rasvjetno_mjesto_nije_numerirano</span>
</span><span class='line'>      <span class="n">errors</span><span class="o">.</span><span class="n">add</span> <span class="ss">:oznaka_rasvjetnog_mjesta</span><span class="p">,</span> <span class="s2">&quot;mora biti odredjena kad je kvar otklonjen osim kada rasvjetno mjesto nije numerirano&quot;</span>
</span><span class='line'>     <span class="k">end</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="k">def</span> <span class="nf">mora_biti_tko_je_otklonio_kada_je_kvar_otklonjen</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">is_otklonjen</span> <span class="o">==</span> <span class="kp">true</span> <span class="o">&amp;&amp;</span> <span class="n">otklonio</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>        <span class="n">errors</span><span class="o">.</span><span class="n">add</span> <span class="ss">:otklonio_id</span><span class="p">,</span> <span class="s2">&quot;mora biti odredjen nositelj ekipe koja je otklonila kvar&quot;</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="k">def</span> <span class="nf">mora_biti_broj_naljepnice_kada_je_kvar_otklonjen</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">is_otklonjen</span> <span class="o">==</span> <span class="kp">true</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">povratna_prijava</span>
</span><span class='line'>        <span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="ss">:broj_naljepnice</span><span class="p">,</span> <span class="s2">&quot;mora biti upisan&quot;</span> <span class="p">)</span> <span class="k">if</span> <span class="n">broj_naljepnice</span><span class="o">.</span><span class="n">nil?</span> <span class="o">||</span> <span class="n">broj_naljepnice</span><span class="o">.</span><span class="n">blank?</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="k">def</span> <span class="nf">datum_otklona_mora_biti_nakon_datuma_prijave</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">is_otklonjen</span> <span class="o">==</span>  <span class="kp">true</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">datum_otklona</span><span class="o">.</span><span class="n">nil?</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">vrijeme_prijave</span><span class="o">.</span><span class="n">to_date</span> <span class="o">&gt;</span> <span class="n">datum_otklona</span><span class="p">)</span>
</span><span class='line'>      <span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="ss">:datum_otklona</span><span class="p">,</span> <span class="s2">&quot;mora biti nakon datuma prijave&quot;</span><span class="p">)</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><span class='line'>  <span class="k">def</span> <span class="nf">lokacija</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">string</span><span class="o">.</span><span class="n">blank</span> <span class="k">if</span> <span class="n">ulica</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>    <span class="n">ret</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">ulica</span><span class="o">.</span><span class="n">lokacija</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">kucni_broj</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>    <span class="k">return</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">ret</span><span class="si">}</span><span class="s2"> - </span><span class="si">#{</span><span class="n">gradska_cetvrt</span><span class="o">.</span><span class="n">naziv</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">unless</span> <span class="n">gradska_cetvrt</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">ret</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">lokacija_bez_gradske_cetvrti</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">string</span><span class="o">.</span><span class="n">blank</span> <span class="k">if</span> <span class="n">ulica</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>    <span class="n">ret</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">ulica</span><span class="o">.</span><span class="n">lokacija</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">kucni_broj</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">oznaka</span>
</span><span class='line'>    <span class="s2">&quot;RN </span><span class="si">#{</span><span class="n">oznaka_short</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">oznaka_short</span>
</span><span class='line'>    <span class="n">result</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">broj_dnevnika</span><span class="si">}</span><span class="s2">/</span><span class="si">#{</span><span class="n">redni_broj</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>    <span class="n">result</span> <span class="o">=</span> <span class="n">result</span> <span class="o">+</span> <span class="s2">&quot;-</span><span class="si">#{</span><span class="n">redni_broj_unutar_naloga</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="o">!</span><span class="n">redni_broj_unutar_naloga</span><span class="o">.</span><span class="n">blank?</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">result</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">mora_biti_unesena_lokacija</span>
</span><span class='line'>    <span class="n">errors</span><span class="o">[</span><span class="ss">:base</span><span class="o">]</span> <span class="o">&lt;&lt;</span>  <span class="no">I18n</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="ss">:lokacija_mora_biti_popunjena</span><span class="p">)</span> <span class="k">if</span> <span class="n">ulica_id</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">datum_prijave</span>
</span><span class='line'>    <span class="n">vrijeme_prijave</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%d.%m.%Y&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">datum_otklona_ispis</span>
</span><span class='line'>    <span class="n">datum_otklona</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%d.%m.%Y&quot;</span><span class="p">)</span> <span class="k">unless</span> <span class="n">datum_otklona</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">mjesec_prijave</span>
</span><span class='line'>    <span class="n">vrijeme_prijave</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%m.%Y&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">godina_prijave</span>
</span><span class='line'>    <span class="n">vrijeme_prijave</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;G%Y&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">status</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">datum_storna</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>      <span class="n">is_otklonjen</span> <span class="o">==</span> <span class="kp">true</span> <span class="p">?</span> <span class="s1">&#39;otklonjen&#39;</span> <span class="p">:</span> <span class="s1">&#39;neotklonjen&#39;</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>      <span class="s1">&#39;storniran&#39;</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="k">def</span> <span class="nf">sekvenca_za_redni_broj_unutar_radnog_naloga</span>
</span><span class='line'>    <span class="s2">&quot;RN</span><span class="si">#{</span><span class="n">broj_dnevnika</span><span class="si">}</span><span class="s2">/</span><span class="si">#{</span><span class="n">redni_broj</span><span class="si">}</span><span class="s2">-</span><span class="si">#{</span><span class="n">vrijeme_prijave</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%Y&quot;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">smjene</span>
</span><span class='line'>    <span class="no">Settings</span><span class="o">.</span><span class="n">smjene</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">kategorije_prijave</span>
</span><span class='line'>   <span class="no">Settings</span><span class="o">.</span><span class="n">kategorije_prijave</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">kategorija_prijave_naziv</span>
</span><span class='line'>    <span class="no">Kvar</span><span class="o">.</span><span class="n">kategorije_prijave</span><span class="o">[</span><span class="n">kategorija_prijave</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">total_on</span><span class="p">(</span><span class="n">month</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">self</span><span class="o">.</span><span class="n">aktivni</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="ss">:conditions</span> <span class="o">=&gt;</span> <span class="o">[</span><span class="s2">&quot;month(vrijeme_prijave) = ? and year(vrijeme_prijave) = &#39;</span><span class="si">#{</span><span class="no">DateTime</span><span class="o">.</span><span class="n">now</span><span class="o">.</span><span class="n">year</span><span class="si">}</span><span class="s2">&#39;&quot;</span><span class="p">,</span> <span class="n">month</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<figure class='code'><figcaption><span> (after.rb)</span> <a href='http://kresimirbojcic.com/downloads/code/let_it_be/after.rb'>download</a></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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1">#endcoding : utf-8</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;kernel&#39;</span>
</span><span class='line'><span class="k">class</span> <span class="nc">Kvar</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'>  <span class="n">searchable</span> <span class="k">do</span>
</span><span class='line'>   <span class="n">text</span> <span class="ss">:napomena</span><span class="p">,</span> <span class="ss">:naselje_naziv</span><span class="p">,</span> <span class="ss">:ulica_naziv</span><span class="p">,</span> <span class="ss">:ulica_sluzbeni_naziv</span><span class="p">,</span>
</span><span class='line'>        <span class="ss">:izvodjac_naziv</span><span class="p">,</span> <span class="ss">:otklonio_naziv</span><span class="p">,</span> <span class="ss">:datum_prijave</span><span class="p">,</span> <span class="ss">:mjesec_prijave</span><span class="p">,</span>
</span><span class='line'>        <span class="ss">:razlog_prijave_opis</span><span class="p">,</span> <span class="ss">:uzrok_kvara_opis</span><span class="p">,</span> <span class="ss">:status</span><span class="p">,</span> <span class="ss">:opis_kvara</span><span class="p">,</span>
</span><span class='line'>        <span class="ss">:godina_prijave</span><span class="p">,</span> <span class="ss">:gradska_cetvrt_naziv</span><span class="p">,</span> <span class="ss">:oznaka</span><span class="p">,</span> <span class="ss">:kategorija_prijave_naziv</span><span class="p">,</span> <span class="ss">:broj_naljepnice</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="n">solr_info</span> <span class="s1">&#39;naselje#naziv&#39;</span><span class="p">,</span> <span class="s1">&#39;ulica#naziv&#39;</span><span class="p">,</span> <span class="s1">&#39;ulica#sluzbeni_naziv&#39;</span><span class="p">,</span> <span class="s1">&#39;izvodjac#naziv&#39;</span><span class="p">,</span> <span class="s1">&#39;gradska_cetvrt#naziv&#39;</span><span class="p">,</span> <span class="s1">&#39;otklonio#naziv&#39;</span><span class="p">,</span>
</span><span class='line'>            <span class="s1">&#39;razlog_prijave#opis&#39;</span> <span class="p">,</span><span class="s1">&#39;uzrok_kvara#opis&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">default_value_for</span> <span class="ss">:vrijeme_prijave</span><span class="p">,</span>  <span class="no">RadnoVrijeme</span><span class="o">.</span><span class="n">zavrseno?</span> <span class="p">?</span> <span class="no">RadnoVrijeme</span><span class="o">.</span><span class="n">pocetak_sutra</span> <span class="p">:</span> <span class="no">DateTime</span><span class="o">.</span><span class="n">now</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">has_many</span> <span class="ss">:obavljeni_rads</span>
</span><span class='line'>  <span class="n">has_many</span> <span class="ss">:zamijenjeni_dijelovi</span><span class="p">,</span> <span class="ss">:class_name</span> <span class="o">=&gt;</span> <span class="s1">&#39;ZamijenjeniDio&#39;</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:rasvjetno_mjesto</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:naselje</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:razlog_prijave</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:ulica</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:gradska_cetvrt</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:izvodjac</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:otklonio</span><span class="p">,</span> <span class="ss">:class_name</span> <span class="o">=&gt;</span> <span class="s2">&quot;NositeljEkipe&quot;</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:uzrok_kvara</span>
</span><span class='line'>  <span class="n">validate</span> <span class="ss">:mora_biti_unesena_lokacija</span>
</span><span class='line'>  <span class="n">validate</span> <span class="ss">:mora_biti_tko_je_otklonio_kada_je_kvar_otklonjen</span>
</span><span class='line'>  <span class="n">validate</span> <span class="ss">:mora_biti_broj_naljepnice_kada_je_kvar_otklonjen</span>
</span><span class='line'>  <span class="n">validate</span> <span class="ss">:datum_otklona_mora_biti_nakon_datuma_prijave</span>
</span><span class='line'>  <span class="n">validate</span> <span class="ss">:oznaka_rasvjetnog_mjesta_mora_biti_kod_otklona_osim_ako_nije_numerirana</span>
</span><span class='line'>  <span class="n">validate</span> <span class="ss">:mora_postojati_dnevnik_rada_za_unos_u_proslosti_preko_tjedan_dana</span>
</span><span class='line'>  <span class="n">validates_uniqueness_of</span> <span class="ss">:broj_naljepnice</span><span class="p">,</span> <span class="ss">:allow_nil</span> <span class="o">=&gt;</span> <span class="kp">true</span>
</span><span class='line'>  <span class="n">validates_presence_of</span> <span class="ss">:vrijeme_prijave</span><span class="p">,</span> <span class="ss">:gradska_cetvrt_id</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">scope</span> <span class="ss">:aktivni</span><span class="p">,</span>  <span class="n">where</span><span class="p">(</span><span class="s1">&#39;kvarovi.datum_storna is NULL&#39;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">scope</span> <span class="ss">:gradska_cetvrt</span><span class="p">,</span> <span class="nb">lambda</span><span class="p">{</span> <span class="o">|</span><span class="n">gradska_cetvrt_id</span><span class="o">|</span> <span class="n">where</span><span class="p">(</span><span class="s1">&#39;gradska_cetvrt_id = ? &#39;</span><span class="p">,</span> <span class="n">gradska_cetvrt_id</span> <span class="p">)</span> <span class="p">}</span>
</span><span class='line'>  <span class="kp">attr_accessor</span> <span class="ss">:povratna_prijava</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">mora_postojati_dnevnik_rada_za_unos_u_proslosti_preko_tjedan_dana</span>
</span><span class='line'>    <span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="ss">:vrijeme_prijave</span><span class="p">,</span> <span class="s2">&quot;nije ispravno, ne postoji dnevnik rada otvoren za taj dan&quot;</span><span class="p">)</span> <span class="k">if</span> <span class="n">unutar_perioda?</span> <span class="o">&amp;&amp;</span>  <span class="o">!</span><span class="no">RadniNalog</span><span class="o">.</span><span class="n">postoji_dnevnik_rada</span><span class="p">(</span><span class="n">datum_prijave</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">oznaka_rasvjetnog_mjesta_mora_biti_kod_otklona_osim_ako_nije_numerirana</span>
</span><span class='line'>    <span class="n">errors</span><span class="o">.</span><span class="n">add</span> <span class="ss">:oznaka_rasvjetnog_mjesta</span><span class="p">,</span> <span class="s2">&quot;mora biti odredjena kad je kvar otklonjen osim kada rasvjetno mjesto nije numerirano&quot;</span> <span class="k">if</span> <span class="n">treba_oznaka?</span> <span class="o">&amp;&amp;</span> <span class="n">otklonjena_normalna_prijava?</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">mora_biti_tko_je_otklonio_kada_je_kvar_otklonjen</span>
</span><span class='line'>    <span class="n">errors</span><span class="o">.</span><span class="n">add</span> <span class="ss">:otklonio_id</span><span class="p">,</span> <span class="s2">&quot;mora biti odredjen nositelj ekipe koja je otklonila kvar&quot;</span> <span class="k">if</span> <span class="n">is_otklonjen</span> <span class="o">==</span> <span class="kp">true</span> <span class="o">&amp;&amp;</span> <span class="n">otklonio</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">datum_otklona_mora_biti_nakon_datuma_prijave</span>
</span><span class='line'>    <span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="ss">:datum_otklona</span><span class="p">,</span> <span class="s2">&quot;mora biti nakon datuma prijave&quot;</span><span class="p">)</span> <span class="k">if</span> <span class="n">is_otklonjen</span> <span class="o">==</span>  <span class="kp">true</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">datum_otklona</span><span class="o">.</span><span class="n">nil?</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">vrijeme_prijave</span><span class="o">.</span><span class="n">to_date</span> <span class="o">&gt;</span> <span class="n">datum_otklona</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:mora_biti_broj_naljepnice_kada_je_kvar_otklonjen</span><span class="p">)</span> <span class="p">{</span> <span class="n">errors</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="ss">:broj_naljepnice</span><span class="p">,</span> <span class="s2">&quot;mora biti upisan&quot;</span> <span class="p">)</span> <span class="k">if</span> <span class="n">otklonjena_normalna_prijava?</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">postoji_broj_naljepnice?</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:mora_biti_unesena_lokacija</span><span class="p">)</span> <span class="p">{</span> <span class="n">errors</span><span class="o">[</span><span class="ss">:base</span><span class="o">]</span> <span class="o">&lt;&lt;</span>  <span class="no">I18n</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="ss">:lokacija_mora_biti_popunjena</span><span class="p">)</span> <span class="k">if</span> <span class="n">ulica_id</span><span class="o">.</span><span class="n">nil?</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:unutar_perioda?</span><span class="p">)</span> <span class="p">{</span> <span class="p">(</span><span class="n">vrijeme_prijave</span> <span class="o">+</span> <span class="mi">7</span><span class="o">.</span><span class="n">days</span> <span class="o">&lt;</span> <span class="no">DateTime</span><span class="o">.</span><span class="n">now</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">vrijeme_prijave</span> <span class="o">-</span> <span class="mi">7</span><span class="o">.</span><span class="n">days</span> <span class="o">&gt;</span> <span class="no">DateTime</span><span class="o">.</span><span class="n">now</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:postoji_broj_naljepnice?</span><span class="p">)</span> <span class="p">{</span> <span class="o">!</span><span class="n">broj_naljepnice</span><span class="o">.</span><span class="n">nil?</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">broj_naljepnice</span><span class="o">.</span><span class="n">blank?</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:otklonjena_normalna_prijava?</span><span class="p">)</span> <span class="p">{</span> <span class="n">is_otklonjen</span> <span class="o">==</span> <span class="kp">true</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">povratna_prijava</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:treba_oznaka?</span><span class="p">)</span> <span class="p">{</span> <span class="n">oznaka_rasvjetnog_mjesta</span><span class="o">.</span><span class="n">blank?</span>  <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">rasvjetno_mjesto_nije_numerirano</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:datum_prijave</span><span class="p">)</span> <span class="p">{</span> <span class="n">vrijeme_prijave</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%d.%m.%Y&quot;</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:datum_otklona_ispis</span><span class="p">)</span>  <span class="p">{</span> <span class="n">datum_otklona</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%d.%m.%Y&quot;</span><span class="p">)</span> <span class="k">unless</span> <span class="n">datum_otklona</span><span class="o">.</span><span class="n">nil?</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:mjesec_prijave</span><span class="p">)</span> <span class="p">{</span> <span class="n">vrijeme_prijave</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%m.%Y&quot;</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:godina_prijave</span><span class="p">)</span> <span class="p">{</span> <span class="n">vrijeme_prijave</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;G%Y&quot;</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:sekvenca_za_redni_broj_unutar_radnog_naloga</span><span class="p">)</span>  <span class="p">{</span> <span class="s2">&quot;RN</span><span class="si">#{</span><span class="n">broj_dnevnika</span><span class="si">}</span><span class="s2">/</span><span class="si">#{</span><span class="n">redni_broj</span><span class="si">}</span><span class="s2">-</span><span class="si">#{</span><span class="n">vrijeme_prijave</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%Y&quot;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:oznaka</span><span class="p">)</span> <span class="p">{</span> <span class="s2">&quot;RN </span><span class="si">#{</span><span class="n">oznaka_short</span><span class="si">}</span><span class="s2">&quot;</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:redni_broj_dnevnika</span><span class="p">)</span> <span class="p">{</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">broj_dnevnika</span><span class="si">}</span><span class="s2">/</span><span class="si">#{</span><span class="n">redni_broj</span><span class="si">}</span><span class="s2">&quot;</span>  <span class="p">}</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:oznaka_short</span><span class="p">)</span> <span class="p">{</span>  <span class="n">redni_broj_dnevnika</span> <span class="o">+</span>  <span class="p">(</span><span class="n">redni_broj_unutar_naloga</span><span class="o">.</span><span class="n">blank?</span> <span class="p">?</span> <span class="n">string</span><span class="o">.</span><span class="n">blank</span> <span class="p">:</span>  <span class="s2">&quot;-</span><span class="si">#{</span><span class="n">redni_broj_unutar_naloga</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:lokacija</span><span class="p">)</span> <span class="p">{</span> <span class="n">lokacija_bez_gradske_cetvrti</span> <span class="o">+</span> <span class="p">(</span><span class="n">gradska_cetvrt</span><span class="o">.</span><span class="n">nil?</span> <span class="p">?</span> <span class="n">string</span><span class="o">.</span><span class="n">blank</span> <span class="p">:</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">gradska_cetvrt</span><span class="o">.</span><span class="n">naziv</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:lokacija_bez_gradske_cetvrti</span><span class="p">)</span> <span class="p">{</span> <span class="n">ulica</span><span class="o">.</span><span class="n">nil?</span> <span class="p">?</span> <span class="n">string</span><span class="o">.</span><span class="n">blank</span> <span class="p">:</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">ulica</span><span class="o">.</span><span class="n">lokacija</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">kucni_broj</span><span class="si">}</span><span class="s2">&quot;</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:otklonjen_opis</span><span class="p">)</span> <span class="p">{</span> <span class="n">is_otklonjen</span> <span class="o">==</span> <span class="kp">true</span> <span class="p">?</span> <span class="s1">&#39;otklonjen&#39;</span> <span class="p">:</span> <span class="s1">&#39;neotklonjen&#39;</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:status</span><span class="p">)</span> <span class="p">{</span> <span class="n">datum_storna</span><span class="o">.</span><span class="n">nil?</span> <span class="p">?</span> <span class="n">otklonjen_opis</span> <span class="p">:</span> <span class="s1">&#39;storniran&#39;</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:kategorija_prijave_naziv</span><span class="p">)</span> <span class="p">{</span> <span class="no">Kvar</span><span class="o">.</span><span class="n">kategorije_prijave</span><span class="o">[</span><span class="n">kategorija_prijave</span><span class="o">]</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">let_self</span><span class="p">(</span><span class="ss">:smjene</span><span class="p">)</span> <span class="p">{</span>  <span class="no">Settings</span><span class="o">.</span><span class="n">smjene</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let_self</span><span class="p">(</span><span class="ss">:kategorije_prijave</span><span class="p">)</span> <span class="p">{</span> <span class="no">Settings</span><span class="o">.</span><span class="n">kategorije_prijave</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">let_self</span><span class="p">(</span><span class="ss">:total_on</span><span class="p">)</span> <span class="p">{</span> <span class="o">|</span><span class="n">month</span><span class="o">|</span> <span class="no">Kvar</span><span class="o">.</span><span class="n">aktivni</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="ss">:conditions</span> <span class="o">=&gt;</span> <span class="o">[</span><span class="s2">&quot;month(vrijeme_prijave) = ? and year(vrijeme_prijave) = &#39;</span><span class="si">#{</span><span class="no">DateTime</span><span class="o">.</span><span class="n">now</span><span class="o">.</span><span class="n">year</span><span class="si">}</span><span class="s2">&#39;&quot;</span><span class="p">,</span> <span class="n">month</span><span class="o">]</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is my modest Kernel patch in <a href="https://github.com/drKreso/guerrilla_patch">guerrilla_patch</a>, @garybernhardt did it &#8220;properly&#8221; in his <a href="https://github.com/garybernhardt/cls">Cls</a> without monkey patching.</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="k">module</span> <span class="nn">Kernel</span>
</span><span class='line'>   <span class="k">def</span> <span class="nf">let</span><span class="p">(</span><span class="nb">name</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>     <span class="n">define_method</span><span class="p">(</span><span class="nb">name</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>   <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>   <span class="k">def</span> <span class="nf">let_self</span><span class="p">(</span><span class="nb">name</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>     <span class="n">define_singleton_method</span><span class="p">(</span><span class="nb">name</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>   <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Why Reddit Is Not Worth It?]]></title>
    <link href="http://kresimirbojcic.com/2012/01/01/why-reddit-is-not-worth-it.html"/>
    <updated>2012-01-01T21:07:00+01:00</updated>
    <id>http://kresimirbojcic.com/2012/01/01/why-reddit-is-not-worth-it</id>
    <content type="html"><![CDATA[<p>This article will sum up my experiences with reddit and why I think it is not worth it to bother with. It all started this summer. Somebody has putted me on a HN and I went front page.<blockquote>7k visitors was more that my tender brain could comprehend :)</blockquote> I didn&#8217;t know it right away but in hindsight that put a &#8220;link-aggregate&#8221; bug in my brain. I am a long time occasional reddit reader. I know you are not exactly supposed to put you own stuff up there, but hey it&#8217;s not like it is really spamming. There is down vote button on the article so if it&#8217;s a dumb one it will get buried in 5 minutes. No harm done. Right?</p>

<blockquote>It&#8217;s easy to say &#8216;don&#8217;t put your own stuff&#8217;. BUT when you have zero readers (like me) it&#8217;s easier said than done.</blockquote>




<!-- more -->


<h2>Every vote counts the same</h2>

<p>I think Twitter is doing much better job at spreading the word. If you have more influence your opinion counts more. When some influencer retweets your blog post you get some quality people visiting the blog and giving great feedback. On reddit you have this nasty anonymity that is licence to be a jackass and thousands of people looking for a (basically) cheap trill. It&#8217;s like entering a public square and proclaiming your ideas while being ridiculed.</p>

<h2>Topic selection</h2>

<p>Because every vote counts the same you don&#8217;t get best ideas on the front. You get the ideas that annoy majority the least. Therefore if you for example bash Lisp (like I did once) you&#8217;ll be rather well received. That of course doesn&#8217;t mean that you are right but if you don&#8217;t read between the lines and notice comments from some really smart people there, you&#8217;ll walk away thinking that Lisp is bash-worthy-material. That&#8217;s how I got my prime time and some other better ideas probably didn&#8217;t.</p>

<h2>Addiction</h2>

<p>The fact is you will get this huge adrenalin rush when you hit the frontpage. I had couple of pretty well received posts that spent couple of days on programming subbreddit frontpage. That means 5k-7k of visits. That combined with gaug.es air view forced me to look at the screen mesmerized.</p>

<iframe src="http://player.vimeo.com/video/32480675?title=0&amp;byline=0&amp;portrait=0" width="400" height="225" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>


<p>In the meantime I&#8217;ve unsubscribed from gaug.es in order to get anything done  but boy was that a rush :)</p>

<h2>Trolling</h2>

<p>From all the link aggregates, reddit crowd is the toughest one. I have this post where I distiled something worth two years of &#8220;the trenches&#8221; about <a href="http://kresimirbojcic.com/2011/12/08/quality-is-overrated.html">quality not being most important thing.</a> (Tangential remark: As they say if you want to date supermodel you have to mingle with supermodels, working on your abs is worth ZERO if actually you don&#8217;t meet any supermodels. Great post about <a href="http://swombat.com/2012/1/1/creating-opportunities">creating opportunities here</a>)<blockquote> Beside being massively down voted the only comment I got was &#8220;You are a moran&#8221;.</blockquote> Good thing I get to moderate my comments so I&#8217;ve deleted it. HEY, the spelling was wrong! What else could I do? Later on post had quite a good run on the DZone, and I got some constructive feedback on it.</p>

<h2>Conclusion</h2>

<p>I am giving up on reddit. I&#8217;ve noticed some really senior guys being bashed &#8220;as really novice&#8221; for exposing their ideas. When taking in account some stuff I&#8217;ve mentioned above that is actually expected result. Reddit reminds me of cold calling. I am not getting the interaction I am looking for.<blockquote>I need gentle environment that will enable me to grow and not the unforgiving you-better-be-grandiose-or-don&#8217;t-show-up kind of community. So I say farewell&#8230;</blockquote></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ruby Oddities]]></title>
    <link href="http://kresimirbojcic.com/2011/12/29/ruby-oddities.html"/>
    <updated>2011-12-29T08:20:00+01:00</updated>
    <id>http://kresimirbojcic.com/2011/12/29/ruby-oddities</id>
    <content type="html"><![CDATA[<p>Over the course of time I&#8217;ve noticed three peculiar Ruby behaviours. I
am not saying these things are good or bad. They are a bit odd/unexpected, mostly neat and always good to know.</p>

<!-- more -->


<h2>String concatenation</h2>

<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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">spooky</span> <span class="o">=</span>  <span class="s2">&quot;This &quot;</span> <span class="s2">&quot;is &quot;</span> <span class="s2">&quot;kinda&quot;</span> <span class="s2">&quot; spooky!&quot;</span>
</span><span class='line'><span class="nb">puts</span> <span class="n">spooky</span> <span class="c1">#=&gt; This is kinda spooky!&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Default params hack</h2>

<p>If you want to know whether your default param remained default you can do it like this:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">default_param_trick</span><span class="p">(</span><span class="n">my_param</span><span class="o">=</span><span class="p">((</span><span class="n">default</span><span class="o">=</span><span class="kp">true</span><span class="p">);</span> <span class="s2">&quot;default&quot;</span><span class="p">))</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;param passed: </span><span class="si">#{</span><span class="n">my_param</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;default: </span><span class="si">#{</span><span class="n">default</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">default_param_trick</span>
</span><span class='line'><span class="c1">#=&gt; param passed: default</span>
</span><span class='line'><span class="c1">#=&gt; default: true</span>
</span><span class='line'>
</span><span class='line'><span class="n">default_param_trick</span> <span class="ss">:foobar</span>
</span><span class='line'><span class="c1">#=&gt; param passed: :foobar </span>
</span><span class='line'><span class="c1">#=&gt; default:</span>
</span></code></pre></td></tr></table></div></figure>


<p>It is really easy to explain. If you don&#8217;t pass default parameter, the
part after the = gets executed. It happens to be two lines of code one
of which sets <em>default</em> to true. Otherwise if you send a param those two lines are not executed and therefore <em>default</em> is not set.</p>

<p>The original explanation can be found at <a href="https://gist.github.com/1528785">default_param_hack</a></p>

<h2>Difference between do&#8230;end and {}</h2>

<p>It has to do with precedence of the operators but the result is subtly different and sort of unexpected:</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="nb">puts</span> <span class="p">(</span><span class="mi">1</span><span class="o">.</span><span class="n">.</span><span class="mi">3</span><span class="p">)</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span> <span class="o">|</span><span class="n">item</span><span class="o">|</span> <span class="n">item</span> <span class="o">*</span> <span class="mi">2</span> <span class="p">}</span>
</span><span class='line'><span class="c1">#=&gt;2</span>
</span><span class='line'><span class="c1">#=&gt;4</span>
</span><span class='line'><span class="c1">#=&gt;6</span>
</span><span class='line'>
</span><span class='line'><span class="nb">puts</span> <span class="p">(</span><span class="mi">1</span><span class="o">.</span><span class="n">.</span><span class="mi">3</span><span class="p">)</span><span class="o">.</span><span class="n">map</span> <span class="k">do</span> <span class="o">|</span><span class="n">item</span><span class="o">|</span>
</span><span class='line'>  <span class="n">item</span> <span class="o">*</span> <span class="mi">2</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="c1">#=&gt;&lt;Enumerator:0x007f86aa84dc70&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>I&#8217;ll stick to @JEG2 rule of writing brace delimiters when I care about result of block and do&#8230;end when I don&#8217;t. Except for one liners. I will always use braces for those. (The @JEG2 chooses to unfold even for one liners if the result is not important. I can see how that helps to communicate the intend, but I love one liners enough not to give up on them even if the result in not important&#8230;).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[I Would Love to See This in Ruby]]></title>
    <link href="http://kresimirbojcic.com/2011/12/27/i-would-love-to-see-this-in-ruby.html"/>
    <updated>2011-12-27T09:13:00+01:00</updated>
    <id>http://kresimirbojcic.com/2011/12/27/i-would-love-to-see-this-in-ruby</id>
    <content type="html"><![CDATA[<p>I like small methods. Small methods make comments unnecessary and allow me to
describe algorithms in a way I will understand in couple of months when
bug strikes. They allow me to develop domain and talk about domain in
the code. There is just one thing bothering me:<blockquote>The excessive presence
of end keyword.</blockquote> This is particularly bothersome for small methods.</p>

<!-- more -->


<p></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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">numbered?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>  <span class="n">line_numbering_style</span>  <span class="o">==</span> <span class="ss">:all_lines</span> <span class="o">||</span> <span class="n">significant?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">significant?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>  <span class="n">line_numbering_style</span> <span class="o">==</span> <span class="ss">:significant_lines</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">blank?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">blank?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>  <span class="n">line</span><span class="o">.</span><span class="n">nil?</span> <span class="p">?</span> <span class="kp">false</span> <span class="p">:</span> <span class="n">line</span><span class="o">.</span><span class="n">chomp</span><span class="o">.</span><span class="n">empty?</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">numerize</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">counter</span><span class="p">)</span>
</span><span class='line'>  <span class="n">counter</span><span class="o">.</span><span class="n">increment</span>
</span><span class='line'>  <span class="s2">&quot;%6d</span><span class="se">\t</span><span class="s2">%s&quot;</span> <span class="o">%</span> <span class="o">[</span><span class="n">counter</span><span class="o">.</span><span class="n">current</span><span class="p">,</span> <span class="n">line</span><span class="o">]</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>This looks <strong>much</strong> 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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">numbered?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>  <span class="n">line_numbering_style</span>  <span class="o">==</span> <span class="ss">:all_lines</span> <span class="o">||</span> <span class="n">significant?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">significant?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>  <span class="n">line_numbering_style</span> <span class="o">==</span> <span class="ss">:significant_lines</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">blank?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">blank?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>  <span class="n">line</span><span class="o">.</span><span class="n">nil?</span> <span class="p">?</span> <span class="kp">false</span> <span class="p">:</span> <span class="n">line</span><span class="o">.</span><span class="n">chomp</span><span class="o">.</span><span class="n">empty?</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">numerize</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">counter</span><span class="p">)</span>
</span><span class='line'>  <span class="n">counter</span><span class="o">.</span><span class="n">increment</span>
</span><span class='line'>  <span class="s2">&quot;%6d</span><span class="se">\t</span><span class="s2">%s&quot;</span> <span class="o">%</span> <span class="o">[</span><span class="n">counter</span><span class="o">.</span><span class="n">current</span><span class="p">,</span> <span class="n">line</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote>I am not talking about full blown Python indentation scheme.</blockquote>


<p>Although it
is working in <em>haml</em> just fine I hate counting spaces in the middle of
method&#8230; I know this was talked about back in a day and the
conclusion was that it&#8217;s not worthed. (I agree).</p>

<p>BUT I&#8217;ve noticed any time I write similar code in Clojure or Smalltalk I
don&#8217;t get to write an <em>end</em> to the method. When I compare the results I
always get the urge to write one liner in Ruby. It sort-of works for simple
code (notice that there is no semicolon):</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="k">def</span> <span class="nf">blank?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="n">line</span><span class="o">.</span><span class="n">nil?</span> <span class="p">?</span> <span class="kp">false</span> <span class="p">:</span> <span class="n">line</span><span class="o">.</span><span class="n">chomp</span><span class="o">.</span><span class="n">empty?</span> <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>For anything bigger than that one liner makes it harder to read. For those cases
when one liner is not cutting it I would even agree to put a dot at the end to ease things up for parser (if that helps):</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="k">def</span> <span class="nf">numbered?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>    <span class="n">line_numbering_style</span>  <span class="o">==</span> <span class="ss">:all_lines</span> <span class="o">||</span> <span class="n">significant?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">significant?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>    <span class="n">line_numbering_style</span> <span class="o">==</span> <span class="ss">:significant_lines</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">blank?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">blank?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>    <span class="n">line</span><span class="o">.</span><span class="n">nil?</span> <span class="p">?</span> <span class="kp">false</span> <span class="p">:</span> <span class="n">line</span><span class="o">.</span><span class="n">chomp</span><span class="o">.</span><span class="n">empty?</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">numerize</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">counter</span><span class="p">)</span>
</span><span class='line'>    <span class="n">counter</span><span class="o">.</span><span class="n">increment</span>
</span><span class='line'>    <span class="s2">&quot;%6d</span><span class="se">\t</span><span class="s2">%s&quot;</span> <span class="o">%</span> <span class="o">[</span><span class="n">counter</span><span class="o">.</span><span class="n">current</span><span class="p">,</span> <span class="n">line</span><span class="o">].</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Refactoring exercise]]></title>
    <link href="http://kresimirbojcic.com/2011/12/23/refactoring-exercise.html"/>
    <updated>2011-12-23T23:12:00+01:00</updated>
    <id>http://kresimirbojcic.com/2011/12/23/refactoring-exercise</id>
    <content type="html"><![CDATA[<p>I&#8217;ve just read an excellent article about refactoring rcat in <a href="http://subinterest.com/rubies-in-the-rough">Rubies in the
Rough.</a> If you are not
subscribed you should be&#8230; I couldn&#8217;t
resist to take a swing at it and refactor <strong>Display</strong> class since
thats where most of the action is happening. In one line <em>rcat</em> is supposed to behave as Unix <em>cat</em> command for some basic cases.</p>

<!-- more -->


<p>This is original implementation, great stuff from the
<a href="http://practicingruby.com/articles/shared/cpihumlznruh">Practicing Ruby.</a></p>

<figure class='code'><figcaption><span> (display_original.rb)</span> <a href='http://kresimirbojcic.com/downloads/code/rcat/display_original.rb'>download</a></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>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">Display</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@line_numbering_style</span>   <span class="o">=</span> <span class="n">params</span><span class="o">[</span><span class="ss">:line_numbering_style</span><span class="o">]</span>
</span><span class='line'>    <span class="vi">@squeeze_extra_newlines</span> <span class="o">=</span> <span class="n">params</span><span class="o">[</span><span class="ss">:squeeze_extra_newlines</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">render</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@line_number</span> <span class="o">=</span> <span class="mi">1</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">lines</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">lines</span>
</span><span class='line'>    <span class="kp">loop</span> <span class="p">{</span> <span class="n">render_line</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="kp">private</span>
</span><span class='line'>
</span><span class='line'>  <span class="kp">attr_reader</span> <span class="ss">:line_numbering_style</span><span class="p">,</span> <span class="ss">:squeeze_extra_newlines</span><span class="p">,</span> <span class="ss">:line_number</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">render_line</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span>
</span><span class='line'>    <span class="n">current_line</span> <span class="o">=</span> <span class="n">lines</span><span class="o">.</span><span class="n">next</span>
</span><span class='line'>    <span class="n">current_line_is_blank</span> <span class="o">=</span> <span class="n">current_line</span><span class="o">.</span><span class="n">chomp</span><span class="o">.</span><span class="n">empty?</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">case</span> <span class="n">line_numbering_style</span>
</span><span class='line'>    <span class="k">when</span> <span class="ss">:all_lines</span>
</span><span class='line'>      <span class="n">print_labeled_line</span><span class="p">(</span><span class="n">current_line</span><span class="p">)</span>
</span><span class='line'>      <span class="n">increment_line_number</span>
</span><span class='line'>    <span class="k">when</span> <span class="ss">:significant_lines</span>
</span><span class='line'>      <span class="k">if</span> <span class="n">current_line_is_blank</span>
</span><span class='line'>        <span class="n">print_unlabeled_line</span><span class="p">(</span><span class="n">current_line</span><span class="p">)</span>
</span><span class='line'>        <span class="c1"># skip incrementing line number, want to only count significant lines</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="n">print_labeled_line</span><span class="p">(</span><span class="n">current_line</span><span class="p">)</span>
</span><span class='line'>        <span class="n">increment_line_number</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>      <span class="n">print_unlabeled_line</span><span class="p">(</span><span class="n">current_line</span><span class="p">)</span>
</span><span class='line'>      <span class="n">increment_line_number</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="n">squeeze_extra_newlines</span> <span class="o">&amp;&amp;</span> <span class="n">current_line_is_blank</span>
</span><span class='line'>       <span class="n">lines</span><span class="o">.</span><span class="n">next</span> <span class="k">while</span> <span class="n">lines</span><span class="o">.</span><span class="n">peek</span><span class="o">.</span><span class="n">chomp</span><span class="o">.</span><span class="n">empty?</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="k">def</span> <span class="nf">print_labeled_line</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">print</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">line_number</span><span class="o">.</span><span class="n">to_s</span><span class="o">.</span><span class="n">rjust</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span><span class="si">}</span><span class="se">\t</span><span class="si">#{</span><span class="n">line</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">print_unlabeled_line</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">print</span> <span class="n">line</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">increment_line_number</span>
</span><span class='line'>    <span class="vi">@line_number</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>I&#8217;ve liked @JEG2 idea about not using loop and about trimming down
<em>render_line</em> method a bit. I did not like the use of additional object
that will carry state. This is what I&#8217;ve ended up with:</p>

<figure class='code'><figcaption><span> (display.rb)</span> <a href='http://kresimirbojcic.com/downloads/code/rcat/display.rb'>download</a></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>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">module</span> <span class="nn">RCat</span>
</span><span class='line'>  <span class="k">class</span> <span class="nc">Display</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
</span><span class='line'>      <span class="vi">@line_numbering_style</span>   <span class="o">=</span> <span class="n">params</span><span class="o">[</span><span class="ss">:line_numbering_style</span><span class="o">]</span>
</span><span class='line'>      <span class="vi">@squeeze_extra_newlines</span> <span class="o">=</span> <span class="n">params</span><span class="o">[</span><span class="ss">:squeeze_extra_newlines</span><span class="o">]</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">render</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</span><span class='line'>      <span class="n">reset_line_number_counter</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">data</span><span class="o">.</span><span class="n">reduce</span><span class="p">(</span><span class="kp">false</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">previous_is_blank</span><span class="p">,</span> <span class="n">line</span><span class="o">|</span>
</span><span class='line'>        <span class="k">next</span> <span class="k">if</span> <span class="n">squeeze_extra_newlines</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>                <span class="n">previous_is_blank</span> <span class="o">&amp;&amp;</span> <span class="n">blank?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>        <span class="nb">print</span> <span class="nb">format</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>        <span class="n">blank?</span><span class="p">(</span><span class="n">line</span><span class="p">)</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="kp">private</span>
</span><span class='line'>
</span><span class='line'>    <span class="kp">attr_reader</span> <span class="ss">:line_numbering_style</span><span class="p">,</span>
</span><span class='line'>                <span class="ss">:squeeze_extra_newlines</span><span class="p">,</span>
</span><span class='line'>                <span class="ss">:line_number</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">format</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>      <span class="n">numbered?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="p">?</span> <span class="n">numbered</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> <span class="p">:</span> <span class="n">line</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">numbered?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>      <span class="n">line_numbering_style</span>  <span class="o">==</span> <span class="ss">:all_lines</span> <span class="o">||</span>
</span><span class='line'>      <span class="p">(</span><span class="n">line_numbering_style</span> <span class="o">==</span> <span class="ss">:significant_lines</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">blank?</span><span class="p">(</span><span class="n">line</span><span class="p">))</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">blank?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>      <span class="n">line</span><span class="o">.</span><span class="n">chomp</span><span class="o">.</span><span class="n">empty?</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">reset_line_number_counter</span>
</span><span class='line'>      <span class="vi">@line_number</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">numbered</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>      <span class="vi">@line_number</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span class='line'>      <span class="s2">&quot;%6d</span><span class="se">\t</span><span class="s2">%s&quot;</span> <span class="o">%</span> <span class="o">[</span><span class="vi">@line_number</span><span class="p">,</span> <span class="n">line</span><span class="o">]</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>The code is so self explanatory :) that I don&#8217;t need to say anything
except maybe that I am in <em>reduce-happy-phase</em> as visible from above.</p>

<p>Afterwards I&#8217;ve played a bit with removing that boolean logic from
reduce and also with extracting the counter logic. This is the result:</p>

<figure class='code'><figcaption><span> (display_ii.rb)</span> <a href='http://kresimirbojcic.com/downloads/code/rcat/display_ii.rb'>download</a></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>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">Display</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@line_numbering_style</span>   <span class="o">=</span> <span class="n">params</span><span class="o">[</span><span class="ss">:line_numbering_style</span><span class="o">]</span>
</span><span class='line'>    <span class="vi">@squeeze_extra_newlines</span> <span class="o">=</span> <span class="n">params</span><span class="o">[</span><span class="ss">:squeeze_extra_newlines</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">render</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</span><span class='line'>    <span class="n">counter</span> <span class="o">=</span> <span class="no">Counter</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">data</span><span class="o">.</span><span class="n">reduce</span><span class="p">(</span><span class="kp">nil</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">previous</span><span class="p">,</span> <span class="n">current</span><span class="o">|</span>
</span><span class='line'>      <span class="k">next</span> <span class="k">if</span> <span class="n">squeeze_extra_newlines</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>              <span class="n">blank?</span><span class="p">(</span><span class="n">previous</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">blank?</span><span class="p">(</span><span class="n">current</span><span class="p">)</span>
</span><span class='line'>      <span class="nb">print</span> <span class="n">numbered?</span><span class="p">(</span><span class="n">current</span><span class="p">)</span> <span class="p">?</span> <span class="n">numerize</span><span class="p">(</span><span class="n">current</span><span class="p">,</span> <span class="n">counter</span><span class="p">)</span> <span class="p">:</span> <span class="n">current</span>
</span><span class='line'>      <span class="n">current</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="kp">private</span>
</span><span class='line'>
</span><span class='line'>  <span class="kp">attr_reader</span> <span class="ss">:line_numbering_style</span><span class="p">,</span>
</span><span class='line'>              <span class="ss">:squeeze_extra_newlines</span><span class="p">,</span>
</span><span class='line'>              <span class="ss">:line_number</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">numbered?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>    <span class="n">line_numbering_style</span>  <span class="o">==</span> <span class="ss">:all_lines</span> <span class="o">||</span> <span class="n">significant?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">significant?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>    <span class="n">line_numbering_style</span> <span class="o">==</span> <span class="ss">:significant_lines</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">blank?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">blank?</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</span><span class='line'>    <span class="n">line</span><span class="o">.</span><span class="n">nil?</span> <span class="p">?</span> <span class="kp">false</span> <span class="p">:</span> <span class="n">line</span><span class="o">.</span><span class="n">chomp</span><span class="o">.</span><span class="n">empty?</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">numerize</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">counter</span><span class="p">)</span>
</span><span class='line'>    <span class="n">counter</span><span class="o">.</span><span class="n">increment</span>
</span><span class='line'>    <span class="s2">&quot;%6d</span><span class="se">\t</span><span class="s2">%s&quot;</span> <span class="o">%</span> <span class="o">[</span><span class="n">counter</span><span class="o">.</span><span class="n">current</span><span class="p">,</span> <span class="n">line</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Counter</span>
</span><span class='line'>  <span class="kp">attr_reader</span> <span class="ss">:current</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span><span class="p">()</span> <span class="vi">@current</span>  <span class="o">=</span> <span class="mi">0</span> <span class="k">end</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">increment</span><span class="p">()</span>  <span class="vi">@current</span> <span class="o">+=</span> <span class="mi">1</span> <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>I like the last example the best because domain is really starting to
show. I get to talk about being blank or significant etc&#8230; In theory
.each_cons(2) seems to be better suited than .reduce for the job of &#8220;sliding&#8221; trough lines,
but I am unable to make it work that way. (@ryanlecompte suggested it
since I completely forgot about that method.)</p>

<p>Also it looks to me as if I need &#8220;Line&#8221; class that would have blank?,
significant? and numbered? methods. Probably also &#8220;Configuration&#8221; class
for line style. But that is something I would do if things begin to get
complex, right now there is no need. I am pretty pleased on how the code
is communicating what it is suppose to do.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Geek...No More!]]></title>
    <link href="http://kresimirbojcic.com/2011/12/22/geek-dot-dot-dot-no-more.html"/>
    <updated>2011-12-22T13:43:00+01:00</updated>
    <id>http://kresimirbojcic.com/2011/12/22/geek-dot-dot-dot-no-more</id>
    <content type="html"><![CDATA[<p>Majority of people I know of that are great with computers tend to be not so great at sports. In tender years of their youth they are usually picked up the last for all sorts of sports activities. I believe this actually helps their computer skills as they get to spend more time with computer. After all everybody likes doing what he is good at. I&#8217;ve noticed couple of distinct phases.</p>

<!-- more -->


<h2>Phase I - denial</h2>

<p>You do notice that you are a bit <em>different</em>. Other people might even call you out for being a geek or nerd. You deny it and fight it.</p>

<h2>Phase II - blending in</h2>

<p>By now you acknowledge that you have a <em>flaw</em>. You try to compensate by doing &#8220;normal&#8221; stuff. In my case this included <em>hiding/ignoring</em> that I was interested in computers and alpha alcoholism instead of going to classes. I had a blast at high school and flunked a couple of years at college, but all in all I&#8217;ve sneaked trough.</p>

<h2>Phase III - overcompensating</h2>

<p>By now it starts to look as being a geek is not such a bad thing after all. As it turns out market demand for computer experts is high and you are doing cool stuff at work for a good paycheck.
You even start calling yourself a <em>geek</em>.</p>

<p>We have all sort of geeks: all around geeks, geeks with hats, your favorite geeks&#8230; and yours truly geek from Croatia. Deep inside you still don&#8217;t want to be a <em>geek</em> from the <strong>phase I</strong>.</p>

<p>This is why we have all this <em>jockey</em> names for <em>stuff</em>:</p>

<ul>
<li>jQuery Ninja</li>
<li>Coding Dojo</li>
<li>eXtreme Programming</li>
<li>Scrum</li>
</ul>


<p>Looks like we are in effect <strong>overcompensating.</strong> It reminds me of this:</p>

<p><img align="center"  src="http://kresimirbojcic.com/images/dont_overcompensate/comboverfromabove.jpg" alt="Covering up"/></p>


<h2>Conclusion</h2>

<p>Where does this leaves us? I will stop calling myself a <em>geek</em> and if I ever contribute with anything I&#8217;ll give it a good honest name. Like Clojure or Ruby for example. No apologies, no warnings and no overcompensation.</p>

<p>I agree that:</p>

<p><img align="center"  src="http://kresimirbojcic.com/images/dont_overcompensate/not_a_ninja.jpg" alt="Not a ninja"/></p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Grokking the Ruby Blocks In 10 Minutes]]></title>
    <link href="http://kresimirbojcic.com/2011/12/18/grokking-the-ruby-blocks-in-10-minutes.html"/>
    <updated>2011-12-18T11:07:00+01:00</updated>
    <id>http://kresimirbojcic.com/2011/12/18/grokking-the-ruby-blocks-in-10-minutes</id>
    <content type="html"><![CDATA[<p>I am assuming you are intrigued about <strong>Ruby blocks</strong>. My assumption is that you are aware that they exist but unsure of what they are or how to use them. From my experience main obstacle in understanding them is introduction of multiple concepts all at once. You need to understand closures and procs to understand blocks. Also Ruby mix-up with lambda vs. proc debate is not helpful either.
There are some great posts about the subject. For example <a href="http://www.robertsosinski.com/2008/12/21/understanding-ruby-blocks-procs-and-lambdas">Understanding Ruby Blocks Procs and Lambdas.</a></p>

<p><img align="center"  src="http://upload.wikimedia.org/wikipedia/en/d/d4/PubTThou01.jpg" alt="Nightmare at 20,000 Feet"/>
<br/>Nightmare at 20,000 Feet via Wikipedia</p>


<p>I am going to bluntly ignore the details and just give the 20,000 feet look at it.</p>

<blockquote>Block in Ruby is just another type of variable.</blockquote>


<!-- more -->


<p>We all understand this:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">hello</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;Hello </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">.&quot;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">hello</span> <span class="s2">&quot;unfortunate reader&quot;</span> <span class="c1">#=&gt; Hello unfortunate reader.</span>
</span></code></pre></td></tr></table></div></figure>


<p>We also understand that the functions in Ruby are a first class citizens; you can declare a function and save it for later usage like this:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">function</span> <span class="o">=</span> <span class="o">-&gt;</span><span class="p">(</span><span class="nb">name</span><span class="p">){</span> <span class="nb">puts</span> <span class="s2">&quot;Hello </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">.&quot;</span> <span class="p">}</span>  <span class="c1">#defining for later execution</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">hello</span><span class="p">(</span><span class="n">function</span><span class="p">,</span> <span class="nb">name</span><span class="p">)</span>
</span><span class='line'>  <span class="n">function</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">hello</span> <span class="n">function</span><span class="p">,</span> <span class="s2">&quot;unfortunate reader&quot;</span> <span class="c1">#=&gt; Hello unfortunate reader.</span>
</span></code></pre></td></tr></table></div></figure>


<p>It turns out block is just syntax sugar for that kind of variable. <blockquote>Here is the deal: You don&#8217;t give a name to a function and it has to be the last argument. Let&#8217;s call it a block.</blockquote> This so called <em>block</em> is (before being used) transformed to a <em>function</em> with that silly ampersand.</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">hello</span><span class="p">(</span><span class="nb">name</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>  <span class="n">block</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">hello</span><span class="p">(</span><span class="s2">&quot;unfortunate reader&quot;</span><span class="p">)</span> <span class="p">{</span><span class="o">|</span><span class="nb">name</span><span class="o">|</span> <span class="nb">puts</span> <span class="s2">&quot;Hello </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">.&quot;</span> <span class="p">}</span>  <span class="c1">#=&gt; Hello unfortunate reader.</span>
</span></code></pre></td></tr></table></div></figure>


<p>This fact is somewhat shadowed with the use of <em>implicit blocks</em> and a special keyword <em>yield</em>. But don&#8217;t let that fool you. It is still just a (hidden) variable and being treated exactly the same as the above <em>block</em>.</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">hello</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
</span><span class='line'>  <span class="k">yield</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">hello</span><span class="p">(</span><span class="s2">&quot;unfortunate reader&quot;</span><span class="p">)</span> <span class="p">{</span> <span class="o">|</span><span class="nb">name</span><span class="o">|</span> <span class="nb">puts</span> <span class="s2">&quot;Goodby </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">.&quot;</span> <span class="p">}</span> <span class="c1">#=&gt; Goodby unfortunate reader.</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Memorize the Concepts Not the APIs]]></title>
    <link href="http://kresimirbojcic.com/2011/12/16/memorize-the-concepts-not-the-apis.html"/>
    <updated>2011-12-16T09:49:00+01:00</updated>
    <id>http://kresimirbojcic.com/2011/12/16/memorize-the-concepts-not-the-apis</id>
    <content type="html"><![CDATA[<p>I was always ashamed of not being able to bang out code without looking at the documentation. One example was file opening/handling in .NET 1.1. I remember not being able to do it even if my life would depend on it. Later on I&#8217;ve read that Microsoft made the study about APIs usability. One of the APIs that missed the mark was the IO.<blockquote>The main complaint was that you need way too many lines of code for basic scenarios.</blockquote> The other complaint was that you need the knowledge of rather abstract (from the usage point of view) inheritance tree. That was a bit of relief. I stopped feeling as such an imposter that was getting payed for doing nothing. Still I regarded this as my flaw and was always irritated when unable to do simple stuff because I forgot API details.</p>

<p>Similarly, after finding out about Ruby I was amazed that <em>alpha geeks</em> figured it out five years before me. When I think about it more carefully, it would not be logical any other way. I speculate that they were able to position Ruby as a Smalltalk derivate that has some Perl syntax sugar and some Lisp functional goodness. That enabled them to label/recognize the whole technology relatively fast and easy.</p>

<!-- more -->


<p>The previous knowledge of concepts was the main factor that enabled that.<blockquote>The matter of fact is that very, very rarely we get a new concept that is also usable at the same time.</blockquote> This is double sworded. One side of it is that we are not making as much progress as we would like. The other side is that if you know enough you get to keep tap on new things. From this perspective it is useless to engage in holy-wars. You get to use previous knowledge and adjust technology trade-offs to your personal taste while recycling the existing ideas.</p>

<blockquote>Concepts enable us to have a common vocabulary and to talk about problems more easily. They also transcendent the technology itself.</blockquote>


<p>The matter of fact is that technology shelf life is 5-7 years. In that time something new will come along and evolve the state of the art. You have to ask yourself who are those people that are pushing the envelope. I think they are the one that are leaning on the shoulders of a giants from (glorious) past. They are able to look at technology instantly knowing its strong sides and limitations. I base this assumption on a fact that main factor in speeding up the whole human race progress was the invention of press machines. Books enabled people to share concepts on a much broader scale than before. Internet is in a way just improved and more interactive version of a book.</p>

<p>I bow my head to Lisp for giving as <em>fold</em> and <em>map</em>, I bow to Smalltalk for giving as block syntax and showing us how nice keyword arguments can really be. I bow my head to Unix for enabling us to connect programs the same way that we connect a garden hoses (standard input/output)&#8230;</p>

<h2>Conclusion</h2>

<p>Don&#8217;t just stand there, learn about <em>traits</em> from Smalltalk or about <em>currying</em> in (for example) Perl. That kind of knowledge is what is most important anyways.<blockquote>Leave the APIs details in the documentation and look it up when needed.</blockquote> Details grow irrelevant fast. Concepts on the other hand will serve you much longer and <strong>will</strong> be present in whatever new technology you are going to use.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Breaking The Rules]]></title>
    <link href="http://kresimirbojcic.com/2011/12/13/breaking-the-rules.html"/>
    <updated>2011-12-13T15:51:00+01:00</updated>
    <id>http://kresimirbojcic.com/2011/12/13/breaking-the-rules</id>
    <content type="html"><![CDATA[<p>Yesterday I&#8217;ve subscribed to <a href="http://subinterest.com/rubies-in-the-rough">Rubies in the Rough</a> from James Edward Gray II and read his article &#8220;Doing it Wrong&#8221;.</p>

<blockquote>In his article he questions (along with some other rules) the rule of never using regular expression for xml parsing.</blockquote>


<p>As it turned out it was a fortunate move since six dollars and one day latter I came across .xml that needed to be parsed.</p>

<p>I have a confession to make: I&#8217;ve always hated xml parsers. This particular .xml did not even use xml strengths; data inside was all messed up:</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>
</pre></td><td class='code'><pre><code class='xml'><span class='line'><span class="cp">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;</span>
</span><span class='line'><span class="nt">&lt;rss</span> <span class="na">version=</span><span class="s">&quot;2.0&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;channel&gt;</span>
</span><span class='line'><span class="nt">&lt;title&gt;</span>Exchage rates list<span class="nt">&lt;/title&gt;</span>
</span><span class='line'><span class="nt">&lt;link&gt;</span>http://*******<span class="nt">&lt;/link&gt;&lt;description&gt;</span>Excange rates list 12/13/2011<span class="nt">&lt;/description&gt;&lt;item&gt;</span>
</span><span class='line'>      <span class="nt">&lt;guid</span> <span class="na">isPermaLink=</span><span class="s">&quot;false&quot;</span><span class="nt">&gt;</span>code: 978<span class="nt">&lt;/guid&gt;</span>
</span><span class='line'>      <span class="nt">&lt;title&gt;</span>EMU (EUR)<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>      <span class="nt">&lt;description&gt;</span>
</span><span class='line'>          Unit: 1<span class="nt">&lt;br</span> <span class="nt">/&gt;</span>
</span><span class='line'>          Buying: 1.95583  <span class="nt">&lt;br</span> <span class="nt">/&gt;</span>
</span><span class='line'>          Medium: 1.95583  <span class="nt">&lt;br</span> <span class="nt">/&gt;</span>
</span><span class='line'>          Selling: 1.95583 <span class="nt">&lt;br</span> <span class="nt">/&gt;</span>
</span><span class='line'>      <span class="nt">&lt;/description&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nt">&lt;/item&gt;</span>   <span class="nt">&lt;item&gt;</span>
</span><span class='line'>      <span class="nt">&lt;guid</span> <span class="na">isPermaLink=</span><span class="s">&quot;false&quot;</span><span class="nt">&gt;</span>code: 36<span class="nt">&lt;/guid&gt;</span>
</span><span class='line'>      <span class="nt">&lt;title&gt;</span>Australia (AUD)<span class="nt">&lt;/title&gt;</span>
</span><span class='line'>      <span class="nt">&lt;description&gt;</span>
</span><span class='line'>          Unit: 1<span class="nt">&lt;br</span> <span class="nt">/&gt;</span>
</span><span class='line'>          Buying: 1.488813<span class="nt">&lt;br</span> <span class="nt">/&gt;</span>
</span><span class='line'>      ...
</span></code></pre></td></tr></table></div></figure>


<!-- more -->


<p>In the article he made a good point and illuminated the edge cases where you are not really parsing, but rather just hunting for some data.</p>

<p>That was encouraging enough to end up with this:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">data</span><span class="o">.</span><span class="n">gsub!</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">gsub!</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\t</span><span class="s2">&quot;</span><span class="p">,</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
</span><span class='line'><span class="n">data</span> <span class="o">=~</span> <span class="sr">/Exchange rates list (\d+\/\d+\/\d+)/</span>
</span><span class='line'>  <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'><span class="n">data</span><span class="o">.</span><span class="n">scan</span><span class="sr"> /code:\s(\d+).*?\((\w+)\).*?Unit:\s(\d+).*?Buying:\s(\d+\.?\d+).*?Medium:\s(\d+\.?\d+).*?Selling:\s(\d+\.?\d+)/</span> <span class="k">do</span> <span class="o">|</span><span class="n">item</span><span class="o">|</span>
</span><span class='line'>  <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Does it feel good? It sure does. Is it any worse than using xml parser? No, I don&#8217;t think so. Data is safe and sound, just look how happy it looks:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="s2">&quot;12/13/2011&quot;</span>
</span><span class='line'><span class="o">[</span><span class="s2">&quot;978&quot;</span><span class="p">,</span> <span class="s2">&quot;EUR&quot;</span><span class="p">,</span> <span class="s2">&quot;1&quot;</span><span class="p">,</span> <span class="s2">&quot;1.95583&quot;</span><span class="p">,</span> <span class="s2">&quot;1.95583&quot;</span><span class="p">,</span> <span class="s2">&quot;1.95583&quot;</span><span class="o">]</span>
</span><span class='line'><span class="o">[</span><span class="s2">&quot;36&quot;</span><span class="p">,</span> <span class="s2">&quot;AUD&quot;</span><span class="p">,</span> <span class="s2">&quot;1&quot;</span><span class="p">,</span> <span class="s2">&quot;1.488813&quot;</span><span class="p">,</span> <span class="s2">&quot;1.492544&quot;</span><span class="p">,</span> <span class="s2">&quot;1.496275&quot;</span><span class="o">]</span>
</span><span class='line'><span class="o">[</span><span class="s2">&quot;124&quot;</span><span class="p">,</span> <span class="s2">&quot;CAD&quot;</span><span class="p">,</span> <span class="s2">&quot;1&quot;</span><span class="p">,</span> <span class="s2">&quot;1.437051&quot;</span><span class="p">,</span> <span class="s2">&quot;1.440653&quot;</span><span class="p">,</span> <span class="s2">&quot;1.444255&quot;</span><span class="o">]</span>
</span><span class='line'><span class="o">[</span><span class="s2">&quot;191&quot;</span><span class="p">,</span> <span class="s2">&quot;HRK&quot;</span><span class="p">,</span> <span class="s2">&quot;100&quot;</span><span class="p">,</span> <span class="s2">&quot;26.021213&quot;</span><span class="p">,</span> <span class="s2">&quot;26.086429&quot;</span><span class="p">,</span> <span class="s2">&quot;26.151645&quot;</span><span class="o">]</span>
</span><span class='line'><span class="o">[</span><span class="s2">&quot;203&quot;</span><span class="p">,</span> <span class="s2">&quot;CZK&quot;</span><span class="p">,</span> <span class="s2">&quot;1&quot;</span><span class="p">,</span> <span class="s2">&quot;0.076274&quot;</span><span class="p">,</span> <span class="s2">&quot;0.076465&quot;</span><span class="p">,</span> <span class="s2">&quot;0.076656&quot;</span><span class="o">]</span>
</span><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Conclusion</h2>

<p>I didn&#8217;t really break any rules. I just saw the whole problem more clearly because of his article. I figured I would need the regex anyhow since document was structured so unfortunately.<br/><br/>Other then recommending his articles I can say that being pragmatic can get you solutions that are on the other side of <em>rules</em> fence. <blockquote>The thing is that sometimes the other side doesn&#8217;t have to be a bad side.</blockquote></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Small Sample of Ruby Elegance]]></title>
    <link href="http://kresimirbojcic.com/2011/12/09/small-sample-of-ruby-elegance.html"/>
    <updated>2011-12-09T17:19:00+01:00</updated>
    <id>http://kresimirbojcic.com/2011/12/09/small-sample-of-ruby-elegance</id>
    <content type="html"><![CDATA[<p>If you don&#8217;t know Ruby please take a few moments and look at code below. You may like it.</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">w</span> <span class="o">=</span> <span class="sx">%w[a c d b e]</span> <span class="c1"># same as w = [&quot;a&quot;, &quot;c&quot;, &quot;d&quot;, &quot;b&quot;, &quot;e&quot;]</span>
</span><span class='line'><span class="n">w</span><span class="o">.</span><span class="n">sort</span> <span class="c1">#=&gt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;]</span>
</span><span class='line'><span class="n">w</span><span class="o">.</span><span class="n">sort</span><span class="o">.</span><span class="n">reverse</span> <span class="c1">#=&gt; [&quot;e&quot;, &quot;d&quot;, &quot;c&quot;, &quot;b&quot;, &quot;a&quot;]</span>
</span><span class='line'><span class="n">w</span><span class="o">.</span><span class="n">sort</span> <span class="p">{</span> <span class="o">|</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="o">|</span> <span class="n">b</span><span class="o">&lt;=&gt;</span><span class="n">a</span> <span class="p">}</span> <span class="c1">#=&gt; [&quot;e&quot;, &quot;d&quot;, &quot;c&quot;, &quot;b&quot;, &quot;a&quot;]</span>
</span><span class='line'>
</span><span class='line'><span class="n">w</span><span class="o">.</span><span class="n">reduce</span><span class="p">(</span><span class="ss">:+</span><span class="p">)</span> <span class="c1">#=&gt; &quot;acdbe&quot;</span>
</span><span class='line'><span class="n">w</span><span class="o">.</span><span class="n">map</span><span class="p">(</span><span class="o">&amp;</span><span class="ss">:upcase</span><span class="p">)</span> <span class="c1">#=&gt; [&quot;A&quot;, &quot;C&quot;, &quot;D&quot;, &quot;B&quot;, &quot;E&quot;]</span>
</span><span class='line'>
</span><span class='line'><span class="n">w</span><span class="o">.</span><span class="n">include?</span> <span class="s2">&quot;a&quot;</span> <span class="c1">#=&gt; true</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="mi">1</span><span class="o">.</span><span class="n">.</span><span class="mi">8</span><span class="p">)</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="o">&amp;</span><span class="ss">:even?</span><span class="p">)</span> <span class="c1">#=&gt; [2, 4, 6, 8]</span>
</span><span class='line'><span class="p">(</span><span class="mi">1</span><span class="o">.</span><span class="n">.</span><span class="mi">8</span><span class="p">)</span><span class="o">.</span><span class="n">reject</span><span class="p">(</span><span class="o">&amp;</span><span class="ss">:even?</span><span class="p">)</span> <span class="c1">#=&gt; [1, 3, 5, 7]</span>
</span><span class='line'>
</span><span class='line'><span class="n">langs</span> <span class="o">=</span> <span class="sx">%w[ruby python perl]</span> <span class="c1"># same as langs = [&quot;ruby&quot;, &quot;python&quot;, &quot;perl&quot;]</span>
</span><span class='line'>
</span><span class='line'><span class="n">langs</span><span class="o">.</span><span class="n">group_by</span><span class="p">(</span><span class="o">&amp;</span><span class="ss">:chr</span><span class="p">)</span> <span class="c1">#=&gt; {&quot;r&quot;=&gt;[&quot;ruby&quot;], &quot;p&quot;=&gt;[&quot;python&quot;, &quot;perl&quot;]}</span>
</span><span class='line'><span class="n">langs</span><span class="o">.</span><span class="n">map</span><span class="p">(</span><span class="o">&amp;</span><span class="ss">:capitalize</span><span class="p">)</span> <span class="c1">#=&gt; [&quot;Ruby&quot;, &quot;Python&quot;, &quot;Perl&quot;]</span>
</span></code></pre></td></tr></table></div></figure>


<p>As they say:</p>

<blockquote>The beauty of Ruby is found in its balance between simplicity and power.</blockquote>


<p>If after this your mouth is watering, you can <a href="http://tryruby.org/levels/1/challenges/0">try Ruby online.</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Quality Is Overrated]]></title>
    <link href="http://kresimirbojcic.com/2011/12/08/quality-is-overrated.html"/>
    <updated>2011-12-08T10:40:00+01:00</updated>
    <id>http://kresimirbojcic.com/2011/12/08/quality-is-overrated</id>
    <content type="html"><![CDATA[<p>I&#8217;ve been a TDD zealot for the last 7-8 years. I take pride in my code being well tested, my solutions being user friendly and my design being test driven.</p>

<blockquote>When I test I know my system works. I sleep like a baby. I have a balls of brass. I can embrace change and laugh at how easy it is to add new requirements.</blockquote>


<p>The thing is, in my life I&#8217;ve seen a fair amount of big systems that are <em>terrible</em>. They all have one thing in common. Everybody hates them. Programmers, users&#8230; but they do work, sort of. They are slow and buggy but nevertheless they deliver some value to the users.</p>

<blockquote>Enterprise is euphemism for lame systems that barely work for 300 users?</blockquote>


<p> Oddly, in many of those <em>terrible</em> systems funny thing happened. After a while guess what? People involved (users and programmers) made those terrible systems work (just enough) and all of a sudden you have a winner. Bigger the system, bigger the win. Bigger the mess, bigger the ecosystem of additional companies making it all work.</p>

<blockquote>Think Windows & antivirus for example.</blockquote>


<p>I wonder how smug IBM felt when developing OS/2 with all the cool stuff&#8230;and than a big nothing happened. Right now you might be thinking that I&#8217;ve lost it. You are ready to click away&#8230; but let see some examples:</p>

<!-- more -->


<h2>World War II Tiger vs. T-34</h2>

<p>One of the most advanced features of the Tiger was its assembly process. Flat section armour plate was used throughout the assembly process, which allowed the use of heavy armour. Various parts were made as one complete unit complete with interlocking joints that made assembly a quick process. <strong>Rings a bell?</strong> They where too heavy for most bridges, but it was not problem since they&#8217;ve added snorkel?! (later abandoned). However it costed staggering 250,000 marks. Meanwhile Russians had a pile of crap. One Tiger could easily destroy multiple Russians cans. There is one minor detail; at the end of the war Russians manufactured 1.300 T-34 monthly and Germans managed to produce 1.500 Tigers all together. It was not a coincidence it was a trade off. Did quality matter? It did, but not all that much for the bottom line.</p>

<blockquote>Some other factors were more important than mere quality.</blockquote>


<p> They were able to match Tiger quality later on while winning the whole time. By the end of the war, other tanks had been developed that outclassed the Tiger based on the lessons learnt on low quality mass production which also secured the front.</p>

<h2>Bradley Fighting Vehicle</h2>

<p>Development started at 1964 and since then project requirements changed a couple of times (big changes)&#8230; I don&#8217;t know if &#8220;Pentagon Wars&#8221; have any truth in it, but it does look a lot like a massive project gone awry. They&#8217;ve pulled it of just on muscle power and hard-as-opposite-to-smart work. The only guy that insisted on quality was force-retired (Coloner Burton). Eventually 17 years and 40 billion dollars later they&#8217;ve managed to slap together product that is in use even today. After a few additional iterations based on combat experience it even became good enough. Prototype that will replace Bradley is planned for 2015. In software project terms this is considered a success. Did it matter that quality suffered most of the time? No, not really.</p>

<h2>Elevator</h2>

<p>I sometimes ride a buggy elevator near where I live. You need to press &#8220;floor 3&#8221; the display shows &#8220;floor 2&#8221; and you actually go to &#8220;floor 1&#8221;. Am I unhappy? Am I not using it? The thing is I don&#8217;t care and it doesn&#8217;t stop me from riding it. When someone new is with me I even get to crack jokes about it. All in all it is a complete win despite obvious flaws.</p>

<h2>Conclusion</h2>

<p>I will not stop to test drive my code. I like the immediate feedback and the power I get from knowing that system is working. I like evolving the code in an organic manner. I like to garden and polish code. This post is acknowledgment that the other side has it&#8217;s strong points. It is not luck that they also make their way work. You can balance your trade-offs in a different constellation and if you are smart enough you may be in equal or even better position. It is not quality that matters, but being a champion.</p>

<p>Champions are underrated because of industry obsession with silver bullets. Throw any technology at champions and give them a goal. Being a champion is much more important than anything else. It is a known fact that OOP projects had much better success rate than procedural paradigm at the beginning of OOP wave. Reason was that you had all the champions trying out this new cool stuff. After a while the numbers evened up back to the average.</p>

<p>It just happens that today rage is all about Ruby, Clojure and what not. That means that you have a bunch of champions piled up. I bet all of those guys would pull it off in any technology and with any development technique.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Blow Your Mind (Maybe) With Case Equality In Ruby]]></title>
    <link href="http://kresimirbojcic.com/2011/12/06/blow-your-maybe-with-case-equality-in-ruby.html"/>
    <updated>2011-12-06T23:00:00+01:00</updated>
    <id>http://kresimirbojcic.com/2011/12/06/blow-your-maybe-with-case-equality-in-ruby</id>
    <content type="html"><![CDATA[<p>It all starts with &#8220;A Little Unnecessary Smalltalk Envy&#8221; from Bob Hutchinson.</p>

<p>Quick warning: If you don&#8217;t like monkey patching&#8230; Run away now it is still not too late&#8230;</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># Copied from</span>
</span><span class='line'><span class="c1"># http://blog.teksol.info/2007/11/23/a-little-smalltalk-in-ruby-if_nil-and-if_not_nil</span>
</span><span class='line'><span class="c1"># http://recursive.ca/hutch/2007/11/22/a-little-unnecessary-smalltalk-envy/</span>
</span><span class='line'><span class="c1"># Bob Huntchison</span>
</span><span class='line'><span class="c1"># Shortened to just support if_not_nil</span>
</span><span class='line'><span class="k">class</span> <span class="nc">Object</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">if_not_nil</span><span class="p">(</span><span class="o">&amp;</span><span class="n">block</span><span class="p">)</span> <span class="k">yield</span><span class="p">(</span><span class="nb">self</span><span class="p">)</span> <span class="k">if</span> <span class="n">block</span> <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">NilClass</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">if_not_nil</span><span class="p">(</span><span class="o">&amp;</span><span class="n">block</span><span class="p">)</span> <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>This enables you to stop treating <em>nil</em> as a special case:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Person</span>
</span><span class='line'>  <span class="kp">attr_reader</span> <span class="ss">:name</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@name</span> <span class="o">=</span> <span class="nb">name</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="k">def</span> <span class="nf">person_that_exists</span>
</span><span class='line'>  <span class="no">Person</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">&quot;drKreso&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">non_existing_person</span>
</span><span class='line'>  <span class="kp">nil</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">person_that_exists</span><span class="o">.</span><span class="n">if_not_nil</span> <span class="p">{</span> <span class="o">|</span><span class="n">person</span><span class="o">|</span> <span class="nb">puts</span> <span class="s2">&quot;found </span><span class="si">#{</span><span class="n">person</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">}</span> <span class="c1"># =&gt; found drKreso</span>
</span><span class='line'><span class="n">non_existing_person</span><span class="o">.</span><span class="n">if_not_nil</span> <span class="p">{</span> <span class="o">|</span><span class="n">person</span><span class="o">|</span> <span class="nb">puts</span> <span class="s2">&quot;found </span><span class="si">#{</span><span class="n">person</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">}</span> <span class="c1"># =&gt; nothing happens</span>
</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>This is easy enough to comprehend. We enabled NilClass to respond to <em>if_not_nil</em> by doing nothing. Normal object reacts on the same message by injecting self to the block and having wanted side effects. Is it useful? I don&#8217;t know but I think it&#8217;s cute.</p>

<p>Yesterday I saw this taken a step further in the example that is (I think) created for the new book <a href="http://avdi.org/devblog/2011/11/15/early-access-beta-of-objects-on-rails-now-available-2/">Objects on Rails</a> whose beta I&#8217;ve read and highly recommend. Original is available at <a href="https://gist.github.com/1435647">Avdi Grimm gist example.</a></p>

<p>The cool part is this short but sweet addition to Object (I told you about monkey patching right?)</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Object</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">when</span><span class="p">(</span><span class="n">matcher</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">matcher</span> <span class="o">===</span> <span class="nb">self</span> <span class="k">then</span> <span class="k">yield</span><span class="p">(</span><span class="nb">self</span><span class="p">)</span> <span class="k">else</span> <span class="nb">self</span> <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now you don&#8217;t have special cases for <em>if_nil</em> or <em>if_not_nil</em>. Actually you can stick in any lambda you want (or so I thought). When the condition is satisfied you get to execute the block with self injected in it. Otherwise you get a no go!</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">person_that_exists</span><span class="o">.</span><span class="n">when</span><span class="p">(</span><span class="o">-&gt;</span><span class="p">(</span><span class="nb">p</span><span class="p">){</span> <span class="o">!</span><span class="nb">p</span><span class="o">.</span><span class="n">nil?</span> <span class="p">})</span> <span class="p">{</span> <span class="o">|</span><span class="nb">p</span><span class="o">|</span> <span class="nb">puts</span> <span class="s2">&quot;found </span><span class="si">#{</span><span class="nb">p</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">}</span> <span class="c1">#=&gt; found drKreso</span>
</span><span class='line'><span class="n">non_existing_person</span><span class="o">.</span><span class="n">when</span><span class="p">(</span><span class="kp">nil</span><span class="p">)</span> <span class="p">{</span> <span class="nb">puts</span> <span class="s2">&quot;Nothing, move along&quot;</span><span class="p">}</span> <span class="c1">#=&gt; Nothing, move along</span>
</span></code></pre></td></tr></table></div></figure>


<p>And now here is the part(finally) that blew my mind. Since you need to put in Proc and Proc#=== is defined as : &#8220;Invokes the block with obj as the proc&#8217;s parameter like Proc#call.&#8221; <br/>This question arises: How come I am not able to rewrite the <em>when</em> definition with Proc#call? It just doesn&#8217;t add up&#8230;
This was the most explicit version that I could write that (I speculated) does the same thing:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">when</span><span class="p">(</span><span class="n">matcher</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">matcher</span><span class="o">.</span><span class="n">nil?</span> <span class="o">||</span> <span class="n">matcher</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="nb">self</span><span class="p">))</span> <span class="k">then</span> <span class="n">block</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="nb">self</span><span class="p">)</span> <span class="k">else</span> <span class="nb">self</span> <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>I read it like this: If matcher is nil or if calling the matcher lambda/proc gives me <em>true</em> then inject self into the block. Otherwise just pass self. Now this was problematic because I had to deal with special case when matcher was nil. Otherwise I could not get it to work&#8230; yet #=== worked just fine.</p>

<p>The answer turned out pretty simple (Thanks @avdi)</p>

<p>It does not have to be lambda(proc) it can be anything that has #=== defined and that would be well anything derived from Object and that would be: everything. (I am not going to dwell about <em>BasicObject</em> here.) So it turns out that Proc happens to invoke <em>call</em> for #=== which is rather fortunate.OH: now it all makes sense, and I fell a bit well you know&#8230;</p>

<p>Since NilClass does not have a #=== defined and since it is derived from Object it ends up calling Object#=== that turns to call Object#==. Inheritance in its full glory, you get to use anything you want for a <em>matcher</em>. End of story.</p>

<h2>Conclusion</h2>

<p>If you ignore my unnecessary wanderings this is pretty neat technique.
I am sorry I skimmed the sections about Case Equality (===) in all the books I&#8217;ve read since it turned out pretty useful. That with combination of me obsessing that it has to be lambda blew my mind pretty well so I thought this might help someone.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Refactoring My Basement]]></title>
    <link href="http://kresimirbojcic.com/2011/12/05/refactoring-my-basement.html"/>
    <updated>2011-12-05T16:38:00+01:00</updated>
    <id>http://kresimirbojcic.com/2011/12/05/refactoring-my-basement</id>
    <content type="html"><![CDATA[<p>A rather unfortunate series of events led me ending up in my basement with a task of cleaning it up.
It was mildly put a mess, this photo was taken shortly after <em>refactoring</em> has begun. I was unable to even go inside and therefore forced to put half of the stuff in the hall.</p>

<p><img align="center" src="http://kresimirbojcic.com/images/refactoring_my_basement/basement.jpg"/></p>

<!-- more -->


<h2>Lessons learnt</h2>

<ul>
<li>I had a reason to do it since I was unable to find part of Christmas decorations</li>
<li>I managed to &#8220;forget&#8221; that I had duplication. (Two Christmas trees for example, two saws, countless other smaller things). Important thing is that I am (legally) sane. So I figure this forgetfulness is normal.</li>
<li>There was a lot of junk that I didn&#8217;t need

<ul>
<li>I threw out lot of the junk</li>
<li>I did not throw out everything, although I was tempted</li>
</ul>
</li>
<li>Some of the junk was really heavy to carry and garbage container was far away</li>
<li>Some of the stuff was borderline and I could not decide whether to throw it out or not</li>
<li>It was beneficial to separate junk on one pile and throw it all out at once</li>
<li>For I while I was in a hole and literally could not get out</li>
<li>I&#8217;ve needed a lot of space while in the process</li>
<li>There was a glass on the floor, so I was at risk to get cut on it the whole time

<ul>
<li>I never got cut before</li>
<li>I got cut when I tried to clean it up</li>
</ul>
</li>
<li>After I was done

<ul>
<li>It was not perfect</li>
<li>It was better than before</li>
<li>I&#8217;ve had a much better understanding of what was inside</li>
</ul>
</li>
</ul>


<h2>Conclusion</h2>

<p>I was amazed at how little I knew about the content I&#8217;ve found. Even if I vaguely knew I had something I was unable to locate it. For lots of stuff I was just amazed that I even have it.</p>

<p>After all the hard work decorations were retrieved and the basement was better than before.</p>

<p>I guess refactoring has a lot more in common with cleaning a basement than I thought it would.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Faking Multiple Blocks in Ruby]]></title>
    <link href="http://kresimirbojcic.com/2011/12/02/faking-multiple-blocks-in-ruby.html"/>
    <updated>2011-12-02T23:55:00+01:00</updated>
    <id>http://kresimirbojcic.com/2011/12/02/faking-multiple-blocks-in-ruby</id>
    <content type="html"><![CDATA[<p>Three months ago I was comparing <a href="http://kresimirbojcic.com/2011/08/19/smalltak-lisp-ruby-comparison-revisited.html">Lisp, Smalltalk and Ruby</a>. I was struggling to create new language syntax (for example my version of <em>if..else</em>) that is so easy to do in Lisp, and also possible in Smalltalk:</p>

<p>In Smalltalk it would be used like this:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="p">(</span><span class="mi">1</span> <span class="o">=</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'>    <span class="n">ifCorrect</span><span class="p">:</span>    <span class="o">[</span><span class="no">Transcript</span> <span class="n">show</span><span class="p">:</span> <span class="s1">&#39;I am correct&#39;</span><span class="o">]</span>
</span><span class='line'>    <span class="n">ifNotCorrect</span><span class="p">:</span> <span class="o">[</span><span class="no">Transcript</span> <span class="n">show</span><span class="p">:</span> <span class="s1">&#39;I am wrong&#39;</span><span class="o">].</span>
</span></code></pre></td></tr></table></div></figure>


<blockquote>My knowledge of Smalltalk is non-existing, but look at the beautiful [] block syntax and notice the keyword arguments being able to accept multiple blocks.</blockquote>


<p>Implementation in Smalltalk is both straightforward and cool:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># this is in True class</span>
</span><span class='line'><span class="n">ifCorrect</span><span class="p">:</span> <span class="n">trueAlternativeBlock</span> <span class="n">ifNotCorrect</span><span class="p">:</span> <span class="n">falseAlternativeBlock</span>
</span><span class='line'>     <span class="o">^</span><span class="n">trueAlternativeBlock</span> <span class="n">value</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># this is in False class</span>
</span><span class='line'><span class="n">ifCorrect</span><span class="p">:</span> <span class="n">trueAlternativeBlock</span> <span class="n">ifNotCorrect</span><span class="p">:</span> <span class="n">falseAlternativeBlock</span>
</span><span class='line'>     <span class="o">^</span><span class="n">falseAlternativeBlock</span> <span class="n">value</span>
</span></code></pre></td></tr></table></div></figure>


<p>In Ruby I was missing the ability to have multiple blocks in method call that would enable me to evaluate only one leg. This was best I could come up with and it included (mis)using the lambdas:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">FalseClass</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">if_correct</span><span class="p">(</span><span class="n">trueBlock</span><span class="p">,</span> <span class="nb">hash</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">hash</span><span class="o">[</span><span class="ss">:if_not_correct</span><span class="o">].</span><span class="n">call</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="k">class</span> <span class="nc">TrueClass</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">if_correct</span><span class="p">(</span><span class="n">trueBlock</span><span class="p">,</span> <span class="nb">hash</span><span class="p">)</span>
</span><span class='line'>    <span class="n">trueBlock</span><span class="o">.</span><span class="n">call</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="p">(</span><span class="mi">1</span><span class="o">==</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">if_correct</span> <span class="o">-&gt;</span><span class="p">{</span> <span class="nb">print</span> <span class="s2">&quot;Hooray it&#39;s true&quot;</span><span class="p">},</span>
</span><span class='line'>       <span class="n">if_not_correct</span><span class="ss">:-</span><span class="o">&gt;</span><span class="p">{</span><span class="nb">print</span> <span class="s2">&quot;Not true&quot;</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Today I&#8217;ve read the excellent post about using <a href="http://www.mattsears.com/articles/2011/11/27/ruby-blocks-as-dynamic-callbacks">Ruby Blocks as Dynamic Callbacks</a>. I was mesmerized, but of course I didn&#8217;t get it. Than I saw really kick ass explanation <a href="http://bodhi.github.com/2011/11/turning-callbacks-inside-out">here</a>. Holding hands did have effect even on me. Still I am not sure that I would be able to pull it of on my own without watching the original code. At the end I did saw one gist in comments claiming to have <a href="https://gist.github.com/1420133">similar pattern.</a> I don&#8217;t know if it&#8217;s better, but it looks less intrusive because there is no patching of Proc class and it clicked more easily.</p>

<!-- more -->


<p>As an exercise I&#8217;ve decided to use technique described there to implement my version of <em>if..else</em>:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1">#1</span>
</span><span class='line'><span class="no">Custom</span><span class="o">.</span><span class="n">if</span><span class="p">(</span><span class="mi">1</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">condition</span><span class="o">|</span>
</span><span class='line'>  <span class="n">condition</span><span class="o">.</span><span class="n">true?</span> <span class="k">do</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;True&quot;</span>
</span><span class='line'>  <span class="k">end</span><span class="o">.</span><span class="n">false?</span> <span class="k">do</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;False&quot;</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">#2</span>
</span><span class='line'><span class="no">Custom</span><span class="o">.</span><span class="n">if</span><span class="p">(</span><span class="mi">1</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">condition</span><span class="o">|</span>
</span><span class='line'>  <span class="n">condition</span><span class="o">.</span><span class="n">true?</span> <span class="p">{</span> <span class="nb">puts</span> <span class="s2">&quot;True&quot;</span> <span class="p">}</span><span class="o">.</span>
</span><span class='line'>  <span class="kp">false</span><span class="p">?</span> <span class="p">{</span> <span class="nb">puts</span> <span class="s2">&quot;False&quot;</span> <span class="p">}</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="c1">#3 (my favourite)</span>
</span><span class='line'><span class="no">Custom</span><span class="o">.</span><span class="n">if</span><span class="p">(</span><span class="mi">1</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">condition</span><span class="o">|</span>
</span><span class='line'>  <span class="n">condition</span><span class="o">.</span><span class="n">true?</span> <span class="p">{</span> <span class="nb">puts</span> <span class="s2">&quot;True&quot;</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">condition</span><span class="o">.</span><span class="n">false?</span> <span class="p">{</span> <span class="nb">puts</span> <span class="s2">&quot;False&quot;</span> <span class="p">}</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span></code></pre></td></tr></table></div></figure>


<p>It&#8217;s relatively easy to explain how it works. Look at the definition of Custom class:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Custom</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">if</span><span class="p">(</span><span class="n">condition</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>    <span class="n">proxy</span> <span class="o">=</span> <span class="no">BlockProxy</span><span class="o">[</span><span class="n">block</span><span class="o">]</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">condition</span>
</span><span class='line'>      <span class="n">proxy</span><span class="o">.</span><span class="n">call_block_for</span> <span class="ss">:true?</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>      <span class="n">proxy</span><span class="o">.</span><span class="n">call_block_for</span> <span class="ss">:false?</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="k">class</span> <span class="nc">BlockProxy</span>
</span><span class='line'>    <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">[]</span><span class="p">(</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>      <span class="kp">new</span><span class="o">.</span><span class="n">tap</span> <span class="p">{</span> <span class="o">|</span><span class="n">proxy</span><span class="o">|</span> <span class="n">block</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">proxy</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">call_block_for</span><span class="p">(</span><span class="n">callback</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span>
</span><span class='line'>      <span class="n">callbacks</span><span class="o">[</span><span class="n">callback</span><span class="o">].</span><span class="n">call</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">method_missing</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>      <span class="n">block</span> <span class="p">?</span> <span class="n">callbacks</span><span class="o">[</span><span class="n">m</span><span class="o">]</span> <span class="o">=</span> <span class="n">block</span> <span class="p">:</span> <span class="k">super</span>
</span><span class='line'>      <span class="nb">self</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">callbacks</span>
</span><span class='line'>      <span class="vi">@callbacks</span> <span class="o">||=</span> <span class="p">{}</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>line 2 : Using self.if method that receives condition and the block</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">codition</span> <span class="o">==&gt;</span> <span class="p">(</span><span class="mi">1</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="o">==&gt;</span> <span class="kp">false</span>
</span><span class='line'><span class="n">block</span>  <span class="o">==&gt;</span>
</span><span class='line'>  <span class="n">condition</span><span class="o">.</span><span class="n">true?</span> <span class="k">do</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;True&quot;</span>
</span><span class='line'>  <span class="k">end</span><span class="o">.</span><span class="n">false?</span> <span class="k">do</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;False&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li>line 3 : Creating the BlockProxy that is responding to missing method call in a way to:

<ul>
<li>If there is passed in block then store it under method name in @callbacks variable</li>
<li>If there is no passed block then raise the classic no method found exception</li>
</ul>
</li>
</ul>


<p>If you now look at usage of Custom class</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">Custom</span><span class="o">.</span><span class="n">if</span><span class="p">(</span><span class="mi">1</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">condition</span><span class="o">|</span>
</span><span class='line'>  <span class="n">condition</span><span class="o">.</span><span class="n">true?</span> <span class="k">do</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;True&quot;</span>
</span><span class='line'>  <span class="k">end</span><span class="o">.</span><span class="n">false?</span> <span class="k">do</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;False&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>notice that <strong>|condition|</strong> is really a <em>BlockProxy</em> object that you&#8217;ve tapped in on line 13.<br/>So when you call:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">condition</span><span class="o">.</span><span class="n">true?</span>
</span></code></pre></td></tr></table></div></figure>


<p>you invoke method_missing on a <em>BlockProxy</em> that stores received block in @callbacks hash with :true? key:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1">#stored block under :true? key</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;True&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>It&#8217;s all great from there on. Next call to false? invokes method_missing again and stores passed in block under :false? key:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1">#stored block under :false? key</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;False&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>When all of this is set and done I get to implement my version of <em>if..else</em> with built in <em>if..else</em> (line 4..8 in Custom class) :)</p>

<h2>Conclusion</h2>

<p>The thing is that with this technique I can do whatever I want with my version of <em>if..else</em>. I may alter it to log something when condition is true or do something similarly outrageous. Also it looks as if I could easily implement switch&#8230;case idiom etc. Is it practical to replace existing syntax? I don&#8217;t think so, but it really is intriguing and I am glad that it can be pulled of in Ruby like this. I want to thank Matt Sears, @bodhi and Ryan LeCompte for taking this one off of my chest.</p>

<blockquote>
This technique does give you yet another tool for creating pure Ruby DSL-s.</blockquote>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Decorators in Ruby]]></title>
    <link href="http://kresimirbojcic.com/2011/12/01/decorators-in-ruby.html"/>
    <updated>2011-12-01T16:04:00+01:00</updated>
    <id>http://kresimirbojcic.com/2011/12/01/decorators-in-ruby</id>
    <content type="html"><![CDATA[<p><img align="center"  src="http://kresimirbojcic.com/images/decorators/decorating.jpg"/></p>

<p>The decorator pattern is used to extend the functionality of a certain object in a runtime. In a statically typed language you need to define decorator interface, then subclass from it and initialize the component (object) that you are decorating.</p>

<blockquote>In Ruby you can pledge: &#8220;Yes I am a grownup&#8221; and skip the formal interface definition part.</blockquote>


<p>In either case the payoff comes with the fact that you can combine &#8220;extensions&#8221; without writing out complex inheritance tree that accounts for all possible combinations. Therefore you end up using extension that you need when you need them.</p>

<p>Let&#8217;s check it out on <a href="http://en.wikipedia.org/wiki/Decorator_patterne">Wikipedia coffee example.</a></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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Coffee</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">cost</span>
</span><span class='line'>    <span class="mi">1</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">ingredients</span>
</span><span class='line'>    <span class="sx">%w(coffee water sugar)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we want some latte, we can create a new decorator for the coffee:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Latte</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">component</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@component</span> <span class="o">=</span> <span class="n">component</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">cost</span>
</span><span class='line'>    <span class="vi">@component</span><span class="o">.</span><span class="n">cost</span> <span class="o">*</span> <span class="mi">1</span><span class="o">.</span><span class="mi">2</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">ingredients</span>
</span><span class='line'>    <span class="vi">@component</span><span class="o">.</span><span class="n">ingredients</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;milk&quot;</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;whipped cream&quot;</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;vanilla&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<!-- more -->


<p>We can now have some latte:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">latte_coffee</span> <span class="o">=</span> <span class="no">Latte</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="no">Coffee</span><span class="o">.</span><span class="n">new</span><span class="p">)</span>
</span><span class='line'><span class="n">pp</span> <span class="n">latte_coffee</span><span class="o">.</span><span class="n">ingredients</span> <span class="o">==&gt;</span> <span class="o">[</span><span class="s2">&quot;coffee&quot;</span><span class="p">,</span> <span class="s2">&quot;water&quot;</span><span class="p">,</span> <span class="s2">&quot;sugar&quot;</span><span class="p">,</span> <span class="s2">&quot;milk&quot;</span><span class="p">,</span> <span class="s2">&quot;whipped cream&quot;</span><span class="p">,</span> <span class="s2">&quot;vanilla&quot;</span><span class="o">]</span>
</span><span class='line'><span class="n">pp</span> <span class="n">latte_coffee</span><span class="o">.</span><span class="n">cost</span> <span class="o">==&gt;</span> <span class="mi">1</span><span class="o">.</span><span class="mi">2</span>
</span></code></pre></td></tr></table></div></figure>


<p>You only need to implement methods that are extending the <em>base</em> methods.
For double coffee we need to implement cost, but the ingredients method is just delegating to the decorated class:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">DoubleCoffee</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">component</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@component</span> <span class="o">=</span> <span class="n">component</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">cost</span>
</span><span class='line'>    <span class="vi">@component</span><span class="o">.</span><span class="n">cost</span> <span class="o">*</span> <span class="mi">2</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">ingredients</span>
</span><span class='line'>    <span class="vi">@component</span><span class="o">.</span><span class="n">ingredients</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Instead of accounting for all cases with inheritance (upfront aka tedious):
<img align="center"  src="http://kresimirbojcic.com/images/decorators/inheritance.png"/>
You can plug it in decorator pattern that looks something like this:
<img align="center"  src="http://kresimirbojcic.com/images/decorators/decorator.png"/></p>

<p>This is small example but I hope that the full scale of combination explosions problem that would occur in bigger scenarios is visible.</p>

<p>Ruby has a cool solution for <em>delegation blues</em> (writing boilerplate code to wrap up unchanged delegated methods).
On the example below you are arguably at lost for using forwardable, but the more methods you need to delegate better of you are with forwardable.</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">DoubleCoffee</span>
</span><span class='line'>  <span class="kp">extend</span> <span class="no">Forwardable</span>
</span><span class='line'>  <span class="n">def_delegator</span> <span class="p">:</span><span class="vi">@component</span><span class="p">,</span> <span class="ss">:ingredients</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">component</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@component</span> <span class="o">=</span> <span class="n">component</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">cost</span>
</span><span class='line'>    <span class="vi">@component</span><span class="o">.</span><span class="n">cost</span> <span class="o">*</span> <span class="mi">2</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you have really big number of methods and you don&#8217;t need to be too selective about what you are delegating then you can pull out the big guns and implement some <em>method_missing</em> magic.</p>

<p>To digress a bit I thought that <em>method_missing</em> is the best thing since sliced bread and also really original idea. That was until I&#8217;ve met <em>doesNotUnderstand</em> message in Smalltalk. Then I felt humbled for a while&#8230; Man they had it <em>back than</em> and still it was new to me even today.</p>

<p>To get back on the <em>decorator</em>. You can be explicit about what&#8217;s going on:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">CoffeeDecorator</span>
</span><span class='line'>  <span class="kp">extend</span> <span class="no">Forwardable</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">component</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@component</span> <span class="o">=</span> <span class="n">component</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="k">class</span> <span class="nc">DoubleCoffee</span> <span class="o">&lt;</span> <span class="no">CoffeeDecorator</span>
</span><span class='line'>  <span class="n">def_delegator</span> <span class="p">:</span><span class="vi">@component</span><span class="p">,</span> <span class="ss">:ingredients</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">cost</span>
</span><span class='line'>    <span class="vi">@component</span><span class="o">.</span><span class="n">cost</span> <span class="o">*</span> <span class="mi">2</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="k">class</span> <span class="nc">Latte</span> <span class="o">&lt;</span> <span class="no">CoffeeDecorator</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">cost</span>
</span><span class='line'>    <span class="vi">@component</span><span class="o">.</span><span class="n">cost</span> <span class="o">*</span> <span class="mi">1</span><span class="o">.</span><span class="mi">2</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">ingredients</span>
</span><span class='line'>    <span class="vi">@component</span><span class="o">.</span><span class="n">ingredients</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;milk&quot;</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;whipped cream&quot;</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;vanilla&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Punchline is that decorators enable you to chain the functionality that you need the way you need it without spelling it out in inheritance tree:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">latte</span> <span class="o">=</span> <span class="no">Latte</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="no">Coffee</span><span class="o">.</span><span class="n">new</span><span class="p">)</span>
</span><span class='line'><span class="n">double_coffee_with_latte</span> <span class="o">=</span> <span class="no">DoubleCoffee</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">latte</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Ruby modules</h2>

<p>You can create the same effect by using modules. It looks rather sexy:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">DoubleCoffee</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">cost</span>
</span><span class='line'>    <span class="n">cost</span> <span class="o">*</span> <span class="mi">2</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="k">module</span> <span class="nn">Latte</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">cost</span>
</span><span class='line'>   <span class="k">super</span> <span class="o">*</span> <span class="mi">1</span><span class="o">.</span><span class="mi">2</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">ingredients</span>
</span><span class='line'>    <span class="k">super</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;milk&quot;</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;whipped cream&quot;</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;vanilla&quot;</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="n">c</span> <span class="o">=</span> <span class="no">Coffee</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">extend</span> <span class="no">Latte</span>
</span><span class='line'><span class="n">c</span><span class="o">.</span><span class="n">extend</span> <span class="no">DoubleCoffee</span>
</span></code></pre></td></tr></table></div></figure>


<p>In practice you would probably build some kind of factory to ease the pain of all this flexibility for the client:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">CoffeeFactory</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">double_coffee_with_latte</span>
</span><span class='line'>   <span class="k">return</span> <span class="no">Coffee</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="no">DoubleCoffee</span><span class="p">)</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="no">Latte</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>One gotcha is that you need to watch out for you methods to be truly chainable. For example if we had:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">Latte</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">cost</span>
</span><span class='line'>    <span class="k">super</span> <span class="o">+</span> <span class="mi">0</span><span class="o">.</span><span class="mi">5</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">ingredients</span>
</span><span class='line'>    <span class="k">super</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;milk&quot;</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;whipped cream&quot;</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;vanilla&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>We would not get the same cost for:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>   <span class="no">Coffee</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="no">DoubleCoffee</span><span class="p">)</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="no">Latte</span><span class="p">)</span><span class="o">.</span><span class="n">cost</span> <span class="o">==&gt;</span> <span class="mi">2</span><span class="o">.</span><span class="mi">5</span>
</span><span class='line'>   <span class="no">Coffee</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="no">Latte</span><span class="p">)</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="no">DoubleCoffee</span><span class="p">)</span><span class="o">.</span><span class="n">cost</span> <span class="o">==&gt;</span> <span class="mi">3</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Methods wrapping</h2>

<p>One more alternative is to wrap up methods in runtime. For example you can implement DoubleCoffee decoration like this:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">c</span> <span class="o">=</span> <span class="no">Coffee</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'><span class="k">class</span> <span class="o">&lt;&lt;</span> <span class="n">c</span>
</span><span class='line'>  <span class="k">alias</span> <span class="n">old_cost</span> <span class="n">cost</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">cost</span>
</span><span class='line'>    <span class="n">old_cost</span> <span class="o">*</span> <span class="mi">2</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Rails has a real nice variation of this tehnique with their alias_method_chain method.</p>

<h2>Conclusion</h2>

<p>I think this is one of those patterns that looks really good in theory. And as they say, &#8220;in theory, theory and practice are the same&#8221;. I would say that in practice you need to carefully judge wether the flexibility gained is worthed increased complexity for the client code. Nevertheless it is nice to know that Ruby is offering some refreshing ways to do it if you really need to.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Favorite Vim Tools & Tricks]]></title>
    <link href="http://kresimirbojcic.com/2011/11/29/favorite-vim-tools-and-tricks.html"/>
    <updated>2011-11-29T10:48:00+01:00</updated>
    <id>http://kresimirbojcic.com/2011/11/29/favorite-vim-tools-and-tricks</id>
    <content type="html"><![CDATA[<p>I&#8217;ve been using Vim for the last two years. It did take some getting use to, but the idea clicked almost instantly. Having normal and insert mode is superior concept in my mind. It allows you to treat text editing as a game.</p>

<p>I am not a power user by far but I do have some favorite tricks.</p>

<h2>Using console version</h2>

<ul>
<li>Pros:

<ul>
<li>Console output is colored</li>
<li>Ctrl-y puts you to console, fg puts you right back</li>
<li>No need to open console in another window</li>
</ul>
</li>
<li>Cons:

<ul>
<li>Color scheme is a bit uglier (less color in console)</li>
<li>Copy paste is a bit harder (from other GNOME apps, at least for me)</li>
</ul>
</li>
</ul>


<p>I&#8217;ve tried everything here. Rationally I thought that the console version is too ugly. BUT I noticed that I type vim from terminal unconsciously. The Ctr-y/fg combo and ability to start test to console from within vim sealed the deal. Somehow I got use to lack of prettier color scheme.</p>

<!-- more -->


<h2>Running tests from vim</h2>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>map ,t :w\|!rspec spec %&lt;cr&gt;</span></code></pre></td></tr></table></div></figure>


<p>This combined with <a href="http://kresimirbojcic.com/2011/09/03/sub-second-testing.html">sub-second testing</a> is really nice.</p>

<p>While on the subject, when doing one time scripts this is rather fast way to run script:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>map ,r :w\|!ruby %&lt;cr&gt;</span></code></pre></td></tr></table></div></figure>


<p>You are always ,r away from the results.</p>

<h2>Using Command-T plugin</h2>

<p>Much better than fuzzy finder. I am not even going to talk about &#8220;tree&#8221; explorers of any kind. Command-T is really really great. If you haven&#8217;t I urge you to try it <a href="http://www.vim.org/scripts/script.php?script_id=3025">out right now.</a></p>

<p>One gotcha is that if I create a new file I need to refresh my Command-T index, and CommandTFlush is just the right way to do it</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>map ,f :CommandTFlush&lt;cr&gt;</span></code></pre></td></tr></table></div></figure>


<h2>Using $MYVIMRC global</h2>

<p>When tweaking .vimrc configuration file I can use $MYVIMRC global.
It&#8217;s customary that you want your changes to take effect immediately</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>:so %</span></code></pre></td></tr></table></div></figure>


<h2>Using % for current file</h2>

<p>When running tests I usually map to the spec I am working on. It&#8217;s not as much work as you would think and it enables you to run tests from wherever. Still sometimes it is nice to reference &#8220;current&#8221; file and % is a way to do it.</p>

<h2>Yank the line without moving cursor</h2>

<p>This one is super simple yet it eluded me for quite some time.
For example if I am on line 40 and want to copy the content of line 28</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>:28y</span></code></pre></td></tr></table></div></figure>


<p>Than ESC and p to put it.
Talking about ESC I did try to switch ESC with CAPSLOCK. Didn&#8217;t find it particularly cool.</p>

<h2>Switch between buffers</h2>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Ctrl-6 </span></code></pre></td></tr></table></div></figure>


<p>Toogle buffers</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>:A</span></code></pre></td></tr></table></div></figure>


<p>Alternate file (rails.vim to switch between spec and working class and some other combinations)</p>

<h2>Rails</h2>

<p>rails.vim of course <a href="http://www.vim.org/account/profile.php?user_id=9012">Tim Pope</a> is a true hero for this. (Also fugitive.vim is nice wrapper for git, but having easy access to the console lessens the need for that plugin.)</p>

<h2>Theming</h2>

<p>I like the desert theme. Also yesterday I saw a cool terminal emulator <a href="http://www.secretgeometry.com/apps/cathode/">secret geometry</a>. They basically disregarded the last 20 years of progress in screen technology.</p>

<h2>Conclusion</h2>

<p>That pretty much wraps everything I had in mind. I admit that you need some love for console version and vim in general. But I feel you get payoff relatively fast.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Mocking And Stubbing On Tiny Example]]></title>
    <link href="http://kresimirbojcic.com/2011/11/28/mocking-and-stubbing-on-tiny-example.html"/>
    <updated>2011-11-28T10:38:00+01:00</updated>
    <id>http://kresimirbojcic.com/2011/11/28/mocking-and-stubbing-on-tiny-example</id>
    <content type="html"><![CDATA[<h2>Guard Clause</h2>

<p>If you know what <em>test doubles</em> are. If you know that <em>stub</em> gives canned answers and that <em>mock</em> is an object that you can set expectations on&#8230; Pass along. If you are still uncertain about this you may want to read on.</p>

<h2>Stubs</h2>

<p>Chances are (if you are a guy) that you are using <em>stub</em> when talking to your girlfriend:</p>

<blockquote>
Does my ass look big in this jeans?  No!
</blockquote>


<p>It doesn&#8217;t matter what the real answer is, you just give back the prepared one. Kinda like when you need certain data for your tests. You shove in your answer for example 11/28/2011 and you expect the canned answer every time. It&#8217;s a lie agreed upon for the greater cause.</p>

<h2>Mocks</h2>

<p><em>Mock</em> is emotionally &#8216;complicated&#8217; <em>stub</em>. He also gives back canned answers but he expects certain things to be done in the process to be fully satisfied.
Translated to our girlfriend example it is something like this:</p>

<blockquote>
Are you cheating on me?  No!
</blockquote>


<p>Here the expectation is that you don&#8217;t give answer right away, because it looks canned that way. Also you shouldn&#8217;t think to long before answering. Mocked object v2.0 might expect that you look her in the eyes&#8230;</p>

<p>DRY me is noticing that we have overlapping in code, so I would probably use the same algorithm for both question in the class BlowTheTruthOutOfWaterIfItsBrutal.</p>

<!-- more -->


<h2>Why Would I Mock/Stub Anyway</h2>

<ol>
<li>You don&#8217;t have the collaborator object when TDD-ing feature</li>
<li>Collaborator is slow</li>
<li>Collaborator is &#8216;outside&#8217; component</li>
<li>You want to isolate your tests more</li>
<li>You want canned answers (time travel for example)</li>
</ol>


<h2>Caveat</h2>

<p>You have a green tests and non working application when <em>stub/mock</em> is not mimicking the real collaborator good enough. It makes you look pretty stupid, so watch out for this!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JIRA Worklog From Command Line]]></title>
    <link href="http://kresimirbojcic.com/2011/11/26/jira-worklog-from-command-line.html"/>
    <updated>2011-11-26T09:38:00+01:00</updated>
    <id>http://kresimirbojcic.com/2011/11/26/jira-worklog-from-command-line</id>
    <content type="html"><![CDATA[<p>If you are using JIRA to log your working hours I think the best policy is to write it right after you are done with particular task. In the process I&#8217;ve experienced a couple of non-happy-path-scenarios such as:</p>

<ol>
<li>JIRA is down</li>
<li>JIRA is <em>slow</em> (I am complicated about speed, kinda like <a href="https://twitter.com/#!/coreyhaines">Corey Haines</a>)</li>
</ol>


<p>In order to mitigate that, I&#8217;ve started writing notes to .txt file. I would then <em>type-in</em> all hours at the end of the day. It&#8217;s just me and my beloved Vim. What could go wrong? Right?</p>

<p>Well, it sounded better in theory as it had its own share of problems, such as:</p>

<ol>
<li>Keeping the file open all day long (and more so finding it)</li>
<li>Forcing myself to fiddle with JIRA for x tasks (not to mention &#8220;at the end of the day&#8221; part)</li>
</ol>


<!-- more -->


<h2>Command Line To The Rescue</h2>

<p>At the end I&#8217;ve settled with using command line for logging work to intermediate &#8220;send&#8221; file (instantaneous) and than at the end of the day sending the whole batch to JIRA via API.</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>
</pre></td><td class='code'><pre><code class=''><span class='line'>rake log:work[1,1h,'Really ground breaking work']
</span><span class='line'>rake log:work[1,2h,'Best thing since sliced bread']
</span><span class='line'>rake log:work[1,3h,'Finding missing semicolon']
</span><span class='line'>rake log:work[OTHERPROJ-1,2h,'Figuring out how to send parms via Rake :)']
</span><span class='line'>
</span><span class='line'>rake log:send</span></code></pre></td></tr></table></div></figure>




<blockquote>
Rake is a bit moody as interface. You need to watch out not to use comma except as a token delimiter. (For example I didn&#8217;t find the way to use it in comment). And it&#8217;s super sensitive to spaces so I tend not to write them.
</blockquote>


<p>My language of choice was Ruby, and for interface I&#8217;ve used Rake. Mostly because that way I can add recurring tasks to rake (such as holidays&#8230;) and I can list all my tasks for free with:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>rake -D</span></code></pre></td></tr></table></div></figure>


<p>The code is not all that important as I had much more trouble finding the optimal workflow. Nevertheless I&#8217;ll put the code below in hope that someone will find it useful:</p>

<figure class='code'><figcaption><span> (log_work.rb)</span> <a href='http://kresimirbojcic.com/downloads/code/jira_work_log/log_work.rb'>download</a></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>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="nb">require</span> <span class="s1">&#39;yaml&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">LogWork</span>
</span><span class='line'>  <span class="k">class</span> <span class="o">&lt;&lt;</span> <span class="nb">self</span>
</span><span class='line'>    <span class="no">SendList</span> <span class="o">=</span> <span class="s2">&quot;send_list.yaml&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">add_work</span><span class="p">(</span><span class="n">task_key</span><span class="p">,</span> <span class="n">time_spent</span><span class="p">,</span> <span class="n">comment</span><span class="p">,</span> <span class="n">go_back_in_days</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
</span><span class='line'>      <span class="n">list</span> <span class="o">=</span> <span class="n">send_list</span>
</span><span class='line'>      <span class="n">list</span> <span class="o">&lt;&lt;</span>  <span class="o">[</span><span class="n">task_key</span><span class="p">,</span> <span class="n">time_spent</span><span class="p">,</span> <span class="n">comment</span><span class="p">,</span> <span class="n">go_back_in_days</span><span class="o">]</span>
</span><span class='line'>      <span class="n">save</span><span class="p">(</span><span class="n">list</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">send_all</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
</span><span class='line'>      <span class="n">sent</span><span class="p">,</span> <span class="n">list</span> <span class="o">=</span> <span class="o">[]</span><span class="p">,</span> <span class="n">send_list</span>
</span><span class='line'>      <span class="n">list</span><span class="o">.</span><span class="n">each</span> <span class="p">{</span> <span class="o">|</span><span class="n">task</span><span class="o">|</span> <span class="n">sent</span> <span class="o">&lt;&lt;</span> <span class="n">task</span> <span class="k">if</span> <span class="n">target</span><span class="o">.</span><span class="n">add_work</span><span class="p">(</span><span class="n">task</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span><span class="p">,</span> <span class="n">task</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span><span class="p">,</span> <span class="n">task</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span><span class="p">,</span> <span class="n">task</span><span class="o">[</span><span class="mi">3</span><span class="o">]</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'>      <span class="n">save</span><span class="p">(</span><span class="n">list</span> <span class="o">-</span> <span class="n">sent</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">send_list</span><span class="p">()</span> <span class="no">File</span><span class="o">.</span><span class="n">exists?</span><span class="p">(</span><span class="no">SendList</span><span class="p">)</span> <span class="p">?</span> <span class="no">File</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="no">SendList</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">)</span> <span class="p">{</span> <span class="o">|</span><span class="n">file</span><span class="o">|</span> <span class="no">YAML</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">file</span><span class="p">)</span> <span class="p">}</span> <span class="p">:</span> <span class="o">[]</span> <span class="k">end</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">save</span><span class="p">(</span><span class="n">list</span><span class="p">)</span> <span class="no">File</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="no">SendList</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span> <span class="p">{</span><span class="o">|</span><span class="n">file</span><span class="o">|</span> <span class="n">file</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">list</span><span class="o">.</span><span class="n">to_yaml</span><span class="p">)</span> <span class="p">}</span> <span class="k">end</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">reset</span><span class="p">()</span> <span class="no">File</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="no">SendList</span><span class="p">)</span> <span class="k">if</span> <span class="no">File</span><span class="o">.</span><span class="n">exists?</span><span class="p">(</span><span class="no">SendList</span><span class="p">)</span> <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<figure class='code'><figcaption><span> (Rakefile)</span> <a href='http://kresimirbojcic.com/downloads/code/jira_work_log/Rakefile'>download</a></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>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="nb">require</span> <span class="s1">&#39;rake&#39;</span>
</span><span class='line'><span class="n">require_relative</span> <span class="s1">&#39;log_work&#39;</span>
</span><span class='line'><span class="n">require_relative</span> <span class="s1">&#39;jira&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">namespace</span> <span class="ss">:log</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">desc</span> <span class="s1">&#39;Add worklog to JIRA&#39;</span>
</span><span class='line'>  <span class="n">task</span> <span class="ss">:work</span><span class="p">,</span> <span class="o">[</span><span class="ss">:task_key</span><span class="p">,</span> <span class="ss">:time_spent</span><span class="p">,</span> <span class="ss">:comment</span><span class="p">,</span> <span class="ss">:go_back_in_days</span><span class="o">]</span> <span class="k">do</span> <span class="o">|</span><span class="n">t</span><span class="p">,</span> <span class="n">args</span><span class="o">|</span>
</span><span class='line'>    <span class="n">args</span><span class="o">.</span><span class="n">with_defaults</span><span class="p">(</span><span class="ss">:go_back_in_days</span> <span class="o">=&gt;</span> <span class="mi">0</span><span class="p">)</span>
</span><span class='line'>    <span class="n">task_key</span> <span class="o">=</span> <span class="n">args</span><span class="o">[</span><span class="ss">:task_key</span><span class="o">]</span>
</span><span class='line'>    <span class="n">task_key</span> <span class="o">=</span> <span class="n">task_key</span><span class="o">.</span><span class="n">to_i</span> <span class="k">if</span> <span class="n">task_key</span> <span class="o">=~</span> <span class="sr">/^[0-9]+$/</span>
</span><span class='line'>    <span class="no">LogWork</span><span class="o">.</span><span class="n">add_work</span><span class="p">(</span><span class="n">task_key</span><span class="p">,</span> <span class="n">args</span><span class="o">[</span><span class="ss">:time_spent</span><span class="o">]</span><span class="p">,</span> <span class="n">args</span><span class="o">[</span><span class="ss">:comment</span><span class="o">]</span><span class="p">,</span> <span class="n">args</span><span class="o">[</span><span class="ss">:go_back_in_days</span><span class="o">].</span><span class="n">to_i</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">desc</span> <span class="s1">&#39;Send all worklogs to JIRA&#39;</span>
</span><span class='line'>  <span class="n">task</span> <span class="ss">:send</span> <span class="k">do</span>
</span><span class='line'>    <span class="no">LogWork</span><span class="o">.</span><span class="n">send_all</span><span class="p">(</span><span class="no">Jira</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Talking to JIRA is done via Savon:</p>

<figure class='code'><figcaption><span> (jira.rb)</span> <a href='http://kresimirbojcic.com/downloads/code/jira_work_log/jira.rb'>download</a></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>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="nb">require</span> <span class="s1">&#39;jiraSOAP&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;savon&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="no">Savon</span><span class="o">.</span><span class="n">configure</span> <span class="k">do</span> <span class="o">|</span><span class="n">config</span><span class="o">|</span>
</span><span class='line'>  <span class="n">config</span><span class="o">.</span><span class="n">log</span> <span class="o">=</span> <span class="kp">false</span>
</span><span class='line'>  <span class="n">config</span><span class="o">.</span><span class="n">log_level</span> <span class="o">=</span> <span class="ss">:info</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Jira</span>
</span><span class='line'>
</span><span class='line'>  <span class="no">ServiceURI</span> <span class="o">=</span> <span class="c1">#you_jira_address</span>
</span><span class='line'>  <span class="no">ServiceWSDL</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="no">ServiceURI</span><span class="si">}</span><span class="s2">/rpc/soap/jirasoapservice-v2?wsdl&quot;</span>
</span><span class='line'>  <span class="no">UserName</span> <span class="o">=</span> <span class="c1">#your_user_name</span>
</span><span class='line'>  <span class="no">Password</span> <span class="o">=</span> <span class="c1">#your_password</span>
</span><span class='line'>  <span class="no">DefaultProject</span> <span class="o">=</span> <span class="c1">#your_default_project</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">add_work</span><span class="p">(</span><span class="n">task_key</span><span class="p">,</span> <span class="n">time_spent</span><span class="p">,</span> <span class="n">comment</span><span class="p">,</span> <span class="n">go_back_in_days</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
</span><span class='line'>     <span class="n">task_key</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="no">DefaultProject</span><span class="si">}</span><span class="s2">-</span><span class="si">#{</span><span class="n">task_key</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">unless</span> <span class="n">task_key</span><span class="o">.</span><span class="n">to_s</span><span class="o">.</span><span class="n">upcase</span> <span class="o">=~</span> <span class="sr">/^[A-Z]+-[0-9]+$/</span>
</span><span class='line'>     <span class="n">go_back_in_days</span> <span class="o">=</span> <span class="n">go_back_in_days</span><span class="o">.</span><span class="n">to_i</span>
</span><span class='line'>     <span class="n">result</span> <span class="o">=</span> <span class="kp">false</span>
</span><span class='line'>     <span class="k">begin</span>
</span><span class='line'>       <span class="n">db</span> <span class="o">=</span> <span class="no">JIRA</span><span class="o">::</span><span class="no">JIRAService</span><span class="o">.</span><span class="n">new</span> <span class="no">ServiceURI</span>
</span><span class='line'>       <span class="n">db</span><span class="o">.</span><span class="n">login</span> <span class="no">UserName</span><span class="p">,</span> <span class="no">Password</span>
</span><span class='line'>       <span class="n">client</span> <span class="o">=</span> <span class="no">Savon</span><span class="o">::</span><span class="no">Client</span><span class="o">.</span><span class="n">new</span> <span class="no">ServiceWSDL</span>
</span><span class='line'>       <span class="n">response</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">request</span> <span class="s1">&#39;addWorklogAndRetainRemainingEstimate&#39;</span>  <span class="k">do</span>
</span><span class='line'>         <span class="n">soap</span><span class="o">.</span><span class="n">body</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>           <span class="ss">:in0</span> <span class="o">=&gt;</span> <span class="n">db</span><span class="o">.</span><span class="n">auth_token</span><span class="p">,</span>
</span><span class='line'>           <span class="ss">:in1</span> <span class="o">=&gt;</span> <span class="n">task_key</span><span class="p">,</span>
</span><span class='line'>           <span class="ss">:in2</span> <span class="o">=&gt;</span>  <span class="p">{</span> <span class="ss">:timeSpent</span> <span class="o">=&gt;</span> <span class="n">time_spent</span><span class="p">,</span> <span class="ss">:comment</span> <span class="o">=&gt;</span> <span class="n">comment</span> <span class="p">,</span> <span class="ss">:startDate</span> <span class="o">=&gt;</span> <span class="no">DateTime</span><span class="o">.</span><span class="n">now</span> <span class="o">-</span> <span class="n">go_back_in_days</span> <span class="p">}</span>
</span><span class='line'>         <span class="p">}</span>
</span><span class='line'>       <span class="k">end</span>
</span><span class='line'>       <span class="n">result</span> <span class="o">=</span> <span class="kp">true</span>
</span><span class='line'>     <span class="k">rescue</span>
</span><span class='line'>       <span class="nb">print</span> <span class="vg">$!</span>
</span><span class='line'>       <span class="n">result</span> <span class="o">=</span> <span class="kp">false</span>
</span><span class='line'>     <span class="k">end</span>
</span><span class='line'>     <span class="k">return</span> <span class="n">result</span>
</span><span class='line'>   <span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Downcase for UTF-8 characters in Ruby]]></title>
    <link href="http://kresimirbojcic.com/2011/11/25/downcase-for-utf-8-characters.html"/>
    <updated>2011-11-25T17:36:00+01:00</updated>
    <id>http://kresimirbojcic.com/2011/11/25/downcase-for-utf-8-characters</id>
    <content type="html"><![CDATA[<p>There is one gotcha in Ruby UTF-8 support. <blockquote>String method <em>downcase</em> is <em>local insensitive</em>, meaning it ignores UTF-8 characters not in standard ASCII character set.</blockquote></p>

<p>Example below will give you expected results:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="s2">&quot;HELLO”.downcase </span>
</span><span class='line'>
</span><span class='line'><span class="s2">--&gt;hello</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next example will not behave as desired as non standard characters remain in uppercase:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="s2">&quot;DINING ROOM - SALLE À MANGER&quot;</span><span class="o">.</span><span class="n">downcase</span>
</span><span class='line'>
</span><span class='line'><span class="o">--&gt;</span><span class="n">dining</span> <span class="n">room</span> <span class="o">-</span> <span class="n">salle</span> <span class="err">À</span> <span class="n">manger</span>
</span></code></pre></td></tr></table></div></figure>


<p>It is supposed to be fixed in Ruby 2.0. Until then you&#8217;ll need some monkey patching:</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">gem</span> <span class="n">install</span> <span class="n">unicode</span>
</span></code></pre></td></tr></table></div></figure>




<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="c1">#enviroment.rb</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;unicode&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;lib/string&#39;</span>
</span><span class='line'><span class="c1">#lib/string.rb</span>
</span><span class='line'><span class="k">class</span> <span class="nc">String</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">downcase</span>
</span><span class='line'>    <span class="no">Unicode</span><span class="o">::</span><span class="n">downcase</span><span class="p">(</span><span class="nb">self</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Risky business, I know. But it&#8217;s the only only solution that I know of.</p>
]]></content>
  </entry>
  
</feed>

