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

  <title><![CDATA[No Fucking Idea]]></title>
  <link href="http://no-fucking-idea.com/atom.xml" rel="self"/>
  <link href="http://no-fucking-idea.com/"/>
  <updated>2013-02-21T22:01:45+00: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['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&#8217;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 &#8220;this is simple&#8221;. 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 &#8220;if&#8221; 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&#8230;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&#8230; 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 &#8220;ify&#8221; language. My language starts like this&#8230;</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<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&#8230; 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 &#8220;prototype&#8221; 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&#8230; 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&#8217;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&#8217;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&#8217;t wan to do some initial design decisions before start they just want to have product and &#8220;we will think about it later&#8221;. This from business point of view is ok but this &#8220;later&#8221; 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&#8230; 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&#8217;m preparing to upgrade my old humidity/temperature meeeeeter solution with raspberry pi. While it is easy to read stuff in C i don&#8217;t want to build whole app in C because i know how this can end when you are 1500 - 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 &#8220;check stuff&#8221; 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 &#8220;pong&#8221; on &#8220;ping&#8221; 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 &#8220;emu@raspberrypi&#8221; and this is actually process that runs so if you will not remember about freeing memory you will fast learn what means &#8220;memory leak&#8221;.</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&#8230; 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&#8230;</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</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 &#8220;cookie&#8221; now &#8230; i said finally&#8230; 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 &#8220;Midway&#8221; 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="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="p">{</span><span class="n">ok</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 &#8220;struct&#8221; symbol for json &#8220;{}&#8221; 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&#8230;</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 &#8216;struct&#8217; 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&#8217;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 &#8220;hacker&#8221; effort. That is amazing! Suddenly I thought that what we all use now is 50 years old technology. Nothing new. Things that are &#8220;new&#8221; today like nodejs &#8220;the new black&#8221; are actually technology that is as old as lisp. Maybe we should take a look at past and think for a moment&#8230;  That is the things i would like to rant about today.</p>

<h1>New Discoveries</h1>

<p>&#8220;Theory is the thing we all skip and later on regret skipping&#8221; (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 &#8220;new discoveries&#8221; or &#8220;rediscoveries&#8221; of some solutions. I have a thesis that &#8220;if something is simple it will get its niche&#8221; (did it again). This would explain new hipe for Nodejs &lt;nodejs.org>. I don&#8217;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&#8217;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&#8230;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 &#8220;non blocking&#8221;.</p>

<h4>Achieving Non-blocking</h4>

<p>To do this we need to have a way of &#8220;wait until will happen and if it happen&#8217;ed trigger event&#8221; 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&#8230; its not async, not real async. Real async was also implemented in 80&#8217;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&#8217;s very handy and was implemented with big success in QT library. Does it has flaws ? basically same as event loop solutions. It&#8217;s a way of doing &#8220;message passing&#8221; 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&#8230; 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&#8230; 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&#8230;</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&#8230; also implemented in 80&#8217;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&#8217;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&#8217;t know I don&#8217;t work for google and I&#8217;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&#8230; 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&#8230; AND HE WROTE MAP REDUCE PAPER.</p>

<p>They did not invented anything really new, they just approached problem simple. We can&#8217;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&#8217;s. Now someone took map and sequence of data that is exclusive and don&#8217;t depend on each other and said &#8220;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 ?&#8221; and map reduce was born. Concept is dead simple. But its nothing new! I&#8217;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&#8230; i bet google has technology archeology department :D</p>

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

<p>I&#8217;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&#8217;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 &#8220;this had to be already invented&#8221;.  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&#8230; still some people don&#8217;t even think about them. This is dull example but basic data structures should be well known by everybody still&#8230; things that freezes blood in your veins happens.</p>

<p>Building DSL and interpreters is good fun, its not easy often I&#8217;m still learning a lot but this should not be &#8220;devil&#8221; 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 &#8220;Stuff&#8221;. 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 - 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&#8230;) 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 - 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 - 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 - The Art of C++  by Herbert Schildt</li>
</ul>


<p>Really good book, also common pattern in books that i read&#8230; 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&#8230; i recon we will hear about them in industry after our deaths ;/ next week apocalypse ;/. Yes there are tones of things to rediscover&#8230; and it&#8217;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&#8230;. another event loop implementation is not.</p>

<p>Sorry for ranting that much :D&#8230; 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 &#8220;trips&#8221; to Lisp world but i was always stroked by amount of half finished vm&#8217;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&#8217;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&#8230;</p>

<h2>Lisp Hacker&#8217;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&#8230; 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 &#8216;ready&#8217; means that 8/10 runs stuff passes, some crash and half of features don&#8217;t even exits so called &#8220;junk features&#8221; ). So his dialect gets better than Haskell lazy evaluation, better etc&#8230; 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 &#8220;getting shit done&#8221; :D. If you don&#8217;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 &#8220;get shit done&#8221;. It support concurrency (with STM - 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 &#8220;Open Source Magazine&#8221; 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 &#8220;clojure&#8221;</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 &#8220;build from source instructions&#8221;</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&#8217;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&#8217;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&#8217;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&#8230;. 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 &#8220;like lambda&#8221; 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&#8217;t evaluate a value so we get exception! It&#8217;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&#8217;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&#8217;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 &#8230; 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 &#8220;array&#8221; 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&#8230; 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 - 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 - On of the biggest language trolls or only language worth learning. Still can&#8217;t decide</p>

<p>Jar - 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&#8230; 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 &#8216;interface&#8217;  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 &#8220;something is on&#8221; 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 &#8220;note to self&#8221; type of post rather than tutorial thing.</li>
<li>It&#8217;s hard to write blog posts when you are trying to take over the world :)</li>
</ul>


<h1>Why ?</h1>

<p>Recently in &#8220;professor Toons&#8221; :)  computer club was a task that was ideal to solve as graph. It was one of this &#8220;find path&#8221; tasks. Yesterday just before going to bed I thought &#8220;Why not solve it in Erlang&#8221;.  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 &#8220;the Task&#8221;. 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 -> CBA -> ACB -> 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&#8217;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&#8230;</p>

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

<h2>First big mistake</h2>

<p>Use key-value store as queue.
- Lets serialize array into XYZ and set it into key.
- That&#8217;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 &#8220;agile says XYZ now&#8221;&#8230; actually &#8220;agile&#8221; don&#8217;t say &#8220;take drugs an yolo because tomorrow you can die&#8221; but &#8220;TAKE RISKY THINGS FIRST&#8221; 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&#8217;t know how to resolve this issue but at least you would know&#8230; 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&#8217;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 &#8220;Append-only file&#8221;</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 ? &#8220;fsync every time a new command is appended to the AOF. Very very slow, very safe.&#8221; that is Ouch!  Your boss could be unhappy even if this solution is actually the best, most simple and durable idea.</p>

<h2>Can&#8217;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 &#8220;appendonly yes&#8221;. 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&#8217;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&#8217;t atomically pop stuff. Don&#8217;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&#8217;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&#8217;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: &#8220;The Redis community is composed of 99% of people that, really, know their stuff, know the Redis internals and behaviour, and are * great *.&#8221;</p>

<p>@shanley: &#8220;@antirez I&#8217;ve never met a technical community where 99% of them were familiar with the internals of anything. Did you mean 9%?&#8221;</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&#8217;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) &#8220;Wow why this is (void </em>) and not (char <em>) this would let compiler better type check it while compilation&#8221; but antirez wrote to me &#8220;@jakuboboza hint: grep listCreate </em>.c&#8221; 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: &#8220;@jakuboboza it&#8217;s definitely a very simple implementation! Probably our most &#8220;on steroids&#8221; implementation of data structures is dict.c&#8221;</p>

<p>^_____^</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Failover Redis setup with Sentinel]]></title>
    <link href="http://no-fucking-idea.com/blog/2012/09/26/failover-redis-setup-with-sentinel/"/>
    <updated>2012-09-26T20:54:00+01:00</updated>
    <id>http://no-fucking-idea.com/blog/2012/09/26/failover-redis-setup-with-sentinel</id>
    <content type="html"><![CDATA[<p>Long time nothing new, recently i started my own company LambdaCu.be and I was massively busy. If you want to hire me ping me at <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#x3a;&#107;&#117;&#98;&#97;&#64;&#108;&#x61;&#x6d;&#x62;&#100;&#x61;&#99;&#117;&#x2e;&#98;&#x65;">&#x6b;&#x75;&#x62;&#x61;&#64;&#x6c;&#97;&#109;&#98;&#100;&#97;&#99;&#117;&#x2e;&#x62;&#101;</a> =)</p>

<p>I have in pipeline a lot texts about lua scripting in redis and using it to build some tools but can&#8217;t find time to finish this stuff ;/.</p>

<h1>Auto failover</h1>

<p>Every database wants to have auto failover mechanism. This is a great marketing pitch! haha :) Main thing about is that one of your server can go down and you still are operating as normal and when he will go up again everything is fine.. unless your routing server will go down :D ofc.</p>

<h1>2.4.16 / 2.6</h1>

<p>Since Redis 2.4 and 2.6 there was this idea of adding it. Antirez wrote a draft spec for it and implemented it as experimental feature. It is really well described here <a href="http://redis.io/topics/sentinel">http://redis.io/topics/sentinel</a> so i will just write a short note how did i setup it and how does it feel.</p>

<h1>Setup</h1>

<p>While preparing to this demo i did everything on master 0ee3f05518e081640c1c6f9ae52c3a414f0feaceso what i did was simply start &#8220;master&#8221; and &#8220;replica servers&#8221; with this configs
(ofc turn daemonize to yes in production lol)</p>

<p>Standard Master setup with default script on port 6379 and replica with</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>daemonize no
</span><span class='line'>timeout 0
</span><span class='line'>loglevel notice
</span><span class='line'>logfile stdout
</span><span class='line'>databases 16
</span><span class='line'>save 900 1
</span><span class='line'>save 300 10
</span><span class='line'>save 60 10000
</span><span class='line'>stop-writes-on-bgsave-error yes
</span><span class='line'>rdbcompression yes
</span><span class='line'>rdbchecksum yes
</span><span class='line'>dbfilename dump.rdb
</span><span class='line'>dir ./replica_dir
</span><span class='line'>slave-serve-stale-data yes
</span><span class='line'>slave-read-only yes
</span><span class='line'>appendonly no
</span><span class='line'>appendfsync everysec
</span><span class='line'>no-appendfsync-on-rewrite no
</span><span class='line'>auto-aof-rewrite-percentage 100
</span><span class='line'>auto-aof-rewrite-min-size 64mb
</span><span class='line'>lua-time-limit 5000
</span><span class='line'>
</span><span class='line'>pidfile /var/run/redis-replica-7789.pid
</span><span class='line'>port 7789
</span><span class='line'><span class="c"># replication config</span>
</span><span class='line'>slaveof 127.0.0.1 6379
</span><span class='line'>
</span><span class='line'>slowlog-log-slower-than 10000
</span><span class='line'>slowlog-max-len 1024
</span><span class='line'><span class="nb">hash</span>-max-ziplist-entries 512
</span><span class='line'><span class="nb">hash</span>-max-ziplist-value 64
</span><span class='line'>list-max-ziplist-entries 512
</span><span class='line'>list-max-ziplist-value 64
</span><span class='line'><span class="nb">set</span>-max-intset-entries 512
</span><span class='line'>zset-max-ziplist-entries 128
</span><span class='line'>zset-max-ziplist-value 64
</span><span class='line'>activerehashing yes
</span><span class='line'>client-output-buffer-limit normal 0 0 0
</span><span class='line'>client-output-buffer-limit slave 256mb 64mb 60
</span><span class='line'>client-output-buffer-limit pubsub 32mb 8mb 60
</span></code></pre></td></tr></table></div></figure>


<p>So i had master and slave running :) that was cool next thing i did was! configure and turn on the sentinel!</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='bash'><span class='line'>sentinel monitor mymaster 127.0.0.1 6379 1
</span><span class='line'>sentinel down-after-milliseconds mymaster 60000
</span><span class='line'>sentinel failover-timeout mymaster 900000
</span><span class='line'>sentinel can-failover mymaster yes
</span><span class='line'>sentinel parallel-syncs mymaster 1
</span><span class='line'>
</span><span class='line'>sentinel monitor resque 127.0.0.1 7789 1
</span><span class='line'>sentinel down-after-milliseconds resque 10000
</span><span class='line'>sentinel failover-timeout resque 900000
</span><span class='line'>sentinel can-failover resque yes
</span><span class='line'>sentinel parallel-syncs resque 5
</span></code></pre></td></tr></table></div></figure>


