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

  <title><![CDATA[zncb.]]></title>
  <link href="https://zncb.me/atom.xml" rel="self"/>
  <link href="https://zncb.me/"/>
  <updated>2016-07-25T21:43:44+00:00</updated>
  <id>https://zncb.me/</id>
  <author>
    <name><![CDATA[zncb]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Sneaky Ansible Pitfalls]]></title>
    <link href="https://zncb.me/blog/2016/03/11/sneaky-ansible-pitfalls/"/>
    <updated>2016-03-11T17:26:11+00:00</updated>
    <id>https://zncb.me/blog/2016/03/11/sneaky-ansible-pitfalls</id>
    <content type="html"><![CDATA[<p>While writing some new roles for Ansible 2.0, I stumbled upon some oddities with the way the <a href="https://docs.ansible.com/ansible/set_fact_module.html">set_fact module</a> deals with variables.</p>

<p>Let&rsquo;s consider this simple playbook:</p>

<pre><code>---
- hosts: node0
  vars:
    foo: ''
  tasks:
    - set_fact: foo='foo'
    - debug: var=foo
</code></pre>

<p>At first glance one would expect the <em>foo</em> variable to be set to the string value <em>&lsquo;foo&rsquo;</em>, but we get some strange result instead:</p>

<pre><code>ok: [node0] =&gt; {
    "foo": "VARIABLE IS NOT DEFINED!"
}
</code></pre>

<!-- more -->


<p>Did ansible interpret the quoted <em>foo</em> as the foo variable and decided to unset the variable because it couldn&rsquo;t deal with the recursion?
In some other cases like setting a variable to itself in a <em>vars:</em> dictionary, an infinite loop error is thrown, not here.</p>

<p>Commenting out the set_fact task, we get the expected result:</p>

<pre><code>ok: [node0] =&gt; {
    "foo": ""
}
</code></pre>

<p>Replacing <em>&lsquo;foo&rsquo;</em> with <em>&lsquo;bar&rsquo;</em> as a value in the set_fact task we get the following, which makes more sense:</p>

<pre><code>ok: [node0] =&gt; {
    "foo": "bar"
}
</code></pre>

<p>But let&rsquo;s say <em>bar</em> is also a variable, like this:</p>

<pre><code>---
- hosts: node0
  vars:
    foo: ''
    bar: 'baz'
  tasks:
    - set_fact: foo='bar'
    - debug: var=foo
</code></pre>

<p>What should we expect here? <em>&lsquo;bar&rsquo;</em> is not evaluated as a variable and the string value is used as is, so we get the same result as when <em>bar</em> was not defined.</p>

<p>When using double quotes, <em>bar</em> is expanded and the resulting value is <em>&lsquo;baz&rsquo;</em>, in the <em>&lsquo;foo&rsquo;</em> case, we still get the same undefined message.</p>

<p>I couldn&rsquo;t find a definitive statement anywhere in the documentation that would clarify the expansion rule for variables inside quoted statements. Are single quoted string supposed to be expanded or not? If so, is it now impossible to assign a variable it&rsquo;s own name as a string?</p>

<p>I very much like Ansible, but this is a good example of how permissive syntax can shoot you right back in the foot. There are many ambiguities and tricky corner cases, sometimes due to functionalities delegated to some other piece of software involved (eg: yaml syntax limitations, reserved python keywords, jinja2 oddities, &hellip;).</p>

<p>In general, Ansible&rsquo;s scoping model is perhaps too complex, with 16(!) levels of precedence and specificity, irregular definition mechanisms (eg: tasks can define vars, but not blocks? rly?), and subtle behavior oddities like the one highlighted here only amplifies that complexity. In simple cases this is not much of a problem, but when trying to create generic, truly reusable roles, it can cause many headaches, and in the long term can even be a thorn in Ansible&rsquo;s side, as once this model gets adopted it will be hard to replace it with a clean design. This seems to be affecting pretty much any declaritive systems that start adding partial scripting capabilities. At first it&rsquo;s just a bonus, then it becomes the reason you use it, and features are piled in to fill gaps as the need comes. At some point you have to wonder if it wouldn&rsquo;t be a better idea to define a proper programming language from the ground up. An alternative starting point would be to use a language that is in itself it&rsquo;s own input data, like Lisp or Scheme.</p>

<h2>Here are a few other favorites:</h2>

<h3>Type mapping</h3>

<p>Ansible gives you freedom of boole: yes,no,true,false,True,False! Not quite. Well, it depends&hellip;</p>

<pre><code>---
- hosts: node0
  vars:
    foo: no
  tasks:
    - debug: msg='this is not the boolean you're looking for'
      when: foo == no
</code></pre>

<p>If we forget the fact that the <em>when</em> conditionals are actually jinja2 expressions (and the syntax helps us forget this so well), then we&rsquo;d expect this playbook to work just fine, but <em>no</em> is undefined in jinja2, where booleans are true/false (although it now permits capitalized versions too).</p>

<h3>Escaping strings</h3>

<p><em>{{ }}</em> can be used to expand a variable. What if you need a string with <em>{{ }}</em> in it?</p>

<pre><code>---
- hosts: node0
  vars:
    foo: '{{ bar }}'
  tasks:
    - debug: var=foo

ok: [node0] =&gt; {
    "foo": "VARIABLE IS NOT DEFINED!"
}
</code></pre>

<p>Oups! As said above it seems that single quote statements are expanded (in some cases, not others, not by the same rules as double quoted string). The jinja2 syntax for escaping this is actually: <code>"{% raw %}{{  bar  }}{% endraw %}"</code>. Probably the most cumbersome escape syntax ever designed. (The liquid templates used in this blog too exhibit the same <a href="https://stackoverflow.com/questions/3426182/how-to-escape-liquid-template-tags/12948815#12948815">nonsense</a>)</p>

<p>Oh, but wait, can I write this?</p>

<pre><code>---
- hosts: node0
  vars:
    foo: "{% raw %}{% raw %}{{ bar }}{% endraw %}{% endraw %}"
  tasks:
    - debug: var=foo

fatal: [node0]: FAILED! =&gt; {"failed": true, "msg": "template error while templating string: Encountered unknown tag 'endraw'.. String: {% raw %}{% raw %}{{ bar }}{% endraw %}{% endraw %}"}
</code></pre>

<p>Of course that first <em>endraw</em> is in the way, but that&rsquo;s going to make things complicated.</p>

<p>This post <a href="http://blog.slaks.net/2013-06-10/jekyll-endraw-in-code/">here</a> explain how to escape the escape sequence. And we could avoid those unbalanced-looking braces by using this awful workaround:</p>

<pre><code>{% assign oTag = '{%' %}
{% assign cP = '%' %}
{% assign cB = '}' %}
{{  oTag  }} raw {{ cP }}{{ cB }}{% raw %}{{ bar }}{% endraw %}{{  oTag  }} endraw {{ cP }}{{ cB }}
</code></pre>

<p>In all honesty, this is absolutely horrific. And you do not want to see <a href="https://zncb.me/assets/misc/escape-nonsense.md">the markdown for this bit</a>. Another alternative in Liquid&rsquo;s case is to use html entities, but that&rsquo;s assuming your target is html at all.</p>

<p>Note that &lsquo;%}&rsquo; had to be split into two variables because the parser captures the first &lsquo;%}&rsquo; it sees no matter what context it encounters it in. Which causes the need to escape the escape sequence&rsquo;s delimiter. This points to a rather inapropriate lexer being used, which perhaps was not intended for this type of work.</p>

