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

  <title><![CDATA[Edward Tsech]]></title>
  <link href="http://edtsech.github.com/atom.xml" rel="self"/>
  <link href="http://edtsech.github.com/"/>
  <updated>2013-05-24T21:10:29+02:00</updated>
  <id>http://edtsech.github.com/</id>
  <author>
    <name><![CDATA[Edward Tsech]]></name>
    <email><![CDATA[edtsech@gmail.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[From Vim to Emacs]]></title>
    <link href="http://edtsech.github.com/2012/12/vim-to-emacs.html"/>
    <updated>2012-12-30T00:00:00+01:00</updated>
    <id>http://edtsech.github.com/2012/12/vim-to-emacs</id>
    <content type="html"><![CDATA[<p>As you probably know I&#8217;m active Vim user, I&#8217;ve been using Vim daily for
about 3 years. I&#8217;ve started with a vimconfig of my friend
<a href="https://github.com/kossnocorp">@kossnocorp</a>
then I tried Vim distribution called &#8220;Janus&#8221;,
but it was complex and I decided to
create my own small <a href="https://github.com/edtsech/dotvim">vimconfig</a>,
now it&#8217;s about 200 LOC and I&#8217;m always trying to keep it as simple as possible.
I&#8217;ve not written any single Vim plugin in the three years,
I have a small one (<a href="https://github.com/edtsech/vim-railsapi">vim-railsapi</a>,
but it&#8217;s not really smth serious, one of the reasons is VimL, I think :)</p>

<h2>A few days ago</h2>

<p>I&#8217;ve decided to try Emacs.</p>

<p>Why?</p>

<ul>
<li>EmacsLisp instead of VimL</li>
<li>Built-in package manager from version 24</li>
<li>Good support for Lisps including Clojure</li>
<li>And for other funcitonal languages</li>
<li>And of course just for fun</li>
</ul>


<h2>What do I really need?</h2>

<ul>
<li>Of course Vi motions</li>
<li>Relative numbers</li>
<li>Supertab auto completion</li>
<li>Buffer explorer</li>
<li>Ack for files</li>
</ul>


<p>Support for langauges it&#8217;s not really a problem in editors like Emacs, I think,
that is why I&#8217;m not counting it here. I started with my own empty <a href="https://github.com/edtsech/.emacs.d">.emacs.d</a> First thing I added was <a href="http://emacswiki.org/emacs/Evil">evil-mode</a>, because
my fingers can&#8217;t live w/o vi-motions. Evil-mode works really perfect without any problems
and helped me to reduce amount of Ctrl clicks. Next step is relative numbers and I was surprised to find mode for that <a href="https://github.com/coldnew/linum-relative">linum-relative</a>
which is good and customizable. For auto completion I&#8217;ve started with <a href="http://emacswiki.org/emacs/AutoComplete">auto-complete</a> which works great,
but popup window doesn&#8217;t look beautiful. Also &#8220;smart-tab&#8221; mode is available.</p>

<p><img src="http://dl.dropbox.com/u/2428018/Screenshots/07.png" alt="emacs popup" /></p>

<p><em>Buffer List</em> is kind of built-in buffer explorer in Emacs you can open it with <code>C-x C-b</code></p>

<p><img src="http://dl.dropbox.com/u/2428018/Screenshots/09.png" alt="buffer list" /></p>

<p>And for Ack I&#8217;ve just installed ack plugin.
<img src="http://dl.dropbox.com/u/2428018/Screenshots/0a.png" alt="list-packages" /></p>

<p>Basically you have mode/packages for everything:</p>

<ul>
<li>Rails with rinari</li>
<li>Clojure mode</li>
<li>Paredit mode</li>
<li>Ruby mode</li>
<li>YAML mode</li>
<li>SML mode</li>
<li>Haskell mode</li>
<li>Cucumber with feature-mode</li>
<li>Zencoding mode</li>
<li>&#8230;</li>
</ul>


<p>I&#8217;ve spent one single day to setup my Emacs environment
and I feel myself pretty comfortabe. Which is amazing.
Let&#8217;s see if it helps me to increase my productivity.</p>

<h2>PS: Emacs crash course</h2>

<ul>
<li>Close Emacs: <code>C-x C-c</code></li>
<li>Open file: <code>C-x C-f</code></li>
<li>Swith &#8220;split&#8221;: <code>C-x o</code></li>
<li>Make horizontal &#8220;split&#8221;: <code>C-x 2</code></li>
<li>Make vertical &#8220;split&#8221;: <code>C-x 3</code></li>
<li>Kill buffer: <code>C-x k</code></li>
</ul>


<h2>Peace!</h2>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[And-let Macro in Clojure]]></title>
    <link href="http://edtsech.github.com/2012/12/and-let.html"/>
    <updated>2012-12-30T00:00:00+01:00</updated>
    <id>http://edtsech.github.com/2012/12/and-let</id>
    <content type="html"><![CDATA[<p>In Clojure we have two nice macros <a href="http://clojuredocs.org/clojure_core/clojure.core/if-let">if-let</a>
and <a href="http://clojuredocs.org/clojure_core/clojure.core/when-let">when-let</a>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='clj'><span class='line'><span class="p">(</span><span class="nb">if-let </span><span class="p">[</span><span class="nv">a</span> <span class="nv">...</span><span class="p">]</span>
</span><span class='line'>  <span class="p">(</span><span class="nb">inc </span><span class="nv">a</span><span class="p">)</span>
</span><span class='line'>  <span class="mi">0</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1">; or we can use `when-let` when we don&#39;t have `else` branch</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nb">when-let </span><span class="p">[</span><span class="nv">a</span> <span class="nv">...</span><span class="p">]</span>
</span><span class='line'>  <span class="p">(</span><span class="nb">inc </span><span class="nv">a</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>but unfortunately we can&#8217;t pass more than two binding forms to
these macros, and emulate the behavior of Scheme&#8217;s <a href="http://www.gnu.org/software/mit-scheme/documentation/mit-scheme-ref/and_002dlet_002a-_0028SRFI-2_0029.html">and-let</a>
or kind of maybe monad.</p>

<p>I mean smth like 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>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='clj'><span class='line'><span class="p">(</span><span class="nf">and-let</span> <span class="p">[</span><span class="nv">a</span> <span class="mi">1</span> <span class="nv">b</span> <span class="mi">2</span><span class="p">]</span>
</span><span class='line'>         <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> <span class="c1">; =&gt; 3</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">and-let</span> <span class="p">[</span><span class="nv">a</span> <span class="mi">1</span> <span class="nv">b</span> <span class="nv">nil</span><span class="p">]</span>
</span><span class='line'>         <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">b</span><span class="p">))</span> <span class="c1">; =&gt; nil</span>
</span></code></pre></td></tr></table></div></figure>


<p>It isn&#8217;t really hard to implement it:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='clj'><span class='line'><span class="p">(</span><span class="kd">defmacro </span><span class="nv">and-let</span> <span class="p">[</span><span class="nv">bindings</span> <span class="nv">expr</span><span class="p">]</span>
</span><span class='line'>  <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="nb">seq </span><span class="nv">bindings</span><span class="p">)</span>
</span><span class='line'>    <span class="o">`</span><span class="p">(</span><span class="nb">if-let </span><span class="p">[</span><span class="o">~</span><span class="p">(</span><span class="nb">first </span><span class="nv">bindings</span><span class="p">)</span> <span class="o">~</span><span class="p">(</span><span class="nb">second </span><span class="nv">bindings</span><span class="p">)]</span>
</span><span class='line'>       <span class="p">(</span><span class="nf">and-let</span> <span class="o">~</span><span class="p">(</span><span class="nb">drop </span><span class="mi">2</span> <span class="nv">bindings</span><span class="p">)</span> <span class="o">~</span><span class="nv">expr</span><span class="p">))</span>
</span><span class='line'>     <span class="nv">expr</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">use</span> <span class="ss">&#39;clojure.walk</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="nf">macroexpand-all</span> <span class="o">&#39;</span><span class="p">(</span><span class="nf">and-let</span> <span class="p">[</span><span class="nv">a</span> <span class="mi">1</span> <span class="nv">b</span> <span class="mi">2</span><span class="p">]</span>
</span><span class='line'>                           <span class="p">(</span><span class="nb">+ </span><span class="nv">a</span> <span class="nv">b</span><span class="p">)))</span>
</span><span class='line'>
</span><span class='line'><span class="c1">; (let* [temp__3971__auto__ 1]</span>
</span><span class='line'><span class="c1">;   (if temp__3971__auto__</span>
</span><span class='line'><span class="c1">;     (let* [a temp__3971__auto__]</span>
</span><span class='line'><span class="c1">;       (let* [temp__3971__auto__ 2]</span>
</span><span class='line'><span class="c1">;         (if temp__3971__auto__</span>
</span><span class='line'><span class="c1">;           (let* [b temp__3971__auto__]</span>
</span><span class='line'><span class="c1">;             (+ a b))</span>
</span><span class='line'><span class="c1">;           nil)))</span>
</span><span class='line'><span class="c1">;     nil))</span>
</span></code></pre></td></tr></table></div></figure>


<p>But we could do some improvements here: check count of binding form (should be even),
implement <code>else</code> clause, probably find a better name, implementation.</p>

<p>I&#8217;m not really sure about <code>else</code> clause, it can be very useful, but it sounds weird to have <code>else</code> part
with <code>and-let</code> name. I thought about <code>if-let*</code> and <code>when-let*</code> names, it looks idiomatic for other Lisps
but not for Clojure I think.</p>

<p>Wdyt?</p>

<p>PS. Another option is use the maybe monad from <code>algo.monads</code> but it&#8217;s extra dependency for relatively
small amount of code (if you don&#8217;t plan use monads really often) and slightly different behavior.</p>

<h2>Peace!</h2>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Do unless]]></title>
    <link href="http://edtsech.github.com/2012/11/do-unless.html"/>
    <updated>2012-11-20T00:00:00+01:00</updated>
    <id>http://edtsech.github.com/2012/11/do-unless</id>
    <content type="html"><![CDATA[<p>Whilst experimenting with <a href="https://github.com/semperos/clj-webdriver">clj-webdriver</a>
and writing <a href="https://github.com/edtsech/social-phobia">social-phobia</a>
I have created an interesting macro and would like to share it with you and get some feedback.</p>

<p>Lets write some simple script, log in to GitHub</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='clj'><span class='line'><span class="p">(</span><span class="nf">set-driver!</span> <span class="p">{</span><span class="ss">:browser</span> <span class="ss">:firefox</span><span class="p">})</span>
</span><span class='line'><span class="p">(</span><span class="nf">to</span> <span class="s">&quot;https://github.com/login&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="nf">input-text</span> <span class="s">&quot;#login_field&quot;</span> <span class="p">(</span><span class="nf">auth</span> <span class="ss">:login</span><span class="p">))</span>
</span><span class='line'><span class="p">(</span><span class="nf">input-text</span> <span class="s">&quot;#password&quot;</span> <span class="p">(</span><span class="nf">auth</span> <span class="ss">:pass</span><span class="p">))</span>
</span><span class='line'><span class="p">(</span><span class="nf">click</span> <span class="p">{</span><span class="ss">:xpath</span> <span class="s">&quot;//input[@type=&#39;submit&#39;]&quot;</span><span class="p">})</span>
</span><span class='line'><span class="nv">...</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we have wrong URL or don&#8217;t have an element on the page, we basically get 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>
</pre></td><td class='code'><pre><code class='clj'><span class='line'><span class="nv">NullPointerException</span>   <span class="nv">clojure.lang.Reflector.invokeInstanceMethod</span> <span class="p">(</span><span class="nf">Reflector.java</span><span class="ss">:26</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>In a different way we can get the same result 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>
</pre></td><td class='code'><pre><code class='clj'><span class='line'><span class="nv">=&gt;</span> <span class="p">(</span><span class="k">def </span><span class="nv">el</span> <span class="p">(</span><span class="nf">find-element</span> <span class="p">{</span><span class="ss">:css</span> <span class="s">&quot;#login_fiel&quot;</span><span class="p">}))</span>
</span><span class='line'><span class="o">#</span><span class="ss">&#39;user/el</span>
</span><span class='line'><span class="nv">=&gt;</span> <span class="nv">el</span>
</span><span class='line'><span class="o">#</span><span class="nv">clj_webdriver.element.Element</span><span class="p">{</span><span class="ss">:webelement</span> <span class="nv">nil</span><span class="p">}</span>
</span><span class='line'><span class="nv">=&gt;</span> <span class="p">(</span><span class="nf">input-text</span> <span class="nv">el</span> <span class="s">&quot;asd&quot;</span><span class="p">)</span>
</span><span class='line'><span class="nv">NullPointerException</span>   <span class="nv">clojure.lang.Reflector.invokeInstanceMethod</span> <span class="p">(</span><span class="nf">Reflector.java</span><span class="ss">:26</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Awesome. But I would like to receive more useful messages if GitHub changes URL or IDs of HTML elements.
Let&#8217;s make our code &#8220;safer&#8221;:</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='clj'><span class='line'><span class="p">(</span><span class="kd">defn </span><span class="nv">error</span>
</span><span class='line'>  <span class="s">&quot;Returns \&quot;\&quot;#uername\&quot; not found\&quot; for e.g.&quot;</span>
</span><span class='line'>  <span class="p">[</span><span class="nv">selector</span><span class="p">]</span>
</span><span class='line'>  <span class="p">{</span><span class="ss">:error</span> <span class="p">(</span><span class="nb">str </span><span class="p">(</span><span class="nb">first </span><span class="p">(</span><span class="nb">vals </span><span class="nv">selector</span><span class="p">))</span> <span class="s">&quot; not found&quot;</span><span class="p">)})</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="kd">defn </span><span class="nv">safe-find-element</span>
</span><span class='line'>  <span class="s">&quot;Find the element, if the element is found, call the f,</span>
</span><span class='line'><span class="s">  if not return a map with an error.&quot;</span>
</span><span class='line'>  <span class="p">[</span><span class="nv">selector</span> <span class="nv">f</span><span class="p">]</span>
</span><span class='line'>  <span class="p">(</span><span class="k">let </span><span class="p">[</span><span class="nv">el</span> <span class="p">(</span><span class="nf">find-element</span> <span class="nv">selector</span><span class="p">)]</span>
</span><span class='line'>    <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="ss">:webelement</span> <span class="nv">el</span><span class="p">)</span>
</span><span class='line'>      <span class="p">(</span><span class="nf">f</span> <span class="nv">el</span><span class="p">)</span>
</span><span class='line'>      <span class="p">(</span><span class="nf">error</span> <span class="nv">selector</span><span class="p">))))</span>
</span></code></pre></td></tr></table></div></figure>


<p>It means if we find an element we call function with that element,
if not we return error which looks like <code>{error: "#signin-email not found"}</code>.
Nice, but not so useful so far.
Let&#8217;s wrap <code>click</code> and <code>input-text</code> functions in this wrapper.</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='clj'><span class='line'><span class="p">(</span><span class="kd">defn- </span><span class="nv">safe-input-text</span> <span class="p">[</span><span class="nv">selector</span> <span class="nv">text</span><span class="p">]</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">safe-find-element</span> <span class="nv">selector</span>
</span><span class='line'>                     <span class="o">#</span><span class="p">(</span><span class="nb">-&gt; </span><span class="nv">%</span>
</span><span class='line'>                        <span class="nv">clear</span>
</span><span class='line'>                        <span class="p">(</span><span class="nf">input-text</span> <span class="nv">text</span><span class="p">))))</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="kd">defn- </span><span class="nv">safe-click</span> <span class="p">[</span><span class="nv">selector</span><span class="p">]</span>
</span><span class='line'>  <span class="p">(</span><span class="nf">safe-find-element</span> <span class="nv">selector</span> <span class="o">#</span><span class="p">(</span><span class="nf">click</span> <span class="nv">%</span><span class="p">)))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&#8217;s see how it 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='clj'><span class='line'><span class="nv">=&gt;</span> <span class="p">(</span><span class="nf">safe-input-text</span> <span class="p">{</span><span class="ss">:css</span> <span class="s">&quot;#login_fiel&quot;</span><span class="p">}</span> <span class="s">&quot;asd&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span><span class="ss">:error</span> <span class="s">&quot;#login_fiel not found&quot;</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And try to rewrite our 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>
</pre></td><td class='code'><pre><code class='clj'><span class='line'><span class="p">(</span><span class="nf">set-driver!</span> <span class="p">{</span><span class="ss">:browser</span> <span class="ss">:firefox</span><span class="p">})</span>
</span><span class='line'><span class="p">(</span><span class="nf">to</span> <span class="s">&quot;https://github.com/login&quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">(</span><span class="nb">or </span><span class="p">(</span><span class="ss">:error</span> <span class="p">(</span><span class="nf">safe-input-text</span> <span class="p">{</span><span class="ss">:css</span> <span class="s">&quot;#login_field&quot;</span><span class="p">}</span> <span class="p">(</span><span class="nf">auth</span> <span class="ss">:login</span><span class="p">)))</span>
</span><span class='line'>    <span class="p">(</span><span class="ss">:error</span> <span class="p">(</span><span class="nf">safe-input-text</span> <span class="p">{</span><span class="ss">:css</span> <span class="s">&quot;#password&quot;</span><span class="p">}</span> <span class="p">(</span><span class="nf">auth</span> <span class="ss">:pass</span><span class="p">)))</span>
</span><span class='line'>    <span class="p">(</span><span class="ss">:error</span> <span class="p">(</span><span class="nf">safe-click</span> <span class="p">{</span><span class="ss">:xpath</span> <span class="s">&quot;//input[@type=&#39;submit&#39;]&quot;</span><span class="p">})))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Hm, it&#8217;s not so DRY.</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='clj'><span class='line'><span class="nv">=&gt;</span> <span class="p">(</span><span class="nf">do-unless</span> <span class="ss">:error</span> <span class="p">(</span><span class="nf">safe-input-text</span> <span class="p">{</span><span class="ss">:css</span> <span class="s">&quot;#login_field&quot;</span><span class="p">}</span> <span class="p">(</span><span class="nf">auth</span> <span class="ss">:login</span><span class="p">))</span>
</span><span class='line'>                     <span class="p">(</span><span class="nf">safe-input-text</span> <span class="p">{</span><span class="ss">:css</span> <span class="s">&quot;#passwor&quot;</span><span class="p">}</span> <span class="p">(</span><span class="nf">auth</span> <span class="ss">:pass</span><span class="p">))</span>
</span><span class='line'>                     <span class="p">(</span><span class="nf">safe-click</span> <span class="p">{</span><span class="ss">:xpath</span> <span class="s">&quot;//input[@type=&#39;submit&#39;]&quot;</span><span class="p">}))</span>
</span><span class='line'><span class="p">{</span><span class="ss">:error</span> <span class="s">&quot;#passwor not found&quot;</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Much nicer. But how is it supposed to work? Tada!</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='clj'><span class='line'><span class="p">(</span><span class="kd">defmacro </span><span class="nv">do-unless</span>
</span><span class='line'>  <span class="s">&quot;</span>
</span><span class='line'><span class="s">  Evaluates the expr if the condition which was called</span>
</span><span class='line'><span class="s">  with result of previous expression returned false.</span>
</span><span class='line'>
</span><span class='line'><span class="s">  Examples:</span>
</span><span class='line'><span class="s">  =========</span>
</span><span class='line'>
</span><span class='line'><span class="s">  (do-unless nil? (println 1) (println 2))</span>
</span><span class='line'><span class="s">  1</span>
</span><span class='line'><span class="s">  nil</span>
</span><span class='line'><span class="s">  (do-unless nil? (do (println 1) 1) (println 2))</span>
</span><span class='line'><span class="s">  1</span>
</span><span class='line'><span class="s">  2</span>
</span><span class='line'><span class="s">  nil&quot;</span>
</span><span class='line'>  <span class="p">([</span><span class="nv">condition</span> <span class="nv">expr</span> <span class="o">&amp;</span> <span class="nv">exprs</span><span class="p">]</span>
</span><span class='line'>   <span class="o">`</span><span class="p">(</span><span class="k">let </span><span class="p">[</span><span class="nv">r#</span> <span class="o">~</span><span class="nv">expr</span><span class="p">]</span>
</span><span class='line'>      <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="o">~</span><span class="nv">condition</span> <span class="nv">r#</span><span class="p">)</span>
</span><span class='line'>        <span class="nv">r#</span>
</span><span class='line'>        <span class="p">(</span><span class="nf">do-unless</span> <span class="o">~</span><span class="nv">condition</span> <span class="o">~@</span><span class="nv">exprs</span><span class="p">))))</span>
</span><span class='line'>  <span class="p">([</span><span class="nv">condition</span> <span class="nv">expr</span><span class="p">]</span>
</span><span class='line'>   <span class="nv">expr</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Macroexpand:</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='clj'><span class='line'><span class="p">(</span><span class="nb">macroexpand </span><span class="o">&#39;</span><span class="p">(</span><span class="nf">do-unless</span> <span class="ss">:error</span> <span class="p">(</span><span class="nf">safe-input-text</span> <span class="p">{</span><span class="ss">:css</span> <span class="s">&quot;#login_field&quot;</span><span class="p">}</span> <span class="p">(</span><span class="nf">auth</span> <span class="ss">:login</span><span class="p">))</span>
</span><span class='line'>                     <span class="p">(</span><span class="nf">safe-input-text</span> <span class="p">{</span><span class="ss">:css</span> <span class="s">&quot;#passwor&quot;</span><span class="p">}</span> <span class="p">(</span><span class="nf">auth</span> <span class="ss">:pass</span><span class="p">))</span>
</span><span class='line'>                     <span class="p">(</span><span class="nf">safe-click</span> <span class="p">{</span><span class="ss">:xpath</span> <span class="s">&quot;//input[@type=&#39;submit&#39;]&quot;</span><span class="p">})))</span>
</span><span class='line'>
</span><span class='line'><span class="p">(</span><span class="nf">let*</span> <span class="p">[</span><span class="nv">r__1016__auto__</span> <span class="p">(</span><span class="nf">safe-input-text</span> <span class="p">{</span><span class="ss">:css</span> <span class="s">&quot;#login_field&quot;</span><span class="p">}</span> <span class="p">(</span><span class="nf">auth</span> <span class="ss">:login</span><span class="p">))]</span>
</span><span class='line'>  <span class="p">(</span><span class="k">if </span><span class="p">(</span><span class="ss">:error</span> <span class="nv">r__1016__auto__</span><span class="p">)</span>
</span><span class='line'>      <span class="nv">r__1016__auto__</span>
</span><span class='line'>      <span class="p">(</span><span class="nf">social-phobia.core/do-unless</span> <span class="ss">:error</span>
</span><span class='line'>                                    <span class="p">(</span><span class="nf">safe-input-text</span> <span class="p">{</span><span class="ss">:css</span> <span class="s">&quot;#passwor&quot;</span><span class="p">}</span> <span class="p">(</span><span class="nf">auth</span> <span class="ss">:pass</span><span class="p">))</span>
</span><span class='line'>                                    <span class="p">(</span><span class="nf">safe-click</span> <span class="p">{</span><span class="ss">:xpath</span> <span class="s">&quot;//input[@type=&#39;submit&#39;]&quot;</span><span class="p">}))))</span>
</span></code></pre></td></tr></table></div></figure>


<p>Basically this macro recursively produces, a set of nested <code>let</code> and <code>if</code> expressions.</p>

<ol>
<li>Cache result of expression</li>
<li>Check is&#8217;t map with <code>:error</code> message or not</li>
<li>If yes, returns that map</li>
<li>If not start this cycle for next expression</li>
</ol>


<p>Nice, also it should be faster than catch exceptions and also
we don&#8217;t produce any extra function calls like we do with monads.
I think this macro is pretty much fun for this kind of code with a purely
imperative nature.</p>

<p>Wdyt?</p>

<h2>Peace!</h2>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Clojure Templating]]></title>
    <link href="http://edtsech.github.com/2012/09/clojure-templating.html"/>
    <updated>2012-09-07T00:00:00+02:00</updated>
    <id>http://edtsech.github.com/2012/09/clojure-templating</id>
    <content type="html"><![CDATA[<p>In this note I would like to describe current situation of dealing with templates in Clojure.
We have four most known options:</p>

<ul>
<li><a href="https://github.com/fhd/clostache" title="">Clostache</a></li>
<li><a href="https://github.com/cgrand/enlive" title="">Enlive</a></li>
<li><a href="https://github.com/Flamefork/fleet" title="">Fleet</a></li>
<li><a href="https://github.com/weavejester/hiccup">Hiccup</a></li>
</ul>


<p>Let&#8217;s start with Fleet. Fleet is pretty similar to old ERB or JSP way of working with templates:</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='clj'><span class='line'><span class="nv">&lt;p&gt;&lt;</span><span class="p">(</span><span class="nf">post</span> <span class="ss">:body</span><span class="p">)</span><span class="nv">&gt;&lt;/p&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In fact it&#8217;s not so popular in Clojure world probably because main philosophy of Lisp is
&#8220;code as data&#8221;. And it&#8217;s also true for templates. It&#8217;s where Hiccup shines:</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='clj'><span class='line'><span class="p">[</span><span class="ss">:p</span> <span class="p">(</span><span class="nf">post</span> <span class="ss">:body</span><span class="p">)]</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, it&#8217;s just Clojure vector, first element of this vector is tag name and second one is content.
You can add attributes to the tag:</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='clj'><span class='line'><span class="p">[</span><span class="ss">:link</span> <span class="p">{</span><span class="ss">:href</span> <span class="s">&quot;www.example.com&quot;</span><span class="p">}</span> <span class="s">&quot;Example&quot;</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>We can easily make abstraction on it and keep it as a helper:</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='clj'><span class='line'><span class="p">(</span><span class="kd">defn </span><span class="nv">link</span> <span class="p">[</span><span class="nv">href</span> <span class="nv">name</span><span class="p">]</span> <span class="p">[</span><span class="ss">:link</span> <span class="p">{</span><span class="ss">:href</span> <span class="nv">href</span><span class="p">}</span> <span class="nv">name</span><span class="p">])</span>
</span><span class='line'><span class="p">(</span><span class="nf">link</span> <span class="s">&quot;www.example.com&quot;</span> <span class="s">&quot;Example&quot;</span><span class="p">)</span>
</span><span class='line'><span class="c1">; =&gt; [:link {:href &quot;www.example.com&quot;} &quot;Example&quot;]</span>
</span></code></pre></td></tr></table></div></figure>


<p>For converting it to html you need to pass it to <code>html</code> function:</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='clj'><span class='line'><span class="p">(</span><span class="nf">html</span> <span class="p">(</span><span class="nf">link</span> <span class="s">&quot;www.example.com&quot;</span> <span class="s">&quot;Example&quot;</span><span class="p">))</span>
</span><span class='line'><span class="c1">; =&gt; &quot;&lt;a href=\&quot;www.example.com\&quot;&gt;Example&lt;/a&gt; &quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can make your own collection of helpers and partials which will be easy to embed in your code.
lso you can find basic low-lewel helpers as <code>link-to</code> and <code>form-to</code> and so on in Hiccup
<a href="https://github.com/weavejester/hiccup/blob/master/src/hiccup/element.clj">itself</a>.
Hiccup is quite popular in Clojure comunity and it&#8217;s used as part of
<a href="webnoir.org">Noir framework</a>.
You don&#8217;t have to write Hiccup templates by yourself if you already have HTML file from a designer, there are some
<a href="https://github.com/weavejester/hiccup/wiki/Converting-html-to-hiccup">tools</a> which can help you to convert HTML file to Hiccup.</p>

<p>If you are sceptic about all this stuff like &#34;code as data&#34; in templates you&#8217;re able to choose Clostache.
It&#8217;s just <a href="http://mustache.github.com/">Mustache</a>
implementation in Clojure. I think you already know that. This how it looks in Clojure.</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='clj'><span class='line'><span class="p">(</span><span class="nf">render</span> <span class="s">&quot;Hello, !&quot;</span> <span class="p">{</span><span class="ss">:name</span> <span class="s">&quot;Felix&quot;</span><span class="p">})</span>
</span></code></pre></td></tr></table></div></figure>


<p>Also we have some pretty interesting approach which calls Enlive, it&#8217;s similar to XSLT transformation,
but instead of noisy XML we have Clojure which is Lisp which is executable XML :)
The main idea is keep our html for a designer. Just do nothing with it.
No ERB templates, Mustache or any other templates. Just plain HTML and transformations.
There is a little bit more code for explanation how it works that is why I&#8217;ve placed this code to the
<a href="https://gist.github.com/3672297">gist</a>.</p>

<p>I think it will be unuseful try to describe pros and cons of each of these template libraries,
because it&#8217;s really depends on which process you use to work with your templates.</p>

<p>Also there is fifth hidden option is use templating on the front-end :)</p>

<h2>Peace!</h2>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Language For Fast Dive Into FP]]></title>
    <link href="http://edtsech.github.com/2012/05/fp.html"/>
    <updated>2012-05-31T00:00:00+02:00</updated>
    <id>http://edtsech.github.com/2012/05/fp</id>
    <content type="html"><![CDATA[<p>Python was invented as a language for a education, at least partially.
And now this language is quite popular and used by many companies and people.
And also Python influenced on many languages like for example Ruby or Groovy.</p>

<p>But in functional world we still don&#8217;t have own Python, a simple language with the dynamic typization and
less noisy syntax. You say Scheme, SICP cources and etc. But for some people LISP&#8217;s syntax isn&#8217;t a synonym for
less noisy.</p>

<p>I think, we need a simple functional language with the dynamic typization, a compact syntax without noise.</p>

<h2>Choose first functional language</h2>

<ul>
<li><a href="http://programmers.stackexchange.com/questions/114885/which-functional-language-is-good-for-a-beginner">http://programmers.stackexchange.com/questions/114885/which-functional-language-is-good-for-a-beginner</a></li>
<li><a href="http://stackoverflow.com/questions/2179263/which-functional-programming-language-should-i-choose-as-first-functional-progra">http://stackoverflow.com/questions/2179263/which-functional-programming-language-should-i-choose-as-first-functional-progra</a></li>
<li><a href="http://programmers.stackexchange.com/questions/24542/choosing-a-functional-programming-language">http://programmers.stackexchange.com/questions/24542/choosing-a-functional-programming-language</a></li>
</ul>


<h2>Lisp Without Parentheses</h2>

<ul>
<li><a href="http://pschombe.wordpress.com/2006/04/16/lisp-without-parentheses/">http://pschombe.wordpress.com/2006/04/16/lisp-without-parentheses/</a></li>
</ul>


<h2>Peace!</h2>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CoffeeScript]]></title>
    <link href="http://edtsech.github.com/2011/11/coffeescript.html"/>
    <updated>2011-11-22T00:00:00+01:00</updated>
    <id>http://edtsech.github.com/2011/11/coffeescript</id>
    <content type="html"><![CDATA[<h2>What is it?</h2>

<ul>
<li>CoffeeScript is a little language that compiles into JavaScript.</li>
<li>The golden rule of CoffeeScript is: &#8220;It&#8217;s just JavaScript&#8221;.</li>
</ul>


<p>More info in <a href="http://jashkenas.github.com/coffee-script/">README</a></p>

<p>When I saw CoffeeScript first time it looks weird: &#8216;:&#8217; instead of &#8216;=&#8217; and other strange things.
And I wasn&#8217;t good about that. But things change and opinions of people too.
Now I have very positive opinion about CS not only because CS makes code less noisy, more structured, more readable and less buggy,
mostly because ECMAScript and CoffeeScript evolve together.
And it makes CoffeeScript not &#8220;Yet another <a href='https://github.com/jashkenas/coffee-script/wiki/List-of-languages-that-compile-to-JS'>language that compiles to JavaScript</a>&#8221;.
CS has big influence on future and present of ECMAScript, I think.
Below I have some examples(it&#8217;s not actually examples, just some links to CS website) of features that will be provided in ES6(in future version of ECMAScript specification)
and these features already implemented in CS, some of them was borrowed from CS.
I think, it&#8217;s awesome because we can just use nice features NOW.
Also CoffeeScript provides big portion of syntax sugar(short functions, optional return, ranges, additional operators, string interpolation and etc) and
fixes some bad parts of JavaScript:</p>

<h2>Fixes</h2>

<ul>
<li>Problems with global scope (each file wraps to anonymous function)</li>
<li>Problems with weak typization (CS internally always uses === operator)</li>
<li>Awkward semicolons (CS has indentation syntax)</li>
</ul>


<h2>Features</h2>

<p>Some features that will be in ES6/ES.next/ES Harmony and that already exist in CoffeeScript:</p>

<ul>
<li><a href="http://jashkenas.github.com/coffee-script/#splats">Splats</a></li>
<li><a href="http://jashkenas.github.com/coffee-script/#destructuring">Destructuring</a></li>
<li><a href="http://jashkenas.github.com/coffee-script/#literals">Arrow functions</a></li>
<li><a href="http://jashkenas.github.com/coffee-script/#fat_arrow" title="">Function binding (fat arrow)</a></li>
</ul>


<h2>Links</h2>

<ul>
<li><a href="http://jashkenas.github.com/coffee-script/">CoffeeScript Home Page</a></li>
<li><a href="http://blip.tv/jsconf/jsconf2011-jeremy-ashkenas-5258082">JSConf 2011, about CS and future of JS</a></li>
<li>Dmitry Soshnikov about future of ECMAScript: <a href='http://blip.tv/falsyvalues/falsy-values-2010-dmitry-soshnikov-5600275'>video</a> and <a href='http://www.slideshare.net/dmitrysoshnikov/falsyvalues-dmitry-soshnikov-ecmascript-6'>slides</a></li>
</ul>


<h2>Peace!</h2>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[PaperTrail Ignore vs Skip]]></title>
    <link href="http://edtsech.github.com/2011/11/paper-trail-ignore-vs-skip.html"/>
    <updated>2011-11-17T00:00:00+01:00</updated>
    <id>http://edtsech.github.com/2011/11/paper-trail-ignore-vs-skip</id>
    <content type="html"><![CDATA[<p>:skip attribute/key was released in PaperTrail 2.4.1 What are the differences between :ignore and :skip?
For example we have <b>Article</b> model with ignored <b>title</b> field and skipped <code>file_upload</code> field:</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='ruby'><span class='line'><span class="k">class</span> <span class="nc">Article</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'>  <span class="n">has_paper_trail</span> <span class="ss">:ignore</span> <span class="o">=&gt;</span> <span class="ss">:title</span><span class="p">,</span>
</span><span class='line'>                  <span class="ss">:skip</span>   <span class="o">=&gt;</span> <span class="ss">:file_upload</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Create empty article object, initial version&#8217;ll be 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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="o">&gt;&gt;</span> <span class="n">a</span> <span class="o">=</span> <span class="no">Article</span><span class="o">.</span><span class="n">create</span>
</span><span class='line'><span class="o">&gt;&gt;</span> <span class="no">Article</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="no">Article</span><span class="p">(</span><span class="nb">id</span><span class="p">:</span> <span class="n">integer</span><span class="p">,</span> <span class="n">title</span><span class="p">:</span> <span class="n">string</span><span class="p">,</span> <span class="n">content</span><span class="p">:</span> <span class="n">string</span><span class="p">,</span> <span class="n">file_upload</span><span class="p">:</span> <span class="n">string</span><span class="p">)</span>
</span><span class='line'><span class="o">&gt;&gt;</span> <span class="n">a</span><span class="o">.</span><span class="n">versions</span><span class="o">.</span><span class="n">count</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="mi">1</span>
</span></code></pre></td></tr></table></div></figure>


<p>If we update ignored <b>title</b> attribute, version won&#8217;t be created.
If we update non-ignored <b>content</b> column, version&#8217;ll be created
and we&#8217;ll have stored changes of object in <b>object_changes</b> column that available through <b>changeset</b> attribute.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="o">&gt;&gt;</span> <span class="n">a</span><span class="o">.</span><span class="n">update_attributes</span> <span class="ss">:title</span> <span class="o">=&gt;</span> <span class="s1">&#39;Title&#39;</span>
</span><span class='line'><span class="o">&gt;&gt;</span> <span class="n">a</span><span class="o">.</span><span class="n">versions</span><span class="o">.</span><span class="n">count</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="mi">1</span>
</span><span class='line'><span class="o">&gt;&gt;</span> <span class="n">a</span><span class="o">.</span><span class="n">update_attributes</span> <span class="ss">:title</span> <span class="o">=&gt;</span> <span class="s1">&#39;New Title&#39;</span><span class="p">,</span> <span class="ss">:content</span> <span class="o">=&gt;</span> <span class="s1">&#39;Content&#39;</span>
</span><span class='line'><span class="o">&gt;&gt;</span> <span class="n">a</span><span class="o">.</span><span class="n">versions</span><span class="o">.</span><span class="n">count</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="mi">2</span>
</span><span class='line'><span class="o">&gt;&gt;</span> <span class="n">a</span><span class="o">.</span><span class="n">versions</span><span class="o">.</span><span class="n">last</span><span class="o">.</span><span class="n">changeset</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="p">{</span><span class="s2">&quot;content&quot;</span><span class="o">=&gt;[</span><span class="kp">nil</span><span class="p">,</span> <span class="s2">&quot;Content&quot;</span><span class="o">]</span><span class="p">}</span>
</span><span class='line'><span class="o">&gt;&gt;</span> <span class="n">a</span><span class="o">.</span><span class="n">versions</span><span class="o">.</span><span class="n">last</span><span class="o">.</span><span class="n">reify</span>
</span><span class='line'><span class="o">=&gt;</span> <span class="c1">#&lt;Article id: 1, title: &quot;Title&quot;, content: nil, abstract: nil, file_upload: nil&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>As we see ignored <b>title</b> column not stored in changeset but it stored in dumped object.
But there are some cases when we don&#8217;t need to store some columns in dump object by various reasons.
For these cases :skip key has been created. :skip and :ignore work identically, but :skip doesn&#8217;t store
data of <b>skiped</b> columns in object dump. That&#8217;s it.</p>

<p>Information about attributes tracking you can find in paper_trail PaperTrail
<a href="https://github.com/airblade/paper_trail">README</a>
(Choosing Attributes To Monitor) on GitHub.</p>

<p><a href="https://github.com/airblade/paper_trail/issues/92">Issue</a> about :skip on GitHub.</p>

<h2>Peace!</h2>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Underscore.string 2.0 release]]></title>
    <link href="http://edtsech.github.com/2011/11/underscore.string-2.0-release.html"/>
    <updated>2011-11-09T00:00:00+01:00</updated>
    <id>http://edtsech.github.com/2011/11/underscore.string-2.0-release</id>
    <content type="html"><![CDATA[<h2>Why 2.0?</h2>

<p>In this version we moved Underscore.string library to separate namespace <b>_.string</b>
for solve name conflicts with Underscore library. There are some functions that available in
both libraries, for ex. <b>include</b> and <b>reverse</b>. In 1.1.6 and lower Underscore.string provided <b>includes</b>
function, but we decided that two function <b>include</b> and (<b>includes</b> or <b>includeString</b>) in one namespace
and with same functionality but one function for collections another for strings, it&#8217;s a little bit ugly.</p>

<h2>Do we always need to write _.string?</h2>

<p>Nope. Underscore.string provide <b>exports</b> function <b>_.string.exports()</b>, this function returns only non-conflict functions and we can mix in these functions to Underscore scope if you want.</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='js'><span class='line'><span class="nx">_</span><span class="p">.</span><span class="nx">mixin</span><span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">string</span><span class="p">.</span><span class="nx">exports</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Access to Underscore.string and Underscore functions</span>
</span><span class='line'><span class="nx">_</span><span class="p">.</span><span class="nx">include</span><span class="p">([</span><span class="mi">1</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="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="nx">_</span><span class="p">.</span><span class="nx">trim</span><span class="p">(</span><span class="s1">&#39;  asd  &#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Access to conflict Underscore.string functions</span>
</span><span class='line'><span class="nx">_</span><span class="p">.</span><span class="nx">string</span><span class="p">.</span><span class="nx">include</span><span class="p">(</span><span class="s1">&#39;foobar&#39;</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">)</span>
</span><span class='line'><span class="c1">// or</span>
</span><span class='line'><span class="nx">_</span><span class="p">.</span><span class="nx">str</span><span class="p">.</span><span class="nx">include</span><span class="p">(</span><span class="s1">&#39;foobar&#39;</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">)</span>
</span><span class='line'><span class="c1">// &quot;str&quot; it&#39;s just alias for &quot;string&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Problems</h2>

<p>We lose two things for <b>include</b> and <b>reverse</b> methods from <b>_.string:</b></p>

<ul>
<li>Calls like <code>_('foobar').include('bar')</code> aren&#8217;t available;</li>
<li>Chaining isn&#8217;t available too.</li>
</ul>


<p>But if you need this functionality you can create aliases for conflict functions which will be convnient for you.</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='js'><span class='line'><span class="nx">_</span><span class="p">.</span><span class="nx">mixin</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">includeString</span><span class="o">:</span> <span class="nx">_</span><span class="p">.</span><span class="nx">str</span><span class="p">.</span><span class="nx">include</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">reverseString</span><span class="o">:</span> <span class="nx">_</span><span class="p">.</span><span class="nx">str</span><span class="p">.</span><span class="nx">reverse</span>
</span><span class='line'><span class="p">})</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Now wrapper calls and chaining are available.</span>
</span><span class='line'><span class="nx">_</span><span class="p">(</span><span class="s1">&#39;foobar&#39;</span><span class="p">).</span><span class="nx">chain</span><span class="p">().</span><span class="nx">reverseString</span><span class="p">().</span><span class="nx">includeString</span><span class="p">(</span><span class="s1">&#39;rab&#39;</span><span class="p">).</span><span class="nx">value</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Standalone Usage</h2>

<p>If you are using Underscore.string without Underscore. You also have <em>.string namespace for it. And current version number you can find through <b>VERSION</b> constant <b></em>.string.VERSION.</b> If you want you can just reassign _ variable with <b>_.string</b></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='js'><span class='line'><span class="nx">_</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">string</span>
</span><span class='line'>
</span><span class='line'><span class="nx">_</span><span class="p">.</span><span class="nx">VERSION</span> <span class="c1">// =&gt; 1.2.0</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Node.js Installation</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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">npm</span> <span class="nx">install</span> <span class="nx">underscore</span><span class="p">.</span><span class="nx">string</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Standalone usage:</h3>

<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='js'><span class='line'><span class="kd">var</span> <span class="nx">_s</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;underscore.string&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Integrate with Underscore.js:</h3>

<p>I recommend you this way for integrating with Underscore.js:</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='js'><span class='line'><span class="kd">var</span> <span class="nx">_</span>  <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;underscore&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Import Underscore.string to separate object, because there are conflict functions (include, reverse, contains)</span>
</span><span class='line'><span class="nx">_</span><span class="p">.</span><span class="nx">str</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;underscore.string&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Mix in non-conflict functions to Underscore namespace if you want</span>
</span><span class='line'><span class="nx">_</span><span class="p">.</span><span class="nx">mixin</span><span class="p">(</span><span class="nx">_</span><span class="p">.</span><span class="nx">str</span><span class="p">.</span><span class="nx">exports</span><span class="p">());</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// All functions, include conflict, will be available through _.str object</span>
</span><span class='line'><span class="nx">_</span><span class="p">.</span><span class="nx">str</span><span class="p">.</span><span class="nx">include</span><span class="p">(</span><span class="s1">&#39;Underscore.string&#39;</span><span class="p">,</span> <span class="s1">&#39;string&#39;</span><span class="p">);</span> <span class="c1">// =&gt; true</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Upgrade</h2>

<p>In new version function <b>includes</b> has been removed, you should replace this function by <b><em>.str.include</b> or create alias <b></em>.includes = _.str.include</b> and all will work fine.</p>

<h2>Peace!</h2>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[PaperTrail 2.2.7-2.4.0 changes]]></title>
    <link href="http://edtsech.github.com/2011/10/paper-trail-2.2.7-2.4.0-changes.html"/>
    <updated>2011-10-20T00:00:00+02:00</updated>
    <id>http://edtsech.github.com/2011/10/paper-trail-2.2.7-2.4.0-changes</id>
    <content type="html"><![CDATA[<h2>1. Changeset</h2>

<p>From PaperTrail 2.2.7 release you can find a new method of <b>Version</b> instances, called <b>changeset.</b>
PaperTrail doesn&#8217;t have <b>diffs</b> mechanism inside, but now if you have <b>object_changes</b> column in <b>versions</b>
table (it can be generated automatically if you install PaperTrail with <b>&#8211;with-changes</b> option) it will store Rails&#8217; <b>changes</b> of dirty 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>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='sh'><span class='line'><span class="nv">$ </span>rails g paper_trail:install --with-changes
</span><span class='line'><span class="c"># or manually add `object_changes` column in your `versions` table</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="o">&gt;&gt;</span> <span class="n">widget</span> <span class="o">=</span> <span class="no">Widget</span><span class="o">.</span><span class="n">create</span> <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s1">&#39;Bob&#39;</span>
</span><span class='line'><span class="o">&gt;&gt;</span> <span class="n">widget</span><span class="o">.</span><span class="n">versions</span><span class="o">.</span><span class="n">last</span><span class="o">.</span><span class="n">changeset</span>                <span class="c1"># {}</span>
</span><span class='line'><span class="o">&gt;&gt;</span> <span class="n">widget</span><span class="o">.</span><span class="n">update_attributes</span> <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s1">&#39;Robert&#39;</span>
</span><span class='line'><span class="o">&gt;&gt;</span> <span class="n">widget</span><span class="o">.</span><span class="n">versions</span><span class="o">.</span><span class="n">last</span><span class="o">.</span><span class="n">changeset</span>                <span class="c1"># {&#39;name&#39; =&gt; [&#39;Bob&#39;, &#39;Robert&#39;]}</span>
</span></code></pre></td></tr></table></div></figure>


<p>More information about Diffing Versions you can find in PaperTrail <a href="https://github.com/airblade/paper_trail#diffing-versions">README</a> on GitHub.</p>

<h2>2. Flexibility in naming of methods</h2>

<p>There are some situations when methods <b>version</b> and <b>versions</b> are already busy by other associations or smth.
In this case we can change the names of these methods in our application (but sometimes it&#8217;s time-consuming)
or we can configure these methods in PaperTrail like 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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">has_paper_trail</span> <span class="ss">:versions</span> <span class="o">=&gt;</span> <span class="ss">:paper_trail_versions</span><span class="p">,</span>
</span><span class='line'>                <span class="ss">:version_name</span> <span class="o">=&gt;</span> <span class="ss">:paper_trail_version</span>
</span></code></pre></td></tr></table></div></figure>


<h2>3. Add :on option</h2>

<p>With this option we can configure what events we need to track. For example, we don&#8217;t need to track <b>create</b> events:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">has_paper_trail</span> <span class="ss">:on</span> <span class="o">=&gt;</span> <span class="o">[</span><span class="ss">:update</span><span class="p">,</span> <span class="ss">:destroy</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure>


<h2>4. Without Versioning</h2>

<p>In some cases some action/actions must be executed without versioning. Now PaperTrail has simple wrapper for this case:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># Executes the given method or block without creating a new version.</span>
</span><span class='line'><span class="k">def</span> <span class="nf">without_versioning</span><span class="p">(</span><span class="nb">method</span> <span class="o">=</span> <span class="kp">nil</span><span class="p">)</span>
</span><span class='line'>  <span class="n">paper_trail_was_enabled</span> <span class="o">=</span> <span class="nb">self</span><span class="o">.</span><span class="n">paper_trail_enabled_for_model</span>
</span><span class='line'>  <span class="nb">self</span><span class="o">.</span><span class="n">class</span><span class="o">.</span><span class="n">paper_trail_off</span>
</span><span class='line'>  <span class="nb">method</span> <span class="p">?</span> <span class="nb">method</span><span class="o">.</span><span class="n">to_proc</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="nb">self</span><span class="p">)</span> <span class="p">:</span> <span class="k">yield</span>
</span><span class='line'><span class="k">ensure</span>
</span><span class='line'>  <span class="nb">self</span><span class="o">.</span><span class="n">class</span><span class="o">.</span><span class="n">paper_trail_on</span> <span class="k">if</span> <span class="n">paper_trail_was_enabled</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>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>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># With method name</span>
</span><span class='line'><span class="vi">@widget</span><span class="o">.</span><span class="n">without_versioning</span> <span class="ss">:destroy</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># or with block</span>
</span><span class='line'><span class="vi">@widget</span><span class="o">.</span><span class="n">without_versioning</span> <span class="k">do</span>
</span><span class='line'>  <span class="vi">@widget</span><span class="o">.</span><span class="n">update_attributes</span> <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s1">&#39;Ford&#39;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<h2>5. Attr Accessible</h2>

<p>Now we need to use <b>attr_accessible</b> if we want to store some <b>meta</b> info in <b>versions</b> table. Example of <b>meta</b> information from PaperTrail README:</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">Article</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:author</span>
</span><span class='line'>  <span class="n">has_paper_trail</span> <span class="ss">:meta</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="ss">:author_id</span>  <span class="o">=&gt;</span> <span class="no">Proc</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span> <span class="o">|</span><span class="n">article</span><span class="o">|</span> <span class="n">article</span><span class="o">.</span><span class="n">author_id</span> <span class="p">},</span>
</span><span class='line'>                             <span class="ss">:word_count</span> <span class="o">=&gt;</span> <span class="ss">:count_words</span><span class="p">,</span>
</span><span class='line'>                             <span class="ss">:answer</span>     <span class="o">=&gt;</span> <span class="mi">42</span> <span class="p">}</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">count_words</span>
</span><span class='line'>    <span class="mi">153</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>In this case <b>author_id</b>, <b>word_count</b> and <b>answer</b> are <b>meta</b>, and we need to have these columns in <b>versions</b> table. And also we need to add these <b>attrs</b> to <b>attr_accessible</b></p>

<h2>Peace!</h2>
]]></content>
  </entry>
  
</feed>