<p>And i turned him on!
with</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'>redis-server sentinel-my.conf --sentinel
</span></code></pre></td></tr></table></div></figure>


<p>And stuff started to work :D</p>

<h1>Carnage!!!</h1>

<p>So i started easy</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'>redis 127.0.0.1:6379&gt; get <span class="s2">&quot;hello&quot;</span>
</span><span class='line'><span class="s2">&quot;hello&quot;</span>
</span><span class='line'>redis 127.0.0.1:6379&gt; <span class="nb">set</span> <span class="s2">&quot;hello&quot;</span> <span class="s2">&quot;lulz&quot;</span>
</span><span class='line'>OK
</span></code></pre></td></tr></table></div></figure>


<p>Works! I killed master and connected on 26379 to sentinel master did query</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'> sentinel masters
</span></code></pre></td></tr></table></div></figure>


<p>and got</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='bash'><span class='line'>1<span class="o">)</span>  1<span class="o">)</span> <span class="s2">&quot;name&quot;</span>
</span><span class='line'>    2<span class="o">)</span> <span class="s2">&quot;resque&quot;</span>
</span><span class='line'>    3<span class="o">)</span> <span class="s2">&quot;ip&quot;</span>
</span><span class='line'>    4<span class="o">)</span> <span class="s2">&quot;127.0.0.1&quot;</span>
</span><span class='line'>    5<span class="o">)</span> <span class="s2">&quot;port&quot;</span>
</span><span class='line'>    6<span class="o">)</span> <span class="s2">&quot;7789&quot;</span>
</span><span class='line'>    ...
</span></code></pre></td></tr></table></div></figure>


<p>Cool works great :D The only thing that worried me was that when i turned on master after failover (it took 8 sec) he did not pickup he is slave and he did not start replicating data.</p>

<h1>when you do this&#8230;</h1>

<p>You will see beefy</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='bash'><span class='line'><span class="o">[</span>36373<span class="o">]</span> 26 Sep 21:15:03.441 <span class="c"># Error condition on socket for SYNC: Connection refused</span>
</span><span class='line'><span class="o">[</span>36373<span class="o">]</span> 26 Sep 21:15:04.521 * Connecting to MASTER...
</span><span class='line'><span class="o">[</span>36373<span class="o">]</span> 26 Sep 21:15:04.521 * MASTER &lt;-&gt; SLAVE sync started
</span><span class='line'><span class="o">[</span>36373<span class="o">]</span> 26 Sep 21:15:04.521 <span class="c"># Error condition on socket for SYNC: Connection refused</span>
</span><span class='line'><span class="o">[</span>36373<span class="o">]</span> 26 Sep 21:15:05.128 * MASTER MODE enabled <span class="o">(</span>user request<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>On the initial slave :) things just went from bad to good :D</p>

<h1>Summary</h1>

<p>This is cool new feature that you can have master-slave and auto failover server the only thing that driver have to do is if you get error while connecting / querying is to ask sentinel for new master connect and retry :) It is very basic but&#8230;</p>

<p>I like it!</p>

<p>THIS IS EXPERIMENTAL FEATURE and much more info about it you can finde here <a href="http://redis.io/topics/sentinel">http://redis.io/topics/sentinel</a>. Especially about pub/sub way of watching stuff / events while they occur.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Designing Twitter clone in redis]]></title>
    <link href="http://no-fucking-idea.com/blog/2012/07/31/designing-twitter-clone-in-redis/"/>
    <updated>2012-07-31T14:02:00+01:00</updated>
    <id>http://no-fucking-idea.com/blog/2012/07/31/designing-twitter-clone-in-redis</id>
    <content type="html"><![CDATA[<p>Ont he official redis site <a href="http://redis.io">http://redis.io</a>  you can find this <a href="http://redis.io/topics/twitter-clone/">http://redis.io/topics/twitter-clone/</a> post about building twitter clone in redis. I based my design post partially on it but i would like to go more deep into building timeline and posts.</p>

<h1>Quick review</h1>

<p>I used similar approach to store followers and following so i will just go fast through the keys and design.</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'>  twtr:&lt;user_id&gt;:follows -&gt; <span class="nb">set </span>of ids this user follows
</span><span class='line'>  twtr:&lt;user_id&gt;:followers -&gt; <span class="nb">set </span>of id<span class="err">&#39;</span>s  that follows this user
</span></code></pre></td></tr></table></div></figure>


<p>What happens when i click &#8220;follow&#8221;</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>
<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='bash'><span class='line'>redis 127.0.0.1:6379&gt; SADD twtr:kuba:following amelia
</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; SADD twtr:amelia:followers kuba
</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; SADD twtr:kuba:following dan
</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; SADD twtr:dan:followers kuba
</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; SADD twtr:kuba:following ben
</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; SADD twtr:ben:followers kuba
</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; SMEMBERS twtr:kuba:following
</span><span class='line'>1<span class="o">)</span> <span class="s2">&quot;ben&quot;</span>
</span><span class='line'>2<span class="o">)</span> <span class="s2">&quot;amelia&quot;</span>
</span><span class='line'>3<span class="o">)</span> <span class="s2">&quot;dan&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>So now i follow amelia, ben and dan.</p>

<p>What happens when amelia click followers!</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>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>redis 127.0.0.1:6379&gt; SMEMBERS twtr:amelia:followers
</span><span class='line'>1<span class="o">)</span> <span class="s2">&quot;kuba&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This way for each user we can see set of people who follow him and those who he follows. Thats all we need like in tutorial.</p>

<h1>Post</h1>

<p>So i think it is not waste if we will decide to keep post in form of 2 keys</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'>  twtr:&lt;user_id&gt;:post:&lt;post_id&gt; -&gt; content text of post
</span><span class='line'>  twtr:&lt;user_id&gt;:post:&lt;post_id&gt;:created_at -&gt; creation <span class="nb">time </span>of post
</span><span class='line'>  twtr:post_owner:&lt;post_id&gt; -&gt; id of post creator.
</span></code></pre></td></tr></table></div></figure>


<p>Why this approach and not compacting all the things into pipe separate key? Both solutions seems to be ok, this just leaves little bit more flexibility. I know that it will generate 2 x times more pickups to redis then previous so you can consider doing</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'>  twtr:&lt;user_id&gt;:post:&lt;post_id&gt; -&gt; <span class="o">(</span>timestamp|text<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Both solutions have a pros and cones, first one will require 2 x lookups and second one will require parsing data in app layer. Still i prefer first one.</p>

<h2>Post id</h2>

<p>This is hard topic, because in future we would want to scale ( lol ) . Generating post id is not easy task in this case. We could just use auto incrementing counter 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'>  twtr:post_id:next -&gt; auto incr
</span></code></pre></td></tr></table></div></figure>


<p>But to have something more flexible you should look at something like snowflake <a href="http://engineering.twitter.com/2010/06/announcing-snowflake.html">http://engineering.twitter.com/2010/06/announcing-snowflake.html</a>.</p>

<h1>Post list</h1>

<p>For each user we will store a list of posts he wrote. Initially i thought that we could just pump everything into list. But this is not optimal. This is single point which will grow like crazy and we will be not able to decide how and when to archive parts that are not used. Eg. posts did by user 8 months ago are not really relevant today because if we will make assumption that on average person posts few times a week this 8 month old entry will be way forgotten. We want to archive it, also it will be healthier for memory to store short lists.</p>

<p>I see here two scenarios:</p>

<ul>
<li>user looks at his last few posts &lt; 100</li>
<li>user is infinite scrolling through all posts.</li>
</ul>


<p>So this scenario reasonable seems to have list of lists in which we will have ordered post lists id&#8217;s. if we will use only LPUSH to add posts lists tot his list we will be able to to do easy LRANGE 0 <range> to get newest lists.</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'>  twtr:&lt;user_id&gt;:lists -&gt; list of lits id<span class="s1">&#39;s only LPUSH id and LRANGE 0 number.</span>
</span><span class='line'><span class="s1">  twtr:&lt;user_id&gt;:list_next -&gt; auto incr counter for lists id&#39;</span>s
</span><span class='line'>  twtr:&lt;user_id&gt;:list:&lt;list_id&gt; -&gt; list with 100 posts
</span></code></pre></td></tr></table></div></figure>


<p>So how do we get most recent posts ? we just  LRANGE 0 2 to get most recent two lists and next we will merge them first + second. Both are LPUSH&#8217;ed so should be semi ordered. (we don&#8217;t really care about order). adding stuff to time line is bit tricky.</p>

<p>we need to do it like this
<code>LRANGE &lt;key&gt; 0 1</code> current list id, next we need to <code>LLEN &lt;key&gt;</code> to check size and if it is &lt; SIZE ( for our example 100 ) we just <code>LPUSH &lt;key&gt; &lt;value&gt;</code> and job done, if size is > 100 we need to <code>INCR &lt;list counter&gt;</code> and LPUSH its result on list of lists and next we need to <code>LPUSH &lt;key&gt; &lt;value&gt;</code> on the new list.</p>

<p>And all of this in application layer. But this is the hardest bit to do. May seem to be complicated but if this seems to be not optimal you can add one more list</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'>  twtr:&lt;user_id&gt;:list:current -&gt; list of current 100 posts
</span></code></pre></td></tr></table></div></figure>


<p>This list is just the most current posts of particular user. How does this list work ? Algorithm is simple</p>

<ul>
<li>LPUSH new post id&#8217;s</li>
<li>RPOP if SIZE > 100</li>
</ul>


<p>This could be useful to reduce number of hits you get against redis.</p>

<h2>Time line</h2>

<p>Now the time line. Time line is exactly the same as user post list. we will just one &#8220;bit&#8221; about adding posts.</p>

<p>Algorithm here is when you add a post you have to pick all id&#8217;s of people who follow you. (example from top if you are adding post as amelia)</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'>SMEMBERS twtr:&lt;user_id&gt;:followers
</span></code></pre></td></tr></table></div></figure>


<p>And you need to push your post id into their time line posts list. Thats all. Ofc one thing that we need to add are keys for time line</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'>  twtr:&lt;user_id&gt;:timeline:lists -&gt; list of lits id<span class="s1">&#39;s only LPUSH id and LRANGE 0 number.</span>
</span><span class='line'><span class="s1">  twtr:&lt;user_id&gt;:timeline:list_next -&gt; auto incr counter for lists id&#39;</span>s
</span><span class='line'>  twtr:&lt;user_id&gt;:timeline:list:&lt;list_id&gt; -&gt; list with 100 posts
</span><span class='line'>  twtr:&lt;user_id&gt;:timeline:current -&gt; LPUSH, RPOP &gt; SIZE current list cache
</span></code></pre></td></tr></table></div></figure>


<h1>Summary</h1>

<p>This is how i would approach building twitter like clone. Things like old lists can be easily archived into mysql, postgres or other thing and EXPIREed from redis.  One thing in my design is common that i put a lot into keys <user_id> this could be skiped but in my opinion it is not bad. IF you will use <user_id> in form of user email md5 you can use it directly to access gravatar of that user.</p>

<p>On average you will need to do around 10-30 hits into redis to get data if you plan to do it in a &#8220;lazy way&#8221; you can minimize number of hits to around 10.</p>

<p>If you see problem with my design comment i want to know it!.  The core of this design is that each user post data is stored into one redis instance. This is important because of access and race condition stories if you will have many redis instances. But achieving &#8220;sharding&#8221; in application layer is not hard. Only thing that i would care about is post id generator. This is single point of failure because i have a strong assertion that post_id is unique in whole system.</p>

