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

  <title><![CDATA[No F*cking Idea]]></title>
  <link href="http://no-fucking-idea.com/atom.xml" rel="self"/>
  <link href="http://no-fucking-idea.com/"/>
  <updated>2019-08-06T13:54:13+01:00</updated>
  <id>http://no-fucking-idea.com/</id>
  <author>
    <name><![CDATA[Jakub Oboza]]></name>
    <email><![CDATA[jakub.oboza@gmail.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[java.util.concurrent Goodies]]></title>
    <link href="http://no-fucking-idea.com/blog/2014/08/25/java-dot-util-dot-concurrent-goodies/"/>
    <updated>2014-08-25T16:42:41+01:00</updated>
    <id>http://no-fucking-idea.com/blog/2014/08/25/java-dot-util-dot-concurrent-goodies</id>
    <content type="html"><![CDATA[<p>JVM as a virtual machine is great. I&rsquo;m not in love with java as i think too many <code>{}</code> can kill anyone regardless of faith. It was really really long time since i wrote anything for the blog and today as it is &ldquo;summer bank holiday&rdquo; i decided to finally sit down and write few things that are interesting.</p>

<h1>java.util.concurrent</h1>

<p>Even if i will be talking about java.util.concurrent i will give few examples using Scala. I like Scala and i think it is much easier to understand and read than java. Simply less tokens. And less tokens mean more fun.</p>

<p>I don&rsquo;t know if explore how much nice things there is in JVM, one of thme is truffle (added in java 8 but i will not be talking about it.). One of the great things is called java.util.concurrent this set of tools/lib gives us  tools to work with concurrency.</p>

<p>In times of agents such a set of tools could feel a bit outdated but still they can gives us valuable lessons about concurrency and maybe be useful in present/future.</p>

<h1>Abstracts</h1>

<p>So as we all know java is full of design patterns and one of the first things you will not while looking into docs are abstract classes. This kinda gives us overview of what we can expect in the package. Just like a movie teaser but&hellip; boring :).
First thing we notice while looking at <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html">http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html</a> is probably <code>BlockingDeque</code> and <code>BlockingQueue</code>. And this is out first example.</p>

<h1>ArrayBlockingQueue</h1>

<p>If you ever worked with threads or any concurrent constructs you know how useful are channels/queues. First concrete class in the package is <code>ArrayBlockingQueue[T]</code> which lets us construct queues. For those who don&rsquo;t know what queue is, it is a FIFO construct, FIFO means First In, First Out. So elements that get in first will be picked up at the receiving end of queue before rest. It is like a queue for tickets before a big summer blockbuster release.</p>

<p>Let us try this ArrayBlockingQueue out:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='scala'><span class='line'><span class="k">import</span> <span class="nn">java.util.concurrent._</span>
</span><span class='line'><span class="k">import</span> <span class="nn">scala.util.control.Breaks._</span>
</span><span class='line'>
</span><span class='line'><span class="k">object</span> <span class="nc">Example</span> <span class="o">{</span>
</span><span class='line'>  <span class="k">val</span> <span class="n">queue</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">ArrayBlockingQueue</span><span class="o">[</span><span class="kt">Int</span><span class="o">](</span><span class="mi">100</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>  <span class="k">val</span> <span class="n">producer1</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">Thread</span><span class="o">(</span><span class="k">new</span> <span class="nc">Runnable</span> <span class="o">{</span>
</span><span class='line'>    <span class="k">def</span> <span class="n">run</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="o">(</span><span class="mi">0</span> <span class="n">to</span> <span class="mi">1000</span><span class="o">).</span><span class="n">map</span><span class="o">(</span> <span class="n">n</span> <span class="k">=&gt;</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">while</span><span class="o">(!</span><span class="n">queue</span><span class="o">.</span><span class="n">offer</span><span class="o">(</span><span class="n">n</span><span class="o">)){}</span>
</span><span class='line'>      <span class="o">})</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>  <span class="o">})</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">val</span> <span class="n">consumer1</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">Thread</span><span class="o">(</span><span class="k">new</span> <span class="nc">Runnable</span> <span class="o">{</span>
</span><span class='line'>    <span class="k">def</span> <span class="n">run</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>      <span class="n">breakable</span> <span class="o">{</span>
</span><span class='line'>        <span class="k">while</span><span class="o">(</span><span class="kc">true</span><span class="o">){</span>
</span><span class='line'>          <span class="k">val</span> <span class="n">result</span> <span class="k">=</span> <span class="n">queue</span><span class="o">.</span><span class="n">take</span><span class="o">()</span>
</span><span class='line'>          <span class="n">print</span><span class="o">(</span><span class="n">result</span><span class="o">.</span><span class="n">toString</span><span class="o">()</span> <span class="o">++</span> <span class="s">&quot;,&quot;</span><span class="o">)</span>
</span><span class='line'>          <span class="k">if</span> <span class="o">(</span><span class="n">result</span> <span class="o">&gt;</span> <span class="mi">999</span><span class="o">){</span>
</span><span class='line'>            <span class="n">break</span>
</span><span class='line'>          <span class="o">}</span>
</span><span class='line'>        <span class="o">}</span>
</span><span class='line'>      <span class="o">}</span>
</span><span class='line'>    <span class="o">}</span>
</span><span class='line'>  <span class="o">})</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="n">main</span><span class="o">(</span><span class="n">args</span><span class="k">:</span> <span class="kt">Array</span><span class="o">[</span><span class="kt">String</span><span class="o">])</span><span class="k">:</span> <span class="kt">Unit</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>    <span class="n">consumer1</span><span class="o">.</span><span class="n">start</span>
</span><span class='line'>    <span class="n">producer1</span><span class="o">.</span><span class="n">start</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>What are we doing here ? We simply demonstrate a producer and consumer type of situation.</p>

<p>There are few things to look at, first initialization</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='scala'><span class='line'><span class="k">val</span> <span class="n">queue</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">ArrayBlockingQueue</span><span class="o">[</span><span class="kt">Int</span><span class="o">](</span><span class="mi">100</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>where we create our queue with a total capacity of 100, this can be skipped for no capacity but this could be risky in terms of memory. So we wanna omit unpredictable parts of code.</p>

<p>How to add stuff to the queue</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='scala'><span class='line'>  <span class="k">while</span><span class="o">(!</span><span class="n">queue</span><span class="o">.</span><span class="n">offer</span><span class="o">(</span><span class="n">n</span><span class="o">)){}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Why like this ? lets not forget it is a blocking queue so once it will fill the capacity it will block. If the queue is full <code>offer</code> method will return false and the element will not be added tot he queue thats why we have to retry this. Of course in this case it might not be the perfect example as it will grind CPU until it can add it to the queue. So maybe adding <code>Thread.sleep(50)</code> sleep for 50 miliseconds could be good here.</p>

<p>Now lets look at consumer, here the job is simple we use take, this will simply block if we can get anything from queue and wait. In most cases this is the behavior we want. Thread simply sitting there and waiting for something to appear in the queue.</p>

<p>There is also option to use <code>add</code> function to add stuff to the queue but this will trigger an exception in case queue is full and i&rsquo;m not a big fan of handling exceptions in this type of scenarios.</p>

<p>More info about ArrayblockingQueue api can be found here <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html">http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html</a></p>

<h1>ConcurrentHashMap[K,V]</h1>

<p>Concurrent Hash Map lets you use a single dictionary / hash by many threads. This is great as it makes all the synchronization work for us. Of course often writes/updates by many threads will make it perform very very slow, but if we can eg. use it as a form of reduction result that would be great simplification.</p>

<p>If we will use 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>
<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>
</pre></td><td class='code'><pre><code class='scala'><span class='line'><span class="k">import</span> <span class="nn">java.util.concurrent._</span>
</span><span class='line'>
</span><span class='line'><span class="k">case</span> <span class="k">class</span> <span class="nc">Mapper</span><span class="o">(</span><span class="n">key</span><span class="k">:</span> <span class="kt">String</span><span class="o">,</span> <span class="n">times</span><span class="k">:</span> <span class="kt">Int</span><span class="o">,</span> <span class="n">hash</span><span class="k">:</span> <span class="kt">ConcurrentHashMap</span><span class="o">[</span><span class="kt">String</span>, <span class="kt">Int</span><span class="o">])</span> <span class="k">extends</span> <span class="nc">Runnable</span> <span class="o">{</span>
</span><span class='line'>  <span class="k">def</span> <span class="n">run</span><span class="o">(){</span>
</span><span class='line'>    <span class="k">val</span> <span class="n">sum</span> <span class="k">=</span> <span class="o">(</span><span class="mi">1</span> <span class="n">to</span> <span class="n">times</span><span class="o">).</span><span class="n">sum</span>
</span><span class='line'>    <span class="n">hash</span><span class="o">.</span><span class="n">put</span><span class="o">(</span><span class="n">key</span><span class="o">,</span> <span class="n">sum</span> <span class="o">+</span> <span class="n">hash</span><span class="o">.</span><span class="n">get</span><span class="o">(</span><span class="n">key</span><span class="o">))</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">object</span> <span class="nc">Example</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">val</span> <span class="n">resultHash</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">ConcurrentHashMap</span><span class="o">[</span><span class="kt">String</span>, <span class="kt">Int</span><span class="o">]()</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="n">main</span><span class="o">(</span><span class="n">args</span><span class="k">:</span> <span class="kt">Array</span><span class="o">[</span><span class="kt">String</span><span class="o">])</span> <span class="k">:</span> <span class="kt">Unit</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">val</span> <span class="n">threads</span> <span class="k">=</span> <span class="nc">Array</span><span class="o">(</span>
</span><span class='line'>      <span class="k">new</span> <span class="nc">Thread</span><span class="o">(</span><span class="nc">Mapper</span><span class="o">(</span><span class="s">&quot;one&quot;</span><span class="o">,</span> <span class="mi">1000</span><span class="o">,</span> <span class="n">resultHash</span><span class="o">)),</span>
</span><span class='line'>      <span class="k">new</span> <span class="nc">Thread</span><span class="o">(</span><span class="nc">Mapper</span><span class="o">(</span><span class="s">&quot;two&quot;</span><span class="o">,</span> <span class="mi">1000</span><span class="o">,</span> <span class="n">resultHash</span><span class="o">)),</span>
</span><span class='line'>      <span class="k">new</span> <span class="nc">Thread</span><span class="o">(</span><span class="nc">Mapper</span><span class="o">(</span><span class="s">&quot;one&quot;</span><span class="o">,</span> <span class="mi">1000</span><span class="o">,</span> <span class="n">resultHash</span><span class="o">))</span>
</span><span class='line'>    <span class="o">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">threads</span><span class="o">.</span><span class="n">map</span><span class="o">(</span><span class="k">_</span><span class="o">.</span><span class="n">start</span><span class="o">)</span>
</span><span class='line'>    <span class="n">threads</span><span class="o">.</span><span class="n">map</span><span class="o">(</span><span class="k">_</span><span class="o">.</span><span class="n">join</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">print</span><span class="o">(</span><span class="s">&quot;Key &#39;one&#39; =&gt; &quot;</span> <span class="o">+</span> <span class="n">resultHash</span><span class="o">.</span><span class="n">get</span><span class="o">(</span><span class="s">&quot;one&quot;</span><span class="o">).</span><span class="n">toString</span> <span class="o">+</span> <span class="s">&quot;\n&quot;</span><span class="o">)</span>
</span><span class='line'>    <span class="n">print</span><span class="o">(</span><span class="s">&quot;Key &#39;two&#39; =&gt; &quot;</span> <span class="o">+</span> <span class="n">resultHash</span><span class="o">.</span><span class="n">get</span><span class="o">(</span><span class="s">&quot;two&quot;</span><span class="o">).</span><span class="n">toString</span> <span class="o">+</span> <span class="s">&quot;\n&quot;</span><span class="o">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Of course it will work but it will  often cause troubles, this code is racy :D and often it will end up with same results  for both one and two even if it is synced.  Well we now know we can use this structure from any number of threads but to make it work it would be more useful to create another thread that would be reducing values or simply have a queue where we put in partial results and a single thread that is updating the hash.  Still this can have some use, if you have a one reducer that is updating this hash or simply many different reducers updating dedicated key spaces while many other threads are simply using this hash in readonly mode. The big issue is when you want to update it as it doesn&rsquo;t support transactions and what you really want to do here is a transaction.</p>

<h1>Atomic variables</h1>

<p>Well we all love simplicity of a single variable, and in concurrent env it is simply easy to forget about goodies of sequential world and use a raw variable to store results of some execution.</p>

<p>Let us write some dodgy code:</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>
</pre></td><td class='code'><pre><code class='scala'><span class='line'><span class="k">import</span> <span class="nn">java.util.concurrent._</span>
</span><span class='line'>
</span><span class='line'><span class="k">case</span> <span class="k">class</span> <span class="nc">Counter</span><span class="o">()</span> <span class="k">extends</span> <span class="nc">Runnable</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="n">run</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="o">(</span><span class="mi">1</span> <span class="n">until</span> <span class="mi">1000</span><span class="o">).</span><span class="n">map</span><span class="o">(</span> <span class="n">n</span> <span class="k">=&gt;</span> <span class="nc">Example</span><span class="o">.</span><span class="n">counter</span> <span class="k">=</span> <span class="nc">Example</span><span class="o">.</span><span class="n">counter</span> <span class="o">+</span> <span class="n">n</span><span class="o">)</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">object</span> <span class="nc">Example</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">var</span> <span class="n">counter</span><span class="k">:</span> <span class="kt">Int</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="n">main</span><span class="o">(</span><span class="n">args</span><span class="k">:</span> <span class="kt">Array</span><span class="o">[</span><span class="kt">String</span><span class="o">])</span> <span class="k">:</span> <span class="kt">Unit</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">val</span> <span class="n">t</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">Thread</span><span class="o">(</span><span class="nc">Counter</span><span class="o">())</span>
</span><span class='line'>    <span class="k">val</span> <span class="n">t2</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">Thread</span><span class="o">(</span><span class="nc">Counter</span><span class="o">())</span>
</span><span class='line'>    <span class="n">t</span><span class="o">.</span><span class="n">start</span>
</span><span class='line'>    <span class="n">t2</span><span class="o">.</span><span class="n">start</span>
</span><span class='line'>    <span class="n">t</span><span class="o">.</span><span class="n">join</span>
</span><span class='line'>    <span class="n">t2</span><span class="o">.</span><span class="n">join</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">print</span><span class="o">(</span><span class="n">counter</span><span class="o">)</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Result should be 999000 but&hellip; you will get stuff like 907369&hellip; This happens because of both threads randomly reading and updating with garbage same val. Thats why we need atomic values :) lets convert it into less dodgy 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>
<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>
</pre></td><td class='code'><pre><code class='scala'><span class='line'><span class="k">import</span> <span class="nn">java.util.concurrent.atomic._</span>
</span><span class='line'>
</span><span class='line'><span class="k">case</span> <span class="k">class</span> <span class="nc">Counter</span><span class="o">()</span> <span class="k">extends</span> <span class="nc">Runnable</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="n">run</span><span class="o">()</span> <span class="o">{</span>
</span><span class='line'>    <span class="o">(</span><span class="mi">1</span> <span class="n">until</span> <span class="mi">1000</span><span class="o">).</span><span class="n">map</span><span class="o">(</span> <span class="n">n</span> <span class="k">=&gt;</span> <span class="nc">Example</span><span class="o">.</span><span class="n">counter</span><span class="o">.</span><span class="n">addAndGet</span><span class="o">(</span><span class="n">n</span><span class="o">))</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">object</span> <span class="nc">Example</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">var</span> <span class="n">counter</span><span class="k">:</span> <span class="kt">AtomicInteger</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">AtomicInteger</span><span class="o">()</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="n">main</span><span class="o">(</span><span class="n">args</span><span class="k">:</span> <span class="kt">Array</span><span class="o">[</span><span class="kt">String</span><span class="o">])</span> <span class="k">:</span> <span class="kt">Unit</span> <span class="o">=</span> <span class="o">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">val</span> <span class="n">t</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">Thread</span><span class="o">(</span><span class="nc">Counter</span><span class="o">())</span>
</span><span class='line'>    <span class="k">val</span> <span class="n">t2</span> <span class="k">=</span> <span class="k">new</span> <span class="nc">Thread</span><span class="o">(</span><span class="nc">Counter</span><span class="o">())</span>
</span><span class='line'>    <span class="n">t</span><span class="o">.</span><span class="n">start</span>
</span><span class='line'>    <span class="n">t2</span><span class="o">.</span><span class="n">start</span>
</span><span class='line'>    <span class="n">t</span><span class="o">.</span><span class="n">join</span>
</span><span class='line'>    <span class="n">t2</span><span class="o">.</span><span class="n">join</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">print</span><span class="o">(</span><span class="n">counter</span><span class="o">.</span><span class="n">get</span><span class="o">())</span>
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>After adding AtomicInteger and changing how we update to atomic updates we always get same results and it is the correct answer. It doesn&rsquo;t look good yet because of this Example.counter but that is just an example.</p>

<h1>A lot more&hellip;</h1>

<p>There is a lot more in this awesome package to cover, i will cover one more thing next time and that are Cyclic Barriers for better synchronization of threads but for now this is it :). I hope this was a useful read. I don&rsquo;t have much time to play with Scala so if something looks &ldquo;too simple&rdquo; :D yeah i&rsquo;m not a scala expert.</p>

<p>Cheers!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Shortest Way to Work With Json in Haskell]]></title>
    <link href="http://no-fucking-idea.com/blog/2014/03/23/shortest-way-to-work-with-json-in-haskell/"/>
    <updated>2014-03-23T10:52:17+00:00</updated>
    <id>http://no-fucking-idea.com/blog/2014/03/23/shortest-way-to-work-with-json-in-haskell</id>
    <content type="html"><![CDATA[<p><code>Data.Aeson</code> is a great package for working with json data in <code>Haskell</code> but you can make it work even in fewer lines of code.</p>

<p>if you will use <code>DeriveGeneric</code> from GHC and <code>GHC.Generics</code> in your module you can parse stuff super easy ;O.</p>

<p>This is my example that explains how to use it.</p>

<figure class='code'><figcaption><span>json_example.hs</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
</pre></td><td class='code'><pre><code class='haskell'><span class='line'><span class="cm">{-# LANGUAGE OverloadedStrings, DeriveGeneric #-}</span>
</span><span class='line'>
</span><span class='line'><span class="kr">import</span> <span class="nn">Data.Aeson</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">GHC.Generics</span>
</span><span class='line'>
</span><span class='line'><span class="kr">data</span> <span class="kt">Profile</span> <span class="ow">=</span> <span class="kt">Profile</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">age</span>       <span class="ow">::</span> <span class="kt">Int</span><span class="p">,</span>
</span><span class='line'>  <span class="n">isNice</span>    <span class="ow">::</span> <span class="kt">Bool</span>
</span><span class='line'><span class="p">}</span> <span class="kr">deriving</span> <span class="p">(</span><span class="kt">Show</span><span class="p">,</span> <span class="kt">Generic</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="kr">data</span> <span class="kt">User</span> <span class="ow">=</span> <span class="kt">User</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">id</span>        <span class="ow">::</span> <span class="kt">Int</span><span class="p">,</span>
</span><span class='line'>  <span class="n">name</span>      <span class="ow">::</span> <span class="kt">String</span><span class="p">,</span>
</span><span class='line'>  <span class="n">profile</span>   <span class="ow">::</span> <span class="kt">Profile</span>
</span><span class='line'><span class="p">}</span> <span class="kr">deriving</span> <span class="p">(</span><span class="kt">Show</span><span class="p">,</span> <span class="kt">Generic</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="kr">instance</span> <span class="kt">FromJSON</span> <span class="kt">Profile</span>
</span><span class='line'><span class="kr">instance</span> <span class="kt">ToJSON</span> <span class="kt">Profile</span>
</span><span class='line'>
</span><span class='line'><span class="kr">instance</span> <span class="kt">FromJSON</span> <span class="kt">User</span>
</span><span class='line'><span class="kr">instance</span> <span class="kt">ToJSON</span> <span class="kt">User</span>
</span><span class='line'>
</span><span class='line'><span class="nf">main</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="kr">let</span> <span class="n">profile</span> <span class="ow">=</span> <span class="kt">Profile</span> <span class="mi">29</span> <span class="kt">True</span>
</span><span class='line'>  <span class="kr">let</span> <span class="n">user</span> <span class="ow">=</span> <span class="kt">User</span> <span class="mi">1</span> <span class="s">&quot;Kuba&quot;</span> <span class="n">profile</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="o">$</span> <span class="n">show</span> <span class="n">user</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">-- encode will give you back ByteString</span>
</span><span class='line'>
</span><span class='line'>  <span class="kr">let</span> <span class="n">json</span> <span class="ow">=</span> <span class="n">encode</span> <span class="n">user</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="o">$</span> <span class="n">show</span> <span class="n">json</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">-- decode will give you back Maybe</span>
</span><span class='line'>
</span><span class='line'>  <span class="kr">let</span> <span class="n">parsedUser</span> <span class="ow">=</span> <span class="n">decode</span> <span class="n">json</span> <span class="ow">::</span> <span class="kt">Maybe</span> <span class="kt">User</span>
</span><span class='line'>  <span class="kr">case</span> <span class="n">parsedUser</span> <span class="kr">of</span>
</span><span class='line'>    <span class="kt">Just</span> <span class="n">newUser</span> <span class="ow">-&gt;</span> <span class="n">putStrLn</span> <span class="o">$</span> <span class="n">show</span> <span class="n">newUser</span>
</span><span class='line'>    <span class="kt">Nothing</span> <span class="ow">-&gt;</span> <span class="n">putStrLn</span> <span class="s">&quot;Sorry mate this is not happening&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>result</p>

<figure class='code'><figcaption><span>result</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='bash'><span class='line'>User <span class="o">{</span><span class="nv">id</span> <span class="o">=</span> 1, <span class="nv">name</span> <span class="o">=</span> <span class="s2">&quot;Kuba&quot;</span>, <span class="nv">profile</span> <span class="o">=</span> Profile <span class="o">{</span><span class="nv">age</span> <span class="o">=</span> 29, <span class="nv">isNice</span> <span class="o">=</span> True<span class="o">}}</span>
</span><span class='line'><span class="s2">&quot;{\&quot;id\&quot;:1,\&quot;name\&quot;:\&quot;Kuba\&quot;,\&quot;profile\&quot;:{\&quot;isNice\&quot;:true,\&quot;age\&quot;:29}}&quot;</span>
</span><span class='line'>User <span class="o">{</span><span class="nv">id</span> <span class="o">=</span> 1, <span class="nv">name</span> <span class="o">=</span> <span class="s2">&quot;Kuba&quot;</span>, <span class="nv">profile</span> <span class="o">=</span> Profile <span class="o">{</span><span class="nv">age</span> <span class="o">=</span> 29, <span class="nv">isNice</span> <span class="o">=</span> True<span class="o">}}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here i made shortest possible example to show off how you can work with Aeson. First of all if you will use Generics you don&rsquo;t have to write real implementation of <code>ToJSON</code> and <code>FromJSON</code> GHC will do this or you!</p>

<p>Only thing to remember is that <code>encode</code> will give you back <code>ByteString</code> and decode will give you <code>Maybe A</code> and thats it.</p>

<p>You always can fallback to normal way of describing <code>FromJSON</code> and <code>ToJSON</code> :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Versioning of Your Code and API]]></title>
    <link href="http://no-fucking-idea.com/blog/2014/03/20/versioning-of-your-code-and-api/"/>
    <updated>2014-03-20T22:20:25+00:00</updated>
    <id>http://no-fucking-idea.com/blog/2014/03/20/versioning-of-your-code-and-api</id>
    <content type="html"><![CDATA[<p>People that deal with evolving applications in &lsquo;the wild&rsquo; are often hit with quite a tricky question. How do you version your api and the code behind it?
We had similar issue where I work and i will present my idea on the topic.</p>

<h1>Motivation</h1>

<p>Different clients requests features, you upgrade your codebase and mvoe along for example streamlining api. You need a way to version the code so old clients have time to move work on upgrade and new clients can use new api without having problems.</p>

<h1>Restful API</h1>

<p>This is the first part and its easy so i will be fast on this. In my opinion using subdomains/CNAM&#8217;es for versions like</p>

<p><code>v1., v2., v3.yourdomain.com</code> or <code>20012013.yourdomain.com</code> is the best way to handle changes in API from client side. As we spoke internally using headers or any other thing can make clients go mental because they are using other type of software and
some change could be not trivial.  Yes actually people have this type of problems with very old bash/perl systems.</p>

<p>But why subdomains are cool in my opinion will unroll in next section.</p>

<h1>But what about the code ?</h1>

<p>Most important thing is how easy it will be for developer to add things without breaking other things.
Yes this is the problem! Most people will think that rolling a solution with some sort of scoping, inheritance is ok.</p>

<p>eg.</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="k">class</span> <span class="nc">V2</span><span class="o">::</span><span class="no">People</span>
</span><span class='line'><span class="k">class</span> <span class="nc">V1</span><span class="o">::</span><span class="no">People</span>
</span></code></pre></td></tr></table></div></figure>


<p>No its not. This is actually sh*t. Why ? Even with good code test coverage you still have issue becasue each of this class is using other classes basically sharing them. And changes in their code can affect other version of api. And with V1 and V2 it is managable but if you have 5-9 versions its starts to be crazy.</p>

<h1>How to solve it ?</h1>

<p>Imagine a queue of versions in form of deployed boxes.</p>

<p>My idea is very simple. You simply tag version codebase and deploy new version on new box while pointing new subdomain to new app.</p>

<p>What do you gain ?</p>

<ul>
<li>You are sure you can deploy from 0 your app in production in isolated environment BIG WIN</li>
<li>You know you can upgrade OS/packages in your production app with each release BIG WIN</li>
<li>You know how many people are still on some version</li>
<li>Your developer can develop in new version just like in any other app without caring for compatibility issues</li>
</ul>


<p>We live in age of cloud deploy so spinning new instance is not that expensive!</p>

<p>There is only one point you have to be very aware, that is data persistence. If you are using SQL you can only ADD COLUMNS/TABLEs never remove anything. But in most thing you will do exactly this anyway.</p>

<p>Version deploy&rsquo;s on virtual machines example:
<img src="http://i.imgur.com/9oEfbnD.png" alt="Image of V'm boxes in the web" /></p>

<h1>Ok that was fast lets recap it</h1>

<p>Process! how would you implement this in real life ? Simple!</p>

<p>When you have an app and you deploy it using eg. puppet + capistrano. When you deploy first version you make a tag in git with name eg <code>version-1</code> or <code>20032014-deploy</code> and deploy it to a box assigning a CNAME.</p>

<p>Next you start working on new version and when you will get new version you tag it <code>21032014-deploy</code> and deploy to a new box. This must contain &ldquo;build whole box script&rdquo; in puppet or if you are using docker. This way if you eg. added redis to stack you need to be sure your production deployment scripts are ready. This makes you be focused on keeping your &ldquo;production ready setup&rdquo; always up to date.</p>

<p>And after deploy you move along and work on new version. When you need to decomision old version you just kill the box. Also each version should be monitored how many requests it actually gets to the API because if you will have 20 versions up and some are getting 0 traffic you can kill them.</p>

<p>Example where many versions use same db &ldquo;ring&rdquo; / &ldquo;cluster&rdquo;:
<img src="http://i.imgur.com/Fd3OvKm.png" alt="V'ms using DB" /></p>

<h1>Rollback ?</h1>

<p>How do you rollback ? simply checkout deployment tag and deploy :)</p>

<h1>The gain ?</h1>

<p>The gain in this strategy is isolation, if you need more boxes for your main version you have ready production scripts so all you have to do is to spin them and be sure that CNAME is load balanced.</p>

<h1>Summary</h1>

<p>I don&rsquo;t think this strategy has any problem / hidden traps. You get smaller codebase to work with, ability to upgrade your production boxes and application libs/frameworks as you always move forward and deploy from scratch. You don&rsquo;t do upgrade-production box deploy but fresh deploy. Also fresh deploy can be smoke-tested by tester before putting it into production.
Deployment scripts makes you by default ready to scale your app horizontally.</p>

<p>Again What you do:</p>

<ul>
<li>start: Deploy version to a fresh box</li>
<li>Upgrade Code/OS and add features</li>
<li>Tag new version</li>
<li>goto start:</li>
</ul>


<p>IMHO everyone should move to this type of strategy in context of api versions.</p>

<p>Cheers
&ndash; Jakub Oboza</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Golang New &amp; Make]]></title>
    <link href="http://no-fucking-idea.com/blog/2014/02/23/golang-new-and-make/"/>
    <updated>2014-02-23T12:42:11+00:00</updated>
    <id>http://no-fucking-idea.com/blog/2014/02/23/golang-new-and-make</id>
    <content type="html"><![CDATA[<p>When i first started playing and learning Google <a href="http://golang.org/">GO</a> one if the first things i noticed was
<code>new</code> and <code>make</code>. At first glance they seemed to be doing same thing. There is a difference and it actually is quite easy to explain.</p>

<h1>Documentation</h1>

<p>If we will go to the golang doc page under <code>http://golang.org/pkg/builtin</code> we can see every builtin function in go. Also <code>new</code> and <code>make</code>. From <a href="http://golang.org/pkg/builtin/#new">new</a> we can read.</p>

<p><em>&ldquo;The new built-in function allocates memory. The first argument is a type, not a value, and the value returned is a pointer to a newly allocated zero value of that type.&rdquo;</em></p>

<p>similar on make.</p>

<p><em>&ldquo;The make built-in function allocates and initializes an object of type slice, map, or chan (only). Like new, the first argument is a type, not a value. Unlike new, make&rsquo;s return type is the same as the type of its argument, not a pointer to it.&rdquo;</em></p>

<p>So we can see that <code>new</code> return pointer to a type and make returns an allocated object of that type. Now this is a difference.</p>

<p>So how can we implement a simplified new ?</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='go'><span class='line'><span class="kd">func</span> <span class="nx">newInt</span><span class="p">()</span> <span class="o">*</span><span class="kt">int</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">i</span> <span class="kt">int</span>
</span><span class='line'>  <span class="k">return</span> <span class="o">&amp;</span><span class="nx">i</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nx">someVar</span> <span class="o">:=</span> <span class="nx">newInt</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>this is just like we would do <code>someVar := new(int)</code>.</p>

<p>In case of <code>make</code> we can only use it for <code>map</code>, <code>slice</code> and <code>chan</code>.</p>

<p><em>&ldquo;Slice: The size specifies the length. The capacity of the slice is
equal to its length. A second integer argument may be provided to
specify a different capacity; it must be no smaller than the
length, so make([]int, 0, 10) allocates a slice of length 0 and
capacity 10.
Map: An initial allocation is made according to the size but the
resulting map has length 0. The size may be omitted, in which case
a small starting size is allocated.
Channel: The channel&rsquo;s buffer is initialized with the specified
buffer capacity. If zero, or the size is omitted, the channel is
unbuffered.&rdquo;</em></p>

<p>make creates and allocates all the memory. We can specify size of the element we want in the second parameter but this only works for slice and chan. Map is a special type that doesn&rsquo;t need size.</p>

<p>And make is the only way to create this objects.</p>

<h1>Summary</h1>

<p><code>new</code> is a way of getting pointers to new types while <code>make</code> is for creating channels, maps and slices only.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Dogecoin Mining on Raspberry Pi LOLMODE]]></title>
    <link href="http://no-fucking-idea.com/blog/2014/01/14/dogecoin-mining-on-raspberry-pi-lolmode/"/>
    <updated>2014-01-14T10:43:36+00:00</updated>
    <id>http://no-fucking-idea.com/blog/2014/01/14/dogecoin-mining-on-raspberry-pi-lolmode</id>
    <content type="html"><![CDATA[<p>!!!UPDATE:
Download cpuminer and build from tar <a href="http://sourceforge.net/projects/cpuminer/">http://sourceforge.net/projects/cpuminer/</a> git HEAD is broken and will not let you run configure.</p>

<p>If you have <code>800 Mhash/s</code> GPU (Graphics card) i&rsquo;m sure you often think about making your raspberry pi a dogecoin miner. Because why not :D ? It is not effective i warn you :) you will get around <code>0.34 khash/s</code> that is about 2000 times less than your GPU :) and about 500 times less than CPU on your box. But its easy and fun.</p>

<p><img src="http://i.imgur.com/83LnzuU.jpg" alt="doge meme" /></p>

<p>I mainly did it for fun to see how it will react, work and what is the possible heat problem.</p>

<h1>Again Why ?</h1>

<p>Because DOGE, doge coin is THE NEW BLACK. Its future! An Irony on all crypto currency :) and its value is based on meme, laugh and happiness. This is much better than bitcoin :> at least for me</p>

<h1>Connect to your raspberry pi</h1>

<p>You will need:</p>

<figure class='code'><figcaption><span>requirements</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'>  λ automake
</span><span class='line'>  λ gcc
</span><span class='line'>  λ git-core
</span><span class='line'>  λ libcurl
</span></code></pre></td></tr></table></div></figure>


<p>if you are using like me <code>2014-01-07-wheezy-raspbian</code> raspbian you will have everything ready :) one thing to install is <code>automake</code> and you can do this by typing <code>apt-get update</code>  followed by <code>apt-get install automake</code> this is all you need.</p>

<p>lets get on the box! (default login/passowrd for this image is pi:raspberry)</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='bash'><span class='line'>10:54 kuba@pc12:~ λ ssh pi@192.168.1.22
</span><span class='line'>pi@raspberrypi ~ <span class="err">$</span>
</span></code></pre></td></tr></table></div></figure>


<p>(This ip address is just an example :D you will need to have a way to find it in your network.)</p>

<p>Now all you need to do is to clone CPU miner for 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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>git clone https://github.com/pooler/cpuminer.git
</span></code></pre></td></tr></table></div></figure>


<p>This will download your mining software on the raspeberry pi, next we need to compile it and run!</p>

<figure class='code'><figcaption><span>compiling</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='bash'><span class='line'>pi@raspberrypi ~/Workspace <span class="nv">$ </span><span class="nb">cd </span>cpuminer-2.3.2/
</span><span class='line'>pi@raspberrypi ~/Workspace/cpuminer-2.3.2 <span class="err">$</span>
</span><span class='line'>./autogen.sh
</span><span class='line'>... script will take some <span class="nb">time</span> ...
</span><span class='line'>./configure <span class="nv">CFLAGS</span><span class="o">=</span><span class="s2">&quot;-O3&quot;</span>
</span><span class='line'>make
</span></code></pre></td></tr></table></div></figure>


<p>This will compile and build the minerd binary that is ready to start mining :). Well you need to do one thing, join a doge pool. I&rsquo;m not gone go into details of solo mining vs pool minnig :)  i&rsquo;m just a simple miner :D</p>

