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

  <title><![CDATA[My Blatant Rublings]]></title>
  <link href="http://rublings.com/atom.xml" rel="self"/>
  <link href="http://rublings.com/"/>
  <updated>2015-11-22T11:56:31+00:00</updated>
  <id>http://rublings.com/</id>
  <author>
    <name><![CDATA[Enzo Rivello]]></name>
    <email><![CDATA[vincenzo.rivello@gmail.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[LWS Flash Talk - Role Switching]]></title>
    <link href="http://rublings.com/blog/2015/11/22/lws-flast-talk-role-switching/"/>
    <updated>2015-11-22T11:15:00+00:00</updated>
    <id>http://rublings.com/blog/2015/11/22/lws-flast-talk-role-switching</id>
    <content type="html"><![CDATA[<br />


<p>Last Monday I had the pleasure to do a Flash Talk at <a href="http://londonwebstandards.org/2015/11/lws-november-16-2015-flexing-your-computer-lwsokflex/">London Web Standard</a>, a monthly meetup made to discuss the state of the web, discuss and learn new technologies. <br />
For this talk I brought one of the processes I mostly cherish &ndash; Role Switching, or how to walk one mile in the shoes of your fellow developer and understand his problems and difficulties, with the final goel to  grow both as an engineer and as a human being.<br />
Speaking from personal experience, I highly suggest you to try this process at least once EXPECIALLY if conflicts are common and tension is high in between members of your team. <br />
I hope you will enjoy this presentation as much as I enjoyed creating it (video will be up soon)<br /></p>

<script async="true" class="speakerdeck-embed" data-id="1edf95e859f148218fd00f2b7a9c56ff" src="http://rublings.com//speakerdeck.com/assets/embed.js"> </script>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[About bad practices....]]></title>
    <link href="http://rublings.com/blog/2013/10/23/about-bad-practices/"/>
    <updated>2013-10-23T10:27:00+01:00</updated>
    <id>http://rublings.com/blog/2013/10/23/about-bad-practices</id>
    <content type="html"><![CDATA[<p><img class="center" src="http://rublings.com/images/find.jpg" width="776" height="424"></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The importance of being O(n)]]></title>
    <link href="http://rublings.com/blog/2013/10/22/the-importance-of-being-o-n/"/>
    <updated>2013-10-22T19:04:00+01:00</updated>
    <id>http://rublings.com/blog/2013/10/22/the-importance-of-being-o-n</id>
    <content type="html"><![CDATA[<p>Understaing complexity is very important, expecially in powerful languages like Ruby.</p>

<p>Take for example this implementation of a <b>Deck</b> class:</p>

<figure class='code'><figcaption><span>Deck class, First implementation </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">class</span> <span class="nc">Deck</span>
</span><span class='line'>  <span class="no">SUITES</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&quot;C&quot;</span><span class="p">,</span><span class="s2">&quot;D&quot;</span><span class="p">,</span><span class="s2">&quot;H&quot;</span><span class="p">,</span><span class="s2">&quot;S&quot;</span><span class="o">]</span>
</span><span class='line'>  <span class="no">VALUES</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&quot;2&quot;</span><span class="p">,</span><span class="s2">&quot;3&quot;</span><span class="p">,</span><span class="s2">&quot;4&quot;</span><span class="p">,</span><span class="s2">&quot;5&quot;</span><span class="p">,</span><span class="s2">&quot;6&quot;</span><span class="p">,</span><span class="s2">&quot;7&quot;</span><span class="p">,</span><span class="s2">&quot;8&quot;</span><span class="p">,</span><span class="s2">&quot;9&quot;</span><span class="p">,</span><span class="s2">&quot;10&quot;</span><span class="p">,</span><span class="s2">&quot;J&quot;</span><span class="p">,</span><span class="s2">&quot;Q&quot;</span><span class="p">,</span><span class="s2">&quot;K&quot;</span><span class="p">,</span><span class="s2">&quot;A&quot;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="kp">attr_accessor</span> <span class="ss">:cards</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">#YAY! fantastic O(N^2) initialization :-/ </span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span>
</span><span class='line'>    <span class="vi">@cards</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>    <span class="no">SUITES</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">suite</span><span class="o">|</span>
</span><span class='line'>      <span class="no">VALUES</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">value</span><span class="o">|</span>
</span><span class='line'>        <span class="vi">@cards</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">value</span><span class="si">}#{</span><span class="n">suite</span><span class="si">}</span><span class="s2">&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 class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see here, the code is correct, but very little efficient.
To create the deck, we need to go 13 times for every element in the SUITES array. <br />
13 * 4 = <b>52</b> iterations. The complexity is clearly <b>O(n<sup>2</sup>)</b>.
Since we are working with a little set of data, this may be negligible, but still, is there a better way to write this code?</p>

<p>Presenting the <b>ImprovedDeck</b> class!</p>

<figure class='code'><figcaption><span>Deck class, second implementation </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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">ImprovedDeck</span>
</span><span class='line'>  <span class="no">VALUES</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&quot;2&quot;</span><span class="p">,</span><span class="s2">&quot;3&quot;</span><span class="p">,</span><span class="s2">&quot;4&quot;</span><span class="p">,</span><span class="s2">&quot;5&quot;</span><span class="p">,</span><span class="s2">&quot;6&quot;</span><span class="p">,</span><span class="s2">&quot;7&quot;</span><span class="p">,</span><span class="s2">&quot;8&quot;</span><span class="p">,</span><span class="s2">&quot;9&quot;</span><span class="p">,</span><span class="s2">&quot;10&quot;</span><span class="p">,</span><span class="s2">&quot;J&quot;</span><span class="p">,</span><span class="s2">&quot;Q&quot;</span><span class="p">,</span><span class="s2">&quot;K&quot;</span><span class="p">,</span><span class="s2">&quot;A&quot;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="kp">attr_accessor</span> <span class="ss">:cards</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">#YAY! Much better O(N) initialization :-D </span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">initialize</span>
</span><span class='line'>    <span class="vi">@cards</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>    <span class="no">VALUES</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">value</span><span class="o">|</span>
</span><span class='line'>      <span class="vi">@cards</span> <span class="o">&lt;&lt;</span> <span class="o">[</span><span class="s2">&quot;</span><span class="si">#{</span><span class="n">value</span><span class="si">}</span><span class="s2">C&quot;</span><span class="p">,</span><span class="s2">&quot;</span><span class="si">#{</span><span class="n">value</span><span class="si">}</span><span class="s2">D&quot;</span><span class="p">,</span><span class="s2">&quot;</span><span class="si">#{</span><span class="n">value</span><span class="si">}</span><span class="s2">H&quot;</span><span class="p">,</span><span class="s2">&quot;</span><span class="si">#{</span><span class="n">value</span><span class="si">}</span><span class="s2">S&quot;</span><span class="o">]</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>    <span class="vi">@cards</span><span class="o">.</span><span class="n">flatten!</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>


<p>In the code above, we  go through each element of the VALUES array only once, returning, in the end,the same deck as the first implementation. The tradeoff of this quickening is the face that we cannot input dynamically the SUITES inside the class, but this is not the case in which we have more than the regular set of suites.</p>

<p>Complexity now is <b>O(n)</b> , confirmed also by the following benchmarks:</p>

<figure class='code'><figcaption><span>Benchmarks</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="o">(</span>on running 1000 <span class="nb">times </span>the same method<span class="o">)</span>
</span><span class='line'>                   user     system      total         real
</span><span class='line'>Deck           0.680000   0.020000   0.700000 <span class="o">(</span>  0.703846<span class="o">)</span>
</span><span class='line'>Improved Deck  0.050000   0.000000   0.050000 <span class="o">(</span>  0.047859<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Of course, real-life cases are not so easy to solve, and sometimes an <b>O(n<sup>2</sup>)</b> complexity is more than acceptable for a certain problem, but i think is a good practice to keep your mind open to further optimize your code.</p>

<p>PS: 1 bazillion thanks to <a href="http://truffles.me.uk">Tim Ruffles</a> for his help and constructive criticism. I wish all the critics was like yours!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Learning Scala after Erlang, with a history of Ruby and Actionscript]]></title>
    <link href="http://rublings.com/blog/2013/10/08/learning-scala-after-erlang/"/>
    <updated>2013-10-08T10:18:00+01:00</updated>
    <id>http://rublings.com/blog/2013/10/08/learning-scala-after-erlang</id>
    <content type="html"><![CDATA[<p><img class="center" src="http://rublings.com/images/woah.gif" width="340" height="205"></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Same quality conversion from PDF to image in RMagick]]></title>
    <link href="http://rublings.com/blog/2013/09/12/same-quality-conversion-from-pdf-to-image-in-rmagick/"/>
    <updated>2013-09-12T14:08:00+01:00</updated>
    <id>http://rublings.com/blog/2013/09/12/same-quality-conversion-from-pdf-to-image-in-rmagick</id>
    <content type="html"><![CDATA[<p>Today one of my tasks was to convert a pdf to a png of the same quality, but sadly, all my attempts were all low resolution.<br />
So after a little research on the documentation i found out the density option, which by default is 72. PDF is around 300, so 200 is a good tradeoff (at least, for now).<br />
Also, i found a little bit misguiding that in some guides , the density declaration is after the write function, while should be right after you read the file&hellip;.by the way, here is a nice example! Enjoy!</p>

<br />




<figure class='code'><figcaption><span>Conversion from PDF to Image without quality loss. </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="nb">require</span> <span class="s1">&#39;rmagick&#39;</span>
</span><span class='line'><span class="c1"># Usage: MyFancyConverter.convert(&quot;path/to/your/file.pdf&quot;, &quot;.png&quot;)</span>
</span><span class='line'><span class="k">class</span> <span class="nc">MyFancyConverter</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">convert</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="nb">format</span><span class="p">)</span>
</span><span class='line'>    <span class="n">image</span> <span class="o">=</span> <span class="ss">Magick</span><span class="p">:</span><span class="ss">:ImageList</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span> <span class="p">{</span> <span class="nb">self</span><span class="o">.</span><span class="n">density</span> <span class="o">=</span> <span class="mi">200</span> <span class="p">}</span>
</span><span class='line'>    <span class="n">image</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">file_path</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="s2">&quot;.pdf&quot;</span><span class="p">,</span> <span class="s2">&quot;.</span><span class="si">#{</span><span class="nb">format</span><span class="si">}</span><span class="s2">&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></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
</feed>