<p>Cheers!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Designing todo app backend using redis and mongodb]]></title>
    <link href="http://no-fucking-idea.com/blog/2012/07/26/designing-todo-app-backend-using-redis-and-mongodb/"/>
    <updated>2012-07-26T18:06:00+01:00</updated>
    <id>http://no-fucking-idea.com/blog/2012/07/26/designing-todo-app-backend-using-redis-and-mongodb</id>
    <content type="html"><![CDATA[<h2>side note</h2>

<p>Upgrading octopress is a @!#!@pain! :></p>

<h1>What is this post about :)</h1>

<p>Long time nothing new here so i will glue something together about stuff that we were talking about today with my friend Jarek. We talked about building backend for Todo app :). Yes simple todo app. How to build scalable backend. So my initial thought was &#8220;how i would design it in different databases&#8221;. (i&#8217;m taking only about data model)</p>

<h2>Requirements</h2>

<p>What we know:</p>

<ul>
<li>User has some sort of id. (number, email, hash of something)</li>
<li>We need to be able to have different todo lists</li>
<li>User can choose his todo list and see tasks ( obvious )</li>
<li>User can tag tasks!</li>
<li>User can query tasks in list by tags</li>
<li>User can see all tags.</li>
</ul>


<h1>Design using Redis</h1>

<p>How to do it with redis ? :)</p>

<p>First few facts i assumed at start. Single todo task has body and timestamps [created_at, updated_at] and base for key will be phrase &#8220;todoapp&#8221;.</p>

<p>So lets start with user and his list of todo lists :). This gives us first key</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>todo:&lt;user_id&gt;:todolist:next <span class="o">=</span>&gt; auto incrementing counter <span class="k">for </span>lists id
</span><span class='line'>todo:&lt;user_id&gt;:todolists <span class="o">=</span>&gt; <span class="o">[</span>LIST<span class="o">]</span>
</span><span class='line'>todo:&lt;user_id&gt;:todolist:&lt;todo_list_id&gt;:name <span class="o">=</span>&gt; list name
</span></code></pre></td></tr></table></div></figure>


<p>Here we have two keys, first is  list id counter that we will bump to get new list counter :), second is list of todolists ids. Why do it this way ? Well people can add and remove todo lists.</p>

<p>Ok so how to create new list ?</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>
<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='bash'><span class='line'>redis 127.0.0.1:6379&gt; INCR todo:kuba:todolist:next
</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; RPUSH todo:kuba:todolists 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; LRANGE todo:kuba:todolists 0 -1
</span><span class='line'>1<span class="o">)</span> <span class="s2">&quot;1&quot;</span>
</span><span class='line'>redis 127.0.0.1:6379&gt; SET todo:kuba:todolist:1:name <span class="s2">&quot;things to do&quot;</span>
</span><span class='line'>OK
</span></code></pre></td></tr></table></div></figure>


<p>Hey ! we just added id of our first list to list of our todo lists (lots of list word here!). Ok so now lets add a task.</p>

<p>list:</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'>todo:&lt;user_id&gt;:todolist:&lt;todo_list_id&gt;:next <span class="o">=</span>&gt; auto incrementing counter <span class="k">for </span>tasks id
</span><span class='line'>todo:&lt;user_id&gt;:todolist:&lt;todo_list_id&gt; <span class="o">=</span>&gt; <span class="o">[</span>LIST<span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>and task:</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'>todo:&lt;user_id&gt;:task:&lt;task_id&gt; <span class="o">=</span>&gt; content of task eg. <span class="s2">&quot;finish blog post&quot;</span>
</span><span class='line'>todo:&lt;user_id&gt;:task:&lt;task_id&gt;:created_at <span class="o">=</span>&gt; epoch <span class="nb">time </span>when it was created handled by app
</span><span class='line'>todo:&lt;user_id&gt;:task:&lt;task_id&gt;:updated_at <span class="o">=</span>&gt; epoch <span class="nb">time </span>when it was last updated handled by app
</span></code></pre></td></tr></table></div></figure>


<p>Ok so how to i add task to my list</p>

<figure class='code'><figcaption><span>adding task</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'>redis 127.0.0.1:6379&gt; INCR todo:kuba:todolist:1:next
</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 todo:kuba:todolist:1 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; SET todo:kuba:task:1 <span class="s2">&quot;finish blog post&quot;</span>
</span><span class='line'>OK
</span><span class='line'>redis 127.0.0.1:6379&gt; SET todo:kuba:task:1:created_at  1343324314
</span><span class='line'>OK
</span><span class='line'>redis 127.0.0.1:6379&gt; SET todo:kuba:task:1:updated_at  1343324315
</span><span class='line'>OK
</span></code></pre></td></tr></table></div></figure>


<p>And we have our first task in. How do we get tasks from out todo list simple!</p>

<figure class='code'><figcaption><span>peeking task</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'>redis 127.0.0.1:6379&gt; LRANGE todo:kuba:todolist:1 0 -1
</span><span class='line'>1<span class="o">)</span> <span class="s2">&quot;1&quot;</span>
</span><span class='line'>redis 127.0.0.1:6379&gt; GET todo:kuba:task:1
</span><span class='line'><span class="s2">&quot;finish blog post&quot;</span>
</span><span class='line'>redis 127.0.0.1:6379&gt; GET todo:kuba:task:1:created_at
</span><span class='line'><span class="s2">&quot;1343324314&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Ok so now we have very simple todo lists with tasks, well at least overview. Ofc you can use sets for todo lists or zsets but lets stay with lists to keep it simple for now.</p>

<p>How ro remove task from the list ?</p>

<figure class='code'><figcaption><span>removing task</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'>redis 127.0.0.1:6379&gt; LREM todo:kuba:todolist:1 -1 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; LRANGE todo:kuba:todolist:1 0 -1
</span><span class='line'><span class="o">(</span>empty list or <span class="nb">set</span><span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Good, now we can add tasks, remove tasks, same sotry with adding todo lists and removing todo lists.
One last thing is to add tags!. Simply here each task will have list of tags and each tag will have list of tasks related with.</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'>todo:&lt;user_id&gt;:task:&lt;task_id&gt;:tags <span class="o">=</span>&gt; <span class="o">[</span>LIST<span class="o">]</span>
</span><span class='line'>todo:&lt;user_id&gt;:tag:&lt;tag&gt;:tasks <span class="o">=</span>&gt; <span class="o">[</span>LIST<span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>So how we will add tags to tasks ? Simple!</p>

<figure class='code'><figcaption><span>tagging</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='bash'><span class='line'>redis 127.0.0.1:6379&gt; LPUSH todo:kuba:task:1:tags <span class="s2">&quot;redis&quot;</span>
</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 todo:kuba:task:1:tags <span class="s2">&quot;design&quot;</span>
</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 todo:kuba:tag:redis:tasks 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 todo:kuba:tag:design:tasks 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; LRANGE todo:kuba:tag:design:tasks 0 -1
</span><span class='line'>1<span class="o">)</span> <span class="s2">&quot;1&quot;</span>
</span><span class='line'>redis 127.0.0.1:6379&gt; LRANGE todo:kuba:task:1:tags 0 -1
</span><span class='line'>1<span class="o">)</span> <span class="s2">&quot;design&quot;</span>
</span><span class='line'>2<span class="o">)</span> <span class="s2">&quot;redis&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This example shows what we need to do to tag a task with something and how to peek tasks tagged with it. Why we have both lists ? To make it fast while searching. If user will click on particular tag like &#8220;redis&#8221; you want to get it O(1) time not O(N) after searching all keys. And same the other way, normal ui will pull task test, when it was created and tags to display so we want to have this data ready.</p>

<p>This is whole design for the todo app. We have 8 types of keys.  Things like pagination, calculating time are all left to app layer. Important thing is that i scope everything to user key / id. This is because i want to isolate each user space easy. Each user in his own space will have short lists, there is no danger of &#8220;ultimate&#8221;  non splittable lists.</p>

<h1>Design using Mongodb</h1>

<p>Well this case upfront is easier to grasp because for each list we can use single document or collection of documents lets talk about both solutions.</p>

<h2>Todolist = Document</h2>

<p>In this example we will use built in &#8220;array&#8221; operators</p>