<p>If you need more info on mining pools you should check this topic <a href="http://www.reddit.com/r/dogecoin/comments/1tn8yz/dogecoin_mining_pool_list/">http://www.reddit.com/r/dogecoin/comments/1tn8yz/dogecoin_mining_pool_list/</a></p>

<p>I personally at the time of writing this post i&rsquo;m using small pool called chunky pool :).</p>

<h2>Starting to mine!</h2>

<p>Now we have software lets actually mine something :).
You will need to create a shell script that will start minerd on your raspberry pi. My looks like this</p>

<figure class='code'><figcaption><span>run.sh</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='bash'><span class='line'>./minerd --a scrypt --threads 1 -o stratum+tcp://pool.chunky.ms:3333 -O dogedogedoge.pi:password
</span></code></pre></td></tr></table></div></figure>


<p>make it executable and run! Yay you are a dogecoin farmer now! CPU mining is not the most optimal but hey..its all just for lolz :)</p>

<h3>Heat problems ?</h3>

<p>For me 2 hours of mining on raspberry pi did not generate any extra heat or stuff like this, seems to be stable. I was worried it will got nuts on this topic but i was proven wrong.</p>

<h1>Summay</h1>

<p>This sucks in terms of speed, you will get close to none speed because below 2 khash/s its not even worth it, you will not be on any stats on any pool even listed, periodically you will actually hit the jackpot and get a success pimping you to 2khash/s for about 60 sec but that is  just a lie, you scored a win and this will give you some parts of doge. Last i checked you were able to get around 0.67 doge per hour of your raspberry time. That is really really bad as pretty basic GPU pimps you to 600+</p>

<p>Cheers :) Hope it helps! Much fun, so currency.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Working With URL Quick Tip Network.Url]]></title>
    <link href="http://no-fucking-idea.com/blog/2013/12/16/working-with-urls-quick-tip-network-dot-url/"/>
    <updated>2013-12-16T17:59:58+00:00</updated>
    <id>http://no-fucking-idea.com/blog/2013/12/16/working-with-urls-quick-tip-network-dot-url</id>
    <content type="html"><![CDATA[<p>I have bigger text to post but before i will do it i have to split it into smaller parts so it will not be one long post about everything.</p>

<p><img src="http://i.imgur.com/jwI5yqK.png" alt="cat explaining stuff" /></p>

<h1>Working with URL&rsquo;s</h1>

<p>Most of the time when preparing to make an http request in haskell eg. using <code>simpleHTTP</code> we need to build a request. We have several ways to do it, one of them would be to ugly glue strings together but thats not the way to do it in a safe way. Happily for us we have <code>url</code>, <code>(cabal install url)</code> package that adds <code>Network.Url</code> package. And here i will show few quick tips how to use it to work with urls.</p>

<h2>Step one: Import</h2>

<p>First thing we have to do is to import our package :D and string into our url lib.</p>

<figure class='code'><figcaption><span>start.hs</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='haskell'><span class='line'><span class="kr">import</span> <span class="nn">Network.URL</span>
</span><span class='line'>
</span><span class='line'><span class="nf">main</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="s">&quot;give me some url:&quot;</span>
</span><span class='line'>  <span class="n">rawUrl</span> <span class="ow">&lt;-</span> <span class="n">getLine</span>
</span><span class='line'>  <span class="kr">let</span> <span class="n">maybeUrl</span> <span class="ow">=</span> <span class="n">importURL</span> <span class="n">rawUrl</span> <span class="kr">in</span>
</span><span class='line'>    <span class="kr">case</span> <span class="n">maybeUrl</span> <span class="kr">of</span>
</span><span class='line'>    <span class="kt">Just</span> <span class="n">url</span> <span class="ow">-&gt;</span>
</span><span class='line'>      <span class="n">putStrLn</span> <span class="o">$</span> <span class="n">exportURL</span> <span class="o">$</span> <span class="n">add_param</span> <span class="n">url</span> <span class="p">(</span><span class="s">&quot;param_name&quot;</span><span class="p">,</span><span class="s">&quot;param_value&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="kt">Nothing</span>  <span class="ow">-&gt;</span> <span class="n">putStrLn</span> <span class="s">&quot;Sorry but this doesn&#39;t look like url&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is the super simple example. But how it work? First of all we have <code>importURL</code> with signature:</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='haskell'><span class='line'><span class="nf">importURL</span> <span class="ow">::</span> <span class="kt">String</span> <span class="ow">-&gt;</span> <span class="kt">Maybe</span> <span class="kt">URL</span>
</span></code></pre></td></tr></table></div></figure>


<p>This will import url in form of string to url library and give us back Maybe URL. This is awesome! So we will have type that we can work on Yay! To exit library and get back string. We need to use <code>exportURL</code> with signature:</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='haskell'><span class='line'><span class="nf">exportURL</span> <span class="ow">::</span> <span class="kt">URL</span> <span class="ow">-&gt;</span> <span class="kt">String</span>
</span></code></pre></td></tr></table></div></figure>


<p>So we are only doing some simple transformation <code>String ~&gt;~ Maybe URL ~&gt;~ URL ~&gt;~ String</code> thats nothing we can&rsquo;t handle!</p>

<p>Next important bit is <code>add_param</code> function with signature:</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='haskell'><span class='line'><span class="nf">add_param</span> <span class="ow">::</span> <span class="kt">URL</span> <span class="ow">-&gt;</span> <span class="p">(</span><span class="kt">String</span><span class="p">,</span> <span class="kt">String</span><span class="p">)</span> <span class="ow">-&gt;</span> <span class="kt">URL</span>
</span></code></pre></td></tr></table></div></figure>


<p>This does exactly what we would expect :D If we need to add to url <code>http://google.com</code> two params <code>ok=1</code> and <code>query=haskell</code> To build  <code>http://google.com?query=haskell&amp;ok=1</code>.</p>

<h2>Step two: More detailed example</h2>

<p>I will try to reiterate our first example showing a bit more thing. Or just same things in a different way. Lets try to add two params.</p>

<figure class='code'><figcaption><span>ue2.hs</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='haskell'><span class='line'><span class="kr">import</span> <span class="nn">Network.URL</span>
</span><span class='line'>
</span><span class='line'><span class="nf">prepareUrl</span> <span class="n">url</span> <span class="ow">=</span>
</span><span class='line'>  <span class="kr">let</span> <span class="n">newUrl</span> <span class="ow">=</span> <span class="n">add_param</span> <span class="n">url</span> <span class="p">(</span><span class="s">&quot;query&quot;</span><span class="p">,</span><span class="s">&quot;gimme cats pics&quot;</span><span class="p">)</span> <span class="kr">in</span>
</span><span class='line'>    <span class="n">add_param</span> <span class="n">newUrl</span> <span class="p">(</span><span class="s">&quot;size&quot;</span><span class="p">,</span> <span class="s">&quot;any&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="nf">main</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="s">&quot;give me some url:&quot;</span>
</span><span class='line'>  <span class="n">rawUrl</span> <span class="ow">&lt;-</span> <span class="n">getLine</span>
</span><span class='line'>  <span class="kr">let</span> <span class="n">maybeUrl</span> <span class="ow">=</span> <span class="n">importURL</span> <span class="n">rawUrl</span> <span class="kr">in</span>
</span><span class='line'>    <span class="kr">case</span> <span class="n">maybeUrl</span> <span class="kr">of</span>
</span><span class='line'>    <span class="kt">Just</span> <span class="n">url</span> <span class="ow">-&gt;</span>
</span><span class='line'>      <span class="n">putStrLn</span> <span class="o">$</span> <span class="n">exportURL</span> <span class="o">$</span> <span class="n">prepareUrl</span> <span class="n">url</span>
</span><span class='line'>    <span class="kt">Nothing</span>  <span class="ow">-&gt;</span> <span class="n">putStrLn</span> <span class="s">&quot;Sorry but this doesn&#39;t look like url&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>You should run the code and see something like this:</p>

<figure class='code'><figcaption><span>ue2.hs</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='haskell'><span class='line'> <span class="err">λ</span> <span class="o">./</span><span class="n">ue2</span>
</span><span class='line'><span class="nf">give</span> <span class="n">me</span> <span class="n">some</span> <span class="n">url</span><span class="kt">:</span>
</span><span class='line'><span class="nf">lambdacu</span><span class="o">.</span><span class="n">be</span>
</span><span class='line'><span class="nf">lambdacu</span><span class="o">.</span><span class="n">be</span><span class="o">?</span><span class="n">size</span><span class="ow">=</span><span class="n">any</span><span class="o">&amp;</span><span class="n">query</span><span class="ow">=</span><span class="n">gimme</span><span class="o">+</span><span class="n">cats</span><span class="o">+</span><span class="n">pics</span>
</span></code></pre></td></tr></table></div></figure>


<h1>Summary</h1>

<p>It is just a quick tip :) <code>Network.URL</code> has few more functions eg. to check if protocol is secure and checking if params are ok.
But stuff showed above is the main point of lib.</p>

<p>More about this lib ofc on hackage: <a href="http://hackage.haskell.org/package/url-2.1/docs/Network-URL.html">http://hackage.haskell.org/package/url-2.1/docs/Network-URL.html</a></p>

<p>&hellip;.And quick tip should be quick :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[forkIO and Friends]]></title>
    <link href="http://no-fucking-idea.com/blog/2013/12/12/forkio-and-friends/"/>
    <updated>2013-12-12T17:38:53+00:00</updated>
    <id>http://no-fucking-idea.com/blog/2013/12/12/forkio-and-friends</id>
    <content type="html"><![CDATA[<p>This post is sponsored by <code>forkIO</code> function and <code>newChan</code> in <code>Haskell</code></p>

<p><img src="http://i.imgur.com/5yQNQxs.png" alt="Catz" /></p>

<h1>What is this forkIO ?</h1>

<p>forkIO is part of <code>Control.Concurrent</code> package and as it says it:</p>

<blockquote><p>Sparks off a new thread to run the IO computation passed as the first argument, and returns the ThreadId of the newly created thread.
The new thread will be a lightweight thread; if you want to use a foreign library that uses thread-local storage, use forkOS instead.</p></blockquote>

<p>This is very neat if your program wants to use all the cores of your CPU or at least be more responsive not waiting for stuff to happen.</p>

<p>forkIO type is:</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='haskell'><span class='line'><span class="nf">forkIO</span> <span class="ow">::</span> <span class="kt">IO</span> <span class="nb">()</span> <span class="ow">-&gt;</span> <span class="kt">IO</span> <span class="kt">ThreadId</span>
</span></code></pre></td></tr></table></div></figure>


<h1>Channels to help !</h1>

<p>forkIO would be enough to start working on stuff but to make a real use of them we need a way of communicating with our threads. This actually opens design of our code to new stuff like building workers. There are other ways of communicating with threads like mVar but IMHO channels win hard.</p>

<p>Channels are part of <code>Control.Concurrent.Chan</code> package and are typable! Typed communication Yay!</p>

<p>Channels functions we need have the following type signatures:</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='haskell'><span class='line'><span class="nf">newChan</span> <span class="ow">::</span> <span class="kt">IO</span> <span class="p">(</span><span class="kt">Chan</span> <span class="n">a</span><span class="p">)</span>
</span><span class='line'><span class="nf">writeChan</span> <span class="ow">::</span> <span class="kt">Chan</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="kt">IO</span> <span class="nb">()</span>
</span><span class='line'><span class="nf">readChan</span> <span class="ow">::</span> <span class="kt">Chan</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="kt">IO</span> <span class="n">a</span>
</span></code></pre></td></tr></table></div></figure>


<p>And that&rsquo;s actually all we need. Let&rsquo;s make some stuff working.</p>

<h1>Ok So lets get this party started :)</h1>

<p>I think most of the time it&rsquo;s better to explain stuff on examples.</p>

<h2>Just spawn!</h2>

<p>First thing we want is just to spawn!</p>

<figure class='code'><figcaption><span>just_spawn.hs</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='haskell'><span class='line'><span class="kr">import</span> <span class="nn">Control.Concurrent</span>
</span><span class='line'>
</span><span class='line'><span class="nf">main</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">forkIO</span> <span class="o">$</span> <span class="kr">do</span>
</span><span class='line'>    <span class="n">putStrLn</span> <span class="s">&quot;Yay! i&#39;m in thread!&quot;</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="s">&quot;I&#39;m important i&#39;m in Main thread!&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is a very simple way to spawn a light weight thread via forkIO :>. As you can see it is a normal action so you can go dirty!</p>

<p>forkIO takes actions and give you back IO ThreadId so you can keep track / kill threads you don&rsquo;t like</p>

<h2>Just Spawn</h2>

<p>Previous example was a bit cheating as it showed nothing really important so lets make some crazy threads printing stuff now.</p>

<figure class='code'><figcaption><span>crazygals.hs</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='haskell'><span class='line'><span class="kr">import</span> <span class="nn">Control.Concurrent</span>
</span><span class='line'>
</span><span class='line'><span class="nf">fanOfGarbage</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="s">&quot;Garbage is best bad evar!&quot;</span>
</span><span class='line'>  <span class="n">fanOfGarbage</span>
</span><span class='line'>
</span><span class='line'><span class="nf">fanOfClassicMusic</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="s">&quot;Dude Garbage is garbage&quot;</span>
</span><span class='line'>  <span class="n">fanOfClassicMusic</span>
</span><span class='line'>
</span><span class='line'><span class="nf">main</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="s">&quot;hit it guys!&quot;</span>
</span><span class='line'>  <span class="n">forkIO</span> <span class="n">fanOfGarbage</span>
</span><span class='line'>  <span class="n">forkIO</span> <span class="n">fanOfClassicMusic</span>
</span></code></pre></td></tr></table></div></figure>


<p>Well compiling and running this gives you only &ldquo;hit it guys&rdquo; as main thread exits and child threads dies! lets fix it so we can say when they need to stop!:></p>

<figure class='code'><figcaption><span>crazygals2.hs</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='haskell'><span class='line'><span class="kr">import</span> <span class="nn">Control.Concurrent</span>
</span><span class='line'>
</span><span class='line'><span class="nf">fanOfGarbage</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="s">&quot;Garbage is best bad evar!&quot;</span>
</span><span class='line'>  <span class="n">fanOfGarbage</span>
</span><span class='line'>
</span><span class='line'><span class="nf">fanOfClassicMusic</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="s">&quot;Dude Garbage is garbage&quot;</span>
</span><span class='line'>  <span class="n">fanOfClassicMusic</span>
</span><span class='line'>
</span><span class='line'><span class="nf">main</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="s">&quot;hit it guys!&quot;</span>
</span><span class='line'>  <span class="n">forkIO</span> <span class="n">fanOfGarbage</span>
</span><span class='line'>  <span class="n">forkIO</span> <span class="n">fanOfClassicMusic</span>
</span><span class='line'>  <span class="n">getLine</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="s">&quot;Thank You Sir for stopping them!&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>After launching it you can see how each thread is spamming its prints ;> So it work until you will hit enter. Cool so we have something working.</p>

<p>How does it work ? first of all we use forkIO to spawn threads and this time we have each &ldquo;thread&rdquo; function in separation.
Each of them run forever like crazy music fans :). In this place we can make it simple by using <code>forever</code> from <code>Control.Monad</code> to make it simpler.</p>

<figure class='code'><figcaption><span>crazygals3.hs</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='haskell'><span class='line'><span class="kr">import</span> <span class="nn">Control.Concurrent</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">Control.Monad</span> <span class="p">(</span><span class="nf">forever</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="nf">fanOfGarbage</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">forever</span> <span class="o">$</span> <span class="kr">do</span>
</span><span class='line'>    <span class="n">putStrLn</span> <span class="s">&quot;Garbage is best bad evar!&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="nf">fanOfClassicMusic</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">forever</span> <span class="o">$</span> <span class="kr">do</span>
</span><span class='line'>    <span class="n">putStrLn</span> <span class="s">&quot;Dude Garbage is garbage&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="nf">main</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="s">&quot;hit it guys!&quot;</span>
</span><span class='line'>  <span class="n">forkIO</span> <span class="n">fanOfGarbage</span>
</span><span class='line'>  <span class="n">forkIO</span> <span class="n">fanOfClassicMusic</span>
</span><span class='line'>  <span class="n">getLine</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="s">&quot;Thank You Sir for stopping them!&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>forever</code> is part of <code>Control.Monad</code> as name says it is doing action forever ;) useful for stuff like workers or stuff that has to happen all the time it type is <code>forever :: Monad m =&gt; m a -&gt; m b</code>.</p>

<h2>Something useful, add channels</h2>

<p>Cool so now we have some basics how to spawn a thread using forkIO but to have something that we actually can use in real life we need to have some sort of communication. I wanna present something i feel would be useful in almost every haskell program. Channel combined with forkIO.</p>

<p>If you programmed ever in <code>Erlang</code> or <code>Go</code> you will know what i&rsquo;m talking about, channels are very similar to message passing. Basically it is a pipe that you can write to or read from in different threads/processes. This is one of the mechanism we can use to get data out of other threads. Because they are not sequential we can&rsquo;t predict normal vals  or time when they will be ready. One of the ways of getting response from threads are channels.</p>

<p>Channels are amazing because they are flexible :) And very natural. Basic principle is simple you write in one thread to the channel and read in other :)</p>