<h3>Blocks</h3>

<p>The block documentation makes the following claim: <em>Most of what you can apply to a single task can be applied at the block level</em>. Apart from notable exceptions like one of the most desirable features for organizing your code, namely <em>vars:</em>, that statement holds up, but with a slight twist.</p>

<pre><code>---
- hosts: node0
  vars:
    foo: true # let's use j2 compatible syntax :P
  tasks:
    - block:
      when: foo
      - debug: msg='not so fast mate...'
</code></pre>

<p>That should work right? Sadly, no, it doesn&rsquo;t. Tasks can have <em>when</em> statements at the beginning, but not blocks. Which leads to some unfortunate situations:</p>

<pre><code>---
- hosts: node0
  tasks:
    -block:
      - shell: /bin/do --some=stuff
        args:
          many='args'
          such='details'
          very='real world use case'
      - ...
      - ...
      - ...
      - ...
      - ...
      - ...
    when: very_lonely_down_here and not_quite_sure_im_aligned_right  
</code></pre>

<p>When reading a long list of tasks and blocks of tasks, the condition for which that item will play ought to be one of the first things on your mind.</p>

<p>No hard feelings here though, combining different tools together allows you to build impressive systems very quickly, albeit with some coherence collateral damage&hellip;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[MT19937 Output Space Visualization]]></title>
    <link href="https://zncb.me/blog/2015/11/05/mt19937-coverage-visualization/"/>
    <updated>2015-11-05T01:42:25+00:00</updated>
    <id>https://zncb.me/blog/2015/11/05/mt19937-coverage-visualization</id>
    <content type="html"><![CDATA[<p>Stumbled upon an old snippet of code implementing a 32bit-word Mersenne Twister and visualizing the output space distribution using ANSI escape sequences in the terminal.</p>

<p><img src="https://zncb.me/assets/misc/mers.gif" alt="Mersenne Twister MT19937 Output Space Visualization - log10 scale" /></p>

<p>This is not very useful, but by running it with various parameters and seed one can notice some dead zones where very few values are produced (especially visible when using a 64x64 space division). Of course it is common knowledge that this PRNG is not cryptographically secure, and has otherwise very good properties for other uses. Nevertheless a bit of an intriguing curiosity.</p>

<p>This was originally posted in the previous version of this blog, so here it is again.</p>

<!-- more -->




<figure class='code'><figcaption><span>mt19937.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>
<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>
</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;string.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;stdint.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;stdlib.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;math.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;signal.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#define MT_SIZE 624</span>
</span><span class='line'><span class="cp">#define GEN_OFST 397</span>
</span><span class='line'><span class="cp">#define INIT_K 0x6c078965</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#define A 0x9908b0df</span>
</span><span class='line'><span class="cp">#define U 11</span>
</span><span class='line'><span class="cp">#define S 7</span>
</span><span class='line'><span class="cp">#define B 0x9d2c55680</span>
</span><span class='line'><span class="cp">#define T 15</span>
</span><span class='line'><span class="cp">#define C 0xefc60000</span>
</span><span class='line'><span class="cp">#define L 18</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#define ESC 27</span>
</span><span class='line'><span class="cp">#define CLS() printf(&quot;%c[2J&quot;,ESC)</span>
</span><span class='line'><span class="cp">#define POS(row,col) printf(&quot;%c[%d;%dH&quot;,ESC,row,col)</span>
</span><span class='line'>
</span><span class='line'><span class="kt">uint32_t</span> <span class="n">gMT</span><span class="p">[</span><span class="n">MT_SIZE</span><span class="p">];</span>
</span><span class='line'><span class="kt">uint16_t</span> <span class="n">gIdx</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="kt">uint32_t</span> <span class="n">gCount4096</span><span class="p">[</span><span class="mi">65636</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="k">typedef</span> <span class="kt">char</span> <span class="n">Grid64</span><span class="p">[</span><span class="mi">64</span><span class="p">][</span><span class="mi">64</span><span class="p">][</span><span class="mi">9</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="k">static</span> <span class="kr">inline</span>
</span><span class='line'><span class="kt">void</span> <span class="nf">init_gen</span><span class="p">(</span><span class="kt">uint32_t</span> <span class="n">seed</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">uint32_t</span> <span class="o">*</span> <span class="n">__restrict</span> <span class="n">mt</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">gMT</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">uint32_t</span> <span class="o">*</span><span class="n">mte</span> <span class="o">=</span> <span class="n">mt</span> <span class="o">+</span> <span class="n">MT_SIZE</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">*</span><span class="p">(</span><span class="n">mt</span><span class="o">++</span><span class="p">)</span> <span class="o">=</span> <span class="n">seed</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">for</span> <span class="p">(;</span> <span class="n">mt</span><span class="o">!=</span><span class="n">mte</span><span class="p">;</span> <span class="o">++</span><span class="n">mt</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="o">*</span><span class="n">mt</span> <span class="o">=</span> <span class="p">(</span><span class="n">INIT_K</span> <span class="o">*</span> <span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">mt</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">^</span> <span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">mt</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">&gt;&gt;</span><span class="mi">30</span><span class="p">)))</span> <span class="o">&amp;</span> <span class="mh">0xffffffff</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">static</span> <span class="kr">inline</span>
</span><span class='line'><span class="kt">void</span> <span class="nf">gen_num</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">uint32_t</span> <span class="o">*</span> <span class="n">__restrict</span> <span class="n">mt</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">gMT</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">for</span> <span class="p">(</span><span class="kt">uint16_t</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="n">i</span><span class="o">&lt;</span><span class="n">MT_SIZE</span><span class="p">;</span><span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">const</span> <span class="kt">uint32_t</span> <span class="n">y</span> <span class="o">=</span> <span class="p">(</span><span class="n">mt</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&amp;</span> <span class="mh">0x80000000</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">mt</span><span class="p">[(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="n">MT_SIZE</span><span class="p">]</span> <span class="o">&amp;</span> <span class="mh">0x7ffffffff</span><span class="p">);</span>
</span><span class='line'>        <span class="n">mt</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">mt</span><span class="p">[(</span><span class="n">i</span><span class="o">+</span><span class="n">GEN_OFST</span><span class="p">)</span><span class="o">%</span><span class="n">MT_SIZE</span><span class="p">]</span> <span class="o">^</span> <span class="p">(</span><span class="n">y</span><span class="o">&lt;&lt;</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">y</span><span class="o">%</span><span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="n">mt</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">mt</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">^</span> <span class="n">A</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 class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">static</span> <span class="kr">inline</span>
</span><span class='line'><span class="kt">uint32_t</span> <span class="nf">xtrct_num</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">gIdx</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">gen_num</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="kt">uint32_t</span> <span class="n">y</span> <span class="o">=</span> <span class="n">gMT</span><span class="p">[</span><span class="n">gIdx</span><span class="p">];</span>
</span><span class='line'>    <span class="n">y</span> <span class="o">^=</span> <span class="n">y</span><span class="o">&gt;&gt;</span><span class="n">U</span><span class="p">;</span>
</span><span class='line'>    <span class="n">y</span> <span class="o">^=</span> <span class="n">y</span><span class="o">&lt;&lt;</span><span class="n">S</span> <span class="o">&amp;</span> <span class="n">B</span><span class="p">;</span>
</span><span class='line'>    <span class="n">y</span> <span class="o">^=</span> <span class="n">y</span><span class="o">&lt;&lt;</span><span class="n">T</span> <span class="o">&amp;</span> <span class="n">C</span><span class="p">;</span>
</span><span class='line'>    <span class="n">y</span> <span class="o">^=</span> <span class="n">y</span><span class="o">&gt;&gt;</span><span class="n">L</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">gIdx</span> <span class="o">=</span> <span class="p">(</span><span class="n">gIdx</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="n">MT_SIZE</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">y</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">static</span> <span class="kr">inline</span>
</span><span class='line'><span class="kt">char</span> <span class="o">*</span><span class="nf">bin32</span><span class="p">(</span><span class="kt">uint32_t</span> <span class="n">val</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">buf</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kt">char</span> <span class="o">*</span><span class="n">pbuf</span> <span class="o">=</span> <span class="n">buf</span><span class="p">;</span>
</span><span class='line'>    <span class="n">memset</span><span class="p">(</span><span class="n">pbuf</span><span class="p">,</span><span class="sc">&#39;0&#39;</span><span class="p">,</span><span class="mi">33</span><span class="p">);</span>
</span><span class='line'>    <span class="n">pbuf</span> <span class="o">+=</span> <span class="mi">33</span><span class="p">;</span>
</span><span class='line'>    <span class="o">*</span><span class="n">pbuf</span><span class="o">--</span> <span class="o">=</span> <span class="sc">&#39;\0&#39;</span><span class="p">;</span>
</span><span class='line'>    <span class="k">while</span> <span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="o">*</span><span class="n">pbuf</span><span class="o">--</span> <span class="o">=</span> <span class="p">(</span><span class="n">val</span> <span class="o">&amp;</span> <span class="mh">0x1</span><span class="p">)</span><span class="o">?</span><span class="sc">&#39;1&#39;</span><span class="o">:</span><span class="sc">&#39;0&#39;</span><span class="p">;</span>
</span><span class='line'>        <span class="n">val</span> <span class="o">&gt;&gt;=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">buf</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="k">static</span> <span class="kr">inline</span>
</span><span class='line'><span class="kt">void</span> <span class="nf">cgrid6464_init</span><span class="p">(</span><span class="n">Grid64</span> <span class="n">buf</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">char</span> <span class="n">d</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span> <span class="o">=</span> <span class="s">&quot;\e[2;30mo&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">for</span><span class="p">(</span><span class="kt">int8_t</span> <span class="n">i</span><span class="o">=</span><span class="mi">31</span><span class="p">;</span><span class="n">i</span><span class="o">&gt;=</span><span class="mi">0</span><span class="p">;</span><span class="o">--</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>        <span class="k">for</span><span class="p">(</span><span class="kt">int8_t</span> <span class="n">j</span><span class="o">=</span><span class="mi">63</span><span class="p">;</span><span class="n">j</span><span class="o">&gt;=</span><span class="mi">0</span><span class="p">;</span><span class="o">--</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>            <span class="k">for</span> <span class="p">(</span><span class="kt">int8_t</span> <span class="n">k</span><span class="o">=</span><span class="mi">8</span><span class="p">;</span><span class="n">k</span><span class="o">&gt;=</span><span class="mi">0</span><span class="p">;</span><span class="o">--</span><span class="n">k</span><span class="p">)</span>
</span><span class='line'>                <span class="n">buf</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="n">k</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">static</span> <span class="kr">inline</span>
</span><span class='line'><span class="kt">void</span> <span class="nf">cgrid6464_upd</span><span class="p">(</span><span class="kt">uint32_t</span> <span class="n">val</span><span class="p">,</span> <span class="n">Grid64</span> <span class="n">buf</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">uint16_t</span> <span class="n">map</span> <span class="o">=</span>  <span class="n">val</span> <span class="o">&amp;</span> <span class="mh">0xffff</span><span class="p">;</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">uint8_t</span> <span class="n">row</span> <span class="o">=</span> <span class="p">((</span><span class="n">map</span> <span class="o">&amp;</span> <span class="mh">0x1f00</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">8</span><span class="p">);</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">uint8_t</span> <span class="n">col</span> <span class="o">=</span> <span class="p">(</span><span class="n">map</span> <span class="o">&amp;</span> <span class="mh">0x3f</span><span class="p">);</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">uint16_t</span> <span class="n">index</span> <span class="o">=</span> <span class="n">col</span><span class="o">*</span><span class="mi">32</span><span class="o">+</span><span class="n">row</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">gCount4096</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">POS</span><span class="p">(</span><span class="n">row</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">col</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">const</span> <span class="kt">char</span> <span class="n">d</span> <span class="o">=</span> <span class="n">buf</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="n">col</span><span class="p">][</span><span class="mi">5</span><span class="p">]</span> <span class="o">=</span> <span class="sc">&#39;0&#39;</span><span class="o">+</span><span class="p">((</span><span class="kt">int</span><span class="p">)(</span><span class="n">log10f</span><span class="p">((</span><span class="kt">float</span><span class="p">)</span><span class="n">gCount4096</span><span class="p">[</span><span class="n">index</span><span class="p">]))</span><span class="o">&amp;</span><span class="mh">0x7</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%c[1;3%cm%c&quot;</span><span class="p">,</span><span class="n">ESC</span><span class="p">,</span><span class="n">d</span><span class="p">,</span><span class="sc">&#39;0&#39;</span><span class="o">+</span><span class="p">(</span><span class="kt">int</span><span class="p">)(</span><span class="n">log10f</span><span class="p">((</span><span class="kt">float</span><span class="p">)</span><span class="n">gCount4096</span><span class="p">[</span><span class="n">index</span><span class="p">])));</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">void</span> <span class="nf">cleanup</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="c1">//FIXME: Resetting the cursor and clearing doesn&#39;t work. Probably due to interrupt inside printf.</span>
</span><span class='line'>    <span class="n">fflush</span><span class="p">(</span><span class="n">stdout</span><span class="p">);</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%c[0m&quot;</span><span class="p">,</span><span class="n">ESC</span><span class="p">);</span>
</span><span class='line'>    <span class="n">CLS</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">int</span> <span class="nf">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 class="p">{</span>
</span><span class='line'>    <span class="kt">uint32_t</span> <span class="n">period</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">33</span><span class="p">];</span>
</span><span class='line'>    <span class="n">Grid64</span> <span class="n">grid</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="n">gIdx</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">memset</span><span class="p">(</span><span class="n">gMT</span><span class="p">,</span><span class="mh">0x0</span><span class="p">,</span><span class="n">MT_SIZE</span><span class="o">*</span><span class="k">sizeof</span><span class="p">(</span><span class="kt">uint32_t</span><span class="p">));</span>
</span><span class='line'>    <span class="n">memset</span><span class="p">(</span><span class="n">gCount4096</span><span class="p">,</span><span class="mh">0x0</span><span class="p">,</span><span class="mi">4096</span><span class="o">*</span><span class="k">sizeof</span><span class="p">(</span><span class="kt">uint32_t</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">init_gen</span><span class="p">(</span><span class="mh">0x2f9a109b</span><span class="p">);</span>
</span><span class='line'>    <span class="c1">//init_gen(0x10000); // Very bad seed but if curious to see the process of recovery</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">atexit</span><span class="p">(</span><span class="n">cleanup</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">CLS</span><span class="p">();</span> <span class="c1">// Clear screen</span>
</span><span class='line'>    <span class="n">cgrid6464_init</span><span class="p">(</span><span class="n">grid</span><span class="p">);</span>
</span><span class='line'>    <span class="k">do</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">cgrid6464_upd</span><span class="p">(</span><span class="n">xtrct_num</span><span class="p">(),</span><span class="n">grid</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="o">++</span><span class="n">period</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Notes on Linux namespaces]]></title>
    <link href="https://zncb.me/blog/2015/10/11/notes-on-linux-network-namespaces/"/>
    <updated>2015-10-11T16:19:44+00:00</updated>
    <id>https://zncb.me/blog/2015/10/11/notes-on-linux-network-namespaces</id>
    <content type="html"><![CDATA[<p>Having a look at the state of Linux namespaces from a system administration perspective, I found myself confused by incomplete or misleading examples. So here&rsquo;s a breakdown of what worked for me as a test setup on Debian Sid.</p>

<p>The objective is simple: run a bash shell in a pid namespace with it&rsquo;s own network namespace, bridged with the host&rsquo;s network.</p>

<!-- more -->


<h2>Running a shell in a new pid namespace</h2>

<p>This is simple enough, use &lsquo;unshare&rsquo; like this:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># unshare -fp --mount-proc
</span><span class='line'># pstree -p
</span><span class='line'>bash(1)───pstree(114)</span></code></pre></td></tr></table></div></figure>


<h2>Adding a network namespace</h2>

<p>In order to isolate the networking too, we can use &lsquo;unshare&rsquo; with a new network namespace via the &lsquo;ip&rsquo; command:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># ip netns add foo
</span><span class='line'># ip netns exec foo unshare -fp --mount-proc</span></code></pre></td></tr></table></div></figure>


<p>You should now have an isolated bash process, with it&rsquo;s own network stack:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># pstree -p
</span><span class='line'>bash(1)───pstree(114)
</span><span class='line'># ip addr
</span><span class='line'>1: lo: &lt;LOOPBACK&gt; mtu 65536 qdisc noop state DOWN group default 
</span><span class='line'>    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00</span></code></pre></td></tr></table></div></figure>


<h2>Bridging the network</h2>

<p>Network interfaces can only live in one namespace, in order to communicate between namespaces we can use veth device pairs which provide a sort of pipe behavior.</p>

<p>We can create a veth pair like this:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># ip link add veth-a type veth peer name veth-b</span></code></pre></td></tr></table></div></figure>


<p>On my Debian Sid system this didn&rsquo;t create &lsquo;veth-b&rsquo;, and subsequent commands failed with &lsquo;Cannot find device &ldquo;veth-b&rdquo;&rsquo;. So I had to issue the reciprocal command:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># ip link add veth-b type veth peer name veth-a</span></code></pre></td></tr></table></div></figure>


<p>Now, we&rsquo;ll assign one end of the veth pair to the &lsquo;foo&rsquo; namespace:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># ip link set veth-b name eth0 netns foo</span></code></pre></td></tr></table></div></figure>


<p>It should now appear under the &lsquo;eth0&rsquo; name from inside our isolated bash shell. We can assign it an appropriate IP address normally with &lsquo;ip addr add <ip> dev eth0&rsquo;, and set a default route &lsquo;ip route add default via <gw_ip> dev eth0&rsquo;.</p>

<p>On the host&rsquo;s side, we now want to bridge &lsquo;veth-a&rsquo; with &lsquo;eth0&rsquo; in order for our little container to access the network.</p>

<p>Warning: this might break your host&rsquo;s network temporarily.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># ip link add br0 type bridge
</span><span class='line'># ip link set eth0 master br0
</span><span class='line'># ip link set veth-a master br0</span></code></pre></td></tr></table></div></figure>


<p>Make sure they are all in state UP, and we should be able to ping the outside world from our isolated namespace. Now, the hosts was probably setup to use &lsquo;eth0&rsquo;, and as it is now part of the bridge it will not work anymore. To get an equivalent setup, we&rsquo;ll need to transfer the IPs assigned to &lsquo;eth0&rsquo;, to &lsquo;br0&rsquo;, and update our routing table. (I&rsquo;m assuming a very simple setup here, e.g.: my laptop connected via ethernet with a static ip)</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># ip addr del &lt;ip&gt; dev eth0
</span><span class='line'># ip add add &lt;ip&gt; dev br0
</span><span class='line'># ip route del default
</span><span class='line'># ip route add default via &lt;gw_ip&gt; dev br0</span></code></pre></td></tr></table></div></figure>


<p>Now, your host&rsquo;s networking should be back on track (actually, I had to bring interfaces down and back up for it work), and you can ping your host and isolated namespace transparently using their respective ip addresses. A thing of beauty.</p>

<p>Of course you probably don&rsquo;t want to start setting up systems manually like this, but doing so does help me grasp a bit better how LXC, Docker and the like are working.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[SDR tool chain on Debian for the cccamp 2015 rad1o badge]]></title>
    <link href="https://zncb.me/blog/2015/08/15/sdr-tool-chain-on-debian-for-the-cccamp-2015-rad1o-badge/"/>
    <updated>2015-08-15T11:12:05+00:00</updated>
    <id>https://zncb.me/blog/2015/08/15/sdr-tool-chain-on-debian-for-the-cccamp-2015-rad1o-badge</id>
    <content type="html"><![CDATA[<p>As per the <a href="https://rad1o.badge.events.ccc.de/software">doc</a> we need the following packages on debian:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>apt-get install hackrf gqrx-sdr gnuradio gr-osmosdr</span></code></pre></td></tr></table></div></figure>


<p>It turns out that in the current state of Debian Sid/unstable, there a few confusing package dependencies as gqrx-sdr depends on libgnuradio-*3.7.5, and not the most recent 3.7.8 versions which are installed by the gnuradio package. Furthermore it also depends on libgnuradio-osmosdr0.1.3 which depends on some libboost packages which break with the recent libstdc++6 ABI change.</p>

<p>To get around this without too much recompile pain, one can install gnuradio 3.7.8 (+ gnuradio-dev) and manually compile libgnuradio-osmosdr, gr-osmosdr and gqrx-sdr.</p>

<p>As of yesterday, the latest revisions of <a href="http://sdr.osmocom.org/trac/wiki/rtl-sdr#Buildingthesoftware">osmocom</a> and the 2.3.2 source of <a href="https://github.com/csete/gqrx/releases">gqrx-sdr</a> were compiling without issues.</p>

<p>I haven&rsquo;t had a chance to test it much yet, will edit with more notes when I do.</p>

<p>EDIT: It works. Just make sure to have libhackrf-dev installed before compiling the osmosdr gnuradio extension, otherwise hackrf devices won&rsquo;t show up in gqrx.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[X201 BIOS VT/AMT Woes]]></title>
    <link href="https://zncb.me/blog/2015/04/18/x201-bios-vt-slash-amt-woes/"/>
    <updated>2015-04-18T01:51:45+00:00</updated>
    <id>https://zncb.me/blog/2015/04/18/x201-bios-vt-slash-amt-woes</id>
    <content type="html"><![CDATA[<p>Today, loading a simple VM on my Lenovo X201 (Debian Sid) turned into a wild four hour goose chase of nonsense.
So I&rsquo;ll share the details here and hopefully that&rsquo;ll save someone the same trouble, as this was quite obscure&hellip;</p>

<p>It started with a Linux amd64 VMWare disk image I wanted to load into VirtualBox and systematically got the following error:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>VT-x is disabled in the BIOS. (VERR_VMX_MSR_VMXON_DISABLED).</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>Looking at the BIOS cpu config all virtualization options were enabled.</p>

<p>Of course the i5-M520 cpu on the X201 supports VT-x, SME, TXT and such&hellip;</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt aes lahf_lm ida arat dtherm tpr_shadow vnmi flexpriority ept vpid</span></code></pre></td></tr></table></div></figure>


<p>And of course the VT-x flag was set in the VBox guest configuration&hellip;</p>

<p>Through all the forums and bug reports out there the closest I found was a Virtual Box bug report that got closed as &ldquo;worksforme&rdquo;. Very encouraging this was.</p>

<p>Some users with similar issues seemed to be able to function by using a prior VirtualBox version (&lt; 4.3), but Oracle did not provide packages for Sid and the Wheezy package is not compatible with the latest kernels.</p>

<p>After giving up on BIOS upgrades due to flaky supposedly bootable ISOs from Lenovo I turned to KVM, assuming this was probably a VirtualBox issue.</p>

<p>But it turned out KVM would not work either. /dev/kvm would not be created and the following warnings showed up in syslog:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>kvm: disable TXT in the BIOS or activate TXT before enabling KVM
</span><span class='line'>kvm: disabled by bios</span></code></pre></td></tr></table></div></figure>


<p>This confirmed for me that this was really a BIOS issue after all.
I remembered seeing a reference to conflicts between Intel AMT and VT features in some Lenovo BIOSes, but AMT was definitely disabled and had been for ages.</p>

<p>Then I tried the following:</p>

<ol>
<li>Enable AMT in the BIOS, and disable all virtualization options</li>
<li>Reboot, let the OS load, do a proper shutdown.</li>
<li>Disable AMT, re-enable virtualization options.</li>
<li>Reboot, and notice AMT being unconfigured.</li>
</ol>


<p>At this point I had a /dev/kvm and was back in business.</p>

<p>It&rsquo;s still unclear however weither there was some state confusion in the BIOS about the virtualization options, or with AMT, and if AMT was indeed conflicting.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Good Cipher Hygiene]]></title>
    <link href="https://zncb.me/blog/2015/04/14/good-cipher-hygiene/"/>
    <updated>2015-04-14T22:20:06+00:00</updated>
    <id>https://zncb.me/blog/2015/04/14/good-cipher-hygiene</id>
    <content type="html"><![CDATA[<p>Spring config-cleaning time&hellip;
For a good starting point check out <a href="https://github.com/ouaibe/duraconf">https://github.com/ouaibe/duraconf</a></p>

<p>And finally got around to re-style this space. Hopefully less retinas will be hurt in the future.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Changing Platform]]></title>
    <link href="https://zncb.me/blog/2014/11/10/changing-platform/"/>
    <updated>2014-11-10T12:59:49+00:00</updated>
    <id>https://zncb.me/blog/2014/11/10/changing-platform</id>
    <content type="html"><![CDATA[<p>Finally getting around to dumping Wordpress for a static framework.
Now to tweak/redesign this.. expect some temporary breakages..</p>
]]></content>
  </entry>
  
</feed>