<figure class='code'><figcaption><span>creating</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='javascript'><span class='line'><span class="o">&gt;</span> <span class="nx">db</span><span class="p">.</span><span class="nx">todolists</span><span class="p">.</span><span class="nx">save</span><span class="p">({</span><span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;House work&quot;</span><span class="p">,</span> <span class="nx">tasks</span><span class="o">:</span> <span class="p">[]})</span>
</span><span class='line'><span class="s2">&quot;ok&quot;</span>
</span><span class='line'><span class="o">&gt;</span> <span class="nx">db</span><span class="p">.</span><span class="nx">todolists</span><span class="p">.</span><span class="nx">find</span><span class="p">({</span><span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;House work&quot;</span><span class="p">})</span>
</span><span class='line'><span class="p">[</span>
</span><span class='line'>  <span class="p">{</span>   <span class="s2">&quot;name&quot;</span> <span class="o">:</span> <span class="s2">&quot;House work&quot;</span><span class="p">,</span>   <span class="s2">&quot;_id&quot;</span> <span class="o">:</span> <span class="p">{</span>   <span class="s2">&quot;$oid&quot;</span> <span class="o">:</span> <span class="s2">&quot;50118742cc93742e0d0b6f7c&quot;</span>   <span class="p">},</span>
</span><span class='line'>      <span class="s2">&quot;tasks&quot;</span> <span class="o">:</span> <span class="p">[</span>   <span class="p">]</span>   <span class="p">}</span>
</span><span class='line'><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>So lets add a task :)</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">db</span><span class="p">.</span><span class="nx">todolists</span><span class="p">.</span><span class="nx">update</span><span class="p">({</span><span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;House work&quot;</span><span class="p">},{</span><span class="nx">$push</span><span class="o">:</span><span class="p">{</span><span class="s2">&quot;tasks&quot;</span><span class="o">:</span><span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="o">:</span><span class="s2">&quot;finish blog post&quot;</span><span class="p">,</span> <span class="s2">&quot;tags&quot;</span><span class="o">:</span><span class="p">[</span><span class="s2">&quot;mongo&quot;</span><span class="p">]</span> <span class="p">}</span> <span class="p">}</span> <span class="p">})</span>
</span><span class='line'><span class="s2">&quot;ok&quot;</span>
</span><span class='line'><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="nx">db</span><span class="p">.</span><span class="nx">todolists</span><span class="p">.</span><span class="nx">find</span><span class="p">({</span><span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;House work&quot;</span><span class="p">})</span>
</span><span class='line'><span class="p">[</span>
</span><span class='line'>  <span class="p">{</span>   <span class="s2">&quot;name&quot;</span> <span class="o">:</span> <span class="s2">&quot;House work&quot;</span><span class="p">,</span>   <span class="s2">&quot;_id&quot;</span> <span class="o">:</span> <span class="p">{</span>   <span class="s2">&quot;$oid&quot;</span> <span class="o">:</span> <span class="s2">&quot;50118742cc93742e0d0b6f7c&quot;</span>   <span class="p">},</span>
</span><span class='line'>      <span class="s2">&quot;tasks&quot;</span> <span class="o">:</span> <span class="p">[</span>
</span><span class='line'>       <span class="p">{</span>   <span class="s2">&quot;name&quot;</span> <span class="o">:</span> <span class="s2">&quot;finish blog post&quot;</span><span class="p">,</span>   <span class="s2">&quot;tags&quot;</span> <span class="o">:</span> <span class="p">[</span>   <span class="s2">&quot;mongo&quot;</span> <span class="p">]</span>   <span class="p">}</span>
</span><span class='line'>      <span class="p">]</span>   <span class="p">}</span>
</span><span class='line'><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>this will create empty todo list with name &#8220;House work&#8221; of course this way we will not omit building sub lists of tags etc, we have to build in a same way like in redis but as part of document. The story is exactly the same like above in redis. Mongodb lets us query nested documents and this will enable us to skip some of the extra &#8220;lists&#8221; while doing search.</p>

<p>Lets try it out how to find out mongo tagged entries?</p>

<figure class='code'><figcaption><span>find by tag</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='javascript'><span class='line'><span class="o">&gt;</span> <span class="nx">db</span><span class="p">.</span><span class="nx">todolists</span><span class="p">.</span><span class="nx">find</span><span class="p">({</span><span class="s2">&quot;tasks.tags&quot;</span><span class="o">:</span> <span class="p">{</span> <span class="nx">$in</span> <span class="o">:</span> <span class="p">[</span><span class="s2">&quot;mongo&quot;</span><span class="p">]</span> <span class="p">}</span> <span class="p">})</span>
</span><span class='line'>
</span><span class='line'><span class="p">[</span>
</span><span class='line'>  <span class="p">{</span>   <span class="s2">&quot;name&quot;</span> <span class="o">:</span> <span class="s2">&quot;House work&quot;</span><span class="p">,</span>   <span class="s2">&quot;_id&quot;</span> <span class="o">:</span> <span class="p">{</span>   <span class="s2">&quot;$oid&quot;</span> <span class="o">:</span> <span class="s2">&quot;50118742cc93742e0d0b6f7c&quot;</span>   <span class="p">},</span>
</span><span class='line'>      <span class="s2">&quot;tasks&quot;</span> <span class="o">:</span> <span class="p">[</span>
</span><span class='line'>        <span class="p">{</span>   <span class="s2">&quot;name&quot;</span> <span class="o">:</span> <span class="s2">&quot;finish blog post&quot;</span><span class="p">,</span>   <span class="s2">&quot;tags&quot;</span> <span class="o">:</span> <span class="p">[</span>   <span class="s2">&quot;mongo&quot;</span> <span class="p">]</span>   <span class="p">}</span>
</span><span class='line'>      <span class="p">]</span>   <span class="p">}</span>
</span><span class='line'><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>This way we can find whole todolist with task that contains tag &#8220;mongo&#8221; but after that we will have to work out from the document  in app the task that we are interested int. Using it like this we will have a document with structure like this</p>

<figure class='code'><figcaption><span>todo list structure</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='javascript'><span class='line'><span class="p">{</span>
</span><span class='line'> <span class="nx">user</span><span class="o">:</span> <span class="s2">&quot;user id&quot;</span><span class="p">,</span>
</span><span class='line'> <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;&lt;name&gt;&quot;</span><span class="p">,</span>
</span><span class='line'> <span class="nx">tasks</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>   <span class="p">{</span>
</span><span class='line'>    <span class="nx">text</span> <span class="o">:</span> <span class="s2">&quot;todo text&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">tags</span> <span class="o">:</span> <span class="p">[</span>
</span><span class='line'>      <span class="s2">&quot;Tag1&quot;</span><span class="p">,</span> <span class="s2">&quot;Tag2&quot;</span>
</span><span class='line'>    <span class="p">]</span>
</span><span class='line'>    <span class="nx">created_at</span> <span class="o">:</span> <span class="nx">Time</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">updated_at</span> <span class="o">:</span> <span class="nx">Time</span>
</span><span class='line'>   <span class="p">}</span>
</span><span class='line'> <span class="p">]</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Using redis we could wrapp stuff into MULTI command while using mongodb &#8220;array&#8221; command we are a bit cowboishing. They could remove wrong stuff in we will not be cautious :). (well same in redis!) Big plus of Mongodb is native time type!</p>

<h2>Todolist = many documents</h2>

<p>Using this approach we can leverage more of our stuff on mongodb search in this approach each task will be a different document.
With structure like this</p>

<figure class='code'><figcaption><span>task structure</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='javascript'><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="nx">todo_list</span><span class="o">:</span> <span class="s2">&quot;todo list id&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">user</span><span class="o">:</span> <span class="s2">&quot;user id&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">text</span><span class="o">:</span> <span class="s2">&quot;todo text&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">tags</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;Tag1&quot;</span><span class="p">,</span> <span class="s2">&quot;Tag2&quot;</span><span class="p">]</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This way we will have a lot of documents, more disk space consumption and still we will have to have second collection with with objects with structure like this</p>

<figure class='code'><figcaption><span>structure of todolist</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='javascript'><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="nx">todo_list</span><span class="o">:</span> <span class="s2">&quot;todo list id&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;todo list name&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">user</span><span class="o">:</span> <span class="s2">&quot;user id&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="c1">// tasks: [Tasks OBjectID Array] you could have this and remove todo_list id from tasks choice is yours :)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And this way we can use <code>find</code> tool very easy and get documents fast.</p>

<h1>Summary</h1>

<p>All of this solutions have some pros and cons, mongodb excels better when documents are bigger (limit is set on 16 mb per document) than loads of small documents (massive waste of space). Solution in redis is really fast and if you will implement lazy loading it will be very fast.  You can adjust this designs to your situation by changing lists to sets etc. The place where redis OWNS mongodb in this context is &#8220;strucutres&#8221; and we use a lot of them to store data like this, lists sets, zsets. Implementing priority list in mongodb will be totally custom solution while in redis we can just use zset.</p>

<p>This is just my point of view on this. I will supply some code to cover it more in part two. This is next problem, i&#8217;m sure solution in mongodb using things like mongoid <a href="http://mongoid.org">http://mongoid.org</a> will be much more developer friendly then building things &#8220;rawly&#8221; in redis hiredis client.</p>

<p>btw i jsut wrote this from &#8220;top of my head&#8221; so it may contain typos and i&#8217;m sure keys, structures can be optimized :) This is just to open discussion with my friend :)</p>

<p>Cheers!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Api prototyping with Rails respond_with]]></title>
    <link href="http://no-fucking-idea.com/blog/2012/06/15/api-prototyping-with-rails-respond-with/"/>
    <updated>2012-06-15T23:11:00+01:00</updated>
    <id>http://no-fucking-idea.com/blog/2012/06/15/api-prototyping-with-rails-respond-with</id>
    <content type="html"><![CDATA[<p>Prototyping json / xml RESTfull api with rails is easy. Before we will want to rewrite it to something like erlang webmachine or node.js! For purpose of this we can use syntax introduced in rails 3. (ages ago) with <code>respond_to/respond_with</code> it is very cool.</p>

<h1>Example controller</h1>

<p>How we use this ?  Lets take a peek and simple 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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">VenuesController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">respond_to</span> <span class="ss">:html</span><span class="p">,</span> <span class="ss">:xml</span><span class="p">,</span> <span class="ss">:json</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">index</span>
</span><span class='line'>    <span class="n">respond_with</span><span class="p">(</span><span class="vi">@venues</span> <span class="o">=</span> <span class="no">Venue</span><span class="o">.</span><span class="n">all</span><span class="o">.</span><span class="n">page</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:page</span><span class="o">]</span><span class="p">)</span><span class="o">.</span><span class="n">per</span><span class="p">(</span><span class="mi">20</span><span class="p">))</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Two things we will notice at start is <code>respond_to :html, :xml, :json</code> this is something like old merbs <code>provides</code> where we specify to which formats we want to respond. Second change is how we layout the action. All we have to do is to put into <code>respond_with</code> object we want to respond with.</p>

<p>What this buys for us ?</p>

<ul>
<li>If we have html request to actions like create, update or destroy we want to redirect on success</li>
<li>if we have json, xml request to same type of &#8220;state changing&#8221; actions we want to render response with our format.</li>
</ul>