<p>But lets make an example that will show how powerful it is.</p>

<figure class='code'><figcaption><span>chanz.hs</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='haskell'><span class='line'><span class="kr">import</span> <span class="nn">Control.Concurrent</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">Control.Monad</span> <span class="p">(</span><span class="nf">forever</span><span class="p">)</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">Control.Concurrent.Chan</span>
</span><span class='line'>
</span><span class='line'><span class="nf">gossipGirl</span> <span class="n">chan</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">forever</span> <span class="o">$</span> <span class="kr">do</span>
</span><span class='line'>    <span class="n">gossip</span> <span class="ow">&lt;-</span> <span class="n">readChan</span> <span class="n">chan</span>
</span><span class='line'>    <span class="n">putStrLn</span> <span class="n">gossip</span>
</span><span class='line'>
</span><span class='line'><span class="nf">main</span> <span class="ow">::</span> <span class="kt">IO</span> <span class="nb">()</span>
</span><span class='line'><span class="nf">main</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="s">&quot;Lets do some gossips&quot;</span>
</span><span class='line'>  <span class="n">gossipChan</span> <span class="ow">&lt;-</span> <span class="n">newChan</span> <span class="c1">-- lets make new chan</span>
</span><span class='line'>  <span class="n">forkIO</span> <span class="o">$</span> <span class="n">gossipGirl</span> <span class="n">gossipChan</span> <span class="c1">-- spawn gossipGirl</span>
</span><span class='line'>  <span class="n">writeChan</span> <span class="n">gossipChan</span> <span class="s">&quot;Garbage is garbage!&quot;</span>
</span><span class='line'>  <span class="n">writeChan</span> <span class="n">gossipChan</span> <span class="s">&quot;Garbage is garbage for reals!&quot;</span>
</span><span class='line'>  <span class="n">getLine</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="s">&quot;Thank You Sir for Info&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Nice! What happens here :)  So new things are <code>newChan</code> that create channel which we will use to talk to our gossipGirl. <code>readChan</code> reads data from channel and <code>writeChan</code> writes stuff to channel. This is very simple :) So now lets generalize our worker into something that we can use in next mini tutorials. A worker.</p>

<h2>A Worker</h2>

<p>simple worker will take 1 channel as parameter and spawn thread this will help us in understanding how this whole thing works. (ofc if we don&rsquo;t got it by now :) )</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='haskell'><span class='line'><span class="kr">import</span> <span class="nn">Control.Concurrent</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">Control.Monad</span> <span class="p">(</span><span class="nf">forever</span><span class="p">)</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">Control.Concurrent.Chan</span>
</span><span class='line'>
</span><span class='line'><span class="nf">worker</span> <span class="n">chan</span> <span class="n">foo</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">forkIO</span> <span class="o">$</span> <span class="n">forever</span> <span class="o">$</span> <span class="n">foo</span> <span class="n">chan</span>
</span><span class='line'>
</span><span class='line'><span class="nf">worker2</span> <span class="n">action</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">forkIO</span> <span class="o">$</span> <span class="n">forever</span> <span class="n">action</span>
</span><span class='line'>
</span><span class='line'><span class="nf">gossipGirl</span> <span class="n">chan</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>    <span class="n">gossip</span> <span class="ow">&lt;-</span> <span class="n">readChan</span> <span class="n">chan</span>
</span><span class='line'>    <span class="n">putStrLn</span> <span class="n">gossip</span>
</span><span class='line'>
</span><span class='line'><span class="nf">main</span> <span class="ow">::</span> <span class="kt">IO</span> <span class="nb">()</span>
</span><span class='line'><span class="nf">main</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="s">&quot;Lets do some gossips&quot;</span>
</span><span class='line'>  <span class="n">gossipChan</span> <span class="ow">&lt;-</span> <span class="n">newChan</span> <span class="c1">-- lets make new chan</span>
</span><span class='line'>  <span class="n">gossipChan2</span> <span class="ow">&lt;-</span> <span class="n">newChan</span> <span class="c1">-- lets make new chan</span>
</span><span class='line'>  <span class="n">worker</span> <span class="n">gossipChan</span> <span class="n">gossipGirl</span> <span class="c1">-- spawn gossipGirl</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">writeChan</span> <span class="n">gossipChan</span> <span class="s">&quot;Garbage is garbage!&quot;</span>
</span><span class='line'>  <span class="n">writeChan</span> <span class="n">gossipChan</span> <span class="s">&quot;Garbage is garbage for reals!&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">worker2</span> <span class="p">(</span><span class="n">gossipGirl</span> <span class="n">gossipChan2</span><span class="p">)</span> <span class="c1">-- woker2 2 girl!</span>
</span><span class='line'>  <span class="n">writeChan</span> <span class="n">gossipChan2</span> <span class="s">&quot;Umkay&quot;</span>
</span><span class='line'>  <span class="n">writeChan</span> <span class="n">gossipChan2</span> <span class="s">&quot;Yez!&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">getLine</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="s">&quot;Thank You Sir for Info&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Yes you can build workers as you want. I would not spend time on trying to build uber generic worker as it is usually custom and you don&rsquo;t need to spend much time to make one :). Usually you can have worker types for particular tasks eg. databasesWriter, logWriters, counters etc.</p>

<p>Now why would you all this forkIO stuff ? here is there reason. Cat simulation!</p>

<figure class='code'><figcaption><span>cat.hs</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='haskell'><span class='line'><span class="kr">import</span> <span class="nn">Control.Concurrent</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">Control.Monad</span> <span class="p">(</span><span class="nf">forever</span><span class="p">)</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">Control.Concurrent.Chan</span>
</span><span class='line'>
</span><span class='line'><span class="kr">data</span> <span class="kt">AskForMeow</span> <span class="ow">=</span> <span class="kt">GibFood</span> <span class="o">|</span> <span class="kt">Smile</span>
</span><span class='line'>
</span><span class='line'><span class="nf">meowMe</span> <span class="n">chan</span> <span class="n">chanBack</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">niceTry</span> <span class="ow">&lt;-</span> <span class="n">readChan</span> <span class="n">chan</span>
</span><span class='line'>  <span class="kr">case</span> <span class="n">niceTry</span> <span class="kr">of</span>
</span><span class='line'>    <span class="kt">GibFood</span> <span class="ow">-&gt;</span> <span class="n">writeChan</span> <span class="n">chanBack</span> <span class="s">&quot;Meow&quot;</span>
</span><span class='line'>    <span class="kt">Smile</span>   <span class="ow">-&gt;</span> <span class="n">writeChan</span> <span class="n">chanBack</span> <span class="s">&quot;No&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="nf">cat</span> <span class="n">action</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">forkIO</span> <span class="o">$</span> <span class="n">forever</span> <span class="n">action</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nf">main</span> <span class="ow">::</span> <span class="kt">IO</span> <span class="nb">()</span>
</span><span class='line'><span class="nf">main</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="s">&quot;Hey kitty kitty&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">foodInputChan</span> <span class="ow">&lt;-</span> <span class="n">newChan</span>
</span><span class='line'>  <span class="n">catOutputChan</span> <span class="ow">&lt;-</span> <span class="n">newChan</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">cat</span> <span class="o">$</span> <span class="n">meowMe</span> <span class="n">foodInputChan</span> <span class="n">catOutputChan</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">writeChan</span> <span class="n">foodInputChan</span> <span class="kt">Smile</span>
</span><span class='line'>  <span class="n">response</span> <span class="ow">&lt;-</span> <span class="n">readChan</span> <span class="n">catOutputChan</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="n">response</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">writeChan</span> <span class="n">foodInputChan</span> <span class="kt">GibFood</span>
</span><span class='line'>  <span class="n">response&#39;</span> <span class="ow">&lt;-</span> <span class="n">readChan</span> <span class="n">catOutputChan</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="n">response&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">getLine</span>
</span><span class='line'>  <span class="n">return</span> <span class="nb">()</span>
</span></code></pre></td></tr></table></div></figure>


<h1>Summary</h1>

<p>I hope this gives a little insight into <code>forkIO</code> and <code>channels</code> functions as You should use them in your code. It is super simple to add them, they work miracles and i love them. Yes you don&rsquo;t need to be expert on Kleisli arrows to use them ;).</p>