<p>We achieve both of this with reponds_with in just one line. But lets take a peek at longer 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>
<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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">VenuesController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">before_filter</span> <span class="ss">:authenticate_user!</span><span class="p">,</span> <span class="ss">:except</span> <span class="o">=&gt;</span> <span class="o">[</span><span class="ss">:index</span><span class="p">,</span> <span class="ss">:show</span><span class="p">,</span> <span class="ss">:near</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">respond_to</span> <span class="ss">:html</span><span class="p">,</span> <span class="ss">:xml</span><span class="p">,</span> <span class="ss">:json</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">index</span>
</span><span class='line'>    <span class="n">respond_with</span><span class="p">(</span><span class="vi">@venues</span> <span class="o">=</span> <span class="no">Venue</span><span class="o">.</span><span class="n">all</span><span class="o">.</span><span class="n">page</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:page</span><span class="o">]</span><span class="p">)</span><span class="o">.</span><span class="n">per</span><span class="p">(</span><span class="mi">20</span><span class="p">))</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">show</span>
</span><span class='line'>    <span class="n">respond_with</span><span class="p">(</span><span class="vi">@venue</span> <span class="o">=</span> <span class="no">Venue</span><span class="o">.</span><span class="n">find_by</span><span class="p">(</span><span class="n">permalink</span><span class="p">:</span> <span class="n">params</span><span class="o">[</span><span class="ss">:id</span><span class="o">]</span><span class="p">))</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">new</span>
</span><span class='line'>    <span class="n">repond_with</span><span class="p">(</span><span class="vi">@venue</span> <span class="o">=</span> <span class="no">Venue</span><span class="o">.</span><span class="n">new</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">create</span>
</span><span class='line'>    <span class="vi">@venue</span> <span class="o">=</span> <span class="no">Venue</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:venue</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>    <span class="n">respond_with</span><span class="p">(</span><span class="vi">@venue</span><span class="p">,</span> <span class="ss">:location</span> <span class="o">=&gt;</span> <span class="n">venues_url</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>In this example we can see example of <code>create</code> action where we add <code>:location =&gt; venues_url</code> this will in case of format: html success redirect to this url.</p>

<h1>Summary</h1>

<p>Using this helps to write stuff fast and readable, you can still use plain old <code>respond_to</code> in action with old <code>format.html</code> syntax..</p>

<p>I hope you liked it :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Pong tests are wrong]]></title>
    <link href="http://no-fucking-idea.com/blog/2012/06/07/pong-tests-are-wrong/"/>
    <updated>2012-06-07T19:09:00+01:00</updated>
    <id>http://no-fucking-idea.com/blog/2012/06/07/pong-tests-are-wrong</id>
    <content type="html"><![CDATA[<p>After short talk with tomash and his gist <a href="https://gist.github.com/2871286">https://gist.github.com/2871286</a> with performance of vibe.d i decided to write this post.
In my opinion pong tests are wrong and do not show real &#8220;performance&#8221;. I said to him to check sinatra with thin handler not webrick and that showed ~1.6k req/sec which is not bad at all. While at my box it was ~900 req/sec so significantly less (Macbook Pro i5).</p>

<p>From this gist we can see that his vibe.d benchmark set pong test at 8425.85 req/sec (He used ab and i used httperf).</p>

<h1>Warp</h1>

<p>My first candidate in this competition of pong tests is haskell warp handler.</p>

<p>code:</p>

<figure class='code'><figcaption><span>pingpong.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>
</pre></td><td class='code'><pre><code class='haskell'><span class='line'><span class="cm">{-# LANGUAGE OverloadedStrings #-}</span>
</span><span class='line'>
</span><span class='line'><span class="kr">import</span> <span class="nn">Network.Wai</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">Network.Wai.Handler.Warp</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">Network.HTTP.Types</span> <span class="p">(</span><span class="nf">status200</span><span class="p">)</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">Blaze.ByteString.Builder</span> <span class="p">(</span><span class="nf">copyByteString</span><span class="p">)</span>
</span><span class='line'><span class="kr">import</span> <span class="k">qualified</span> <span class="nn">Data.ByteString.UTF8</span> <span class="k">as</span> <span class="n">BU</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">Data.Monoid</span>
</span><span class='line'><span class="kr">import</span> <span class="nn">Data.Enumerator</span> <span class="p">(</span><span class="nf">run_</span><span class="p">,</span> <span class="nf">enumList</span><span class="p">,</span> <span class="p">(</span><span class="o">$$</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="kr">let</span> <span class="n">port</span> <span class="ow">=</span> <span class="mi">8000</span>
</span><span class='line'>    <span class="n">putStrLn</span> <span class="o">$</span> <span class="s">&quot;Listening on port &quot;</span> <span class="o">++</span> <span class="n">show</span> <span class="n">port</span>
</span><span class='line'>    <span class="n">run</span> <span class="n">port</span> <span class="n">app</span>
</span><span class='line'>
</span><span class='line'><span class="nf">app</span> <span class="n">req</span> <span class="ow">=</span> <span class="n">return</span> <span class="o">$</span>
</span><span class='line'>    <span class="kr">case</span> <span class="n">pathInfo</span> <span class="n">req</span> <span class="kr">of</span>
</span><span class='line'>        <span class="p">[</span><span class="s">&quot;pong&quot;</span><span class="p">]</span> <span class="ow">-&gt;</span> <span class="n">pong</span>
</span><span class='line'>        <span class="n">x</span> <span class="ow">-&gt;</span> <span class="n">index</span> <span class="n">x</span>
</span><span class='line'>
</span><span class='line'><span class="nf">pong</span> <span class="ow">=</span> <span class="kt">ResponseBuilder</span> <span class="n">status200</span> <span class="p">[</span> <span class="p">(</span><span class="s">&quot;Content-Type&quot;</span><span class="p">,</span> <span class="s">&quot;text/plain&quot;</span><span class="p">)</span> <span class="p">]</span> <span class="o">$</span> <span class="n">mconcat</span> <span class="o">$</span> <span class="n">map</span> <span class="n">copyByteString</span>
</span><span class='line'>    <span class="p">[</span> <span class="s">&quot;pong&quot;</span> <span class="p">]</span>
</span><span class='line'>
</span><span class='line'><span class="nf">index</span> <span class="n">x</span> <span class="ow">=</span> <span class="kt">ResponseBuilder</span> <span class="n">status200</span> <span class="p">[(</span><span class="s">&quot;Content-Type&quot;</span><span class="p">,</span> <span class="s">&quot;text/html&quot;</span><span class="p">)]</span> <span class="o">$</span> <span class="n">mconcat</span> <span class="o">$</span> <span class="n">map</span> <span class="n">copyByteString</span>
</span><span class='line'>    <span class="p">[</span> <span class="s">&quot;&lt;p&gt;Hello from &quot;</span><span class="p">,</span> <span class="kt">BU</span><span class="o">.</span><span class="n">fromString</span> <span class="o">$</span> <span class="n">show</span> <span class="n">x</span><span class="p">,</span> <span class="s">&quot;!&lt;/p&gt;&quot;</span>
</span><span class='line'>    <span class="p">,</span> <span class="s">&quot;&lt;p&gt;&lt;a href=&#39;/pong&#39;&gt;pong&lt;/a&gt;&lt;/p&gt;</span><span class="se">\n</span><span class="s">&quot;</span> <span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>it is semi rack like syntax ;)</p>

<h1>Benchmark results</h1>

<p>I prepared results to show how big lie is pong test. Because in this type of test / showoff all you test is how fast really you can accept connections. Single thread will always win :). But lets look at results:</p>

<ul>
<li>Multi threaded - 50 threads   - Request rate: 858.8 req/s (1.2 ms/req) BOOO!!!!</li>
<li>Multi threaded - 4 threads ( on for each core ) - Request rate: 10020.8 req/s (0.1 ms/req) Vibe.d die!!! Yeah!!!!</li>
<li>Single threaded - default compilation  - Request rate: 13584.1 req/s (0.1 ms/req) Mother of God!</li>
</ul>


<p>Tested with <code>httperf --uri=/ --port=8000 --num-calls=10000 --num-conns=20</code> httperf command.</p>

<h1>Summary</h1>

<p>You can test it on your own, i did it on latest 7.4.1 Ghc from haskell platform on OSX 10.7. And post reply with your results :) maybe i missed something. Code, scripts to build and run are in repository <a href="https://github.com/JakubOboza/haskell-warp-pong-test">https://github.com/JakubOboza/haskell-warp-pong-test</a>.</p>

<h2>So how to test ?!</h2>

<p>I think you should test your application in default environment so with db behind it, but anyone in this scenario can say it is testing performance of db. But everyday&#8230; users are really testing performance of our db ;>&#8230; or the weakest of the elements in chain. So if your db / rendering engine is performing at level of 50 req / sec fast app handler will not turn it into 5000 req / sec.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rebar templates]]></title>
    <link href="http://no-fucking-idea.com/blog/2012/05/29/rebar-templates/"/>
    <updated>2012-05-29T21:38:00+01:00</updated>
    <id>http://no-fucking-idea.com/blog/2012/05/29/rebar-templates</id>
    <content type="html"><![CDATA[<p>First question when i need to add new blog to my code I ask is, do i remember all the boilerplate and how many times i will make a mistake this time. No more :). Rebar has a nice thing built in it is templating language that lets us build our own templates.</p>

<h1>Custom template ?</h1>

<p>I always end up looking at old projects and copying parts like <code>gen_server</code> and reusing them. I always knew rebar has option to write them but never had time to look at it. Today lol, i wanted to do some cleaning at home so every thing seems to be a good excuse to not do any cleaning :D.</p>

<h2>What i need to know</h2>

<p>Basic template is made from one or many <code>.erl</code> files written with <code>mustache</code> style <code>{ { } }</code> code and <code>.template</code> file describing what to do with files.</p>

<h2>Let&#8217;s build gen_server template</h2>

<p>So my first file will be <code>gen_server.erl</code></p>

<figure class='code'><figcaption><span>gen_server.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>
<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='bash'><span class='line'>%%% @author  <span class="o">{</span> <span class="o">{</span>author_name <span class="o">}</span> <span class="o">}</span> &lt;<span class="o">{</span> <span class="o">{</span>author_email<span class="o">}</span> <span class="o">}</span>&gt;
</span><span class='line'>%%% @copyright  <span class="o">{</span> <span class="o">{</span>copyright_year <span class="o">}</span> <span class="o">}</span>  <span class="o">{</span> <span class="o">{</span>author_name<span class="o">}</span> <span class="o">}</span>.
</span><span class='line'>%%% @doc  <span class="o">{</span> <span class="o">{</span>description <span class="o">}</span> <span class="o">}</span>
</span><span class='line'>
</span><span class='line'>-module<span class="o">(</span> <span class="o">{</span> <span class="o">{</span>name <span class="o">}</span> <span class="o">})</span>.
</span><span class='line'>-behaviour<span class="o">(</span>gen_server<span class="o">)</span>.
</span><span class='line'>
</span><span class='line'>-author<span class="o">(</span><span class="s1">&#39; { {author_name } } &lt;{ {author_email } }&gt;&#39;</span><span class="o">)</span>.
</span><span class='line'>
</span><span class='line'>-export<span class="o">([</span>start_link/1<span class="o">])</span>.
</span><span class='line'>-export<span class="o">([</span>init/1, handle_call/3, handle_cast/2, terminate/2, handle_info/2, code_change/3, stop/1<span class="o">])</span>.
</span><span class='line'>
</span><span class='line'>% public api
</span><span class='line'>
</span><span class='line'>start_link<span class="o">(</span>_Args<span class="o">)</span> -&gt;
</span><span class='line'>  gen_server:start_link<span class="o">({</span><span class="nb">local</span>, ?MODULE<span class="o">}</span>, ?MODULE, <span class="o">[]</span>, <span class="o">[])</span>.
</span><span class='line'>
</span><span class='line'>% state should be change with State that you will pass
</span><span class='line'>init<span class="o">([])</span> -&gt;
</span><span class='line'>  <span class="o">{</span>ok, state<span class="o">}</span>.
</span><span class='line'>
</span><span class='line'>stop<span class="o">(</span>_Pid<span class="o">)</span> -&gt;
</span><span class='line'>  stop<span class="o">()</span>.
</span><span class='line'>
</span><span class='line'>stop<span class="o">()</span> -&gt;
</span><span class='line'>  gen_server:cast<span class="o">(</span>?MODULE, stop<span class="o">)</span>.
</span><span class='line'>
</span><span class='line'>handle_call<span class="o">({</span>method_name_and_params<span class="o">}</span>, _From, State<span class="o">)</span> -&gt;
</span><span class='line'>  <span class="nv">Response</span> <span class="o">=</span> ok,
</span><span class='line'>  <span class="o">{</span>reply, Response, State<span class="o">}</span>;
</span><span class='line'>
</span><span class='line'>handle_call<span class="o">(</span>_Message, _From, State<span class="o">)</span> -&gt;
</span><span class='line'>  <span class="o">{</span>reply, error, State<span class="o">}</span>.
</span><span class='line'>
</span><span class='line'>handle_cast<span class="o">(</span>_Message, State<span class="o">)</span> -&gt; <span class="o">{</span>noreply, State<span class="o">}</span>.
</span><span class='line'>handle_info<span class="o">(</span>_Message, State<span class="o">)</span> -&gt; <span class="o">{</span>noreply, State<span class="o">}</span>.
</span><span class='line'>terminate<span class="o">(</span>_Reason, _State<span class="o">)</span> -&gt; ok.
</span><span class='line'>code_change<span class="o">(</span>_OldVersion, State, _Extra<span class="o">)</span> -&gt; <span class="o">{</span>ok, State<span class="o">}</span>.
</span></code></pre></td></tr></table></div></figure>


<p>This is the template, i know a bit long i tried to cut out all comments, euint etc and narrow it to minimum. I posted it to show how much you can save :). Now you will need the <code>transformation file</code>. All this things in { { something } } will be replaced by things we will type in command line or defaults from template file.</p>

<figure class='code'><figcaption><span>gen_server.template</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='bash'><span class='line'><span class="o">{</span>variables, <span class="o">[</span>
</span><span class='line'>  <span class="o">{</span>name, <span class="s2">&quot;template&quot;</span><span class="o">}</span>,
</span><span class='line'>  <span class="o">{</span>copyright_year, <span class="s2">&quot;2012&quot;</span><span class="o">}</span>,
</span><span class='line'>  <span class="o">{</span>author_name, <span class="s2">&quot;jakub Oboza&quot;</span><span class="o">}</span>,
</span><span class='line'>  <span class="o">{</span>author_email, <span class="s2">&quot;jakub.oboza@gmail.com&quot;</span><span class="o">}</span>
</span><span class='line'><span class="o">]}</span>.
</span><span class='line'><span class="o">{</span>template, <span class="s2">&quot;gen_server.erl&quot;</span>, <span class="s2">&quot;src/{ {name} }.erl&quot;</span><span class="o">}</span>.
</span></code></pre></td></tr></table></div></figure>


<p>For me it looks like this, we have few default definitions and at the bottom. template! This is important part it says which file he has to copy where and what will be the name of new file. Now everything should be clear!</p>

<h2>Injet it into rebar!</h2>

<p>All you need now to do is symlink your template folders to <code>~/.rebar/templates</code> and you can use them!
(you can symlink your folder or just create one there :) )</p>

<h2>Use!</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>λ rebar create <span class="nv">template</span><span class="o">=</span>gen_server <span class="nv">name</span><span class="o">=</span><span class="nv">example</span>
</span><span class='line'><span class="o">==</span>&gt; tmp <span class="o">(</span>create<span class="o">)</span>
</span><span class='line'>Writing src/example.erl
</span></code></pre></td></tr></table></div></figure>


<p>Viola!</p>

<h1>important</h1>

<p>When i was looking at this post i saw that {{ is converted in a wrong way by octopress so i added spaces between them! check repo for correct code!</p>

<h1>My own templates</h1>

<p>Today i started adding my own templates initially i have only <code>gen_server</code> and <code>webmachine_resource</code> but i will add more :). It is fun it is like building your own anti-boiler plate framework.</p>

<p>My templates repo: <a href="https://github.com/JakubOboza/rebar-templates">https://github.com/JakubOboza/rebar-templates</a></p>

<p>Hope this helps!
Cheers!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Future toons processing logs with node.js]]></title>
    <link href="http://no-fucking-idea.com/blog/2012/04/29/future-toons-processing-logs-with-node-dot-js/"/>
    <updated>2012-04-29T20:41:00+01:00</updated>
    <id>http://no-fucking-idea.com/blog/2012/04/29/future-toons-processing-logs-with-node-dot-js</id>
    <content type="html"><![CDATA[<p>I&#8217;m using new relic for monitoring of my servers and i think it is great tool but recently their marketing wing
just spammmmmmed, hammered me with emails and when i replied to one of this emails it started to be even worse. My name is not Dave, David, John or Mark its Jakub. So i thought about processing nginx and all application servers on my own just for the lulz :).</p>

<p>First thing to achieve was to build a tool that will be able to work with logs in a way that will not limit it usage to small files. This is simple, i decided to build a lib that will enable to stream process logs by &#8220;entry&#8221;. Some of the</p>

<h1>Initial idea</h1>

<p>We will emit single &#8220;entry&#8221; so for logs that are build around &#8220;lines&#8221; we will emit line and for logs like rails we will emit whole entry. Line streaming is easy so few hours ago during watching 3 season of <a href="http://en.wikipedia.org/wiki/Metalocalypse">http://en.wikipedia.org/wiki/Metalocalypse</a> i wrote this.</p>

<h1>Future toons</h1>

<p>Version 0.0.1 <a href="https://github.com/JakubOboza/future_toons">https://github.com/JakubOboza/future_toons</a> This is my entry point to analytics on big files :). First thing was a benchmark. I said to my self that it can&#8217;t be more then 0.5sec on my box (i5 MBP) vs 100mb log file from nginx. I took a log from production and checked my initial code. It was 0.37 sec. That&#8217;s ok.</p>

<figure class='code'><figcaption><span>lib/toons.js</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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">FutureToons</span><span class="p">(</span><span class="nx">filename</span><span class="p">,</span> <span class="nx">callback</span><span class="p">,</span> <span class="nx">end_callback</span><span class="p">){</span>
</span><span class='line'>  <span class="c1">// in case someone will call it wrong way ;)</span>
</span><span class='line'>  <span class="k">if</span><span class="p">(</span><span class="kc">false</span> <span class="o">===</span> <span class="p">(</span><span class="k">this</span> <span class="k">instanceof</span> <span class="nx">FutureToons</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">new</span> <span class="nx">FutureToons</span><span class="p">(</span><span class="nx">filename</span><span class="p">,</span> <span class="nx">callback</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="nx">events</span><span class="p">.</span><span class="nx">EventEmitter</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">onEnd</span><span class="p">(</span><span class="nx">end_callback</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span><span class="p">(</span><span class="nx">filename</span> <span class="o">&amp;&amp;</span> <span class="nx">callback</span><span class="p">){</span>
</span><span class='line'>    <span class="c1">// if both present run instant</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">onLine</span><span class="p">(</span><span class="nx">callback</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="nx">filename</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// do not put methods between this line and initial definition</span>
</span><span class='line'><span class="nx">util</span><span class="p">.</span><span class="nx">inherits</span><span class="p">(</span><span class="nx">FutureToons</span><span class="p">,</span> <span class="nx">events</span><span class="p">.</span><span class="nx">EventEmitter</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Code of whole thing is very simple. But while building node.js module there are few things that are useful. First of all you don&#8217;t need to implement your own way of inheritance you can use the one from utils. (Remember to put it just after function definition) because it overrides prototype :) you don&#8217;t wanna lose your &#8220;instance methods&#8221; don&#8217;t you.</p>

<p>Next nice thing to help users is check of instanceof just at top of &#8220;constructor&#8221; function. This prevents users from using it wrong. Well its easier to say it enables them to use it wrong and fixes their mistake.</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='javascript'><span class='line'><span class="kd">var</span> <span class="nx">toons</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;future_toons&#39;</span><span class="p">);</span>
</span><span class='line'><span class="k">new</span> <span class="nx">toons</span><span class="p">(</span><span class="s2">&quot;example.js&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">line</span><span class="p">){});</span>
</span></code></pre></td></tr></table></div></figure>


<p>and</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='javascript'><span class='line'><span class="kd">var</span> <span class="nx">toons</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;future_toons&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">toons</span><span class="p">(</span><span class="s2">&quot;example.js&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">line</span><span class="p">){});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This will produce same output and act in same way.</p>

<h1>How to use this ?</h1>

<p>It is simple :) You need to know three things, where the file is, what do you want to do with each line and do you need to do something at the end.</p>

<p>basic 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>
<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='javascript'><span class='line'><span class="kd">var</span> <span class="nx">toons</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;future_toons&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">on_each_line_callback</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">line</span><span class="p">){</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;&gt; &quot;</span> <span class="o">+</span> <span class="nx">line</span><span class="p">);</span>  
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="k">new</span> <span class="nx">toons</span><span class="p">(</span><span class="s2">&quot;example.txt&quot;</span><span class="p">,</span> <span class="nx">on_each_line_callback</span><span class="p">);</span>
</span><span class='line'><span class="c1">// this will auto trigger run and process it but you can delay it like this</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">streamer</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">toons</span><span class="p">();</span>
</span><span class='line'><span class="nx">streamer</span><span class="p">.</span><span class="nx">onLine</span><span class="p">(</span><span class="nx">on_each_line_callback</span><span class="p">);</span>
</span><span class='line'><span class="c1">// you can add function on end! also :)</span>
</span><span class='line'><span class="nx">streamer</span><span class="p">.</span><span class="nx">onEnd</span><span class="p">(</span><span class="kd">function</span><span class="p">(){</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">&quot;lol&quot;</span><span class="p">)});</span>
</span><span class='line'><span class="c1">// run it naow!</span>
</span><span class='line'><span class="nx">streamer</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="s2">&quot;example.txt&quot;</span><span class="p">);</span>
</span><span class='line'><span class="c1">// you can reuse it for many files if you want ;p</span>
</span></code></pre></td></tr></table></div></figure>


<p>This example will show each line of the file prefixed with &#8220;>&#8221; symbol and at the end he will print out &#8220;lol&#8221;. This is most common case in real world :) you need to optimize &#8220;lol&#8221;. And for now thats the whole api.</p>

<h1>Command line interface</h1>

<p>Currently i added simple command line interface just to play with it. 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>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>λ <span class="nb">time </span>node bin/toons -f ~/Downloads/access.log -e <span class="s2">&quot;function(line){}&quot;</span> node bin/toons -f ~/Downloads/access.log -e <span class="s2">&quot;function(line){}&quot;</span>
</span><span class='line'>0.38s user 0.07s system 101% cpu 0.440 total
</span></code></pre></td></tr></table></div></figure>


<p>It is a bit unsafe now so maybe i will remove it soonish.</p>

<h1>Db vs File</h1>

<p>Some people say they need to put logs into db, i always ask this people &#8220;why not just file? this db will have to write it to this file anyway :)&#8221;</p>

<h1>Summary</h1>

<p>if you will get email from new relic sales guy, ignore! don&#8217;t reply ever!!! Haha while writing this post i got new email from their sales. Code is on github i hope i will have some time to work on it and it will have rails production.log streaming support soonish.</p>

<p>Cheers!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Setting up replication with Redis]]></title>
    <link href="http://no-fucking-idea.com/blog/2012/04/29/setting-up-replication-with-redis/"/>
    <updated>2012-04-29T20:16:00+01:00</updated>
    <id>http://no-fucking-idea.com/blog/2012/04/29/setting-up-replication-with-redis</id>
    <content type="html"><![CDATA[<p>Everyone who wants to feel safe about his data wants to have some sort of backup :). Redis have a support for replication.
And it is very easy to setup.</p>

<h1>Setup!</h1>

<p>To setup replica node all you have to do is to add one line <code>slaveOf</code> in config @_@ of your new Redis instance.
Sounds easy :). Lets think about most basic scenario.</p>

<p>Two nodes, master node and slave node. For purpose of this example you can just start redis using <code>redis-server</code> command without by default he will start on port <code>6379</code> and this is all we need to know to setup replication.</p>

<h2>Configuration of replica node</h2>

<p>To configure replica node all we need to do is to create place to store the db eg. <code>mkdir replica_db</code> and choose port eg. <code>7789</code>. Last thing to do is to create config and point this node to the master. For me it looks like this:</p>

<figure class='code'><figcaption><span>redis-replica.conf</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>daemonize no
</span><span class='line'>timeout 0
</span><span class='line'>loglevel notice
</span><span class='line'>logfile stdout
</span><span class='line'>databases 16
</span><span class='line'>save 900 1
</span><span class='line'>save 300 10
</span><span class='line'>save 60 10000
</span><span class='line'>stop-writes-on-bgsave-error yes
</span><span class='line'>rdbcompression yes
</span><span class='line'>rdbchecksum yes
</span><span class='line'>dbfilename dump.rdb
</span><span class='line'>dir ./replica_dir
</span><span class='line'>slave-serve-stale-data yes
</span><span class='line'>slave-read-only yes
</span><span class='line'>appendonly no
</span><span class='line'>appendfsync everysec
</span><span class='line'>no-appendfsync-on-rewrite no
</span><span class='line'>auto-aof-rewrite-percentage 100
</span><span class='line'>auto-aof-rewrite-min-size 64mb
</span><span class='line'>lua-time-limit 5000
</span><span class='line'>
</span><span class='line'>pidfile /var/run/redis-replica-7789.pid
</span><span class='line'>port 7789
</span><span class='line'><span class="c"># replication config</span>
</span><span class='line'>slaveof 127.0.0.1 6379
</span><span class='line'>
</span><span class='line'>slowlog-log-slower-than 10000
</span><span class='line'>slowlog-max-len 1024
</span><span class='line'><span class="nb">hash</span>-max-ziplist-entries 512
</span><span class='line'><span class="nb">hash</span>-max-ziplist-value 64
</span><span class='line'>list-max-ziplist-entries 512
</span><span class='line'>list-max-ziplist-value 64
</span><span class='line'><span class="nb">set</span>-max-intset-entries 512
</span><span class='line'>zset-max-ziplist-entries 128
</span><span class='line'>zset-max-ziplist-value 64
</span><span class='line'>activerehashing yes
</span><span class='line'>client-output-buffer-limit normal 0 0 0
</span><span class='line'>client-output-buffer-limit slave 256mb 64mb 60
</span><span class='line'>client-output-buffer-limit pubsub 32mb 8mb 60
</span></code></pre></td></tr></table></div></figure>


<p>Here the important thing really is <code>slaveof 127.0.0.1 6379</code> where we set where is our master. <code>port 7789</code> important if we are using few redis instances on one box and <code>dir ./replica_dir</code> be sure to not point this to master node db path if you do&#8230; you will suffer eternal flame.</p>

<p>Now just start the node <code>redis-server redis-replica.conf</code> and he will start syncing.</p>

<h1>Checking if everything works</h1>

<p>So by now we should have master running on default port and replica connected to it. Lets connect using <code>redis-cli</code> to master and set some keys eg. <code>set name kuba</code>.  Now lets connect to our replica.  If you followed the same configuration then me you can simply do <code>./redis-cli -p 7789</code> this will prompt you with regular command line interface. Now jsut type <code>get name</code></p>

<figure class='code'><figcaption><span>redis-replica.conf</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'>redis 127.0.0.1:7789&gt; get name
</span><span class='line'><span class="s2">&quot;jakub&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Bang works!</p>

<h1>RO</h1>

<p>Important information is that one master can have many replicas and each replica is read only! So you can connect to it and read from it if you want / need.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'> λ ./redis-cli -p 7789
</span><span class='line'>redis 127.0.0.1:7789&gt; keys *
</span><span class='line'> 1<span class="o">)</span> <span class="s2">&quot;age&quot;</span>
</span><span class='line'> 2<span class="o">)</span> <span class="s2">&quot;name&quot;</span>
</span><span class='line'>redis 127.0.0.1:7789&gt; get name
</span><span class='line'><span class="s2">&quot;jakub&quot;</span>
</span><span class='line'>redis 127.0.0.1:7789&gt; <span class="nb">set </span>name <span class="s2">&quot;not jakub&quot;</span>
</span><span class='line'><span class="o">(</span>error<span class="o">)</span> READONLY You can<span class="err">&#39;</span>t write against a <span class="nb">read </span>only slave.
</span><span class='line'>redis 127.0.0.1:7789&gt;
</span></code></pre></td></tr></table></div></figure>


<h1>Summary</h1>

<p>I never had deadly important data in redis :) But still its worth knowing how to setup this just in case something goes wrong you may want to have replica ready :).</p>

<p>On official site <a href="http://redis.io/topics/replication">http://redis.io/topics/replication</a> you can learn more about replication in redis.</p>

<p>Cheers!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Building node.js module using npm]]></title>
    <link href="http://no-fucking-idea.com/blog/2012/04/23/building-node-dot-js-module-using-npm/"/>
    <updated>2012-04-23T21:28:00+01:00</updated>
    <id>http://no-fucking-idea.com/blog/2012/04/23/building-node-dot-js-module-using-npm</id>
    <content type="html"><![CDATA[<p>I have spend a bit time to find out how to build modules, where to put dependencies and how to form <code>package.json</code> so i decided to create this post to gather some of this info in one place. This <code>modules</code> are more like ruby <code>gems</code> than parts of language grouping functions also called modules (eg. Erlang). I was recently on conference and i want to post something about module i was working on at airport but before next post i need to add this so i will have something to reference to.</p>

<h1>npm</h1>

<p>Npm stands for node package manager and it is something like gems in ruby, eggs in python or apt in debian. It lets you search, install and update your node or application modules. You can create node.js modules without <code>npm</code> but if you want to publish your module its better to do it this way. If you have node.js <code>&gt;0.6.10</code> you should have npm bundled with your instalation if not go to <a href="http://npmjs.org/">http://npmjs.org/</a> and follow the instructions. (for normal platforms all you have to do i run <code>http://npmjs.org/install.sh</code>)</p>

<h1>scaffold</h1>

<p>First thing to do is to initialize our module, to do this we need to create a directory for it and run npm init 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'>λ mkdir my_first_module <span class="o">&amp;&amp;</span> <span class="nb">cd </span>my_first_module
</span><span class='line'>λ npm init
</span></code></pre></td></tr></table></div></figure>


<p>Next he will ask us few questions, we should answer ;).
example output:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>Package name: <span class="o">(</span>my_first_module<span class="o">)</span>
</span><span class='line'>Description: my first module
</span><span class='line'>Package version: <span class="o">(</span>0.0.0<span class="o">)</span>
</span><span class='line'>Project homepage: <span class="o">(</span>none<span class="o">)</span> no-fucking-idea.com
</span><span class='line'>Project git repository: <span class="o">(</span>none<span class="o">)</span>
</span><span class='line'>Author name: Jakub Oboza
</span><span class='line'>Author email: <span class="o">(</span>none<span class="o">)</span> jakub.oboza@gmail.com
</span><span class='line'>Author url: <span class="o">(</span>none<span class="o">)</span> no-fucking-idea.com
</span><span class='line'>Main module/entry point: <span class="o">(</span>none<span class="o">)</span>
</span><span class='line'>Test <span class="nb">command</span>: <span class="o">(</span>none<span class="o">)</span> mocha -R landing lib/my_first_module.js
</span><span class='line'>About to write to /private/tmp/my_first_module/package.json
</span><span class='line'>
</span><span class='line'><span class="o">{</span>
</span><span class='line'>  <span class="s2">&quot;author&quot;</span>: <span class="s2">&quot;Jakub Oboza &lt;jakub.oboza@gmail.com&gt; (no-fucking-idea.com)&quot;</span>,
</span><span class='line'>  <span class="s2">&quot;name&quot;</span>: <span class="s2">&quot;my_first_module&quot;</span>,
</span><span class='line'>  <span class="s2">&quot;description&quot;</span>: <span class="s2">&quot;my first module&quot;</span>,
</span><span class='line'>  <span class="s2">&quot;version&quot;</span>: <span class="s2">&quot;0.0.0&quot;</span>,
</span><span class='line'>  <span class="s2">&quot;homepage&quot;</span>: <span class="s2">&quot;no-fucking-idea.com&quot;</span>,
</span><span class='line'>  <span class="s2">&quot;scripts&quot;</span>: <span class="o">{</span>
</span><span class='line'>    <span class="s2">&quot;test&quot;</span>: <span class="s2">&quot;mocha -R landing lib/my_first_module.js&quot;</span>
</span><span class='line'>  <span class="o">}</span>,
</span><span class='line'>  <span class="s2">&quot;dependencies&quot;</span>: <span class="o">{}</span>,
</span><span class='line'>  <span class="s2">&quot;devDependencies&quot;</span>: <span class="o">{}</span>,
</span><span class='line'>  <span class="s2">&quot;optionalDependencies&quot;</span>: <span class="o">{}</span>,
</span><span class='line'>  <span class="s2">&quot;engines&quot;</span>: <span class="o">{</span>
</span><span class='line'>    <span class="s2">&quot;node&quot;</span>: <span class="s2">&quot;*&quot;</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><span class='line'>
</span><span class='line'>Is this ok? <span class="o">(</span>yes<span class="o">)</span> yes
</span></code></pre></td></tr></table></div></figure>


<p>This will create for us <code>package.json</code>. Now we have fully functional module and we could stop now&#8230;. but</p>

<h1>package.json</h1>

<p>This file is description of our package. It is in form of json so it should be easy to read and change.
Most of this fields don&#8217;t need a lot of description because keys are self explaining but things that we should look at is <code>"scripts"</code> where we defined <code>"test"</code> key. If we will now run <code>npm test</code> he will execute this command that is very useful.</p>

<p>Engines defined on what version of <code>node.js</code> our code will work leaving it to <code>*</code> is a bit hazard. You can set it to something specific if you want.</p>

<p>Important thing! If we will not specify entry point to our module by default it will be looking for <code>index.js</code> so for now lets leave it this way.</p>

<h1>tests with mocha</h1>

<p>If we want to write reasonable code that we want to rely on we should be doing massive testing. I think <code>mocha</code> is a very good library for this purpose! I strongly suggest installing it with flag <code>-g</code> so it will be accessible in global scope of <code>npm</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>λ npm install -g mocha
</span></code></pre></td></tr></table></div></figure>


<p></p>

<h1>Code</h1>

<p>Ok but we don&#8217;t have any code yet ;/. Yes lets start coding.</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'>λ mkdir lib
</span><span class='line'>λ touch index.js
</span><span class='line'>λ touch lib/my_first_module.js
</span></code></pre></td></tr></table></div></figure>


<p>Ok so we created <code>lib</code> directory with out module code, empty module file and index file. Now lets run the tests and see what happened.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>λ npm <span class="nb">test</span>
</span><span class='line'>
</span><span class='line'>&gt; my_first_module@0.0.0 <span class="nb">test</span> /private/my_first_module
</span><span class='line'>&gt; mocha -R landing lib/my_first_module.js
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>  ✔ 0 tests <span class="nb">complete</span> <span class="o">(</span>1ms<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Everything passed, that is expected because we don&#8217;t have any tests :) Now lets add to <code>package.json</code> one more thing development dependency for <code>should.js</code> it will enable us to use mocha in a bit <code>rspec</code> bdd style. Like this:</p>

<figure class='code'><figcaption><span>package.json</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='javascript'><span class='line'>  <span class="s2">&quot;devDependencies&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;should&quot;</span><span class="o">:</span> <span class="s2">&quot;&gt;= 0.0.0&quot;</span>
</span><span class='line'>  <span class="p">},</span>
</span></code></pre></td></tr></table></div></figure>


<p>And again <code>npm install -l</code> to get everything installed locally.</p>

<h2>First test</h2>

<p>Initial mocha test for our module</p>

<figure class='code'><figcaption><span>lib/my_first_module.js</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='javascript'><span class='line'><span class="kd">function</span> <span class="nx">MyFirstFoo</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">){</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">MyFirstFoo</span>
</span><span class='line'>
</span><span class='line'><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;should&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="nx">describe</span><span class="p">(</span><span class="s1">&#39;MyFirstFoo&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;should be able to add&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="nx">MyFirstFoo</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="nx">should</span><span class="p">.</span><span class="nx">be</span><span class="p">[</span><span class="mi">5</span><span class="p">];</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>First we define empty body of function next we have <code>module.exports =</code> this is to mark which functions will be visible outside this module when other clients will <code>require</code> this module.  If you need more info about writing specs in mocha please read my earlier post <a href="http://no-fucking-idea.com/blog/2012/04/05/testing-handlebars-with-mocha/">http://no-fucking-idea.com/blog/2012/04/05/testing-handlebars-with-mocha/</a>. Now lets run <code>npm test</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'> λ npm <span class="nb">test</span>
</span><span class='line'>
</span><span class='line'>&gt; my_first_module@0.0.0 <span class="nb">test</span> /private/tmp/my_first_module
</span><span class='line'>&gt; mocha -R landing lib/my_first_module.js
</span><span class='line'>  -----------------------------------------------------------------------------------------------------------------------------------------------
</span><span class='line'>  ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅✈
</span><span class='line'>  -----------------------------------------------------------------------------------------------------------------------------------------------
</span><span class='line'>
</span><span class='line'>  ✖ 1 of 1 tests failed:
</span><span class='line'>
</span><span class='line'>  1<span class="o">)</span> MyFirstFoo should be able to add:
</span><span class='line'>     TypeError: Cannot <span class="nb">read </span>property <span class="s1">&#39;should&#39;</span> of undefined
</span><span class='line'>      at Context.&lt;anonymous&gt; <span class="o">(</span>/private/tmp/lol/my_first_module/lib/my_first_module.js:13:21<span class="o">)</span>
</span><span class='line'>      at Test.run <span class="o">(</span>/opt/local/lib/node_modules/mocha/lib/runnable.js:156:32<span class="o">)</span>
</span><span class='line'>      at Runner.runTest <span class="o">(</span>/opt/local/lib/node_modules/mocha/lib/runner.js:272:10<span class="o">)</span>
</span><span class='line'>      at /opt/local/lib/node_modules/mocha/lib/runner.js:316:12
</span><span class='line'>      at next <span class="o">(</span>/opt/local/lib/node_modules/mocha/lib/runner.js:199:14<span class="o">)</span>
</span><span class='line'>      at /opt/local/lib/node_modules/mocha/lib/runner.js:208:7
</span><span class='line'>      at next <span class="o">(</span>/opt/local/lib/node_modules/mocha/lib/runner.js:157:23<span class="o">)</span>
</span><span class='line'>      at Array.0 <span class="o">(</span>/opt/local/lib/node_modules/mocha/lib/runner.js:176:5<span class="o">)</span>
</span><span class='line'>      at EventEmitter._tickCallback <span class="o">(</span>node.js:192:40<span class="o">)</span>
</span><span class='line'>
</span><span class='line'>...
</span></code></pre></td></tr></table></div></figure>


<p>Fails as expected so lets ad implementation to our function.</p>

<figure class='code'><figcaption><span>lib/my_first_module.js</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='javascript'><span class='line'><span class="kd">function</span> <span class="nx">MyFirstFoo</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">){</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">MyFirstFoo</span>
</span><span class='line'>
</span><span class='line'><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;should&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="nx">describe</span><span class="p">(</span><span class="s1">&#39;MyFirstFoo&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>  <span class="nx">it</span><span class="p">(</span><span class="s2">&quot;should be able to add&quot;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(){</span>
</span><span class='line'>    <span class="nx">MyFirstFoo</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="nx">should</span><span class="p">.</span><span class="nx">be</span><span class="p">[</span><span class="mi">5</span><span class="p">];</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>And run <code>npm test</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>λ npm <span class="nb">test</span>
</span><span class='line'>
</span><span class='line'>&gt; my_first_module@0.0.0 <span class="nb">test</span> /private/tmp/lol/my_first_module
</span><span class='line'>&gt; mocha -R landing lib/my_first_module.js
</span><span class='line'>  -----------------------------------------------------------------------------------------------------------------------------------------------
</span><span class='line'>  ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅✈
</span><span class='line'>  -----------------------------------------------------------------------------------------------------------------------------------------------
</span><span class='line'>
</span><span class='line'>  ✔ 1 tests <span class="nb">complete</span> <span class="o">(</span>2ms<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>We have landed safely ;) Now we are ready for development!</p>

<h1>Summary</h1>

<p>Creating good quality of code requires testing in node.js thats why i decided to join this two things and explain how to marry them both fast. More info can be found here <a href="http://howtonode.org/how-to-module">http://howtonode.org/how-to-module</a>.</p>

<p>I hope it helped a bit.
Cheers!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Setting up redis cluster]]></title>
    <link href="http://no-fucking-idea.com/blog/2012/04/16/setting-up-redis-cluster/"/>
    <updated>2012-04-16T19:54:00+01:00</updated>
    <id>http://no-fucking-idea.com/blog/2012/04/16/setting-up-redis-cluster</id>
    <content type="html"><![CDATA[<p>redis cluster in currently unstable, i used todays master HEAD (93a74949d7bb5d0c4115d1bf45f856c368badf31) commit to build my redis server and client. Setting redis cluster requires only few settings to go! :)</p>

<p>Here is link to overview how redis cluster works <a href="http://redis.io/presentation/Redis_Cluster.pdf">http://redis.io/presentation/Redis_Cluster.pdf</a></p>

<h1>redis.conf</h1>

<p>Regular nodes can&#8217;t be part of cluster :( so you have to prepare separate redis configs for your cluster servers.
Most important thing is to setup <code>cluster-enabled</code> and <code>cluster-config-file</code> I decided to name my config files <code>redis-cluster-&lt;port&gt;.conf</code>. I used ports 4444, 4445 4446
Here is my sample config</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>daemonize yes
</span><span class='line'>timeout 0
</span><span class='line'>loglevel notice
</span><span class='line'>logfile stdout
</span><span class='line'>databases 16
</span><span class='line'>save 900 1
</span><span class='line'>save 300 10
</span><span class='line'>save 60 10000
</span><span class='line'>stop-writes-on-bgsave-error yes
</span><span class='line'>rdbcompression yes
</span><span class='line'>rdbchecksum yes
</span><span class='line'>dbfilename dump.rdb
</span><span class='line'>dir ./cluster_4444
</span><span class='line'>slave-serve-stale-data yes
</span><span class='line'>slave-read-only yes
</span><span class='line'>appendonly no
</span><span class='line'>appendfsync everysec
</span><span class='line'>no-appendfsync-on-rewrite no
</span><span class='line'>auto-aof-rewrite-percentage 100
</span><span class='line'>auto-aof-rewrite-min-size 64mb
</span><span class='line'>lua-time-limit 5000
</span><span class='line'>
</span><span class='line'><span class="c"># Cluster</span>
</span><span class='line'><span class="c">#</span>
</span><span class='line'>pidfile /var/run/redis-4444.pid
</span><span class='line'>port 4444
</span><span class='line'>cluster-enabled yes
</span><span class='line'>cluster-config-file redis-cluster-4444.conf
</span><span class='line'>
</span><span class='line'>slowlog-log-slower-than 10000
</span><span class='line'>slowlog-max-len 1024
</span><span class='line'><span class="nb">hash</span>-max-ziplist-entries 512
</span><span class='line'><span class="nb">hash</span>-max-ziplist-value 64
</span><span class='line'>list-max-ziplist-entries 512
</span><span class='line'>list-max-ziplist-value 64
</span><span class='line'><span class="nb">set</span>-max-intset-entries 512
</span><span class='line'>zset-max-ziplist-entries 128
</span><span class='line'>zset-max-ziplist-value 64
</span><span class='line'>activerehashing yes
</span><span class='line'>client-output-buffer-limit normal 0 0 0
</span><span class='line'>client-output-buffer-limit slave 256mb 64mb 60
</span><span class='line'>client-output-buffer-limit pubsub 32mb 8mb 60
</span></code></pre></td></tr></table></div></figure>


<p>For each node i created directory <code>cluster_&lt;port&gt;</code> and that was the hardest part actually to do. With this all you have to do is to start ( for debug you can set daemonize to no) all nodes using <code>redis-server path/to/redis-cluster-&lt;port&gt;.conf</code> and then use magic ruby tool :)</p>

<h1>redis-tribe.rb</h1>

<p>In <code>src/</code> directory of source you can find ruby script for creating and managing cluster. But first you need to have ruby installed with <code>redis</code> gem. i just did <code>gem install redis</code> but if you don&#8217;t have ruby you have to google how to install it etc (hint: get 1.9.2).</p>

<p>now you can run the script. <code>./redis-tribe.rb</code> and see</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='bash'><span class='line'>λ ./redis-trib.rb
</span><span class='line'>Usage: redis-trib &lt;<span class="nb">command</span>&gt; &lt;arguments ...&gt;
</span><span class='line'>
</span><span class='line'>  create               host1:port host2:port ... hostN:port
</span><span class='line'>  check                host:port
</span><span class='line'>  reshard              host:port
</span></code></pre></td></tr></table></div></figure>


<p>To start cluster we will type &#8220;create&#8221; (useless comment)</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>λ ./redis-trib.rb create 127.0.0.1:4444 127.0.0.1:4445 127.0.0.1:4446
</span><span class='line'>Creating cluster
</span><span class='line'>Connecting to node 127.0.0.1:4444: OK
</span><span class='line'>Connecting to node 127.0.0.1:4445: OK
</span><span class='line'>Connecting to node 127.0.0.1:4446: OK
</span><span class='line'>Performing <span class="nb">hash </span>slots allocation on 3 nodes...
</span><span class='line'><span class="o">[</span>FAIL<span class="o">]</span> 5a2f6df453f1cd52bcb22c2afc45580283bcce87 127.0.0.1:4444 slots:0-1364 <span class="o">(</span>1365 slots<span class="o">)</span>
</span><span class='line'><span class="o">[</span>FAIL<span class="o">]</span> 35d107017bc726ece9b57e1ea2f21678555cf6a8 127.0.0.1:4445 slots:1365-2729 <span class="o">(</span>1365 slots<span class="o">)</span>
</span><span class='line'><span class="o">[</span>FAIL<span class="o">]</span> 76d06b0d3cb1b3829cb60574260dff2d06964cea 127.0.0.1:4446 slots:2730-4095 <span class="o">(</span>1366 slots<span class="o">)</span>
</span><span class='line'>Can I <span class="nb">set </span>the above configuration? <span class="o">(</span><span class="nb">type</span> <span class="s1">&#39;yes&#39;</span> to accept<span class="o">)</span>: yes
</span><span class='line'>** Nodes configuration updated
</span><span class='line'>** Sending CLUSTER MEET messages to join the cluster
</span><span class='line'>Performing Cluster Check <span class="o">(</span>using node 127.0.0.1:4444<span class="o">)</span>
</span><span class='line'><span class="o">[</span>FAIL<span class="o">]</span> 5a2f6df453f1cd52bcb22c2afc45580283bcce87 127.0.0.1:4444 slots:0-1364 <span class="o">(</span>1365 slots<span class="o">)</span>
</span><span class='line'><span class="o">[</span>FAIL<span class="o">]</span> 35d107017bc726ece9b57e1ea2f21678555cf6a8 127.0.0.1:4445 slots:1365-2729 <span class="o">(</span>1365 slots<span class="o">)</span>
</span><span class='line'><span class="o">[</span>FAIL<span class="o">]</span> 76d06b0d3cb1b3829cb60574260dff2d06964cea 127.0.0.1:4446 slots:2730-4095 <span class="o">(</span>1366 slots<span class="o">)</span>
</span><span class='line'><span class="o">[</span>OK<span class="o">]</span> All 4096 slots covered.
</span></code></pre></td></tr></table></div></figure>


<p>Nice we have our cluster running :) now we can connect to any node and 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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>λ ./redis-cli -h 127.0.0.1 -p 4445
</span><span class='line'>redis 127.0.0.1:4445&gt; <span class="nb">set</span> <span class="s2">&quot;jakub&quot;</span> <span class="s2">&quot;oboza&quot;</span>
</span><span class='line'><span class="o">(</span>error<span class="o">)</span> MOVED 198 127.0.0.1:4444
</span></code></pre></td></tr></table></div></figure>


<p>Sweet :D</p>

<p>Using this tool you can also reshard :D I did on my 15 keys worked :-F.</p>

<h1>Smart clients</h1>

<p>In redis doc we can read that you will require &#8220;smart client&#8221; to make it low latency. Yes, you can read from output that it was moved so you will have to cache where the key is now and reset temp cache when it will be moved (resharding)</p>

<h1>Fire!</h1>

<p>You can now test how it will behaves under fire by killing and restarting your nodes 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>
<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='bash'><span class='line'><span class="o">[</span>19008<span class="o">]</span> 16 Apr 19:44:09.945 <span class="c"># Server started, Redis version 2.9.7</span>
</span><span class='line'><span class="o">[</span>19008<span class="o">]</span> 16 Apr 19:44:09.946 * The server is now ready to accept connections on port 4444
</span><span class='line'><span class="o">[</span>19008<span class="o">]</span> 16 Apr 19:45:14.414 * Connecting with Node c20290a7b70a2a840a168c3309f00e3de1b1844d at 127.0.0.1:14446
</span><span class='line'><span class="o">[</span>19008<span class="o">]</span> 16 Apr 19:45:15.424 * Connecting with Node ab93647957ed4bb93fc43b1dc76202a6cdb94f49 at 127.0.0.1:14445
</span><span class='line'><span class="o">[</span>19008<span class="o">]</span> 16 Apr 19:59:10.047 * 1 changes in 900 seconds. Saving...
</span><span class='line'><span class="o">[</span>19008<span class="o">]</span> 16 Apr 19:59:10.047 * Background saving started by pid 19321
</span><span class='line'><span class="o">[</span>19321<span class="o">]</span> 16 Apr 19:59:10.080 * DB saved on disk
</span><span class='line'><span class="o">[</span>19008<span class="o">]</span> 16 Apr 19:59:10.248 * Background saving terminated with success
</span><span class='line'><span class="o">[</span>19008<span class="o">]</span> 16 Apr 20:08:29.837 * I/O error reading from node link: connection closed
</span><span class='line'><span class="o">[</span>19008<span class="o">]</span> 16 Apr 20:08:29.837 * I/O error reading from node link: connection closed
</span><span class='line'><span class="o">[</span>19008<span class="o">]</span> 16 Apr 20:08:30.056 * Connecting with Node 76d06b0d3cb1b3829cb60574260dff2d06964cea at 127.0.0.1:14446
</span><span class='line'><span class="o">[</span>19008<span class="o">]</span> 16 Apr 20:08:30.056 * I/O error writing to node link: Broken pipe
</span><span class='line'><span class="o">[</span>19008<span class="o">]</span> 16 Apr 20:08:30.525 * I/O error reading from node link: connection closed
</span><span class='line'><span class="o">[</span>19008<span class="o">]</span> 16 Apr 20:08:30.526 * I/O error reading from node link: connection closed
</span><span class='line'><span class="o">[</span>19008<span class="o">]</span> 16 Apr 20:08:31.063 * Connecting with Node 35d107017bc726ece9b57e1ea2f21678555cf6a8 at 127.0.0.1:14445
</span><span class='line'><span class="o">[</span>19008<span class="o">]</span> 16 Apr 20:08:31.064 * Connecting with Node 76d06b0d3cb1b3829cb60574260dff2d06964cea at 127.0.0.1:14446
</span></code></pre></td></tr></table></div></figure>


<h1>Summary</h1>

<p>Even if i think this is a great tool, and is unstable i saw after few minutes play that some things just don&#8217;t work as intended and some keys are not pushed. But it is pulled from unstable branch so i&#8217;m crossing my fingers for this project because it looks sweet! Go Go Antirez.</p>
]]></content>
  </entry>
  
</feed>