<p>Cheers!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Erlang E17 and Second Edition of Programming Erlang]]></title>
    <link href="http://no-fucking-idea.com/blog/2013/10/21/erlang-e17-and-second-edition-of-programming-erlang/"/>
    <updated>2013-10-21T20:09:00+01:00</updated>
    <id>http://no-fucking-idea.com/blog/2013/10/21/erlang-e17-and-second-edition-of-programming-erlang</id>
    <content type="html"><![CDATA[<p>Today I got my hands on <a href="http://pragprog.com/book/jaerlang2/programming-erlang">Programming Erlang 2ed</a>. And i have to make a spoiler now. The book is great. I remember the times when i was reading &ldquo;Programing Erlang&rdquo; and it was a great book. I enjoyed it and it made me get into erlang I was a really happy person.</p>

<p>This book is talking about R17. From what i read R17 should be named Erlang 2.0 the changes are just amazing.</p>

<p>My face after reading changes&hellip;</p>

<p><img src="http://i.imgur.com/fbC4hQ7.png" alt="Vomiting Rainbow" /></p>

<h1>Page 75 Maps</h1>

<p>This chapter hits you in the face! I don&rsquo;t have yet E17 to check more stuff but this looks amazing. Ok lets have a look. In Erlang E17 they are introducing MAPS. Also known as key-val&rsquo;s / hashes / assoccs / dictionary. Basically a data structure that lets you store a value with a key and retrieve the value if you know the right key.</p>

<p>Lets have a look at the syntax.</p>

<figure class='code'><figcaption><span>maps</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='erlang'><span class='line'><span class="err">λ</span>  <span class="nv">Kv</span> <span class="o">=</span> <span class="err">#</span><span class="p">{</span><span class="n">a</span> <span class="o">=&gt;</span> <span class="mi">1</span><span class="p">,</span> <span class="n">b</span> <span class="o">=&gt;</span> <span class="mi">2</span><span class="p">,</span> <span class="n">c</span> <span class="o">=&gt;</span> <span class="mi">3</span><span class="p">}.</span>
</span></code></pre></td></tr></table></div></figure>


<p>This creates a map with 3 elements a,b and c. Easy. Of course maps are immutable data structures so if you want to add stuff you need to do it like this</p>

<figure class='code'><figcaption><span>maps2</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='erlang'><span class='line'><span class="err">λ</span>  <span class="nv">Kv2</span> <span class="o">=</span> <span class="nv">Kv</span><span class="err">#</span><span class="p">{</span><span class="n">d</span> <span class="o">=&gt;</span> <span class="mi">4</span><span class="p">}.</span>
</span></code></pre></td></tr></table></div></figure>


<p>So it is similar to updating records but imho the true power is in retrieving data and pattern matching on maps. YES PATTERN MATCHING.</p>

<figure class='code'><figcaption><span>maps3</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='erlang'><span class='line'><span class="err">λ</span>  <span class="err">#</span><span class="p">{</span><span class="n">b</span> <span class="o">=&gt;</span> <span class="nv">B</span><span class="p">,</span> <span class="n">c</span> <span class="o">=&gt;</span> <span class="nv">C</span><span class="p">}</span> <span class="o">=</span> <span class="nv">Kv2</span><span class="p">.</span>
</span><span class='line'><span class="err">λ</span>  <span class="nv">B</span><span class="p">.</span>
</span><span class='line'><span class="err">λ</span><span class="o">&gt;</span> <span class="mi">2</span>
</span></code></pre></td></tr></table></div></figure>


<p>Isn&rsquo;t this amazing!? You can use maps like in ruby and pattern match on them. And i was just about to scream from joy when&hellip;</p>

<p>i saw this.</p>

<h2>Maps &ndash;>  Json</h2>

<p>Yes you can serialize and deserialize maps to json. WTF ?! Yes.</p>

<figure class='code'><figcaption><span>maps4</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='erlang'><span class='line'><span class="err">λ</span> <span class="nn">maps</span><span class="p">:</span><span class="n">to_json</span><span class="p">(</span><span class="nv">Map</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nv">Bin</span>
</span></code></pre></td></tr></table></div></figure>


<p>Calling maps:to_json you can make from map a json and by calling</p>

<figure class='code'><figcaption><span>maps5</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='erlang'><span class='line'><span class="err">λ</span> <span class="nn">maps</span><span class="p">:</span><span class="n">from_json</span><span class="p">(</span><span class="nv">Bin</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nv">Map</span>
</span><span class='line'><span class="err">λ</span> <span class="nn">maps</span><span class="p">:</span><span class="n">save_from_json</span><span class="p">(</span><span class="nv">Bin</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nv">Map</span>
</span></code></pre></td></tr></table></div></figure>


<p>Gives you option to load maps from binaries! C&#8217;mon! this is amazing. Safe version will explode if you try to flood VM with not existing atoms. This is useful! because atoms are never GC&#8217;ed!</p>

<p>Yes new MAPs are amazing! I love them :> This sloves so many problems and resolved so many situations when you had to write boilerplate code. Amazing work!</p>

<h1>Page 287 Programing with Websockets and Erlang</h1>

<p>Is also new thing i love this chapter as it shows you how to tackle real thing which is websockets :) it is very cool addition to the book and also a free sample so you can read it on your own before buying book.</p>

<p><a href="http://media.pragprog.com/titles/jaerlang2/websockets.pdf">http://media.pragprog.com/titles/jaerlang2/websockets.pdf</a></p>

<h1>Addition of Dializer and Rebar</h1>

<p>This is great from empiric point of view as Joe shows how to use rebar and build real life code using github. This is a great thing and worth reading. I love it :) You get real life example&hellip; i get here everything i lacked in previous book.</p>

<h1>Summary</h1>

<p>Every single new thing in the book is great. Stuff about E17 version of Erlang is just great. I don&rsquo;t have E17 yet on my box but this will be by far best release of Erlang.  In chapter about maps he talks about looking at ruby. I think it is a bit inspired by ruby builtin syntax for hashes by yet again. This is amazing and in future this will resolve so many problems and make many API&rsquo;s much more useful. You don&rsquo;t have to type anymore ton of _ if you want to pattern match on big tuple. You can match on a key.</p>

<p>I spend an hour reading the book on the train from London to Epsom and all I can say. It is great!. I love it and i love new changes!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Redis SETEX to the Rescue]]></title>
    <link href="http://no-fucking-idea.com/blog/2013/07/02/redis-setex-to-the-rescue/"/>
    <updated>2013-07-02T23:33:00+01:00</updated>
    <id>http://no-fucking-idea.com/blog/2013/07/02/redis-setex-to-the-rescue</id>
    <content type="html"><![CDATA[<p>This is next mini entry about small thing that makes me happy in terms of changes in redis. Nothing new :D but still nice :D.</p>

<h1>SET, EXPIRE, CHECK, ???, REPEAT</h1>

<p>While using redis there is very common task we do. It is <code>SET</code> followed by <code>EXPIRE</code>. We do this when we want to cache for some period of time some data.</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='bash'><span class='line'>SET <span class="s2">&quot;user:1:token&quot;</span> <span class="s2">&quot;kuba&quot;</span>
</span><span class='line'>EXPIRE <span class="s2">&quot;user:1:token&quot;</span> 5
</span></code></pre></td></tr></table></div></figure>


<p>This will set key <code>user:1:token</code> to value <code>"kuba"</code> and next set it to expire in 5 seconds. We can check Time to live on this key by using ttl command.</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='bash'><span class='line'>TTL <span class="s2">&quot;user:1:token&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>this will return number of seconds that this key will be valid for or an negative number if its not valid anymore.</p>

<h1>SETEX</h1>

<p>SETEX Introduced in redis 2.0.0 command, lets you do both things SET and EXPIRE in one go. How do we use it ? Its simple!</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='bash'><span class='line'>SETEX &lt;key&gt; &lt;seconds&gt; &lt;value&gt;
</span></code></pre></td></tr></table></div></figure>


<p>It is not key, value seconds! :D:D example usage:</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='bash'><span class='line'>SETEX <span class="s2">&quot;key:to:home&quot;</span> 1500 <span class="s2">&quot;4b234ferg34ret34rasd32rs&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This will set for 1500 seconds key &ldquo;key:to:home&rdquo; to value &ldquo;4b234ferg34ret34rasd32rs&rdquo;. Pretty easy thing to do.</p>

<h2>PSETEX</h2>

<p>Since Redis 2.6.0 we can use new command it is PSETEX <key> <milliseconds> <value> this is same as SETEX except it takes miliseconds not seconds so you can be more accurate in low latency / time situations</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='bash'><span class='line'>PSETEX <span class="s2">&quot;key:to:home&quot;</span> 15000 <span class="s2">&quot;4b234ferg34ret34rasd32rs&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Will set &ldquo;key:to:home&rdquo; to expire in 15 seconds, its important to notice that TTL will give you back amount of time units! so if you did PSETEX it will me miliseconds and if it is SETEX it is in seconds!.</p>

<p>Cheers!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How to Use Twitter for Something Else Than Pics of Cats]]></title>
    <link href="http://no-fucking-idea.com/blog/2013/06/09/how-to-use-twitter-for-something-else-than-pics-of-cats/"/>
    <updated>2013-06-09T23:30:00+01:00</updated>
    <id>http://no-fucking-idea.com/blog/2013/06/09/how-to-use-twitter-for-something-else-than-pics-of-cats</id>
    <content type="html"><![CDATA[<p>So it was long since last post and i have in pipeline many posts on ODM&rsquo;s, Genetic Algorithms, Streaming Algorithms Clojure and Haskell i was working on but nothing is finished ;/. Need time!</p>

<h1>I&rsquo;m using twitter</h1>

<p>And most of the time it is just updates from friends, sometimes some news from hacker world that potentially could be interesting. I use twitter in a bit odd way first of all i post link to things i read during commute to work :) and i use twitter to post alters from my apps to me.</p>

<h1>Why twitter ?</h1>

<p>I think twitter is great because he is posting things to my phone also, so instead of building this really complex infrastructure i can use twitter to do everything.</p>

<h1>How ?</h1>

<p>This is simple i add to every app i make a bit of code to handle twitter. eg. method like this in ruby</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">def</span> <span class="nf">alert_notify!</span>
</span><span class='line'>  <span class="k">if</span> <span class="vi">@config</span><span class="o">[</span><span class="ss">:notification_list</span><span class="o">]</span>
</span><span class='line'>    <span class="n">notifier</span> <span class="o">=</span> <span class="no">Twitter</span><span class="o">::</span><span class="no">Client</span><span class="o">.</span><span class="n">new</span><span class="p">(</span>
</span><span class='line'>      <span class="ss">:oauth_token</span> <span class="o">=&gt;</span> <span class="vi">@config</span><span class="o">[</span><span class="ss">:&quot;oauth_token&quot;</span><span class="o">]</span><span class="p">,</span>
</span><span class='line'>      <span class="ss">:oauth_token_secret</span> <span class="o">=&gt;</span> <span class="vi">@config</span><span class="o">[</span><span class="ss">:&quot;oauth_token_secret&quot;</span><span class="o">]</span>
</span><span class='line'>    <span class="p">)</span>
</span><span class='line'>    <span class="vi">@config</span><span class="o">[</span><span class="ss">:notification_list</span><span class="o">].</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">entry</span><span class="o">|</span>
</span><span class='line'>      <span class="n">notifier</span><span class="o">.</span><span class="n">direct_message_create</span><span class="p">(</span><span class="n">entry</span><span class="p">,</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="no">Time</span><span class="o">.</span><span class="n">now</span><span class="si">}</span><span class="s2">: I crushed! please go to logs and see what happpened!&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></code></pre></td></tr></table></div></figure>


<p>This is part of TwitterDriver/Agent class. And i wrap everything into exception handler when i get exception i log it and send notification to me via twitter direct message.</p>

<p>I love this way of using twitter because a year ago i thought it is only for sharing very random not useful messages about cats and sharing instagram pictures.</p>

<p>Try it yourself!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA['If' the Real Game Changer]]></title>
    <link href="http://no-fucking-idea.com/blog/2013/02/21/if-the-real-game-changer/"/>
    <updated>2013-02-21T21:35:00+00:00</updated>
    <id>http://no-fucking-idea.com/blog/2013/02/21/if-the-real-game-changer</id>
    <content type="html"><![CDATA[<p>Recently i was working on a project that is processing campaigns. I asked my self if I can improve it a bit, but not by refactoring existing code but by trying to approach it from a different angle.</p>

<h1>Observations</h1>

<p>I started making mind notes of things that i understand about system i&rsquo;m working with. I never had time to think about grammar of this and really get into it. The system has many parts but i thought it can be reproduced in for of language that is easy to parse and nice to work with. I think i might change my current solution into more LISP looking thing just to make it easier to parse.</p>

<h2>Observation 1</h2>

<p>Each campaign is a sequence of actions that happens one after another. So my initial thought was &ldquo;this is simple&rdquo;. We can represent it by list of actions 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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'> <span class="o">[</span>step<span class="o">]</span> -&gt; <span class="o">[</span>step<span class="o">]</span> -&gt; <span class="o">[</span>step<span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>But this is true only for simple campaigns and most of them are NOT like this :(</p>

<h2>Observation 2</h2>

<p>Most of the campaigns are built around key thing. This thing is making decisions! So if i can incorporate &ldquo;if&rdquo; i WIN !
Lets have a look</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>                     /&gt; <span class="o">[</span>step<span class="o">]</span>
</span><span class='line'>                   <span class="o">(</span>No<span class="o">)</span>
</span><span class='line'>                    |
</span><span class='line'>  <span class="o">[</span>step<span class="o">]</span> -&gt; <span class="o">[</span><span class="k">if </span>a &lt; 5<span class="o">]</span> - <span class="o">(</span> yes <span class="o">)</span> -&gt; <span class="o">[</span>step<span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Yes! This was it, i think this is solution to all problems, ability to represent campaign as a sequence of steps mixed with if statements essentially abstract syntax tree of campaign.</p>

<h2>Observation 3</h2>

<p>It is not a tree&hellip;its more a graph. But AST will make it :] it is a programming language! So this was in my head and i did not had time to work on it&hellip; but today i decided to give a try and I made first impression of AST that we would need to have to make it work.</p>

<h1>AST</h1>

<p>I wrote simple grammar and made a parser of a very simple &ldquo;ify&rdquo; language. My language starts like this&hellip;</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>-- Grammar
</span><span class='line'>-- x is variable
</span><span class='line'>-- a is artmetic thing aka number
</span><span class='line'>-- n is actual number eg. 1
</span><span class='line'>-- b is boolean
</span><span class='line'>-- opa is arthmetic operator
</span><span class='line'>-- opb is boolean operator
</span><span class='line'>-- opr is comparison operator
</span><span class='line'>-- S is statement
</span><span class='line'>--  a   ::<span class="o">=</span> x | n | - a | a opa a
</span><span class='line'>--  b   ::<span class="o">=</span> <span class="nb">true</span> | <span class="nb">false</span> | not b | b opb b | a opr a
</span><span class='line'>--  opa ::<span class="o">=</span> + | - | * | /
</span><span class='line'>--  opb ::<span class="o">=</span> and | or
</span><span class='line'>--  opr ::<span class="o">=</span> &gt; | &lt;
</span><span class='line'>--  S   ::<span class="o">=</span> x | x &lt;- a | S1; S2 | <span class="o">(</span> S <span class="o">)</span> | <span class="k">if </span>b <span class="k">then </span>S1 <span class="k">else </span>S2
</span></code></pre></td></tr></table></div></figure>


<p>This shows that the grammar is very simple, we can have assigments, operators to test and compare and ofc IF statement ;) this is our key to divnity!</p>

<p>Parser looks kinda ugly because i used parts of the code i wrote before and had i in different projects.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<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>
<span class='line-number'>146</span>
<span class='line-number'>147</span>
<span class='line-number'>148</span>
<span class='line-number'>149</span>
<span class='line-number'>150</span>
<span class='line-number'>151</span>
<span class='line-number'>152</span>
<span class='line-number'>153</span>
<span class='line-number'>154</span>
<span class='line-number'>155</span>
<span class='line-number'>156</span>
<span class='line-number'>157</span>
<span class='line-number'>158</span>
<span class='line-number'>159</span>
<span class='line-number'>160</span>
<span class='line-number'>161</span>
<span class='line-number'>162</span>
<span class='line-number'>163</span>
<span class='line-number'>164</span>
<span class='line-number'>165</span>
<span class='line-number'>166</span>
<span class='line-number'>167</span>
<span class='line-number'>168</span>
<span class='line-number'>169</span>
<span class='line-number'>170</span>
<span class='line-number'>171</span>
<span class='line-number'>172</span>
<span class='line-number'>173</span>
<span class='line-number'>174</span>
</pre></td><td class='code'><pre><code class='haskell'><span class='line'><span class="kr">import</span> <span class="nn">System.Environment</span><span class="p">(</span><span class="n">getArgs</span><span class="p">)</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">System.IO</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">Control.Monad</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">Text.ParserCombinators.Parsec</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">Text.ParserCombinators.Parsec.Expr</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">Text.ParserCombinators.Parsec.Language</span>
</span><span class='line'><span class="kr">import</span> <span class="k">qualified</span> <span class="nn">Text.ParserCombinators.Parsec.Token</span> <span class="k">as</span> <span class="n">Token</span>
</span><span class='line'>
</span><span class='line'><span class="c1">--  Grammar</span>
</span><span class='line'><span class="c1">-- x is variable</span>
</span><span class='line'><span class="c1">-- a is artmetic thing aka number</span>
</span><span class='line'><span class="c1">-- n is actual number eg. 1</span>
</span><span class='line'><span class="c1">-- b is boolean</span>
</span><span class='line'><span class="c1">-- opa is arthmetic operator</span>
</span><span class='line'><span class="c1">-- opb is boolean operator</span>
</span><span class='line'><span class="c1">-- opr is comparison operator</span>
</span><span class='line'><span class="c1">-- S is statement</span>
</span><span class='line'><span class="c1">--  a   ::= x | n | - a | a opa a</span>
</span><span class='line'><span class="c1">--  b   ::= true | false | not b | b opb b | a opr a</span>
</span><span class='line'><span class="c1">--  opa ::= + | - | * | /</span>
</span><span class='line'><span class="c1">--  opb ::= and | or</span>
</span><span class='line'><span class="c1">--  opr ::= &gt; | &lt;</span>
</span><span class='line'><span class="c1">--  S   ::= x | x &lt;- a | S1; S2 | ( S ) | if b then S1 else S2 </span>
</span><span class='line'>
</span><span class='line'><span class="kr">data</span> <span class="kt">AExpr</span> <span class="ow">=</span> <span class="kt">Var</span> <span class="kt">String</span>
</span><span class='line'>            <span class="o">|</span> <span class="kt">IntConst</span> <span class="kt">Integer</span>
</span><span class='line'>            <span class="o">|</span> <span class="kt">Neg</span> <span class="kt">AExpr</span>
</span><span class='line'>            <span class="o">|</span> <span class="kt">ABinary</span> <span class="kt">ABinOp</span> <span class="kt">AExpr</span> <span class="kt">AExpr</span>
</span><span class='line'>              <span class="kr">deriving</span> <span class="p">(</span><span class="kt">Show</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="kr">data</span> <span class="kt">BExpr</span> <span class="ow">=</span> <span class="kt">BoolConst</span> <span class="kt">Bool</span>
</span><span class='line'>            <span class="o">|</span> <span class="kt">Not</span> <span class="kt">BExpr</span>
</span><span class='line'>            <span class="o">|</span> <span class="kt">BBinary</span> <span class="kt">BBinOp</span> <span class="kt">BExpr</span> <span class="kt">BExpr</span>
</span><span class='line'>            <span class="o">|</span> <span class="kt">RBinary</span> <span class="kt">RBinOp</span> <span class="kt">AExpr</span> <span class="kt">AExpr</span>
</span><span class='line'>             <span class="kr">deriving</span> <span class="p">(</span><span class="kt">Show</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="kr">data</span> <span class="kt">ABinOp</span> <span class="ow">=</span> <span class="kt">Add</span>
</span><span class='line'>            <span class="o">|</span> <span class="kt">Subtract</span>
</span><span class='line'>            <span class="o">|</span> <span class="kt">Multiply</span>
</span><span class='line'>            <span class="o">|</span> <span class="kt">Divide</span>
</span><span class='line'>              <span class="kr">deriving</span> <span class="p">(</span><span class="kt">Show</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="kr">data</span> <span class="kt">BBinOp</span> <span class="ow">=</span> <span class="kt">And</span> <span class="o">|</span> <span class="kt">Or</span> <span class="kr">deriving</span> <span class="p">(</span><span class="kt">Show</span><span class="p">)</span>
</span><span class='line'><span class="kr">data</span> <span class="kt">RBinOp</span> <span class="ow">=</span> <span class="kt">Greater</span> <span class="o">|</span> <span class="kt">Less</span> <span class="kr">deriving</span> <span class="p">(</span><span class="kt">Show</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="kr">data</span> <span class="kt">Stmt</span> <span class="ow">=</span> <span class="kt">Seq</span> <span class="p">[</span><span class="kt">Stmt</span><span class="p">]</span>
</span><span class='line'>           <span class="o">|</span> <span class="kt">Assign</span> <span class="kt">String</span> <span class="kt">AExpr</span>
</span><span class='line'>           <span class="o">|</span> <span class="kt">If</span> <span class="kt">BExpr</span> <span class="kt">Stmt</span> <span class="kt">Stmt</span>
</span><span class='line'>           <span class="o">|</span> <span class="kt">Ident</span> <span class="kt">String</span>
</span><span class='line'>             <span class="kr">deriving</span> <span class="p">(</span><span class="kt">Show</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="nf">languageDef</span> <span class="ow">=</span>
</span><span class='line'>   <span class="n">emptyDef</span> <span class="p">{</span> <span class="kt">Token</span><span class="o">.</span><span class="n">commentStart</span>    <span class="ow">=</span> <span class="s">&quot;/*&quot;</span>
</span><span class='line'>            <span class="p">,</span> <span class="kt">Token</span><span class="o">.</span><span class="n">commentEnd</span>      <span class="ow">=</span> <span class="s">&quot;*/&quot;</span>
</span><span class='line'>            <span class="p">,</span> <span class="kt">Token</span><span class="o">.</span><span class="n">commentLine</span>     <span class="ow">=</span> <span class="s">&quot;#&quot;</span>
</span><span class='line'>            <span class="p">,</span> <span class="kt">Token</span><span class="o">.</span><span class="n">identStart</span>      <span class="ow">=</span> <span class="n">letter</span>
</span><span class='line'>            <span class="p">,</span> <span class="kt">Token</span><span class="o">.</span><span class="n">identLetter</span>     <span class="ow">=</span> <span class="n">alphaNum</span>
</span><span class='line'>            <span class="p">,</span> <span class="kt">Token</span><span class="o">.</span><span class="n">reservedNames</span>   <span class="ow">=</span> <span class="p">[</span> <span class="s">&quot;if&quot;</span>
</span><span class='line'>                                      <span class="p">,</span> <span class="s">&quot;then&quot;</span>
</span><span class='line'>                                      <span class="p">,</span> <span class="s">&quot;else&quot;</span>
</span><span class='line'>                                      <span class="p">,</span> <span class="s">&quot;true&quot;</span>
</span><span class='line'>                                      <span class="p">,</span> <span class="s">&quot;false&quot;</span>
</span><span class='line'>                                      <span class="p">,</span> <span class="s">&quot;not&quot;</span>
</span><span class='line'>                                      <span class="p">,</span> <span class="s">&quot;and&quot;</span>
</span><span class='line'>                                      <span class="p">,</span> <span class="s">&quot;or&quot;</span>
</span><span class='line'>                                      <span class="p">]</span>
</span><span class='line'>            <span class="p">,</span> <span class="kt">Token</span><span class="o">.</span><span class="n">reservedOpNames</span> <span class="ow">=</span> <span class="p">[</span><span class="s">&quot;+&quot;</span><span class="p">,</span> <span class="s">&quot;-&quot;</span><span class="p">,</span> <span class="s">&quot;*&quot;</span><span class="p">,</span> <span class="s">&quot;/&quot;</span><span class="p">,</span> <span class="s">&quot;&lt;-&quot;</span>
</span><span class='line'>                                      <span class="p">,</span> <span class="s">&quot;&lt;&quot;</span><span class="p">,</span> <span class="s">&quot;&gt;&quot;</span><span class="p">,</span> <span class="s">&quot;and&quot;</span><span class="p">,</span> <span class="s">&quot;or&quot;</span><span class="p">,</span> <span class="s">&quot;not&quot;</span>
</span><span class='line'>                                      <span class="p">]</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nf">lexer</span> <span class="ow">=</span> <span class="kt">Token</span><span class="o">.</span><span class="n">makeTokenParser</span> <span class="n">languageDef</span>
</span><span class='line'>
</span><span class='line'><span class="nf">identifier</span> <span class="ow">=</span> <span class="kt">Token</span><span class="o">.</span><span class="n">identifier</span> <span class="n">lexer</span> <span class="c1">-- parses an identifier</span>
</span><span class='line'><span class="nf">reserved</span>   <span class="ow">=</span> <span class="kt">Token</span><span class="o">.</span><span class="n">reserved</span>   <span class="n">lexer</span> <span class="c1">-- parses a reserved name</span>
</span><span class='line'><span class="nf">reservedOp</span> <span class="ow">=</span> <span class="kt">Token</span><span class="o">.</span><span class="n">reservedOp</span> <span class="n">lexer</span> <span class="c1">-- parses an operator</span>
</span><span class='line'><span class="nf">parens</span>     <span class="ow">=</span> <span class="kt">Token</span><span class="o">.</span><span class="n">parens</span>     <span class="n">lexer</span> <span class="c1">-- parses surrounding parenthesis:</span>
</span><span class='line'><span class="nf">integer</span>    <span class="ow">=</span> <span class="kt">Token</span><span class="o">.</span><span class="n">integer</span>    <span class="n">lexer</span> <span class="c1">-- parses an integer</span>
</span><span class='line'><span class="nf">semi</span>       <span class="ow">=</span> <span class="kt">Token</span><span class="o">.</span><span class="n">semi</span>       <span class="n">lexer</span> <span class="c1">-- parses a semicolon</span>
</span><span class='line'><span class="nf">whiteSpace</span> <span class="ow">=</span> <span class="kt">Token</span><span class="o">.</span><span class="n">whiteSpace</span> <span class="n">lexer</span> <span class="c1">-- parses whitespace</span>
</span><span class='line'>
</span><span class='line'><span class="nf">whileParser</span> <span class="ow">::</span> <span class="kt">Parser</span> <span class="kt">Stmt</span>
</span><span class='line'><span class="nf">whileParser</span> <span class="ow">=</span> <span class="n">whiteSpace</span> <span class="o">&gt;&gt;</span> <span class="n">statement</span>
</span><span class='line'>
</span><span class='line'><span class="nf">statement</span> <span class="ow">::</span> <span class="kt">Parser</span> <span class="kt">Stmt</span>
</span><span class='line'><span class="nf">statement</span> <span class="ow">=</span>   <span class="n">parens</span> <span class="n">statement</span>
</span><span class='line'>           <span class="o">&lt;|&gt;</span> <span class="n">sequenceOfStmt</span>
</span><span class='line'>
</span><span class='line'><span class="nf">sequenceOfStmt</span> <span class="ow">=</span>
</span><span class='line'>   <span class="kr">do</span> <span class="n">list</span> <span class="ow">&lt;-</span> <span class="p">(</span><span class="n">sepBy1</span> <span class="n">statement&#39;</span> <span class="n">semi</span><span class="p">)</span>
</span><span class='line'>      <span class="n">return</span> <span class="o">$</span> <span class="kr">if</span> <span class="n">length</span> <span class="n">list</span> <span class="o">==</span> <span class="mi">1</span> <span class="kr">then</span> <span class="n">head</span> <span class="n">list</span> <span class="kr">else</span> <span class="kt">Seq</span> <span class="n">list</span>
</span><span class='line'>
</span><span class='line'><span class="nf">statement&#39;</span> <span class="ow">::</span> <span class="kt">Parser</span> <span class="kt">Stmt</span>
</span><span class='line'><span class="nf">statement&#39;</span> <span class="ow">=</span>   <span class="n">ifStmt</span>
</span><span class='line'>            <span class="o">&lt;|&gt;</span> <span class="n">assignStmt</span>
</span><span class='line'>            <span class="o">&lt;|&gt;</span> <span class="n">identName</span>
</span><span class='line'>
</span><span class='line'><span class="nf">ifStmt</span> <span class="ow">::</span> <span class="kt">Parser</span> <span class="kt">Stmt</span>
</span><span class='line'><span class="nf">ifStmt</span> <span class="ow">=</span>
</span><span class='line'>   <span class="kr">do</span> <span class="n">reserved</span> <span class="s">&quot;if&quot;</span>
</span><span class='line'>      <span class="n">cond</span>  <span class="ow">&lt;-</span> <span class="n">bExpression</span>
</span><span class='line'>      <span class="n">reserved</span> <span class="s">&quot;then&quot;</span>
</span><span class='line'>      <span class="n">stmt1</span> <span class="ow">&lt;-</span> <span class="n">statement</span>
</span><span class='line'>      <span class="n">reserved</span> <span class="s">&quot;else&quot;</span>
</span><span class='line'>      <span class="n">stmt2</span> <span class="ow">&lt;-</span> <span class="n">statement</span>
</span><span class='line'>      <span class="n">return</span> <span class="o">$</span> <span class="kt">If</span> <span class="n">cond</span> <span class="n">stmt1</span> <span class="n">stmt2</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nf">identName</span> <span class="ow">::</span> <span class="kt">Parser</span> <span class="kt">Stmt</span>
</span><span class='line'><span class="nf">identName</span> <span class="ow">=</span>
</span><span class='line'>   <span class="kr">do</span>  <span class="n">varName</span> <span class="ow">&lt;-</span> <span class="n">identifier</span>
</span><span class='line'>       <span class="n">return</span> <span class="o">$</span> <span class="kt">Ident</span> <span class="n">varName</span>
</span><span class='line'>
</span><span class='line'><span class="nf">assignStmt</span> <span class="ow">::</span> <span class="kt">Parser</span> <span class="kt">Stmt</span>
</span><span class='line'><span class="nf">assignStmt</span> <span class="ow">=</span>
</span><span class='line'>   <span class="kr">do</span> <span class="n">var</span>  <span class="ow">&lt;-</span> <span class="n">identifier</span>
</span><span class='line'>      <span class="n">reservedOp</span> <span class="s">&quot;&lt;-&quot;</span>
</span><span class='line'>      <span class="n">expr</span> <span class="ow">&lt;-</span> <span class="n">aExpression</span>
</span><span class='line'>      <span class="n">return</span> <span class="o">$</span> <span class="kt">Assign</span> <span class="n">var</span> <span class="n">expr</span>
</span><span class='line'>
</span><span class='line'><span class="nf">aExpression</span> <span class="ow">::</span> <span class="kt">Parser</span> <span class="kt">AExpr</span>
</span><span class='line'><span class="nf">aExpression</span> <span class="ow">=</span> <span class="n">buildExpressionParser</span> <span class="n">aOperators</span> <span class="n">aTerm</span>
</span><span class='line'>
</span><span class='line'><span class="nf">bExpression</span> <span class="ow">::</span> <span class="kt">Parser</span> <span class="kt">BExpr</span>
</span><span class='line'><span class="nf">bExpression</span> <span class="ow">=</span> <span class="n">buildExpressionParser</span> <span class="n">bOperators</span> <span class="n">bTerm</span>
</span><span class='line'>
</span><span class='line'><span class="nf">aOperators</span> <span class="ow">=</span> <span class="p">[</span> <span class="p">[</span><span class="kt">Prefix</span> <span class="p">(</span><span class="n">reservedOp</span> <span class="s">&quot;-&quot;</span>   <span class="o">&gt;&gt;</span> <span class="n">return</span> <span class="p">(</span><span class="kt">Neg</span>             <span class="p">))</span>          <span class="p">]</span>
</span><span class='line'>              <span class="p">,</span> <span class="p">[</span><span class="kt">Infix</span>  <span class="p">(</span><span class="n">reservedOp</span> <span class="s">&quot;*&quot;</span>   <span class="o">&gt;&gt;</span> <span class="n">return</span> <span class="p">(</span><span class="kt">ABinary</span> <span class="kt">Multiply</span><span class="p">))</span> <span class="kt">AssocLeft</span><span class="p">]</span>
</span><span class='line'>              <span class="p">,</span> <span class="p">[</span><span class="kt">Infix</span>  <span class="p">(</span><span class="n">reservedOp</span> <span class="s">&quot;/&quot;</span>   <span class="o">&gt;&gt;</span> <span class="n">return</span> <span class="p">(</span><span class="kt">ABinary</span> <span class="kt">Divide</span>  <span class="p">))</span> <span class="kt">AssocLeft</span><span class="p">]</span>
</span><span class='line'>              <span class="p">,</span> <span class="p">[</span><span class="kt">Infix</span>  <span class="p">(</span><span class="n">reservedOp</span> <span class="s">&quot;+&quot;</span>   <span class="o">&gt;&gt;</span> <span class="n">return</span> <span class="p">(</span><span class="kt">ABinary</span> <span class="kt">Add</span>     <span class="p">))</span> <span class="kt">AssocLeft</span><span class="p">]</span>
</span><span class='line'>              <span class="p">,</span> <span class="p">[</span><span class="kt">Infix</span>  <span class="p">(</span><span class="n">reservedOp</span> <span class="s">&quot;-&quot;</span>   <span class="o">&gt;&gt;</span> <span class="n">return</span> <span class="p">(</span><span class="kt">ABinary</span> <span class="kt">Subtract</span><span class="p">))</span> <span class="kt">AssocLeft</span><span class="p">]</span>
</span><span class='line'>               <span class="p">]</span>
</span><span class='line'>
</span><span class='line'><span class="nf">bOperators</span> <span class="ow">=</span> <span class="p">[</span> <span class="p">[</span><span class="kt">Prefix</span> <span class="p">(</span><span class="n">reservedOp</span> <span class="s">&quot;not&quot;</span> <span class="o">&gt;&gt;</span> <span class="n">return</span> <span class="p">(</span><span class="kt">Not</span>             <span class="p">))</span>          <span class="p">]</span>
</span><span class='line'>              <span class="p">,</span> <span class="p">[</span><span class="kt">Infix</span>  <span class="p">(</span><span class="n">reservedOp</span> <span class="s">&quot;and&quot;</span> <span class="o">&gt;&gt;</span> <span class="n">return</span> <span class="p">(</span><span class="kt">BBinary</span> <span class="kt">And</span>     <span class="p">))</span> <span class="kt">AssocLeft</span><span class="p">]</span>
</span><span class='line'>              <span class="p">,</span> <span class="p">[</span><span class="kt">Infix</span>  <span class="p">(</span><span class="n">reservedOp</span> <span class="s">&quot;or&quot;</span>  <span class="o">&gt;&gt;</span> <span class="n">return</span> <span class="p">(</span><span class="kt">BBinary</span> <span class="kt">Or</span>      <span class="p">))</span> <span class="kt">AssocLeft</span><span class="p">]</span>
</span><span class='line'>              <span class="p">]</span>
</span><span class='line'>
</span><span class='line'><span class="nf">aTerm</span> <span class="ow">=</span>  <span class="n">parens</span> <span class="n">aExpression</span>
</span><span class='line'>      <span class="o">&lt;|&gt;</span> <span class="n">liftM</span> <span class="kt">Var</span> <span class="n">identifier</span>
</span><span class='line'>      <span class="o">&lt;|&gt;</span> <span class="n">liftM</span> <span class="kt">IntConst</span> <span class="n">integer</span>
</span><span class='line'>
</span><span class='line'><span class="nf">bTerm</span> <span class="ow">=</span>  <span class="n">parens</span> <span class="n">bExpression</span>
</span><span class='line'>      <span class="o">&lt;|&gt;</span> <span class="p">(</span><span class="n">reserved</span> <span class="s">&quot;true&quot;</span>  <span class="o">&gt;&gt;</span> <span class="n">return</span> <span class="p">(</span><span class="kt">BoolConst</span> <span class="kt">True</span> <span class="p">))</span>
</span><span class='line'>      <span class="o">&lt;|&gt;</span> <span class="p">(</span><span class="n">reserved</span> <span class="s">&quot;false&quot;</span> <span class="o">&gt;&gt;</span> <span class="n">return</span> <span class="p">(</span><span class="kt">BoolConst</span> <span class="kt">False</span><span class="p">))</span>
</span><span class='line'>      <span class="o">&lt;|&gt;</span> <span class="n">rExpression</span>
</span><span class='line'>
</span><span class='line'><span class="nf">rExpression</span> <span class="ow">=</span>
</span><span class='line'>   <span class="kr">do</span> <span class="n">a1</span> <span class="ow">&lt;-</span> <span class="n">aExpression</span>
</span><span class='line'>      <span class="n">op</span> <span class="ow">&lt;-</span> <span class="n">relation</span>
</span><span class='line'>      <span class="n">a2</span> <span class="ow">&lt;-</span> <span class="n">aExpression</span>
</span><span class='line'>      <span class="n">return</span> <span class="o">$</span> <span class="kt">RBinary</span> <span class="n">op</span> <span class="n">a1</span> <span class="n">a2</span>
</span><span class='line'>
</span><span class='line'><span class="nf">relation</span> <span class="ow">=</span>   <span class="p">(</span><span class="n">reservedOp</span> <span class="s">&quot;&gt;&quot;</span> <span class="o">&gt;&gt;</span> <span class="n">return</span> <span class="kt">Greater</span><span class="p">)</span>
</span><span class='line'>          <span class="o">&lt;|&gt;</span> <span class="p">(</span><span class="n">reservedOp</span> <span class="s">&quot;&lt;&quot;</span> <span class="o">&gt;&gt;</span> <span class="n">return</span> <span class="kt">Less</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nf">parseString</span> <span class="ow">::</span> <span class="kt">String</span> <span class="ow">-&gt;</span> <span class="kt">Stmt</span>
</span><span class='line'><span class="nf">parseString</span> <span class="n">str</span> <span class="ow">=</span>
</span><span class='line'>   <span class="kr">case</span> <span class="n">parse</span> <span class="n">whileParser</span> <span class="s">&quot;&quot;</span> <span class="n">str</span> <span class="kr">of</span>
</span><span class='line'>     <span class="kt">Left</span> <span class="n">e</span>  <span class="ow">-&gt;</span> <span class="ne">error</span> <span class="o">$</span> <span class="n">show</span> <span class="n">e</span>
</span><span class='line'>     <span class="kt">Right</span> <span class="n">r</span> <span class="ow">-&gt;</span> <span class="n">r</span>
</span><span class='line'>
</span><span class='line'><span class="nf">parseFile</span> <span class="ow">::</span> <span class="kt">String</span> <span class="ow">-&gt;</span> <span class="kt">IO</span> <span class="kt">Stmt</span>
</span><span class='line'><span class="nf">parseFile</span> <span class="n">file</span> <span class="ow">=</span>
</span><span class='line'>   <span class="kr">do</span> <span class="n">program</span>  <span class="ow">&lt;-</span> <span class="n">readFile</span> <span class="n">file</span>
</span><span class='line'>      <span class="kr">case</span> <span class="n">parse</span> <span class="n">whileParser</span> <span class="s">&quot;&quot;</span> <span class="n">program</span> <span class="kr">of</span>
</span><span class='line'>        <span class="kt">Left</span> <span class="n">e</span>  <span class="ow">-&gt;</span> <span class="n">print</span> <span class="n">e</span> <span class="o">&gt;&gt;</span> <span class="n">fail</span> <span class="s">&quot;parse error&quot;</span>
</span><span class='line'>        <span class="kt">Right</span> <span class="n">r</span> <span class="ow">-&gt;</span> <span class="n">return</span> <span class="n">r</span>
</span><span class='line'>
</span><span class='line'><span class="nf">main</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class='line'>  <span class="n">args</span> <span class="ow">&lt;-</span> <span class="n">getArgs</span>
</span><span class='line'>  <span class="n">ast</span> <span class="ow">&lt;-</span> <span class="n">parseFile</span><span class="p">(</span><span class="n">head</span> <span class="n">args</span><span class="p">)</span>
</span><span class='line'>  <span class="n">putStrLn</span> <span class="o">$</span> <span class="n">show</span> <span class="n">ast</span>
</span></code></pre></td></tr></table></div></figure>


<p>But it works&hellip; we can parse. Now i have to make it more production ready and less unstable ;]. This is first attempt at this idea.  I need to expand grammar and think about it more then just few minutes. but i think it is a good start. Next step for me is to make better grammar and parser and move to building interpreter of this mini language.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Recent Rails Security Problems and Building Software]]></title>
    <link href="http://no-fucking-idea.com/blog/2013/02/12/recent-rails-security-problems-and-building-software/"/>
    <updated>2013-02-12T21:33:00+00:00</updated>
    <id>http://no-fucking-idea.com/blog/2013/02/12/recent-rails-security-problems-and-building-software</id>
    <content type="html"><![CDATA[<p>Recently we have a very very exploit rich winter. By now most of people connects everything to YAML and in general deserializing stuff. But I will not write about this in detail because for me the problem is deeper.</p>

<h1>Startup era</h1>

<p>We live now in startup era and main focus of people building new products is to make them fast. Who is the first to build some solution is most likely to get the market and monetize it. So almost every father of startup is looking for a technology that will help him build thing fast. This is the main reason that Rails are so popular, they are not fast, they consume memory like crazy but they offer you out-of-box something that you can work on. It has all properties you are looking for and everything is there with rich documentation and easy to learn and use conventions. Rails are like a gift to people who wants to &ldquo;prototype&rdquo; application fast, but for 99% of solution out there they never leave prototype stage.</p>

<h2>Going big!</h2>

<p>Rails started small, the community was small and it was normal that not many people cared about finding security issues because it was more important to add support for everything and make the framework richer and richer. First thing that was the biggest helper in opening every door was raising popularity but this is also the biggest enemy of the framework. It started traction around the framework and people started to hack it, audit code and find things that can be exploited.</p>

<h2>Natural point in life</h2>

<p>Every framework has to go through this type of periods in its life, there is no bug free code. People will find bugs in code base. What is the best way to prevent this ? Have a great team of engineers that follows the trends. But&hellip; most of startup owners wants to cut the costs, they outsource the work and have periods of life of the product that simply nobody cares about it in technical way.  Or it can be even worse, team can be focused so much on features because of the boss pressure that they don&rsquo;t have time for it.</p>

<h1>Building solution</h1>

<p>Some of startup starters will be technical, more technical or not technical at all, in most cases it is not technical at all and this is a problem. This leads to building every startup base on frameworks like Rails or Django. Scenario looks the same every time. First team spends a lot of time building initial release and next it goes big so they don&rsquo;t have a way to scale it in other way than spaming rails instances and changing database. So if something hits rails it hits whole platform and that hurts. Second scenario is that team is having some sort of engine and just a rails front end this is a smart approach because if something will go really wrong it only will kill front end and this is not bad! But how many teams build solutions in this way ? Not many, mostly polilingual team that know something more than ruby. What i experienced in my career is that people don&rsquo;t wan to do some initial design decisions before start they just want to have product and &ldquo;we will think about it later&rdquo;. This from business point of view is ok but this &ldquo;later&rdquo; is often very early.  Some startups are lucky enough to have engineer that are smart and know how to solve problems using background processing, caching and a bit of cheating (eg. like youtube do with vote count) so make everything work smooth but most of startups are created in a crazy way with big stress on speed of building.</p>

<h2>Problems, security and future</h2>

<p>People will always suggest things like <code>YAML.safe_load</code> in my personal opinion its not a solution but just a patch. Why not disable support for YAML, JSON, XML and any other type of request and make it explicit what you accept as form of request for actions. Trying to apply every possible parser to input is not often best thing to do.</p>

<h1>Summary</h1>

<p>I think problems like rails have now with security are not something we should cry about, it is just another step in becoming mature framework and problems like this can happen always with every framework. We have to embrace it and devise tactics to deal with it in a timely  fashion so we will not be affected. Building software is not cheap, maintaining it is not cheap but&hellip; if you will hit right market you will get the money back.</p>

<p>This is how i see startup stage now.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Building FFI Extensions in Erlang]]></title>
    <link href="http://no-fucking-idea.com/blog/2013/02/05/building-ffi-extensions-in-erlang/"/>
    <updated>2013-02-05T20:20:00+00:00</updated>
    <id>http://no-fucking-idea.com/blog/2013/02/05/building-ffi-extensions-in-erlang</id>
    <content type="html"><![CDATA[<p>I&rsquo;m preparing to upgrade my old humidity/temperature meeeeeter solution with raspberry pi. While it is easy to read stuff in C i don&rsquo;t want to build whole app in C because i know how this can end when you are 1500 &ndash; 3000 km from home and app stops to respond and the only living person to fix it is your Cat Haskell. So i want to have everything in <code>Erlang</code> and only small module reading stuff in C.</p>

<h1>Ports</h1>

<p>Firt thought was to build small C program that will check stuff periodically or just &ldquo;check stuff&rdquo; in SHT1x and just print it out to output. So my first attempt was</p>

<p>For the example here i will use <code>/proc/cpuinfo</code></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='erlang'><span class='line'><span class="p">-</span><span class="ni">module</span><span class="p">(</span><span class="n">mycpuinfo</span><span class="p">).</span>
</span><span class='line'><span class="p">-</span><span class="ni">export</span><span class="p">([</span><span class="n">info</span><span class="o">/</span><span class="mi">0</span><span class="p">]).</span>
</span><span class='line'>
</span><span class='line'><span class="p">-</span><span class="ni">define</span><span class="p">(</span><span class="no">CMD</span><span class="p">,</span> <span class="s">&quot;cat /proc/cpuinfo&quot;</span><span class="p">).</span>
</span><span class='line'>
</span><span class='line'><span class="nf">info</span><span class="p">()</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="nv">Port</span> <span class="o">=</span> <span class="nb">open_port</span><span class="p">({</span><span class="nb">spawn</span><span class="p">,</span> <span class="o">?</span><span class="nv">CMD</span><span class="p">},</span> <span class="p">[{</span><span class="n">packet</span><span class="p">,</span> <span class="mi">1</span><span class="p">},</span> <span class="n">use_stdio</span><span class="p">,</span> <span class="n">exit_status</span><span class="p">,</span> <span class="n">binary</span><span class="p">]),</span>
</span><span class='line'>    <span class="nb">port_command</span><span class="p">(</span><span class="nv">Port</span><span class="p">,</span> <span class="o">&lt;&lt;&gt;&gt;</span><span class="p">),</span>
</span><span class='line'>    <span class="k">receive</span>
</span><span class='line'>  <span class="p">{</span><span class="nv">Port</span><span class="p">,</span> <span class="p">{</span><span class="n">data</span><span class="p">,</span> <span class="nv">Response</span><span class="p">}}</span> <span class="o">-&gt;</span>
</span><span class='line'>      <span class="p">{</span><span class="n">ok</span><span class="p">,</span> <span class="p">{</span><span class="n">cpuinfo</span><span class="p">,</span> <span class="nv">Response</span><span class="p">}};</span>
</span><span class='line'>  <span class="p">_</span>  <span class="o">-&gt;</span> <span class="n">error</span>
</span><span class='line'>    <span class="k">end</span><span class="p">.</span>
</span><span class='line'>
</span></code></pre></td></tr></table></div></figure>


<p>Nothing super special, except that raspberry pi is not really cool with different packet sizes and it can for example not read whole input properly. I observed some issues with it. So i decided to explore more FFI.</p>

<h1>erl_interface</h1>

<p>The thing i found is called erl_interface and it is designed for FFI. This is it! What you do is you build process like thing in C and micro module in erlang that handles this. (It is just to make it look nice). But there are few glitches!</p>

<p>This is my module posting back &ldquo;pong&rdquo; on &ldquo;ping&rdquo; message</p>

<figure class='code'><figcaption><span>lolpong.c</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="cp">#include &lt;stdio.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;sys/types.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;sys/socket.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;netinet/in.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#include &quot;erl_interface.h&quot;</span>
</span><span class='line'><span class="cp">#include &quot;ei.h&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#define BUFFSIZE 100</span>
</span><span class='line'>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">**</span> <span class="n">argv</span><span class="p">){</span>
</span><span class='line'>
</span><span class='line'>  <span class="kt">int</span> <span class="n">fd</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="n">BUFFSIZE</span><span class="p">];</span>
</span><span class='line'>  <span class="n">ErlMessage</span> <span class="n">emsg</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">msg_type</span><span class="p">;</span>
</span><span class='line'>  <span class="n">ETERM</span> <span class="o">*</span><span class="n">fromp</span><span class="p">,</span> <span class="o">*</span><span class="n">argp</span><span class="p">,</span> <span class="o">*</span><span class="n">rsp</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">erl_init</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span><span class="p">(</span><span class="n">erl_connect_init</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">&quot;cookie&quot;</span><span class="p">,</span>  <span class="mi">0</span><span class="p">)</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">){</span>
</span><span class='line'>    <span class="n">erl_err_quit</span><span class="p">(</span><span class="s">&quot;init failed&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span><span class="p">((</span><span class="n">fd</span> <span class="o">=</span> <span class="n">erl_connect</span><span class="p">(</span><span class="s">&quot;emu@raspberrypi&quot;</span><span class="p">))</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="p">){</span>
</span><span class='line'>    <span class="n">erl_err_quit</span><span class="p">(</span><span class="s">&quot;Emus could won war with australia but you still can&#39;t connect to emu :(&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">){</span>
</span><span class='line'>    <span class="n">msg_type</span> <span class="o">=</span> <span class="n">erl_receive_msg</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="n">BUFFSIZE</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">emsg</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span><span class="p">(</span><span class="n">msg_type</span> <span class="o">==</span> <span class="n">ERL_TICK</span><span class="p">){</span>
</span><span class='line'>      <span class="cm">/* Emu is checking australian defences, Polish people are safe! so I can ignore this */</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">msg_type</span> <span class="o">==</span> <span class="n">ERL_ERROR</span><span class="p">){</span>
</span><span class='line'>      <span class="cm">/* Huston we have an Emu! */</span>
</span><span class='line'>      <span class="k">break</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>      <span class="cm">/* our pro msg */</span>
</span><span class='line'>      <span class="n">fromp</span> <span class="o">=</span> <span class="n">erl_element</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">emsg</span><span class="p">.</span><span class="n">msg</span><span class="p">);</span>
</span><span class='line'>      <span class="n">argp</span> <span class="o">=</span> <span class="n">erl_element</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">emsg</span><span class="p">.</span><span class="n">msg</span><span class="p">);</span>
</span><span class='line'>      <span class="n">rsp</span> <span class="o">=</span> <span class="n">erl_format</span><span class="p">(</span><span class="s">&quot;pong&quot;</span><span class="p">);</span>
</span><span class='line'>      <span class="n">erl_send</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">fromp</span><span class="p">,</span> <span class="n">rsp</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>      <span class="n">erl_free_term</span><span class="p">(</span><span class="n">emsg</span><span class="p">.</span><span class="n">from</span><span class="p">);</span>
</span><span class='line'>      <span class="n">erl_free_term</span><span class="p">(</span><span class="n">emsg</span><span class="p">.</span><span class="n">msg</span><span class="p">);</span>
</span><span class='line'>      <span class="n">erl_free_term</span><span class="p">(</span><span class="n">fromp</span><span class="p">);</span>
</span><span class='line'>      <span class="n">erl_free_term</span><span class="p">(</span><span class="n">argp</span><span class="p">);</span>
</span><span class='line'>      <span class="n">erl_free_term</span><span class="p">(</span><span class="n">rsp</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>First of all complexity goes p fast. You have to think about many things. Here i know that my host is called &ldquo;emu@raspberrypi&rdquo; and this is actually process that runs so if you will not remember about freeing memory you will fast learn what means &ldquo;memory leak&rdquo;.</p>

<p>But most important thing is how to build this and run.</p>

<h2>Building</h2>

<p>My make file looks 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>
</pre></td><td class='code'><pre><code class='make'><span class='line'><span class="nf">all</span><span class="o">:</span>
</span><span class='line'>  gcc -o lolpong -I/usr/lib/erlang/lib/erl_interface-3.7.7/include -L/usr/lib/erlang/lib/erl_interface-3.7.7/lib lolpong.c -lerl_interface -lei -pthread
</span></code></pre></td></tr></table></div></figure>


<p>It is important to remember about -pthread.</p>

<h2>Running everything.</h2>

<p>No how to make everything work&hellip; we need module</p>

<figure class='code'><figcaption><span>lolpong.erl</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='erlang'><span class='line'><span class="p">-</span><span class="ni">module</span><span class="p">(</span><span class="n">lolpong</span><span class="p">).</span>
</span><span class='line'><span class="p">-</span><span class="ni">export</span><span class="p">([</span><span class="n">ping</span><span class="o">/</span><span class="mi">0</span><span class="p">]).</span>
</span><span class='line'>
</span><span class='line'><span class="nf">ping</span><span class="p">()</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="p">{</span><span class="n">any</span><span class="p">,</span> <span class="n">&#39;c1@raspberrypi&#39;</span><span class="p">}</span> <span class="o">!</span> <span class="p">{</span><span class="n">self</span><span class="p">(),</span> <span class="n">ping</span><span class="p">},</span>
</span><span class='line'>    <span class="k">receive</span>
</span><span class='line'>  <span class="nv">R</span> <span class="o">-&gt;</span> <span class="p">{</span><span class="n">ok</span><span class="p">,</span> <span class="nv">R</span><span class="p">}</span>
</span><span class='line'>    <span class="k">end</span><span class="p">.</span>
</span></code></pre></td></tr></table></div></figure>


<p>`
This c1 is for c extension 1 not super obvious :) cN will be for c extension N =).</p>

<p>And finally we need to spawn our node&hellip;</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='bash'><span class='line'>λ  erl -sname <span class="s2">&quot;emu&quot;</span> -setcookie <span class="s2">&quot;cookie&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This spawns node named emu@raspberrypi on my mini box with cookie &ldquo;cookie&rdquo; now &hellip; i said finally&hellip; but it was not final step.</p>

<p>Final step is to run out <code>lolpong</code> binary. It is important to run it after node is up because it will try to connect to this node.</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='bash'><span class='line'>./lolpong
</span></code></pre></td></tr></table></div></figure>


<p>Now we can run in our erlang shell check if everything works!</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='erlang'><span class='line'><span class="p">(</span><span class="n">emu</span><span class="p">@</span><span class="n">raspberrypi</span><span class="p">)</span><span class="mi">1</span><span class="o">&gt;</span> <span class="nn">lolpong</span><span class="p">:</span><span class="n">ping</span><span class="p">().</span>
</span><span class='line'><span class="p">{</span><span class="n">ok</span><span class="p">,</span><span class="n">pong</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Works!</p>

<h1>Summary</h1>

<p>It is good fun, now i need to wait for the parts to assemble everything and build rest of application :)</p>

<p>Cheers!!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Making Request to REST Resources in Erlang]]></title>
    <link href="http://no-fucking-idea.com/blog/2013/01/22/making-request-to-rest-resources-in-erlang/"/>
    <updated>2013-01-22T19:42:00+00:00</updated>
    <id>http://no-fucking-idea.com/blog/2013/01/22/making-request-to-rest-resources-in-erlang</id>
    <content type="html"><![CDATA[<p>Recently with friends we are building side project called &ldquo;Midway&rdquo; its a simple battleship server. The whole point of the game is to create a client and defeat other people maps! winner takes it all! The person with lowest number of hits/won-map wins! This is again a not to self type of entry. So i created some placeholder libs to building clients and while working through Erlang placeholder i made some notes on stuff.</p>

<h1>Making request</h1>

<p>So first of all i used builtin inets for making requests.
So first thing to do is to start inets!</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='erlang'><span class='line'><span class="nn">inets</span><span class="p">:</span><span class="n">start</span><span class="p">().</span>
</span></code></pre></td></tr></table></div></figure>


<p>Ok i generalized using httpc to really simple 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>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='erlang'><span class='line'><span class="nf">post</span><span class="p">(</span><span class="nv">URL</span><span class="p">,</span> <span class="nv">ContentType</span><span class="p">,</span> <span class="nv">Body</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">request</span><span class="p">(</span><span class="n">post</span><span class="p">,</span> <span class="p">{</span><span class="nv">URL</span><span class="p">,</span> <span class="p">[],</span> <span class="nv">ContentType</span><span class="p">,</span> <span class="nv">Body</span><span class="p">}).</span>
</span><span class='line'><span class="nb">get</span><span class="p">(</span><span class="nv">URL</span><span class="p">)</span>                     <span class="o">-&gt;</span> <span class="n">request</span><span class="p">(</span><span class="nb">get</span><span class="p">,</span>  <span class="p">{</span><span class="nv">URL</span><span class="p">,</span> <span class="p">[]}).</span>
</span><span class='line'>
</span><span class='line'><span class="nf">request</span><span class="p">(</span><span class="nv">Method</span><span class="p">,</span> <span class="nv">Body</span><span class="p">)</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="nn">httpc</span><span class="p">:</span><span class="n">request</span><span class="p">(</span><span class="nv">Method</span><span class="p">,</span> <span class="nv">Body</span><span class="p">,</span> <span class="p">[],</span> <span class="p">[]).</span>
</span></code></pre></td></tr></table></div></figure>


<p>So if you will a call you will get something 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>
<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='erlang'><span class='line'><span class="nn">httpc</span><span class="p">:</span><span class="nf">request</span><span class="p">(</span><span class="nb">get</span><span class="p">,</span> <span class="p">{</span><span class="s">&quot;http://www.youtube.com/watch?v=JvxG3zl_WhU&quot;</span><span class="p">,</span> <span class="p">[]},</span> <span class="p">[],</span> <span class="p">[]).</span>
</span><span class='line'><span class="p">{</span><span class="n">ok</span><span class="p">,</span><span class="err">\</span><span class="p">{</span> <span class="err">\</span><span class="p">{</span><span class="s">&quot;HTTP/1.1&quot;</span><span class="p">,</span><span class="mi">200</span><span class="p">,</span><span class="s">&quot;OK&quot;</span><span class="p">},</span>
</span><span class='line'>     <span class="p">[{</span><span class="s">&quot;cache-control&quot;</span><span class="p">,</span><span class="s">&quot;no-cache&quot;</span><span class="p">},</span>
</span><span class='line'>      <span class="p">{</span><span class="s">&quot;date&quot;</span><span class="p">,</span><span class="s">&quot;Tue, 22 Jan 2013 20:36:16 GMT&quot;</span><span class="p">},</span>
</span><span class='line'>      <span class="p">{</span><span class="s">&quot;server&quot;</span><span class="p">,</span><span class="s">&quot;gwiseguy/2.0&quot;</span><span class="p">},</span>
</span><span class='line'>      <span class="p">{</span><span class="s">&quot;content-length&quot;</span><span class="p">,</span><span class="s">&quot;221233&quot;</span><span class="p">},</span>
</span><span class='line'>      <span class="p">{</span><span class="s">&quot;content-type&quot;</span><span class="p">,</span><span class="s">&quot;text/html; charset=utf-8&quot;</span><span class="p">},</span>
</span><span class='line'>      <span class="p">{</span><span class="s">&quot;expires&quot;</span><span class="p">,</span><span class="s">&quot;Tue, 27 Apr 1971 19:44:06 EST&quot;</span><span class="p">},</span>
</span><span class='line'>      <span class="p">{</span><span class="s">&quot;set-cookie&quot;</span><span class="p">,</span>
</span><span class='line'>       <span class="s">&quot;PREF=f1=50000000; path=/; domain=.youtube.com; expires=Fri, 20-Jan-2023 20:36:15 GMT&quot;</span><span class="p">},</span>
</span><span class='line'>      <span class="p">{</span><span class="s">&quot;set-cookie&quot;</span><span class="p">,</span>
</span><span class='line'>       <span class="s">&quot;use_hitbox=d5c5516c3379125f43aa0d495d100d6ddAEAAAAw; path=/; domain=.youtube.com&quot;</span><span class="p">},</span>
</span><span class='line'>      <span class="p">{</span><span class="s">&quot;set-cookie&quot;</span><span class="p">,</span>
</span><span class='line'>       <span class="s">&quot;VISITOR_INFO1_LIVE=99hU0tGtAng; path=/; domain=.youtube.com; expires=Thu, 19-Sep-2013 20:36:15 GMT&quot;</span><span class="p">},</span>
</span><span class='line'>      <span class="p">{</span><span class="s">&quot;set-cookie&quot;</span><span class="p">,</span>
</span><span class='line'>       <span class="s">&quot;recently_watched_video_id_list=dda4a4415949369ee6eb305306b40e47WwEAAABzCwAAAEp2eEczemxfV2hV; path=/; domain=.youtube.com&quot;</span><span class="p">},</span>
</span><span class='line'>      <span class="p">{</span><span class="s">&quot;x-frame-options&quot;</span><span class="p">,</span><span class="s">&quot;SAMEORIGIN&quot;</span><span class="p">},</span>
</span><span class='line'>      <span class="p">{</span><span class="s">&quot;x-content-type-options&quot;</span><span class="p">,</span><span class="s">&quot;nosniff&quot;</span><span class="p">},</span>
</span><span class='line'>      <span class="p">{</span><span class="s">&quot;p3p&quot;</span><span class="p">,</span>
</span><span class='line'>       <span class="s">&quot;CP=</span><span class="se">\&quot;</span><span class="s">This is not a P3P policy! See http://support.google.com/accounts/bin/answer.py?answer=151657&amp;hl=en-GB for more info.</span><span class="se">\&quot;</span><span class="s">&quot;</span><span class="p">},</span>
</span><span class='line'>      <span class="p">{</span><span class="s">&quot;x-xss-protection&quot;</span><span class="p">,</span><span class="s">&quot;1; mode=block&quot;</span><span class="p">}],</span>
</span><span class='line'>     <span class="p">[</span><span class="mi">60</span><span class="p">,</span><span class="mi">33</span><span class="p">,</span><span class="mi">68</span><span class="p">,</span><span class="mi">79</span><span class="p">,</span><span class="mi">67</span><span class="p">,</span><span class="mi">84</span><span class="p">,</span><span class="mi">89</span><span class="p">,</span><span class="mi">80</span><span class="p">,</span><span class="mi">69</span><span class="p">,</span><span class="mi">32</span><span class="p">,</span><span class="mi">104</span><span class="p">,</span><span class="mi">116</span><span class="p">,</span><span class="mi">109</span><span class="p">,</span><span class="mi">108</span><span class="p">,</span><span class="mi">62</span><span class="p">,</span><span class="mi">60</span><span class="p">,</span><span class="mi">104</span><span class="p">,</span>
</span><span class='line'>      <span class="mi">116</span><span class="p">,</span><span class="mi">109</span><span class="p">,</span><span class="mi">108</span><span class="p">,</span><span class="mi">32</span><span class="p">,</span><span class="mi">108</span><span class="p">,</span><span class="mi">97</span><span class="p">,</span><span class="mi">110</span><span class="p">|...]}}</span>
</span></code></pre></td></tr></table></div></figure>


<p>One more thing i added was extracting body of the response</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='erlang'><span class='line'>  <span class="n">response_body</span><span class="p">({</span><span class="n">ok</span><span class="p">,</span> <span class="p">{</span> <span class="p">_,</span> <span class="p">_,</span> <span class="nv">Body</span><span class="p">}})</span> <span class="o">-&gt;</span> <span class="nv">Body</span><span class="p">.</span>
</span></code></pre></td></tr></table></div></figure>


<p>So after calling it on response we can get body</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>
</pre></td><td class='code'><pre><code class='erlang'><span class='line'>  <span class="nv">Response</span> <span class="o">=</span> <span class="nn">httpc</span><span class="p">:</span><span class="n">request</span><span class="p">(</span><span class="nb">get</span><span class="p">,</span> <span class="p">{</span><span class="s">&quot;http://www.youtube.com/watch?v=JvxG3zl_WhU&quot;</span><span class="p">,</span> <span class="p">[]},</span> <span class="p">[],</span> <span class="p">[]).</span>
</span><span class='line'>  <span class="nv">Body</span> <span class="o">=</span> <span class="n">response_body</span><span class="p">(</span><span class="nv">Response</span><span class="p">).</span>
</span><span class='line'>  <span class="nn">io</span><span class="p">:</span><span class="n">format</span><span class="p">(</span><span class="s">&quot;</span><span class="si">~s~n</span><span class="s">&quot;</span><span class="p">,[</span><span class="nv">Body</span><span class="p">]).</span>
</span><span class='line'>  <span class="o">&lt;!</span><span class="nv">DOCTYPE</span> <span class="n">html</span><span class="o">&gt;&lt;</span><span class="n">html</span> <span class="n">lang</span><span class="o">=</span><span class="s">&quot;en&quot;</span><span class="o">&gt;&lt;</span><span class="n">head</span><span class="o">&gt;</span> <span class="p">...</span>
</span></code></pre></td></tr></table></div></figure>


<h1>Parsing Json</h1>

<p> So next thing to do was to parse json :)  for this pupose use two libs mochijson2 or jiffy.</p>

<h2>Mochijson2</h2>

<p>So this one is easy to find and use. All you need to do is grab file from mochiweb project and compile it :) it has two method encode and decode.</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='erlang'><span class='line'><span class="nn">mochijson2</span><span class="p">:</span><span class="n">decode</span><span class="p">(</span><span class="nv">STUFF</span><span class="p">).</span>
</span><span class='line'><span class="nn">mochijson2</span><span class="p">:</span><span class="n">endcode</span><span class="p">(</span><span class="nv">STUFF</span><span class="p">).</span>
</span></code></pre></td></tr></table></div></figure>


<p>One thing worth mentioning is that it expects input in a bit structured format.</p>

<p>So typycaly it will use &ldquo;struct&rdquo; symbol for json &ldquo;{}&rdquo; objects.</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='erlang'><span class='line'><span class="p">{</span><span class="n">struct</span><span class="p">,</span> <span class="p">[{</span><span class="n">name</span><span class="p">,</span> <span class="o">&lt;&lt;</span><span class="s">&quot;jakub&quot;</span><span class="o">&gt;&gt;</span><span class="p">},</span> <span class="p">{</span><span class="n">age</span><span class="p">,</span> <span class="mi">27</span><span class="p">},</span> <span class="p">{</span><span class="n">ids</span><span class="p">,</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">]}]}</span>
</span></code></pre></td></tr></table></div></figure>


<p>So array in json will be list but object will have to be in tuple with struct. It is awkward at first but you can get used to it. but there is easier thing to use&hellip;</p>

<h2>Jiffy</h2>

<p>This! There is a good example on main page.</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='erlang'><span class='line'><span class="nv">Eshell</span> <span class="nv">V5</span><span class="p">.</span><span class="mi">8</span><span class="p">.</span><span class="mi">2</span>  <span class="p">(</span><span class="n">abort</span> <span class="n">with</span> <span class="err">^</span><span class="nv">G</span><span class="p">)</span>
</span><span class='line'><span class="mi">1</span><span class="o">&gt;</span> <span class="nn">jiffy</span><span class="p">:</span><span class="n">decode</span><span class="p">(</span><span class="o">&lt;&lt;</span><span class="s">&quot;{</span><span class="se">\&quot;</span><span class="s">foo</span><span class="se">\&quot;</span><span class="s">: </span><span class="se">\&quot;</span><span class="s">bar</span><span class="se">\&quot;</span><span class="s">}&quot;</span><span class="o">&gt;&gt;</span><span class="p">).</span>
</span><span class='line'><span class="p">{[{</span><span class="o">&lt;&lt;</span><span class="s">&quot;foo&quot;</span><span class="o">&gt;&gt;</span><span class="p">,</span><span class="o">&lt;&lt;</span><span class="s">&quot;bar&quot;</span><span class="o">&gt;&gt;</span><span class="p">}]}</span>
</span><span class='line'><span class="mi">2</span><span class="o">&gt;</span> <span class="nv">Doc</span> <span class="o">=</span> <span class="p">{[{</span><span class="n">foo</span><span class="p">,</span> <span class="p">[</span><span class="o">&lt;&lt;</span><span class="s">&quot;bing&quot;</span><span class="o">&gt;&gt;</span><span class="p">,</span> <span class="mi">2</span><span class="p">.</span><span class="mi">3</span><span class="p">,</span> <span class="n">true</span><span class="p">]}]}.</span>
</span><span class='line'><span class="p">{[{</span><span class="n">foo</span><span class="p">,[</span><span class="o">&lt;&lt;</span><span class="s">&quot;bing&quot;</span><span class="o">&gt;&gt;</span><span class="p">,</span><span class="mi">2</span><span class="p">.</span><span class="mi">3</span><span class="p">,</span><span class="n">true</span><span class="p">]}]}</span>
</span><span class='line'><span class="mi">3</span><span class="o">&gt;</span> <span class="nn">jiffy</span><span class="p">:</span><span class="n">encode</span><span class="p">(</span><span class="nv">Doc</span><span class="p">).</span>
</span><span class='line'><span class="o">&lt;&lt;</span><span class="s">&quot;{</span><span class="se">\&quot;</span><span class="s">foo</span><span class="se">\&quot;</span><span class="s">:[</span><span class="se">\&quot;</span><span class="s">bing</span><span class="se">\&quot;</span><span class="s">,2.2999999999999998224,true]}&quot;</span><span class="o">&gt;&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This shows how nice it is to use :D no &lsquo;struct&rsquo; pure love!</p>

<p>You can get it here <a href="https://github.com/davisp/jiffy">https://github.com/davisp/jiffy</a></p>

<h1>Summary</h1>

<p>This is just note to self to not be checking up docs looking for this stuff again :).</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Gems Hidden in the Past]]></title>
    <link href="http://no-fucking-idea.com/blog/2012/12/17/gems-hidden-in-the-past/"/>
    <updated>2012-12-17T20:52:00+00:00</updated>
    <id>http://no-fucking-idea.com/blog/2012/12/17/gems-hidden-in-the-past</id>
    <content type="html"><![CDATA[<p>I&rsquo;ve been talking with my friend about Haskell, Ocaml ( Objective CaML), Functional programming, dependent types and INDUSTRY. We had a long talk about new Camridge hacker space, that they want to send satelite in space with &ldquo;hacker&rdquo; effort. That is amazing! Suddenly I thought that what we all use now is 50 years old technology. Nothing new. Things that are &ldquo;new&rdquo; today like nodejs &ldquo;the new black&rdquo; are actually technology that is as old as lisp. Maybe we should take a look at past and think for a moment&hellip;  That is the things i would like to rant about today.</p>

<h1>New Discoveries</h1>

<p>&ldquo;Theory is the thing we all skip and later on regret skipping&rdquo; (Yes i quoted my self, I heard someone did it before so its not hip). We learn a lot of stuff and some of the things simply slip through and gets forgotten. That is opening for &ldquo;new discoveries&rdquo; or &ldquo;rediscoveries&rdquo; of some solutions. I have a thesis that &ldquo;if something is simple it will get its niche&rdquo; (did it again). This would explain new hipe for Nodejs &lt;nodejs.org>. I don&rsquo;t want to judge technologies I did some stuff in node and i have small portion of experience but this text is not about this, its about technology behind stuff people think it&rsquo;s brilliant and new nowadays.</p>

<h2>Event loop | Evented solutions</h2>

<p>Event loops exists long long and are nothing new. When someone says event loop first thing i think about is not nodejs or eventmachine or twistted but WinAPI. Yes old WinAPI and suddenly everybody realize that every GUI (Graphical User Interface) solution is evented. QT, WinAPI and many other even older solutions. This is nothing new,  so lets take a trip through the cards of history to find other gems that we can rediscover and become new rocket scientists&hellip;or first tech archeologists.</p>

<h3>Step One: Alternatives to sequencing</h3>

<p>So most common thing people do is sequencing and even if we use brain in other way it is easy to us to think about and form sequences because it is something we understand. This is basic unit of work we think about. So most of people write small function that sequence some action and they build programs from small functions calling small functions in a really big sequence.</p>

<p>Alternative solution to do this is event machine, this solution will enable us to generate a lot of small event and if we will manage to force programmer to make them as small as possible and as fast as possible we can achieve a feeling of multitasking. How does it work ? we have one loop that picks events from event queue and process them and as long as nobody will make event that is blocking everything this will work like charm. Key to this solution is &ldquo;non blocking&rdquo;.</p>

<h4>Achieving Non-blocking</h4>

<p>To do this we need to have a way of &ldquo;wait until will happen and if it happen&#8217;ed trigger event&rdquo; thing. This can be done by many different solutions. For example for file descriptors (everything is a file) we have stuff like <code>select</code>, <code>poll</code>, <code>epoll</code>, <code>kqueue</code>. and this is not new its the 80&#8217;. Later on POSIX first official POSIX thing 1997. 15 years ago! Previously mentioned nodejs is representing this category (ofc from the fresh news!). Does it have flaws ? Yes! People call this async&hellip; its not async, not real async. Real async was also implemented in 80&rsquo;s :D</p>

<h4>Signals</h4>

<p>Signals are also very old, basically this is similar concept (every concept is similar) You have a slot that handles signal and something that emits signals. It&rsquo;s very handy and was implemented with big success in QT library. Does it has flaws ? basically same as event loop solutions. It&rsquo;s a way of doing &ldquo;message passing&rdquo; pattern.</p>

<h4>Message passing</h4>

<p>Message passing really well implemented in Erlang is another way of achieving same result, imho  most clean and good solution in the industry right now. Simply you cast messages and other entities receive them and react. YES THIS IS HOW PEOPLE WORK.
Most of thins seems to be inspired by nature&hellip; but lets not go this route and start religious war.</p>

<h4>Async</h4>

<p>The real unix async calls. Yes unix has this built in.</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='c'><span class='line'><span class="cp">#include &lt;aio.h&gt;</span>
</span><span class='line'><span class="kt">int</span> <span class="n">aio_write</span><span class="p">(</span><span class="k">struct</span> <span class="n">aiocb</span> <span class="o">*</span><span class="n">aiocbp</span><span class="p">);</span>
</span><span class='line'><span class="kt">int</span> <span class="n">aio_read</span><span class="p">(</span><span class="k">struct</span> <span class="n">aiocb</span> <span class="o">*</span><span class="n">aiocbp</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>You call <code>aio_write</code> and write to a file will happen, sometime in future&hellip; BEFORE END OF THE WORLD, maybe!</p>

<p>Wow! This is fresh! nobody is using it nowadays! you should make new nodejs on it and call it modejs. Or wait ? Can you ? nobody really know how to use them and not be cluster f@cked after five seconds.  Real async syscalls in unix. That is awesome and its older than your son! Lets dig more&hellip;</p>

<h4>Reactive programming</h4>

<p>This is the sh*t, real event programming, you have real reactor nothing is faked like in eventloop! But its nothing new&hellip; also implemented in 80&rsquo;s.  But what is the difference between reactive programming and event loop ? Not much because this is more conceptual thing around building your reactor. In reactor concept we think about data flows and reacting to changes in them.</p>

<p>We don&rsquo;t have to research things that are found!</p>

<h2>Map Reduce, Google, Smart people</h2>

<p>So how mega smart people in Google work ? I don&rsquo;t know I don&rsquo;t work for google and I&rsquo;m not smart but I assume they want to get sh*t done. And after reading Amazon Dynamo Paper <a href="http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/decandia07dynamo.pdf">http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/decandia07dynamo.pdf</a> , Google Big Table paper <a href="http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/pl//archive/bigtable-osdi06.pdf">http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/pl//archive/bigtable-osdi06.pdf</a> and many other i think they developed it in kitchen. Yes in a kitchen.</p>

<p>They sat down, people from google and amazon i imagine 6 engineers took 1 apple (Steve Jobs was serving) and asked them self how to how to cut it into 6 parts so they can eat it. They took knife and sliced into 6 parts and split it to each other. Suddenly one stood up (Amazon guy with headphones in avatar) and said. Each part of apple is exclusive (patent trolls have everything exclusive nowadays) to each of us so we can eat them on our own. LETS MAKE DB USING THIS TECH AND WRITE A PAPER ON IT. Next guy said.. yeah we have limited number of apple parts so it is predictable and we form a RING from it&hellip; and thats how Big Table and Amazon dynamo was born. The Google cook who was slicing apple said, i sliced apple in parts one by one with one knife&hellip; AND HE WROTE MAP REDUCE PAPER.</p>

<p>They did not invented anything really new, they just approached problem simple. We can&rsquo;t split and scale complex solutions so we will make everything simple. And it happens that most of things can be turned into linear or near linear problem.</p>

<h3>Is Map Reduce really something new ?</h3>

<p>In my opinion not. Map existed in lisp world probably since 70&rsquo;s. Now someone took map and sequence of data that is exclusive and don&rsquo;t depend on each other and said &ldquo;What will happen if i will split this list into two parts and run map on each in two or more threads and then just sum results ?&rdquo; and map reduce was born. Concept is dead simple. But its nothing new! I&rsquo;m not taking here credit from google engineers. I think guys there are very smart and by using simple things in my eyes they are ^2 smart. But is it something ground breaking new ? No.</p>

<p>So maybe we should more often look into past. Maybe we can find more gems like this&hellip; i bet google has technology archeology department :D</p>

<h3>Step Two: Type writer</h3>

<p>I&rsquo;m 80&#8217; kid. I remember type writers and the sound so for me understanding how files in OS (Unix or in general) works was simple, but when recently i was explaining it to friend who is 90&#8217; kid he did not got the concept of that well. Why ? Because he is from age where type writers did not exist. For me it was a bit shocking because i thought everybody knows exactly how they work. And when i said why we have \r and what it is i was for a moment happy that I&rsquo;m very very old :D.</p>

<h3>Queues, Interpreters and other stuff.</h3>

<p>Technology archeologiest must be open to new things, read about everything and most of all, never stop thinking &ldquo;this had to be already invented&rdquo;.  When I first suggested Queue as a solution to a problem some people looked at me like i would be snake. FIFO queues, something so basic&hellip; still some people don&rsquo;t even think about them. This is dull example but basic data structures should be well known by everybody still&hellip; things that freezes blood in your veins happens.</p>

<p>Building DSL and interpreters is good fun, its not easy often I&rsquo;m still learning a lot but this should not be &ldquo;devil&rdquo; to other programmers.</p>

<h1>Old manuscripts</h1>

<p>There are books that contains tones of cool knowledge, you can be technology archeologist like me! just venture into them and discover &ldquo;Stuff&rdquo;. First book i would recall here is Richard Stevens.</p>

<ul>
<li>1990 – UNIX Network Programming – ISBN 0-13-949876-1</li>
<li>1992 – Advanced Programming in the UNIX Environment – ISBN 0-201-56317-7</li>
<li>1994 – TCP/IP Illustrated, Volume 1: The Protocols – ISBN 0-201-63346-9</li>
<li>1995 – TCP/IP Illustrated, Volume 2: The Implementation (z Garym R. Wrightem) – ISBN 0-201-63354-X</li>
<li>1996 – TCP/IP Illustrated, Volume 3: TCP for Transactions, HTTP, NNTP, and the UNIX Domain Protocols – ISBN 0-201-63495-3</li>
<li>1998 – UNIX Network Programming, Volume 1, Second Edition: Networking APIs: Sockets and XTI – ISBN 0-13-490012-X</li>
<li>1999 – UNIX Network Programming, Volume 2, Second Edition: Interprocess Communications – ISBN 0-13-081081-9</li>
</ul>


<p>This guy is amazing, books are very good quality talking about topics that today are more than active in our community. 22 year old books!</p>

<ul>
<li>1989 &ndash; Genetic Algorithms in Search, Optimization, and Machine Learning</li>
</ul>


<p>Amazing book, I never was big fan of A.I. (maybe i should, that would give me chance to actually have some of I&hellip;) but this book opened my eyes on how simple this stuff is. How easy and how powerful. When i was at uni this was one of the books i enjoed the most.</p>

<ul>
<li>1976 &ndash; Algorithms + Data Structures = Programs (Prentice-Hall Series in Automatic Computation) by Wirth.</li>
</ul>


<p>Classic this guy guides you through Pascal and shows you how to program and at the end of book implements subset of language. I say 76&#8217; FFS that good books will not be printed after 2006. 44 years ago published. C&#8217;mon!</p>

<ul>
<li>1988 &ndash; C Programming Language (2nd Edition)</li>
</ul>


<p>Next classic, especially section about making your own malloc(). C&#8217;mon 1988&#8217; 24 years ago. Brilliant book.</p>

<p>And something fresh</p>

<ul>
<li>2004 &ndash; The Art of C++  by Herbert Schildt</li>
</ul>


<p>Really good book, also common pattern in books that i read&hellip; guy is implementing language at the end ( subset of C )</p>

<p>Yes this is good stuff. Old books containing knowledge that industry will discover in 6-10 years.</p>

<h2>But what about current research ?</h2>

<p>Current stuff like dependent types&hellip; i recon we will hear about them in industry after our deaths ;/ next week apocalypse ;/. Yes there are tones of things to rediscover&hellip; and it&rsquo;s fun! lets do it!</p>

<h1>Summary</h1>

<p>I love when i hear about new stuff and suddenly  after inspection it becomes clear it is just old thing on new cogs. I love this. I love technology archeology and i want to bring more examples of this and write about it on my blog.</p>

<p>Yes sending satelite in space is something new&hellip;. another event loop implementation is not.</p>

<p>Sorry for ranting that much :D&hellip; anyway nobody read this :D.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Getting Some Clojure]]></title>
    <link href="http://no-fucking-idea.com/blog/2012/12/15/getting-some-clojure/"/>
    <updated>2012-12-15T20:07:00+00:00</updated>
    <id>http://no-fucking-idea.com/blog/2012/12/15/getting-some-clojure</id>
    <content type="html"><![CDATA[<p>After long chat with my friend who is Ocaml ( Objective Caml ) fanatic on topic of Lisp. I decided to get my hands on Clojure. Is there a better idea to learn language other than to write a crapy language learning tutorial ? Sure! but i will go with this one :D.</p>

<h2>Lisp</h2>

<p>Before i tried Clojure i had few &ldquo;trips&rdquo; to Lisp world but i was always stroked by amount of half finished vm&rsquo;s and implementations that are far from being production ready. For example chicken, scsh, sketchy, mit-scheme, bigloo. Some of them are more some less production ready but none of them is ready for anything real. The most production ready lisp thing i saw in my life was <code>elisp</code> YES f*cking <code>EMACS</code> lisp.
But I&rsquo;m not any expert in lisp world!</p>

<h2>Scheme</h2>

<p>Scheme is a dialect of Lisp that implements subset of language, in scheme code and data has same form which is a massive game changer. Scheme has super duper hiper mega MACRO building capabilities. And it is probably its biggest problems&hellip;</p>

<h2>Lisp Hacker&rsquo;s</h2>

<p>I remember when my friend was hacking in lisp, i remember when i was trying to hack stuff in scheme. So scheme is a trap!
First stage of lisp/scheme hacker is to build scheme interpreter in scheme, when he finishes this he tries to implement scheme interpreter in his interpreter&hellip; Second trap is when he realizes that he wrote enough amount of scheme interpreters and he moves to implementing new features into his interpreter in interpreter in interpreter ( and yes &lsquo;ready&rsquo; means that 8/10 runs stuff passes, some crash and half of features don&rsquo;t even exits so called &ldquo;junk features&rdquo; ). So his dialect gets better than Haskell lazy evaluation, better etc&hellip; at this stage he has self bootstraping half working interpreter of his language that had no docs and nobody except his can use it and even if he can he must be on drags to make the lazy evaluation happen. Next stage of course is starting to do AI in scheme. So the point is that no shit gets done, its all conceptual work. If Da&#8217;vinci would program in Lisp he would not cut of his ear, he would cut of his head.</p>

<h2>Life of ()</h2>

<p>I wrote some borderline rant on lisp hackers and this was supposed to be micro tutorial on scheme. Well i took the Lisp way of &ldquo;getting shit done&rdquo; :D. If you don&rsquo;t know that lisp bread and butter are <code>(</code> and <code>)</code> you should probably run away.</p>

<p>Naow!</p>

<h2>So why Clojure ?</h2>

<p>Clojure seems to be production ready stuff that can &ldquo;get shit done&rdquo;. It support concurrency (with STM &ndash; Software Transactional Memory) it is Scheme&#8217;y / Lispy and I have read that its hip in Open Source magazine. Thats enough to start learning yeah ?</p>

<p>No! But i want to learn it and write some stuff about it. It seems to be so different from other languages, RP notation and the whole community of Stallman like people.</p>

<p>Clojure runs on JVM ( Java Virtual Machine ) and beside Java being biggest troll language next to C++ ever! JVM is really good. It makes stuff really portable and its good for building stuff like backends for servers. Same goes with Scala using JVM, actually JVM is solid! ( coming from me Java hater ). Its not like some f*cktard writing in &ldquo;Open Source Magazine&rdquo; that C++ enables you to write portable code. No, writing os portable code in C++ is not easy, its hard and full of pain.</p>

<h1>Getting s*it on your box</h1>

<p>First thing you have to do is to install Clojure. This is the easy step. Just visit <a href="http://clojure.org/">http://clojure.org/</a>. I installed it using macports by running <code>sudo port install clojure</code> but for more into i would suggest going to:</p>

<ul>
<li>Minimum jar needed to start REPL <a href="http://clojure.org/getting_started">http://clojure.org/getting_started</a></li>
<li>Downloads for latest version <a href="http://clojure.org/downloads">http://clojure.org/downloads</a></li>
<li>Brew / Macports search &ldquo;clojure&rdquo;</li>
<li>In case that nothing else work, go to <a href="https://github.com/clojure/clojure">https://github.com/clojure/clojure</a> and look for &ldquo;build from source instructions&rdquo;</li>
</ul>


<p>Next you will want to install <code>leiningen</code> this is a build tool for Clojure. same procedure. either <code>sudo port install leiningen</code> or <a href="http://leiningen.org/">http://leiningen.org/</a> for more instructions.</p>

<h1>Running repl and first code!</h1>

<p>Enough of this sh*t lets do some stuff. First to run repl you need to do following.</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='bash'><span class='line'>clj
</span></code></pre></td></tr></table></div></figure>


<p>I mix it with <code>cjl</code>  but thats because i&rsquo;m a noob.
This should prompt you with something 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='bash'><span class='line'>20:59 kuba@kuba:~ λ clj
</span><span class='line'>Clojure 1.4.0
</span><span class='line'><span class="nv">user</span><span class="o">=</span>&gt;
</span></code></pre></td></tr></table></div></figure>


<p>Success!!!
We can now try to evaluate some simple stuff.</p>

<p>So now normal person would try to type something like <code>2 + 6</code> bad idea! Expressions in Lisp starts and ends with <code>()</code> so if you see things like <code>(((((((((((((((((((((((((((((</code>  or <code>)))))))))))))))))))))))</code> you know something is happening :D (second one more commonly)</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='scheme'><span class='line'><span class="nv">user=&gt;</span> <span class="mi">2</span> <span class="nv">+</span> <span class="mi">6</span>
</span><span class='line'><span class="mi">2</span>
</span><span class='line'><span class="o">#</span><span class="nv">&lt;core$_PLUS_</span> <span class="nv">clojure</span><span class="o">.</span><span class="nv">core$_PLUS_@9d686c1&gt;</span>
</span><span class='line'><span class="mi">6</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">+ </span><span class="mi">2</span> <span class="mi">6</span><span class="p">)</span>
</span><span class='line'><span class="mi">8</span>
</span></code></pre></td></tr></table></div></figure>


<p>RPN now i should quote link to wikipedia on Reverse Polish Notation. (I&rsquo;m Polish so it is kind&#8217;a like looking at my back and trying to read sign on t-shirt). Here you go <a href="http://en.wikipedia.org/wiki/Reverse_Polish_notation">http://en.wikipedia.org/wiki/Reverse_Polish_notation</a> Reverse polish notation simple words is a stack notation. Where you put operator on stack and then arguments. Or so called prefix notation. C, Java, Ruby are all infix notation eg. <code>2 + 6</code> while lisp / scheme is prefix notation aka <code>(+ 2 6)</code> on reality its so cool that you don&rsquo;t have to repeat your self and you put operator, function only  once and a list of arguments eg. <code>(+ 1 2 3 4 5)</code>. So lets try it out.</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>
</pre></td><td class='code'><pre><code class='scheme'><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">+ </span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span><span class="p">)</span>
</span><span class='line'><span class="mi">21</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">- </span><span class="mi">10</span> <span class="mi">7</span><span class="p">)</span>
</span><span class='line'><span class="mi">3</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">- </span><span class="mi">10</span> <span class="mi">7</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="mi">2</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">* </span><span class="mi">6</span> <span class="mi">7</span><span class="p">)</span>
</span><span class='line'><span class="mi">42</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">* </span><span class="mi">6</span> <span class="mi">7</span> <span class="mi">2</span><span class="p">)</span>
</span><span class='line'><span class="mi">84</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">/ </span><span class="mi">4</span> <span class="mi">5</span><span class="p">)</span>
</span><span class='line'><span class="mi">4</span><span class="nv">/5</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">/ </span><span class="mi">4</span> <span class="mf">5.0</span><span class="p">)</span>
</span><span class='line'><span class="mf">0.8</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">/ </span><span class="mi">4</span> <span class="mf">5.0</span> <span class="mi">2</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can see that those examples work in REPL nice!. But wait there is something different between <code>(/ 4 5)</code> and <code>(/ 4 5.0)</code>. Yes! Clojure has built in support for rational numbers so 4/5 is a rational 4/5 not rounded estimate of 4/5 while result of evaluating 4/5.0 is a floating point number. Lets see what happens if we will try to do 1/3</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>
</pre></td><td class='code'><pre><code class='scheme'><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">/ </span><span class="mi">1</span> <span class="mi">3</span><span class="p">)</span>
</span><span class='line'><span class="mi">1</span><span class="nv">/3</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">/ </span><span class="mi">1</span> <span class="mf">3.0</span><span class="p">)</span>
</span><span class='line'><span class="mf">0.3333333333333333</span>
</span></code></pre></td></tr></table></div></figure>


<p>Yeah the second one is not really accurate. Or is 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>
</pre></td><td class='code'><pre><code class='scheme'><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">+ </span><span class="p">(</span><span class="nb">/ </span><span class="mi">1</span> <span class="mi">3</span><span class="p">)</span> <span class="p">(</span><span class="nb">/ </span><span class="mi">1</span> <span class="mi">3</span><span class="p">))</span>
</span><span class='line'><span class="mi">2</span><span class="nv">/3</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">+ </span><span class="p">(</span><span class="nb">/ </span><span class="mi">1</span> <span class="mf">3.0</span><span class="p">)</span> <span class="p">(</span><span class="nb">/ </span><span class="mi">1</span> <span class="mf">3.0</span><span class="p">))</span>
</span><span class='line'><span class="mf">0.6666666666666666</span>
</span></code></pre></td></tr></table></div></figure>


<p>Not really&hellip;. it should be something like 0.(6) :)</p>

<p>So this is how you invoke functions, built in functions. But what if you would want to comment something out ? because its a useful info about new scheme dialect you are building?</p>

<h2>Comments</h2>

<p>You do comments using <code>;</code> everything after  ; is getting ignored!
For example:</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='scheme'><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">* </span><span class="mi">1</span> <span class="mi">1</span><span class="p">)</span> <span class="c1">; most useful thing Clojure has to offer </span>
</span><span class='line'><span class="mi">1</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">/ </span><span class="mi">1</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="mi">1</span>
</span><span class='line'><span class="nv">user=&gt;</span>  <span class="c1">; comment about lisp being full of ((((</span>
</span></code></pre></td></tr></table></div></figure>


<h2>defn</h2>

<p>First thing that makes people happy usually while learning new language is the moment when guy that tries to explain whole concept helps them write first function! Yes thats what i will do now.</p>

<p>To define a function we use <code>defn</code> (old lisp grinders will connect it with <code>def</code> yes!) that defines a function for us, so to it we need to supply name of function, or the symbol that this function will be bind to, arguments and body 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>
</pre></td><td class='code'><pre><code class='scheme'><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nf">defn</span> <span class="nv">multiply-by</span> <span class="err">[</span><span class="nv">base</span> <span class="nv">amount</span><span class="err">]</span> <span class="p">(</span><span class="nb">* </span><span class="nv">base</span> <span class="nv">amount</span><span class="p">))</span>
</span><span class='line'><span class="o">#</span><span class="ss">&#39;user/multiply-by</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nf">multiply-by</span> <span class="mi">5</span> <span class="mi">6</span><span class="p">)</span>
</span><span class='line'><span class="mi">30</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next we can invoke it eg. <code>(multiply-by 3 4)</code> its worth mentioning that you can use <code>-</code> in function names. But what is really happening ? this is two part thing. First we have <code>def</code> and second we have <code>fn</code> def binds symbol name with expression or value and <code>fn</code> return a function. So it is &ldquo;like lambda&rdquo; in fact it is lambda.</p>

<p>Lets go with example.</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='scheme'><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nf">fn</span> <span class="err">[</span><span class="nv">base</span><span class="err">]</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">base</span> <span class="mi">1</span><span class="p">)</span> <span class="p">)</span>
</span><span class='line'><span class="o">#</span><span class="nv">&lt;user$eval33$fn__34</span> <span class="nv">user$eval33$fn__34@f5bfdbd&gt;</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">((</span><span class="nf">fn</span> <span class="err">[</span><span class="nv">base</span><span class="err">]</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">base</span> <span class="mi">1</span><span class="p">)</span> <span class="p">)</span> <span class="mi">5</span><span class="p">)</span>
</span><span class='line'><span class="mi">6</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nf">def</span> <span class="nv">troll-symbol</span> <span class="mi">7</span><span class="p">)</span>
</span><span class='line'><span class="o">#</span><span class="ss">&#39;user/troll-symbol</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nf">troll-symbol</span><span class="p">)</span>
</span><span class='line'><span class="nv">ClassCastException</span> <span class="nv">java</span><span class="o">.</span><span class="nv">lang</span><span class="o">.</span><span class="nv">Long</span> <span class="nv">cannot</span> <span class="nv">be</span> <span class="nv">cast</span> <span class="nv">to</span> <span class="nv">clojure</span><span class="o">.</span><span class="nv">lang</span><span class="o">.</span><span class="nv">IFn</span>  <span class="nv">user/eval41</span> <span class="p">(</span><span class="nf">NO_SOURCE_FILE:25</span><span class="p">)</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">troll-symbol</span> <span class="p">((</span><span class="nf">fn</span> <span class="err">[</span><span class="nv">base</span><span class="err">]</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">base</span> <span class="mi">1</span><span class="p">)</span> <span class="p">)</span> <span class="mi">5</span><span class="p">)</span> <span class="p">)</span>
</span><span class='line'><span class="mi">13</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is slightly more complex but also should be easy. In first line we use <code>fn</code> to define function with one parameter called base this returns a function. In line two we do the same but this function is returned and passed and argument of 5 and evaluated to 6. In line three we define symbol troll-symbol with value of 7 we obviously can&rsquo;t evaluate a value so we get exception! It&rsquo;s all fine because its value. But we can use it like in last line, where we add to value of troll-symbol effect of evaluation of function that we defined passed with argument of 5.</p>

<p>Don&rsquo;t be afraid :D. All we did here is explained what <code>defn</code> do, basically defn is just composition of def and fn. Lets you specify symbol that function returned by fn is bound to.</p>

<p>Defn simply saves us key strokes :) Like using Emacs :D this can lead to RSI. =)</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='scheme'><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nf">def</span> <span class="nv">troll-symbol</span> <span class="mi">8</span><span class="p">)</span>
</span><span class='line'><span class="o">#</span><span class="ss">&#39;user/troll-symbol</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="nv">troll-symbol</span>
</span><span class='line'><span class="mi">8</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nf">def</span> <span class="nv">troll-foo</span> <span class="p">(</span><span class="nf">fn</span> <span class="err">[</span><span class="nv">base</span><span class="err">]</span> <span class="p">(</span><span class="nb">+ </span><span class="nv">base</span> <span class="mi">1</span><span class="p">)))</span>
</span><span class='line'><span class="o">#</span><span class="ss">&#39;user/troll-foo</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nf">troll-foo</span> <span class="mi">7</span><span class="p">)</span>
</span><span class='line'><span class="mi">8</span>
</span></code></pre></td></tr></table></div></figure>


<p>This exactly shows what happens when you use defn, you get function from fn and bind it to some symbol. That&rsquo;s it. Its good to have some play with all this brackets :) its fun! try defining something on your own :D</p>

<h2>Hello world</h2>

<p>So every tutorial has to have something like hello world program!
In my tutorial there is space for Hello World also :D</p>

<p>All you need to do is to create a file called <code>hello.clj</code> and type this in!</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='scheme'><span class='line'><span class="p">(</span><span class="nf">println</span> <span class="s">&quot;Hello World&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>When you will run it using <code>clj hello.clj</code> you will see something 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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>λ clj hello.clj
</span><span class='line'>Hello World
</span></code></pre></td></tr></table></div></figure>


<h2>Lambdas!</h2>

<p>So i mentioned something called <code>fn</code> for creating functions. But sometime you need a function ad&#8217;hoc eg. when you pass it to <code>map</code> function this is done by using different syntax.</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='scheme'><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="o">#</span><span class="p">(</span><span class="nv">+</span> <span class="mi">1</span> <span class="nv">%1</span><span class="p">)</span> <span class="mi">9</span><span class="p">)</span>
</span><span class='line'><span class="mi">10</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can still use old syntax but this is just faster to type. Remember that %1, %2 &hellip; refer to arguments that are passed to this lambda.</p>

<h1>Lists and Vectors</h1>

<p>Like in all programming languages we have lists and vectors. Those are built in. Syntax for List is simply <code>'()</code> eg. <code>'(1 2 3 4)</code> and for vector aka &ldquo;array&rdquo; its <code>[]</code> eg. <code>[1 2 3]</code>. NO COMAS!</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>
</pre></td><td class='code'><pre><code class='scheme'><span class='line'><span class="nv">user=&gt;</span> <span class="err">[</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span><span class="err">]</span>
</span><span class='line'><span class="err">[</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span><span class="err">]</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="o">&#39;</span><span class="p">(</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Lets do something useful with them! print them out naow!</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='scheme'><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">map </span><span class="o">#</span><span class="p">(</span><span class="nv">println</span> <span class="nv">%1</span><span class="p">)</span> <span class="o">&#39;</span><span class="p">(</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span><span class="p">))</span>
</span><span class='line'><span class="p">(</span><span class="mi">1</span>
</span><span class='line'><span class="mi">2</span>
</span><span class='line'><span class="nv">nil</span> <span class="mi">3</span>
</span><span class='line'><span class="nv">nil</span> <span class="mi">4</span>
</span><span class='line'><span class="nv">nil</span> <span class="mi">5</span>
</span><span class='line'><span class="nv">nil</span> <span class="nv">nil</span><span class="p">)</span>
</span><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nb">map </span><span class="o">#</span><span class="p">(</span><span class="nv">println</span> <span class="nv">%1</span><span class="p">)</span> <span class="err">[</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span><span class="err">]</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="mi">1</span>
</span><span class='line'><span class="mi">2</span>
</span><span class='line'><span class="mi">3</span>
</span><span class='line'><span class="mi">4</span>
</span><span class='line'><span class="mi">5</span>
</span><span class='line'><span class="nv">nil</span> <span class="nv">nil</span> <span class="nv">nil</span> <span class="nv">nil</span> <span class="nv">nil</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>It is map&hellip; so it is ugly because result from <code>println</code> is nil so we printed out contents of vector and list but its ugly.
Map is a high order function that takes function and list/array/sequance of arguments, applyies and evaluates funtion on each argument and stores results of this in a list that is returned at the end :) eg. <code>(map (+ %1 1) (1 2 3))</code> will give <code>[2 3 4]</code>.</p>

<p>Lets try to do it with doseq.</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='scheme'><span class='line'><span class="nv">user=&gt;</span> <span class="p">(</span><span class="nf">doseq</span> <span class="err">[</span><span class="nv">i</span> <span class="err">[</span><span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span><span class="err">]]</span> <span class="p">(</span><span class="nf">println</span> <span class="nv">i</span><span class="p">))</span>
</span><span class='line'><span class="mi">1</span>
</span><span class='line'><span class="mi">2</span>
</span><span class='line'><span class="mi">3</span>
</span><span class='line'><span class="nv">nil</span>
</span></code></pre></td></tr></table></div></figure>


<p>Works!</p>

<h3>Glossary</h3>

<p>REPL &ndash; Read Eval Print Loop. Simply language console in which you can run code and see results without typing code into file and running interpreter on it.</p>

<p>Lisp &ndash; On of the biggest language trolls or only language worth learning. Still can&rsquo;t decide</p>

<p>Jar &ndash; Java archive that contains code, can contain also jam. I like jam.</p>

<h1>Summary</h1>

<p>This is just the first part of the tutorial i hope you liked it, just covers the very basic of defining and evaluation functions.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using Tcpdump]]></title>
    <link href="http://no-fucking-idea.com/blog/2012/12/11/using-tcpdump/"/>
    <updated>2012-12-11T21:02:00+00:00</updated>
    <id>http://no-fucking-idea.com/blog/2012/12/11/using-tcpdump</id>
    <content type="html"><![CDATA[<p>We all love <code>tcpdump</code> :D So i found this tool useful while i was working on many things. Guess what ? it if very useful when working with network related stuff :D but its uneasy to grasp. This is my list of commands and options I use.</p>

<h2>Mac, Linux</h2>

<p>In this text i use <code>en0</code>, <code>en1</code> naming convention from OSX if you are linux user you should change it to eth0, eth1 w&hellip; check your network config using <code>ifconfig</code>. Basic knowledge required! =)</p>

<h1>Tcpdump</h1>

<p>Tcpdump is a tool that lets you dump network packets. This helps to debug networking issues, apis, communication or other stuff.</p>

<h2>Basic options</h2>

<p>Tcpdump basic options are</p>

<ul>
<li>-i &lsquo;interface&rsquo;  option lets you specify on which interface you will listen</li>
<li>-nS lets you see basic information about packets</li>
<li>-v, -vv, -vvv verbose mode</li>
<li>-s 1514 lets you specify how much data from packet is displayed. In this case you see whole packet</li>
<li>src, dst listening on specific things for source or destination</li>
<li>net eg. 192.168.0.1/24 listening on all stuff in some network.</li>
<li>port eg. port 3000 lets you listen on port</li>
</ul>


<h2>First example, getting info</h2>

<p>First thing that people do often is to listen to everything that bounces en1 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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo tcpdump -nS -i en1
</span></code></pre></td></tr></table></div></figure>


<p>This is obviously bad idea, only good thing about its that i lets you see that &ldquo;something is on&rdquo; so you will be able to say that this device is actually working.</p>

<h2>Example two, targeting host!</h2>

<p>If you want to see all traffic that goes to some host, so something that is useful you should add <code>host</code> option.</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='bash'><span class='line'>sudo tcpdump -nS -i en1 host www.facebook.com
</span></code></pre></td></tr></table></div></figure>


<p>This will let you see if there are some packets going to and from &lt;www.facebook.com>.</p>

<h2>Example three, give me stuff targeting some port!</h2>

<p>Lets say you want to see what generates curl to your own machine</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='bash'><span class='line'>sudo tcpdump -vvnS -i lo0 port 4000
</span></code></pre></td></tr></table></div></figure>


<p>and in other shell just type</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='bash'><span class='line'>curl http://localhost:4000
</span></code></pre></td></tr></table></div></figure>


<p>port is most fun option because it lets you see stuff that you are interested in.</p>

<h1>Summary</h1>

<p>Tcpdump is useful tool and i hope this text will let me not constantly forget its options.</p>

<p>Cheers!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Erlang: Digraph]]></title>
    <link href="http://no-fucking-idea.com/blog/2012/11/20/erlang-digraph/"/>
    <updated>2012-11-20T19:20:00+00:00</updated>
    <id>http://no-fucking-idea.com/blog/2012/11/20/erlang-digraph</id>
    <content type="html"><![CDATA[<ul>
<li>This is more &ldquo;note to self&rdquo; type of post rather than tutorial thing.</li>
<li>It&rsquo;s hard to write blog posts when you are trying to take over the world :)</li>
</ul>


<h1>Why ?</h1>

<p>Recently in &ldquo;professor Toons&rdquo; :)  computer club was a task that was ideal to solve as graph. It was one of this &ldquo;find path&rdquo; tasks. Yesterday just before going to bed I thought &ldquo;Why not solve it in Erlang&rdquo;.  And this are my thoughts about erlang digraph: library.</p>

<h2>Task</h2>

<p>First of all <a href="http://erldocs.com/">http://erldocs.com/</a> is the way to go when working with documentation.</p>

<p>Second &ldquo;the Task&rdquo;. It had two parts, first was to load xml file with songs and second was to build graph and find playlist between two songs having in mind that for each song following has to start with the same letter that first ended.</p>

<p>example.</p>

<p>if you have song list:
ABC
CBA
BAC
ACB
BBA</p>

<p>And you want to find playlist from ABC to BAC you will get ABC &ndash;> CBA &ndash;> ACB &ndash;> BAC. Easy</p>

<h2>Digraph</h2>

<p>Digraph API is quite nice but there are few things you have to have in mind.</p>

<ul>
<li>Digraph is imperative graph!</li>
<li>You need to pass vertices to get_path!</li>
<li>Graph with loads of edges can be quite big :D</li>
</ul>


<p>To create empty graph you call :new/0</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='erlang'><span class='line'><span class="nv">Graph</span> <span class="o">=</span> <span class="nn">digraph</span><span class="p">:</span><span class="n">new</span><span class="p">().</span>
</span></code></pre></td></tr></table></div></figure>


<p>To add node to graph you call :add_vertex/2</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='erlang'><span class='line'><span class="nv">Data</span> <span class="o">=</span> <span class="p">{</span><span class="nv">Value1</span><span class="p">,</span> <span class="nv">Value2</span><span class="p">,</span> <span class="nv">Value3</span><span class="p">},</span>
</span><span class='line'><span class="nn">digraph</span><span class="p">:</span><span class="n">add_vertex</span><span class="p">(</span><span class="nv">Graph</span><span class="p">,</span> <span class="nv">Data</span><span class="p">).</span>
</span></code></pre></td></tr></table></div></figure>


<p>To add edge to graph you call :add_edge/3</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='erlang'><span class='line'><span class="nn">digraph</span><span class="p">:</span><span class="n">add_edge</span><span class="p">(</span><span class="nv">Graph</span><span class="p">,</span> <span class="nv">VertexStart</span><span class="p">,</span> <span class="nv">VertexEnd</span><span class="p">).</span>
</span></code></pre></td></tr></table></div></figure>


<p>To get all vertices from graph (random order) :vertices/1</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='erlang'><span class='line'><span class="nv">Vertices</span> <span class="o">=</span> <span class="nn">digraph</span><span class="p">:</span><span class="n">vertices</span><span class="p">(</span><span class="nv">Graph</span><span class="p">).</span>
</span></code></pre></td></tr></table></div></figure>


<p>And finally to get path you just call :get_path/3</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='erlang'><span class='line'><span class="nv">Path</span> <span class="o">=</span> <span class="nn">digraph</span><span class="p">:</span><span class="n">get_path</span><span class="p">(</span><span class="nv">Graph</span><span class="p">,</span> <span class="nv">VertexStart</span><span class="p">,</span> <span class="nv">VertexEnd</span><span class="p">).</span>
</span></code></pre></td></tr></table></div></figure>


<p>This path is a list of vertices in order.  This API is just to remind me essential things about using the digraph from erlang stdlib. This graph is quite simple.</p>

<p>And for me for about 5000 vertices and a lot of edges it consumed 1.5 GB of ram. But when it was created it was super fast to use.</p>

<p>It was fun to play with.</p>

<h2>Quick summary</h2>

<p>I will make quick summary in form of short code sample!</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='erlang'><span class='line'><span class="nv">G</span> <span class="o">=</span> <span class="nn">digraph</span><span class="p">:</span><span class="n">new</span><span class="p">(),</span>
</span><span class='line'><span class="nv">V1</span> <span class="o">=</span> <span class="nn">digraph</span><span class="p">:</span><span class="n">add_vertex</span><span class="p">(</span><span class="nv">G</span><span class="p">,</span> <span class="s">&quot;Andrychow&quot;</span><span class="p">),</span>
</span><span class='line'><span class="nv">V2</span> <span class="o">=</span> <span class="nn">digraph</span><span class="p">:</span><span class="n">add_vertex</span><span class="p">(</span><span class="nv">G</span><span class="p">,</span> <span class="s">&quot;Krakow&quot;</span><span class="p">),</span>
</span><span class='line'><span class="nv">V3</span> <span class="o">=</span> <span class="nn">digraph</span><span class="p">:</span><span class="n">add_vertex</span><span class="p">(</span><span class="nv">G</span><span class="p">,</span> <span class="s">&quot;London&quot;</span><span class="p">),</span>
</span><span class='line'><span class="nv">V4</span> <span class="o">=</span> <span class="nn">digraph</span><span class="p">:</span><span class="n">add_vertex</span><span class="p">(</span><span class="nv">G</span><span class="p">,</span> <span class="s">&quot;Warsaw&quot;</span><span class="p">),</span>
</span><span class='line'><span class="nv">V5</span> <span class="o">=</span> <span class="nn">digraph</span><span class="p">:</span><span class="n">add_vertex</span><span class="p">(</span><span class="nv">G</span><span class="p">,</span> <span class="s">&quot;Paris&quot;</span><span class="p">),</span>
</span><span class='line'>
</span><span class='line'><span class="nn">digraph</span><span class="p">:</span><span class="n">add_edge</span><span class="p">(</span><span class="nv">G</span><span class="p">,</span> <span class="nv">V1</span><span class="p">,</span> <span class="nv">V2</span><span class="p">),</span>
</span><span class='line'><span class="nn">digraph</span><span class="p">:</span><span class="n">add_edge</span><span class="p">(</span><span class="nv">G</span><span class="p">,</span> <span class="nv">V2</span><span class="p">,</span> <span class="nv">V4</span><span class="p">),</span>
</span><span class='line'><span class="nn">digraph</span><span class="p">:</span><span class="n">add_edge</span><span class="p">(</span><span class="nv">G</span><span class="p">,</span> <span class="nv">V2</span><span class="p">,</span> <span class="nv">V5</span><span class="p">),</span>
</span><span class='line'><span class="nn">digraph</span><span class="p">:</span><span class="n">add_edge</span><span class="p">(</span><span class="nv">G</span><span class="p">,</span> <span class="nv">V2</span><span class="p">,</span> <span class="nv">V3</span><span class="p">),</span>
</span><span class='line'><span class="nn">digraph</span><span class="p">:</span><span class="n">add_edge</span><span class="p">(</span><span class="nv">G</span><span class="p">,</span> <span class="nv">V3</span><span class="p">,</span> <span class="nv">V4</span><span class="p">),</span>
</span><span class='line'><span class="nn">digraph</span><span class="p">:</span><span class="n">add_edge</span><span class="p">(</span><span class="nv">G</span><span class="p">,</span> <span class="nv">V3</span><span class="p">,</span> <span class="nv">V2</span><span class="p">),</span>
</span><span class='line'><span class="nn">digraph</span><span class="p">:</span><span class="n">add_edge</span><span class="p">(</span><span class="nv">G</span><span class="p">,</span> <span class="nv">V2</span><span class="p">,</span> <span class="nv">V1</span><span class="p">),</span>
</span><span class='line'>
</span><span class='line'><span class="nv">PathHome</span> <span class="o">=</span> <span class="nn">digraph</span><span class="p">:</span><span class="n">get_path</span><span class="p">(</span><span class="nv">G</span><span class="p">,</span> <span class="nv">V3</span><span class="p">,</span> <span class="nv">V1</span><span class="p">).</span>
</span></code></pre></td></tr></table></div></figure>


<p>This gives you back <code>["London","Krakow","Andrychow"]</code> so Win! we are at home!</p>

<h1>Summary</h1>

<p>It was fun to play a bit with digraph before going to bed. There is a tone of things i did not use and also look into digraph_utils for even more things :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Building Up Queue System]]></title>
    <link href="http://no-fucking-idea.com/blog/2012/10/14/building-up-queue-system/"/>
    <updated>2012-10-14T21:16:00+01:00</updated>
    <id>http://no-fucking-idea.com/blog/2012/10/14/building-up-queue-system</id>
    <content type="html"><![CDATA[<p>Queue = FIFO, First in, First Out.</p>

<p>Many people use adds queue system to their products. Some of them do legendary things with it to make it extremely unreliable products :). Most of this solutions may seem trolling but they actually exists in some products.</p>

<h1>Rolling out own queue system</h1>

<p>First thing often people do is rolling out their own queue system. Is it bad ? no! it is great as long as you don&rsquo;t have constraint that data can never be lost!</p>

<h2>Can lose data in queue</h2>

<p>If you use queue just to communicate between processes you can use something like unix name pipe. In reality this is just a file. Actually in Unix everything is a file and this is best ever design (if you neglect it you should die!).</p>

<figure class='code'><figcaption><span>name_pipe</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='bash'><span class='line'>mkfifo oldschool_pipe
</span><span class='line'>gzip -9 -c &lt; oldschool_pipe &gt; out.gz &amp;
</span></code></pre></td></tr></table></div></figure>


<p>And next you can use it to push stuff into it eg.</p>

<figure class='code'><figcaption><span>example</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='bash'><span class='line'>eacho <span class="s2">&quot;oldschoolllzzzz!!!!&quot;</span> &gt; oldschool_pipe
</span></code></pre></td></tr></table></div></figure>


<p>but this is shell example, you could create it and just read/write it in your processes.</p>

<p>That is cool. And this is the last point where we will not see problems :)))</p>

<h2>But we are programmers!</h2>

<p>Yes we are programmers and most of us are young and full of energy nobody remembers 70&#8217; i was born in 85 so i technically would be quite mad if i would remember 70&#8217;.</p>

<p>So how we approach problems so of us would create inside of their code queue.</p>

<p>In C it would be simply array wrapped with mutex&#8217;es but this is unreliable and its long to write and and and&hellip;</p>

<p>So what people do ? They try use READY products.</p>

<h2>First big mistake</h2>

<p>Use key-value store as queue.
&ndash; Lets serialize array into XYZ and set it into key.
&ndash; That&rsquo;s good idea! Only one thing will write to it!</p>

<p>WRONG!</p>

<p>Such an assumption will provide you with insane amount of carnage in future. And even if i know &ldquo;agile says XYZ now&rdquo;&hellip; actually &ldquo;agile&rdquo; don&rsquo;t say &ldquo;take drugs an yolo because tomorrow you can die&rdquo; but &ldquo;TAKE RISKY THINGS FIRST&rdquo; and this is risky thing. Should be implemented well.</p>

<p>What happens in this case ? Someone gets a great idea that product should scale adds another daemon and this f*cks up queue you lose messages.</p>

<p>Some dbms can handle this problem, but wrapping it into transaction will not solve the problem.</p>

<p>Scenario is:
Process a)</p>

<ul>
<li>reads queue</li>
<li>process is (makes a pop or push)</li>
<li>saves the serialised queue</li>
</ul>


<p>Now imagine process b) does the same. Everything is blazing fast and you get f*cked.</p>

<p>So DB system must know context. This is where RIAK shines, you get vector clocks and you know that you are f*cked. You can react but in 99% you don&rsquo;t know how to resolve this issue but at least you would know&hellip; but some specialsits can disable this because handling vector clocks is a pain and you can get PERFORMANCE BOOST :))).</p>

<h2>Redis list as queue</h2>

<p>Redis is great tool to build a lot of stuff. And it has built in data structures. I think this is ground breaking because previous solutions like RDBMS most commonly use or other NoSQL solutions. Redis is great how to make queue within redis ?</p>

<figure class='code'><figcaption><span>queue</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='bash'><span class='line'>lpush queue_name value -&gt; push
</span><span class='line'>rpop queue_name -&gt; pop
</span></code></pre></td></tr></table></div></figure>


<p>example like this</p>

<figure class='code'><figcaption><span>redis_example</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='bash'><span class='line'>redis 127.0.0.1:6379&gt; lpush queue 1
</span><span class='line'><span class="o">(</span>integer<span class="o">)</span> 1
</span><span class='line'>redis 127.0.0.1:6379&gt; lpush queue 2
</span><span class='line'><span class="o">(</span>integer<span class="o">)</span> 2
</span><span class='line'>redis 127.0.0.1:6379&gt; lpush queue 7
</span><span class='line'><span class="o">(</span>integer<span class="o">)</span> 3
</span><span class='line'>redis 127.0.0.1:6379&gt; rpop queue
</span><span class='line'><span class="s2">&quot;1&quot;</span>
</span><span class='line'>redis 127.0.0.1:6379&gt; rpop queue
</span><span class='line'><span class="s2">&quot;2&quot;</span>
</span><span class='line'>redis 127.0.0.1:6379&gt; rpop queue
</span><span class='line'><span class="s2">&quot;7&quot;</span>
</span><span class='line'>redis 127.0.0.1:6379&gt; rpop queue
</span><span class='line'><span class="o">(</span>nil<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Cool ! Works great and any process can access it in atomic way isn&rsquo;t it great ? best thing ever ?!</p>

<p>Actually it is very good. But there is one thing you just missed! Redis do a flush of keys every 60 sec if 10k keys did change by default. What does it mean ? You can get screwed if redis will instantly die!</p>

<p>How to fix this ? Visit <a href="http://redis.io/topics/persistence">http://redis.io/topics/persistence</a> and see section &ldquo;Append-only file&rdquo;</p>

<figure class='code'><figcaption><span>redis_config.fix</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='bash'><span class='line'>- appendonly no
</span><span class='line'>+ appendonly yes
</span></code></pre></td></tr></table></div></figure>


<p>Man you just did it, you lost some performance but you did it. Who would knew ? You just saved the world.
How much we just cut performance ? &ldquo;fsync every time a new command is appended to the AOF. Very very slow, very safe.&rdquo; that is Ouch!  Your boss could be unhappy even if this solution is actually the best, most simple and durable idea.</p>

<h2>Can&rsquo;t lose any data! Redis plus Mysql/Postgres</h2>

<p>Persistence daemons worked out a new combo. You store each element of the queue like key-value store in SQL RDBMS and put its id on the queue in redis next you pop it up from the queue in redis process and updates its status in SQL RDBM. This is not so bad but it kills performance more than just turning on &ldquo;appendonly yes&rdquo;. Also it makes things hell more complicated and forces you to do updates in both system.</p>

<p>Is this system cure for cancer ? No! You have to have very good queue fail recovery / startup system. Simply empty list and make query</p>

<figure class='code'><figcaption><span>startup</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='bash'><span class='line'><span class="k">select</span> * <span class="nb">jobs </span>where <span class="k">done</span> <span class="o">=</span> <span class="nb">false</span>
</span></code></pre></td></tr></table></div></figure>


<p>next you have to clean redis queue and push new data. Is this safe ? No you don&rsquo;t know if few last jobs did finish or not. Eg. Mysql got f*cked but messages got processed. Yes this adds a lot more complications.</p>

<p>Also with this solution index on ID column makes its fast to make a select but slow to add or remove. And you want your queue to perform and yes mysql will do fsync.</p>

<h1>Why not MongoDB</h1>

<p>You can&rsquo;t atomically pop stuff. Don&rsquo;t think about pop/push/pushall on array in document!
If you will have this idea check my gist <a href="https://gist.github.com/2071805">https://gist.github.com/2071805</a> run it and see what happens :) what you get back.</p>

<h1>RabbitMQ / ZeroMQ</h1>

<p>When you will visit ZeroMQ page you will see</p>

<figure class='code'><figcaption><span>intro</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='bash'><span class='line'>ØMQ <span class="se">\z</span>eromq<span class="se">\:</span>
</span><span class='line'> Ø  The socket library that acts as a concurrency framework.
</span><span class='line'> Ø  Faster than TCP, <span class="k">for </span>clustered products and supercomputing.
</span><span class='line'> Ø  Carries messages across inproc, IPC, TCP, and multicast.
</span><span class='line'> Ø  Connect N-to-N via fanout, pubsub, pipeline, request-reply.
</span><span class='line'> Ø  Asynch I/O <span class="k">for </span>scalable multicore message-passing apps.
</span><span class='line'> Ø  Large and active open <span class="nb">source </span>community.
</span><span class='line'> Ø  30+ languages including C, C++, Java, .NET, Python.
</span><span class='line'> Ø  Most OSes including Linux, Windows, OS X.
</span><span class='line'> Ø  LGPL free software with full commercial support from iMatix.
</span></code></pre></td></tr></table></div></figure>


<p>Nothing about consistency FASTERN THAN (this has to be good) TCP but can use TCP (i wonder if it can be faster than TCP even using TCP /trollface). Anyway you see a lot of stuff. I started some search on zeromq losing data and what i found <a href="http://zguide.zeromq.org/page:all#Missing-Message-Problem-Solver">http://zguide.zeromq.org/page:all#Missing-Message-Problem-Solver</a> a nice image.</p>

<p><a href="https://github.com/imatix/zguide/raw/master/images/fig9.png">Problem resolution diagram</a></p>

<p>Big thing :)</p>

<p>If you will visit rabbitmq page <a href="http://www.rabbitmq.com/">http://www.rabbitmq.com/</a> you will see a lot of nice things like tutorial etc. Page is nice and has useful knowledge. Both solutions have client in Erlang (massive plus) and other languages. And even while setting up whole thing may be a pain i think this is a solid option both ZeromMQ and RabbitMQ.</p>

<h1>Why do we use Queues ?</h1>

<p>We use them to absorb traffic of messages and process their content by eg. workers / handlers etc. If we will make it unprocessable by more than one worker we ain&rsquo;t doing our job properly.</p>

<p>What makes things hard.</p>

<ul>
<li>Locks if we use them, they will bite you back</li>
<li>Many points where we store same data in different way</li>
<li>Yes, locks will bite you back</li>
</ul>


<h1>So what is the best way to go ?</h1>

<p>I think the best way to go is just to start a new movement called Unix Archeology because we seems to be reinventing the wheel too many times. But really</p>

<ul>
<li>Make a list of solution</li>
<li>Ask your self if your idea is really good</li>
</ul>


<p>I&rsquo;m 100% sure that storing queues as serialized lists in memcached or keeping them as table in mysql/postgres and making loads of funky stuff to keep it running is not the way to go. It can seem like a good idea at start but it is not. Named pipe in file system can be better.</p>

<p>Loads of things can be brilliant queue choices eg. Redis, ZeroMQ, RabbitMQ or even named pipes but not serialized array in key-value store.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Redis List Internals]]></title>
    <link href="http://no-fucking-idea.com/blog/2012/09/26/redis-list-internals/"/>
    <updated>2012-09-26T21:59:00+01:00</updated>
    <id>http://no-fucking-idea.com/blog/2012/09/26/redis-list-internals</id>
    <content type="html"><![CDATA[<p>Today i spoted on twitter this:</p>

<p>@antirez: &ldquo;The Redis community is composed of 99% of people that, really, know their stuff, know the Redis internals and behaviour, and are * great *.&rdquo;</p>

<p>@shanley: &ldquo;@antirez I&rsquo;ve never met a technical community where 99% of them were familiar with the internals of anything. Did you mean 9%?&rdquo;</p>

<p>This sparked in my mind very quick review of the topics that we talk about in work and i realised that we talk about a lot  about internals of redis and a bit about riak but this is different story :).</p>

<h1>Spike</h1>

<p>I just wanted to write a short post about first thing i ever picked when i was looking into internals of Redis. It is List :D i love lists.</p>

<p>So what i did was opening again github and picking up list header file to re-read.</p>

<p><a href="https://github.com/antirez/redis/blob/d310fbedabd3101505b694f5c25a2e48480a3c2b/src/adlist.h">https://github.com/antirez/redis/blob/d310fbedabd3101505b694f5c25a2e48480a3c2b/src/adlist.h</a></p>

<p>First thing that you notice is that code is simple and whole thing is implemented in 93 lines of header and 341 lines .c file.  (with license etc lol).</p>

<h1>Structure of List</h1>

<p>In general List is just degenerated Tree. In Redis structure of it is simple. Whole description of the list is simply</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='c'><span class='line'><span class="k">typedef</span> <span class="k">struct</span> <span class="n">listNode</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">struct</span> <span class="n">listNode</span> <span class="o">*</span><span class="n">prev</span><span class="p">;</span>
</span><span class='line'>    <span class="k">struct</span> <span class="n">listNode</span> <span class="o">*</span><span class="n">next</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">void</span> <span class="o">*</span><span class="n">value</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span> <span class="n">listNode</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">typedef</span> <span class="k">struct</span> <span class="n">list</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">listNode</span> <span class="o">*</span><span class="n">head</span><span class="p">;</span>
</span><span class='line'>    <span class="n">listNode</span> <span class="o">*</span><span class="n">tail</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">void</span> <span class="o">*</span><span class="p">(</span><span class="o">*</span><span class="n">dup</span><span class="p">)(</span><span class="kt">void</span> <span class="o">*</span><span class="n">ptr</span><span class="p">);</span>
</span><span class='line'>    <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">free</span><span class="p">)(</span><span class="kt">void</span> <span class="o">*</span><span class="n">ptr</span><span class="p">);</span>
</span><span class='line'>    <span class="kt">int</span> <span class="p">(</span><span class="o">*</span><span class="n">match</span><span class="p">)(</span><span class="kt">void</span> <span class="o">*</span><span class="n">ptr</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">key</span><span class="p">);</span>
</span><span class='line'>    <span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">len</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span> <span class="n">list</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>this knowledge lets us count how much space this will take on the heap and compare it with eg. set if we really need to. (list is imho most memory effective structure)</p>

<p>List iterator is important so its also worth having a peek at even if this is just internal implementation.</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>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="k">typedef</span> <span class="k">struct</span> <span class="n">listIter</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">listNode</span> <span class="o">*</span><span class="n">next</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">int</span> <span class="n">direction</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span> <span class="n">listIter</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>with this we can take a peek into .c file and check how you get iterator.</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='c'><span class='line'><span class="n">listIter</span> <span class="o">*</span><span class="n">listGetIterator</span><span class="p">(</span><span class="n">list</span> <span class="o">*</span><span class="n">list</span><span class="p">,</span> <span class="kt">int</span> <span class="n">direction</span><span class="p">){</span>
</span><span class='line'>    <span class="n">listIter</span> <span class="o">*</span><span class="n">iter</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">((</span><span class="n">iter</span> <span class="o">=</span> <span class="n">zmalloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="o">*</span><span class="n">iter</span><span class="p">)))</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="k">return</span> <span class="nb">NULL</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">direction</span> <span class="o">==</span> <span class="n">AL_START_HEAD</span><span class="p">)</span>
</span><span class='line'>        <span class="n">iter</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">list</span><span class="o">-&gt;</span><span class="n">head</span><span class="p">;</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>        <span class="n">iter</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">list</span><span class="o">-&gt;</span><span class="n">tail</span><span class="p">;</span>
</span><span class='line'>    <span class="n">iter</span><span class="o">-&gt;</span><span class="n">direction</span> <span class="o">=</span> <span class="n">direction</span><span class="p">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">iter</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And see that even if AL_START_HEAD is defined as 0 and AL_START_TAIL as 1 if we will use direction of 5 (lol) we will get tail :D I know that i&rsquo;m bikesheding now.</p>

<p>Even without going any deeper you have a feeling how this works. Double linked list with (void<em>) value. First thing i thought today was (this was stupid) &ldquo;Wow why this is (void </em>) and not (char <em>) this would let compiler better type check it while compilation&rdquo; but antirez wrote to me &ldquo;@jakuboboza hint: grep listCreate </em>.c&rdquo; and that was the hint i needed. (void *) is more generic but list is used in many places in redis internals and i did not thought about it (lol)</p>

<figure class='code'><figcaption><span>grep listCreate *.c</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='bash'><span class='line'>λ grep listCreate *.c
</span><span class='line'>adlist.c:list *listCreate<span class="o">(</span>void<span class="o">)</span>
</span><span class='line'>adlist.c:    <span class="k">if</span> <span class="o">((</span><span class="nv">copy</span> <span class="o">=</span> listCreate<span class="o">())</span> <span class="o">==</span> NULL<span class="o">)</span>
</span><span class='line'>aof.c:    server.aof_rewrite_buf_blocks <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>aof.c:    c-&gt;reply <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>aof.c:    c-&gt;watched_keys <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>bio.c:        bio_jobs<span class="o">[</span>j<span class="o">]</span> <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>multi.c:        <span class="nv">clients</span> <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>networking.c:    c-&gt;reply <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>networking.c:    c-&gt;io_keys <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>networking.c:    c-&gt;watched_keys <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>networking.c:    c-&gt;pubsub_patterns <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>object.c:    list *l <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>pubsub.c:            <span class="nv">clients</span> <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>redis-benchmark.c:    config.clients <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>redis.c:    server.clients <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>redis.c:    server.clients_to_close <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>redis.c:    server.slaves <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>redis.c:    server.monitors <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>redis.c:    server.unblocked_clients <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>redis.c:    server.ready_keys <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>redis.c:    server.pubsub_patterns <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>sentinel.c:    sentinel.scripts_queue <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>slowlog.c:    server.slowlog <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>sort.c:    <span class="nv">operations</span> <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>t_list.c:        list *l <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>t_list.c:            <span class="nv">l</span> <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>t_list.c:        server.ready_keys <span class="o">=</span> listCreate<span class="o">()</span>;
</span><span class='line'>ziplist.c:            <span class="nv">ref</span> <span class="o">=</span> listCreate<span class="o">()</span>;
</span></code></pre></td></tr></table></div></figure>


<p>A lot of places :) lol.</p>

<p>In adlist.c we can also check how the list is created</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>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="n">list</span> <span class="o">*</span><span class="nf">listCreate</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">struct</span> <span class="n">list</span> <span class="o">*</span><span class="n">list</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">((</span><span class="n">list</span> <span class="o">=</span> <span class="n">zmalloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="o">*</span><span class="n">list</span><span class="p">)))</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span>
</span><span class='line'>        <span class="k">return</span> <span class="nb">NULL</span><span class="p">;</span>
</span><span class='line'>    <span class="n">list</span><span class="o">-&gt;</span><span class="n">head</span> <span class="o">=</span> <span class="n">list</span><span class="o">-&gt;</span><span class="n">tail</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span><span class='line'>    <span class="n">list</span><span class="o">-&gt;</span><span class="n">len</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">-&gt;</span><span class="n">dup</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span><span class='line'>    <span class="n">list</span><span class="o">-&gt;</span><span class="n">free</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span><span class='line'>    <span class="n">list</span><span class="o">-&gt;</span><span class="n">match</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">list</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is just academic example :D  I love it. This code is easy to understand and just pleasure to read.</p>

<h1>why to even bother talking about internals ?</h1>

<p>It is important to talk about them because if you read in documentation that</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='bash'><span class='line'>lpush is O<span class="o">(</span>1<span class="o">)</span>
</span><span class='line'>rpush is O<span class="o">(</span>1<span class="o">)</span>
</span><span class='line'>lpop is O<span class="o">(</span>1<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>you really want to check this out to get better understanding how stuff works under the hood. Even if this is trivial example.</p>

<p>It is worth talking about internals of tools that you use, you learn a lot and i think its truth what antirez said, this community is great!</p>

<h1>Next</h1>

<p>Thing to view is suggested by antires Dict!</p>

<p>antirez: &ldquo;@jakuboboza it&rsquo;s definitely a very simple implementation! Probably our most &#8220;on steroids&rdquo; implementation of data structures is dict.c&#8221;</p>

<p>^_____^</p>
]]></content>
  </entry>
  
</feed>
