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

  <title><![CDATA[taras kalapun]]></title>
  <link href="http://kalapun.com/atom.xml" rel="self"/>
  <link href="http://kalapun.com/"/>
  <updated>2013-03-20T11:36:19+02:00</updated>
  <id>http://kalapun.com/</id>
  <author>
    <name><![CDATA[Taras Kalapun]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Generating API - teaser]]></title>
    <link href="http://kalapun.com/blog/2013/03/01/generating-api-teaser/"/>
    <updated>2013-03-01T19:35:00+02:00</updated>
    <id>http://kalapun.com/blog/2013/03/01/generating-api-teaser</id>
    <content type="html"><![CDATA[<p><img src="http://kalapun.com/images/2013-03-01/seq_scruffy.png" alt=""></p>

<p>Imagine you&#39;r defining how Web-service API should look like in a simple YAML file</p>

<!-- more -->

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='yaml'><span class='line'><span class="l-Scalar-Plain">baseURL</span><span class="p-Indicator">:</span> <span class="s">&quot;http://localhost&quot;</span>
</span><span class='line'><span class="l-Scalar-Plain">fixtureDirectory</span><span class="p-Indicator">:</span> <span class="s">&quot;&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="l-Scalar-Plain">defaults</span><span class="p-Indicator">:</span>
</span><span class='line'>  <span class="l-Scalar-Plain">request</span><span class="p-Indicator">:</span>
</span><span class='line'>    <span class="l-Scalar-Plain">method</span><span class="p-Indicator">:</span> <span class="s">&quot;GET&quot;</span>
</span><span class='line'>  <span class="l-Scalar-Plain">response</span><span class="p-Indicator">:</span>
</span><span class='line'>    <span class="l-Scalar-Plain">responseCode</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">200</span>
</span><span class='line'>    <span class="l-Scalar-Plain">headers</span><span class="p-Indicator">:</span>
</span><span class='line'>      <span class="l-Scalar-Plain">Content-Type</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">application/json</span>
</span><span class='line'>
</span><span class='line'><span class="l-Scalar-Plain">mocks</span><span class="p-Indicator">:</span>
</span><span class='line'>  <span class="p-Indicator">-</span>
</span><span class='line'>    <span class="l-Scalar-Plain">request</span><span class="p-Indicator">:</span>
</span><span class='line'>      <span class="l-Scalar-Plain">url</span><span class="p-Indicator">:</span> <span class="s">&quot;/api/v1/catalog/products&quot;</span>
</span><span class='line'>    <span class="l-Scalar-Plain">response</span><span class="p-Indicator">:</span>
</span><span class='line'>      <span class="l-Scalar-Plain">fixture</span><span class="p-Indicator">:</span> <span class="s">&quot;catalog_products.json&quot;</span>
</span><span class='line'>      <span class="l-Scalar-Plain">timeout</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">60.0</span>
</span><span class='line'>  <span class="p-Indicator">-</span>
</span><span class='line'>    <span class="l-Scalar-Plain">request</span><span class="p-Indicator">:</span>
</span><span class='line'>      <span class="l-Scalar-Plain">url</span><span class="p-Indicator">:</span> <span class="s">&quot;/api/v1/pickups&quot;</span>
</span><span class='line'>    <span class="l-Scalar-Plain">response</span><span class="p-Indicator">:</span>
</span><span class='line'>      <span class="l-Scalar-Plain">fixture</span><span class="p-Indicator">:</span> <span class="s">&quot;pickups.json&quot;</span>
</span></code></pre></td></tr></table></div></figure>

<p>Now imagine you make a stubs from it, in runtime, on iOS ans Android.. and Ruby&#8230; </p>

<p>Or you generate API documentation&#8230;</p>

<p>Or just a few diagrams, to show your boss how it works&#8230;</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='yaml'><span class='line'><span class="l-Scalar-Plain">./parser.rb api.yml &gt; seq.diag</span>
</span><span class='line'><span class="l-Scalar-Plain">seqdiag -Tsvg seq.diag &gt; seq.svg</span>
</span><span class='line'><span class="l-Scalar-Plain">./svg2png.sh seq.svg</span>
</span></code></pre></td></tr></table></div></figure>

<p>And you get a Sequence diagram!</p>

<p><img src="http://kalapun.com/images/2013-03-01/seq_def.png" alt=""></p>

<p>And after a few additional tricks&#8230;</p>

<table><thead>
<tr>
<th>Header 1</th>
<th>Header2</th>
</tr>
</thead><tbody>
<tr>
<td>kjfek</td>
<td>kdfjnvkerv</td>
</tr>
</tbody></table>

<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='yaml'><span class='line'><span class="l-Scalar-Plain">./svg2scruffy.rb seq.svg &gt; seq_scruffy.svg</span>
</span></code></pre></td></tr></table></div></figure>

<p>You can get a fun &quot;hand-drawn&quot; diagram</p>

<p><img src="http://kalapun.com/images/2013-03-01/seq_scruffy.png" alt=""></p>

<p>Stay tuned&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rails - SQLite and PostgreSQL playing nice together]]></title>
    <link href="http://kalapun.com/blog/2013/02/12/rails-sqlite-and-postgresql-playing-nice-together/"/>
    <updated>2013-02-12T16:57:00+02:00</updated>
    <id>http://kalapun.com/blog/2013/02/12/rails-sqlite-and-postgresql-playing-nice-together</id>
    <content type="html"><![CDATA[<p>So I was asked to add few features to the web-app, that was in production and running PostgreSQL. Well, I didn&#39;t want to install the PostgreSQL on my local machine. So I decided to have development version and test version to run in SQLite, while keeping production version unchanged.</p>

<p>So I came up to few hacks.</p>

<h2>database.yml</h2>

<p>First, edit your <code>config/database.yml</code> and change it so <code>development</code> and <code>test</code> enviroment will use SQLite
<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='yaml'><span class='line'><span class="l-Scalar-Plain">development</span><span class="p-Indicator">:</span>
</span><span class='line'>  <span class="l-Scalar-Plain">adapter</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">sqlite3</span>
</span><span class='line'>  <span class="l-Scalar-Plain">database</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">db/development.sqlite3</span>
</span><span class='line'>  <span class="l-Scalar-Plain">pool</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">5</span>
</span><span class='line'>  <span class="l-Scalar-Plain">timeout</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">5000</span>
</span><span class='line'><span class="l-Scalar-Plain">test</span><span class="p-Indicator">:</span> <span class="nl">&amp;test</span>
</span><span class='line'>  <span class="l-Scalar-Plain">adapter</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">sqlite3</span>
</span><span class='line'>  <span class="l-Scalar-Plain">database</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">db/test.sqlite3</span>
</span><span class='line'>  <span class="l-Scalar-Plain">pool</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">5</span>
</span><span class='line'>  <span class="l-Scalar-Plain">timeout</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">5000</span>
</span></code></pre></td></tr></table></div></figure></p>

<p>And don&#39;t forget to run <code>rake db:reset</code> and <code>rake db:seed</code> to set your new DB and seed it with data.</p>

<!-- more -->

<h2>Gemfile</h2>

<p>Don&#39;t forget to edit your <code>Gemfile</code></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">group</span> <span class="ss">:development</span><span class="p">,</span> <span class="ss">:test</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">gem</span> <span class="s1">&#39;sqlite3&#39;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">group</span> <span class="ss">:production</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">gem</span> <span class="s1">&#39;pg&#39;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>

<h2>SQL stuff</h2>

<p>PostgreSQL has some SQL addons, that SQLite doesn&#39;t. Some of them can be changed to DB-agnostic style, and some of them - can be skipped for development.</p>

<p>As the first example, we have a query like </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="no">Thing</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">#{</span><span class="n">key</span><span class="si">}</span><span class="s2"> ilike ?&quot;</span><span class="p">,</span><span class="err"> </span><span class="s2">&quot;%</span><span class="si">#{</span><span class="n">value</span><span class="si">}</span><span class="s2">%&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>

<p>You see this <code>iLike</code> keyword, don&#39;t you? Well the thing is, putting DB-agnostic query is even faster than native <code>ILIKE</code>. So change it to <code>lower(x) like lower(y)</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">Thing</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="s2">&quot;lower(</span><span class="si">#{</span><span class="n">resource_class</span><span class="o">.</span><span class="n">table_name</span><span class="si">}</span><span class="s2">.</span><span class="si">#{</span><span class="n">key</span><span class="si">}</span><span class="s2">) LIKE lower(?)&quot;</span><span class="p">,</span><span class="err"> </span><span class="s2">&quot;%</span><span class="si">#{</span><span class="n">value</span><span class="si">}</span><span class="s2">%&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>

<p>Next one is <code>INDEX</code>. PostgreSQL has an addition with <code>WHERE</code>, but SQLite doesnt. But for development purposes, we don&#39;t care.</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="k">if</span> <span class="no">Rails</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">development?</span> <span class="o">||</span> <span class="no">Rails</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">test?</span>
</span><span class='line'>    <span class="n">execute</span> <span class="s2">&quot;CREATE UNIQUE INDEX websites_qa_profile_url ON websites (qa_profile_id, url)&quot;</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>    <span class="n">execute</span> <span class="s2">&quot;CREATE UNIQUE INDEX websites_qa_profile_url ON websites (qa_profile_id, url) WHERE deleted_at IS NULL&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>

<p>This will use the proper SQL query depending on enviroment it runs.</p>

<h2>Dates</h2>

<p>Next thing, PostgreSQL has his own dating formats like <code>now() - &#39;5 days&#39;::interval</code>, which SQLite doesn&#39;t have. So I&#39;ve made this class</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">AdapterSpecific</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">class</span> <span class="o">&lt;&lt;</span> <span class="nb">self</span>
</span><span class='line'>    <span class="c1"># Workaround for &quot;updated_at &gt; now() - &#39;5 days&#39;::interval&quot;</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">datetime</span><span class="p">(</span><span class="n">timestring</span><span class="p">,</span> <span class="n">modifier</span><span class="p">)</span>
</span><span class='line'>      <span class="n">res</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>      <span class="k">case</span> <span class="ss">ActiveRecord</span><span class="p">:</span><span class="ss">:Base</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">adapter_name</span>
</span><span class='line'>      <span class="k">when</span> <span class="s1">&#39;PostgreSQL&#39;</span>
</span><span class='line'>        <span class="n">timestring</span> <span class="o">=</span> <span class="s1">&#39;now()&#39;</span> <span class="k">if</span> <span class="n">timestring</span> <span class="o">==</span> <span class="s1">&#39;now&#39;</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">modifier</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="s1">&#39;-&#39;</span>
</span><span class='line'>          <span class="n">add</span> <span class="o">=</span> <span class="s1">&#39;-&#39;</span>
</span><span class='line'>          <span class="n">modifier</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>          <span class="n">modifier</span><span class="o">.</span><span class="n">strip!</span>
</span><span class='line'>        <span class="k">else</span>
</span><span class='line'>          <span class="n">add</span> <span class="o">=</span> <span class="s1">&#39;+&#39;</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>        <span class="s2">&quot;</span><span class="si">#{</span><span class="n">timestring</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">add</span><span class="si">}</span><span class="s2"> &#39;</span><span class="si">#{</span><span class="n">modifier</span><span class="si">}</span><span class="s2">&#39;::interval&quot;</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="s2">&quot;datetime(</span><span class="si">#{</span><span class="n">timestring</span><span class="si">}</span><span class="s2">, </span><span class="si">#{</span><span class="n">modifier</span><span class="si">}</span><span class="s2">)&quot;</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">before</span><span class="p">(</span><span class="n">modifier</span><span class="p">)</span>
</span><span class='line'>      <span class="k">case</span> <span class="ss">ActiveRecord</span><span class="p">:</span><span class="ss">:Base</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">adapter_name</span>
</span><span class='line'>      <span class="k">when</span> <span class="s1">&#39;PostgreSQL&#39;</span>
</span><span class='line'>        <span class="s2">&quot;now() - &#39;</span><span class="si">#{</span><span class="n">modifier</span><span class="si">}</span><span class="s2">&#39;::interval&quot;</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="s2">&quot;datetime(&#39;now&#39;, &#39;-</span><span class="si">#{</span><span class="n">modifier</span><span class="si">}</span><span class="s2">&#39;)&quot;</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><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>Put it as <code>lib/adapter_specific.rb</code>, edit your <code>config/initializers/application.rb</code> and add on top <code>require &#39;adapter_specific&#39;</code>. Then change your SQL queries to be like one below:</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="no">Thing</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="s2">&quot;updated_at &gt; </span><span class="si">#{</span><span class="no">AdapterSpecific</span><span class="o">.</span><span class="n">before</span><span class="p">(</span><span class="s1">&#39;5 days&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">limit</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>

<p>Hope this short post will help you in playing with RoR apps.`</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Reverse-engineering iOS app]]></title>
    <link href="http://kalapun.com/blog/2013/02/11/reverse-engineering-ios-app/"/>
    <updated>2013-02-11T18:02:00+02:00</updated>
    <id>http://kalapun.com/blog/2013/02/11/reverse-engineering-ios-app</id>
    <content type="html"><![CDATA[<p>On one of projects I was involved in, we were implementing <code>Captive Login</code> technology, to automatically log in networks that have <code>Captive Portal</code> via <code>WISPr</code> technology. Everything went quite fine, except that on iOS, you can&#39;t do auto-login to WiFi network without user&#39;s permission. And the <code>CaptiveLogin</code> support is quite limited.</p>

<p>Then we suddenly spotted an app, that could do all that cool things. That was the start of my small research.</p>

<h2>The Beginning Is the End Is the Beginning</h2>

<p>For sake of convinience, let&#39;s call tha app that we&#39;r interested in <code>iApp</code>. We downloaded the app from AppStore, renamed <code>.ipa</code> to <code>.zip</code>, and started looking inside. </p>

<p>First of all, we opened <code>Info.plist</code>. And found a quite interesting string <code>network-authentication</code> for <code>Required background modes</code>. Google gave us 0 results. </p>

<p>Next thing, I checked <code>iApp.entitlements</code> file. And found there a nice key <code>com.apple.developer.CaptiveNetworkPlugin</code> saying <code>YES</code>. That was something. </p>

<!-- more -->

<h2>Disassembling</h2>

<p>I wanted to check if the app uses some privete libraries or methods related to <code>CaptiveNetwork</code>. To find that out, I used <a href="http://hopperapp.com">Hopper Disassembler</a>. For checking the app disassembly, the Demo version is quite good. </p>

<p>After some digging I found a notice of using some <code>Plugin</code></p>

<p><a href="http://kalapun.com/images/2013-02-11/1.png" class="fancybox" title=""><img src="http://kalapun.com/images/2013-02-11/1.png" alt="" /></a></p>

<p>That gave me idea of usage of some private <code>CaptiveNetwork</code> library. I found one in <code>/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/System/Library/PrivateFrameworks/CaptiveNetwork.framework</code> (similar path to ARM version)</p>

<p><code>nm -g CaptiveNetwork</code> gave me an interesting list of public methods (one starts with <code>T</code>):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>00001e78 T _CNAccountsAdd
</span><span class='line'>00001e40 T _CNAccountsCopy
</span><span class='line'>00002018 T _CNAccountsResolve
</span><span class='line'>00001cb4 T _CNAccountsUse
</span><span class='line'>000022e4 T _CNCheckControlSettings
</span><span class='line'>00001ad0 T _CNDebugLaunchWebsheet
</span><span class='line'>000022c4 T _CNDumpState
</span><span class='line'>00001bf4 T _CNForgetSSID
</span><span class='line'>00002074 T _CNIAmTheWebsheetApp
</span><span class='line'>00001b60 T _CNLogoff
</span><span class='line'>000049c0 T _CNNetworkCopyPluginNames
</span><span class='line'>00004890 T _CNNetworkGetBSSID
</span><span class='line'>00004858 T _CNNetworkGetSSID
</span><span class='line'>00004820 T _CNNetworkGetSSIDString
</span><span class='line'>00004908 T _CNNetworkGetSignalStrength
</span><span class='line'>00004744 T _CNNetworkGetTypeID
</span><span class='line'>000048c8 T _CNNetworkIsProtected
</span><span class='line'>00004770 T _CNNetworkSetCaptive
</span><span class='line'>000047e0 T _CNNetworkSetConfidence
</span><span class='line'>00004970 T _CNNetworkWasAutoJoined
</span><span class='line'>000050e0 T _CNPluginCommandBindReadStream
</span><span class='line'>00005110 T _CNPluginCommandCopyCurrentNetwork
</span><span class='line'>0000512c T _CNPluginCommandCopyNetworkList
</span><span class='line'>000050d0 T _CNPluginCommandGetInterfaceName
</span><span class='line'>000050cc T _CNPluginCommandGetType
</span><span class='line'>000050a0 T _CNPluginCommandGetTypeID
</span><span class='line'>00004bbc T _CNPluginRegister
</span><span class='line'>00005290 T _CNPluginResponseCreate
</span><span class='line'>00005300 T _CNPluginResponseDeliver
</span><span class='line'>00005264 T _CNPluginResponseGetTypeID
</span><span class='line'>000054b8 T _CNPluginResponseSetNetwork
</span><span class='line'>0000543c T _CNPluginResponseSetNetworkList
</span><span class='line'>00001798 T _CNProberCreate
</span><span class='line'>000019dc T _CNProberCreateRunLoopSource
</span><span class='line'>000016f0 T _CNProberGetTypeID
</span></code></pre></td></tr></table></div></figure>

<p>which looked quite interesting. So not thinking for so long, I opened the library in disassembly:</p>

<p><a href="http://kalapun.com/images/2013-02-11/2.png" class="fancybox" title=""><img src="http://kalapun.com/images/2013-02-11/2.png" alt="" /></a></p>

<p>Hmm, they are getting the info from some <code>NSDictionary</code> ?</p>

<h2>Putting stuff together</h2>

<p>Well, I tried making a demo app and using that private framework.</p>

<p>But how do we get access to it&#39;s C-functions? Her&#39;s the answer:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="c1">// Get the bundle framework</span>
</span><span class='line'><span class="n">CFBundleRef</span> <span class="n">bundle</span> <span class="o">=</span> <span class="n">CFBundleGetBundleWithIdentifier</span><span class="p">(</span><span class="n">CFSTR</span><span class="p">(</span><span class="s">&quot;com.apple.CaptiveNetworkSupport&quot;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Declare the function</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// let&#39;s start with some simple one</span>
</span><span class='line'><span class="kt">BOOL</span> <span class="p">(</span><span class="o">*</span><span class="n">CNNetworkWasAutoJoined</span><span class="p">)(</span><span class="n">CFDictionaryRef</span><span class="p">)</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span><span class='line'>    <span class="n">CNNetworkWasAutoJoined</span> <span class="o">=</span> <span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="p">)</span><span class="n">CFBundleGetFunctionPointerForName</span><span class="p">(</span><span class="n">bundle</span><span class="p">,</span> <span class="n">CFSTR</span><span class="p">(</span><span class="s">&quot;CNNetworkWasAutoJoined&quot;</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// register us in networks</span>
</span><span class='line'><span class="n">CFStringRef</span> <span class="n">ssids</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="n">CFSTR</span><span class="p">(</span><span class="s">&quot;OurWiFi&quot;</span><span class="p">),</span> <span class="n">CFSTR</span><span class="p">(</span><span class="s">&quot;NeighboursWiFi&quot;</span><span class="p">)</span> <span class="p">};</span>
</span><span class='line'>    <span class="n">CFArrayRef</span> <span class="n">arr_ssids</span> <span class="o">=</span> <span class="n">CFArrayCreate</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="p">(</span><span class="k">const</span> <span class="kt">void</span> <span class="o">**</span><span class="p">)</span><span class="n">ssids</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">kCFTypeArrayCallBacks</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span><span class="p">(</span> <span class="n">CNSetSupportedSSIDs</span><span class="p">((</span><span class="n">CFArrayRef</span><span class="p">)</span><span class="n">arr_ssids</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;Successfully registered supported network SSIDs&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;Error: Failed to register supported network SSIDs&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="n">CFRelease</span><span class="p">(</span><span class="n">arr_ssids</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Find network interfaces by CNCopySupportedInterfaces()</span>
</span><span class='line'><span class="n">NSString</span><span class="o">*</span> <span class="n">interface</span> <span class="o">=</span> <span class="s">@&quot;en0&quot;</span><span class="p">;</span>  <span class="c1">// or hard code it</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Get network details</span>
</span><span class='line'><span class="n">NSDictionary</span><span class="o">*</span> <span class="n">networkDetails</span> <span class="o">=</span> <span class="p">(</span><span class="n">__bridge</span> <span class="n">NSDictionary</span><span class="o">*</span><span class="p">)</span><span class="n">CNCopyCurrentNetworkInfo</span><span class="p">((</span><span class="n">__bridge</span> <span class="n">CFStringRef</span><span class="p">)</span> <span class="n">interface</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// check it?</span>
</span><span class='line'><span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;all details: %@&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">networkDetails</span> <span class="n">description</span><span class="p">]);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Let&#39;s use the private method</span>
</span><span class='line'><span class="kt">BOOL</span> <span class="n">x</span> <span class="o">=</span> <span class="n">CNNetworkWasAutoJoined</span><span class="p">((</span><span class="n">__bridge</span> <span class="n">CFDictionaryRef</span><span class="p">)(</span><span class="n">networkDetails</span><span class="p">));</span>
</span><span class='line'><span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;X: %d&quot;</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>

<p>Now everything seems working till the last one. If we&#39;ll check debugger, we&#39;re getting the <code>bundle</code>, we&#39;re getting the private function in <code>CNNetworkWasAutoJoined</code>, but we&#39;r getting crash when we try using it. It seems the <code>networkDetails</code> doesn&#39;t contain the needed information. </p>

<h2>The End Is the Beginning Is the End</h2>

<p>Well, idea of putting <code>com.apple.developer.CaptiveNetworkPlugin</code> to <code>Entitlments</code> did&#39;nt work. There need to be a valid Provisioning profile for this thing. And the valid one can be issued only by Apple. </p>

<p>So it brings us to idea that the creators of this <code>iApp</code>
 got in contact with Apple, and got a special priviledges for their app. Well, we also contacted Apple, but still no response from their side.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[iOS Unit testing]]></title>
    <link href="http://kalapun.com/blog/2013/02/11/ios-unit-testing/"/>
    <updated>2013-02-11T16:10:00+02:00</updated>
    <id>http://kalapun.com/blog/2013/02/11/ios-unit-testing</id>
    <content type="html"><![CDATA[<p>Let me tell you, dear reader, how I simplify my life by writing small and effective unit tests for iOS projects.</p>

<p>I&#39;m quite lazy person, so if I can simplify my life and work - I do so. Of course you agree, that writing tests is cool. Having tests means you have less bugs in code, and if someone changes something, he can check if he&#39;s patch breaks anything in existing implementation. And of course, writing unit tests makes you thinking about better architecture, and making smaller, better methods. You know beforehand, that testing a method that is few hundreds of lines of code is a big pain in the ass&#8230;</p>

<p>But why people often avoid writing tests? Well, as I see often - because they think it&#39;s a lot of additional code to write. </p>

<p>So I&#39;ll try to tell from my experience, how to write less test code :)</p>

<h2>Asserts</h2>

<p>Let&#39;s start with simple thing, thing that you can spot in many test samples:</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='obj-c'><span class='line'><span class="n">STAssertNotNil</span><span class="p">(</span><span class="n">objects</span><span class="p">,</span> <span class="s">@&quot;Could not load objects&quot;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>

<p>Well, if it&#39;s one line in code - it&#39;s kind of OK. But if you need to write these <code>STAssers</code>-s over 9000 times&#8230; you know what I mean. It&#39;s getting even worse if you want to compare simple types like <code>int</code> or <code>float</code>.</p>

<p>So my number one pick is a small library called <a href="https://github.com/petejkim/expecta">Expecta</a>. Just add to your <code>Podfile</code> (I think you&#39;r using <a href="http://cocoapods.org">cocoapods</a>, don&#39;t you?) <code>pod &#39;Expecta&#39;</code> and you&#39;ll have a simple and nice assert tests like</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='obj-c'><span class='line'><span class="n">expect</span><span class="p">(</span><span class="n">objects</span><span class="p">).</span><span class="n">toNot</span><span class="p">.</span><span class="n">beNil</span><span class="p">();</span>
</span><span class='line'><span class="n">expect</span><span class="p">(</span><span class="n">objects</span><span class="p">.</span><span class="n">count</span><span class="p">).</span><span class="n">to</span><span class="p">.</span><span class="n">equal</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
</span><span class='line'><span class="n">expect</span><span class="p">(</span><span class="n">evaluated</span><span class="p">).</span><span class="n">to</span><span class="p">.</span><span class="n">equal</span><span class="p">(</span><span class="n">YES</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// or more fancy stuff</span>
</span><span class='line'><span class="n">NSDictionary</span> <span class="o">*</span><span class="n">dict2</span> <span class="o">=</span> <span class="err">@</span><span class="p">{</span><span class="s">@&quot;id&quot;</span> <span class="o">:</span> <span class="s">@&quot;articleId&quot;</span><span class="p">,</span> <span class="s">@&quot;name&quot;</span> <span class="o">:</span> <span class="s">@&quot;name&quot;</span><span class="p">,</span> <span class="s">@&quot;title&quot;</span> <span class="o">:</span> <span class="s">@&quot;title&quot;</span><span class="p">};</span>
</span><span class='line'><span class="n">expect</span><span class="p">(</span><span class="n">dict</span><span class="p">).</span><span class="n">to</span><span class="p">.</span><span class="n">equal</span><span class="p">(</span><span class="n">dict2</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>

<!-- more -->

<h2>HTTP requests</h2>

<p>A lot of developers find it hard to test their <code>API</code>-classes and network-related code. Well, I&#39;ll give you some tips on it.</p>

<p>I&#39;m using <a href="https://github.com/luisobo/Nocilla">Nocilla</a> library. (<code>pod &#39;Nocilla&#39;</code>). It&#39;s a small library that can stub some network requests, and return back stuff like Headers, response code, etc. It&#39;s in active development, so if you want to refer to latest code, you should put in your <code>Podfile</code> <code>pod &#39;Nocilla&#39;, podspec: &#39;https://github.com/luisobo/Nocilla/raw/master/Nocilla.podspec&#39;</code></p>

<p>Some code samples:</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='obj-c'><span class='line'><span class="n">NSString</span> <span class="o">*</span><span class="n">data</span> <span class="o">=</span> <span class="s">@&quot;Some data here&quot;</span><span class="p">;</span>
</span><span class='line'><span class="n">stubRequest</span><span class="p">(</span><span class="s">@&quot;GET&quot;</span><span class="p">,</span> <span class="s">@&quot;http://localhost/articles&quot;</span><span class="p">).</span>
</span><span class='line'><span class="n">andReturn</span><span class="p">(</span><span class="mi">200</span><span class="p">).</span><span class="n">withHeaders</span><span class="p">(</span><span class="err">@</span><span class="p">{</span><span class="s">@&quot;Content-Type&quot;</span><span class="o">:</span> <span class="s">@&quot;application/json&quot;</span><span class="p">}).</span><span class="n">withBody</span><span class="p">(</span><span class="n">data</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>

<p>Now if you&#39;ll make a normal <code>NSURLRequest</code> to <code>http://localhost/articles</code> you&#39;ll get a response code <code>200</code>, Header <code>Content-Type: application/json</code> and, of course, your piece of data :). Oh, and don&#39;t forget to initialize and clear the stubs:</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='obj-c'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">setUp</span> <span class="p">{</span>
</span><span class='line'>    <span class="p">[[</span><span class="n">LSNocilla</span> <span class="n">sharedInstance</span><span class="p">]</span> <span class="n">start</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">tearDown</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// Clear Network stubs</span>
</span><span class='line'>    <span class="p">[[</span><span class="n">LSNocilla</span> <span class="n">sharedInstance</span><span class="p">]</span> <span class="n">clearStubs</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[[</span><span class="n">LSNocilla</span> <span class="n">sharedInstance</span><span class="p">]</span> <span class="n">stop</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<h2>Asynchronous testing</h2>

<p>Network tests have delays. yep. and you need to deal with them. And your tests need to wait for it. Same for blocks. Methods, where you need to check return values in blocks need asynchronous testing.</p>

<p>In internet, you can find a lot of examples how to do that. The one I&#39;ve used is</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<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='obj-c'><span class='line'><span class="n">dispatch_semaphore_t</span> <span class="n">semaphore</span> <span class="o">=</span> <span class="n">dispatch_semaphore_create</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'><span class="p">[</span><span class="n">Thing</span> <span class="nl">doSomethingOnSuccess:</span><span class="o">^</span><span class="p">(</span><span class="n">NSArray</span> <span class="o">*</span><span class="n">objects</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">expect</span><span class="p">(</span><span class="n">objects</span><span class="p">).</span><span class="n">toNot</span><span class="p">.</span><span class="n">beNil</span><span class="p">();</span>
</span><span class='line'>        <span class="n">dispatch_semaphore_signal</span><span class="p">(</span><span class="n">semaphore</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span> <span class="nl">failure:</span><span class="o">^</span><span class="p">(</span><span class="n">NSError</span> <span class="o">*</span><span class="n">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">dispatch_semaphore_signal</span><span class="p">(</span><span class="n">semaphore</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}];</span>
</span><span class='line'><span class="k">while</span> <span class="p">(</span><span class="n">dispatch_semaphore_wait</span><span class="p">(</span><span class="n">semaphore</span><span class="p">,</span> <span class="n">DISPATCH_TIME_NOW</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">[[</span><span class="n">NSRunLoop</span> <span class="n">currentRunLoop</span><span class="p">]</span> <span class="nl">runMode:</span><span class="n">NSDefaultRunLoopMode</span>
</span><span class='line'>                                 <span class="nl">beforeDate:</span><span class="p">[</span><span class="n">NSDate</span> <span class="nl">dateWithTimeIntervalSinceNow:</span><span class="mi">2</span><span class="p">]];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<p>Writing this once - kind of OK. But again, we can make it simpler. Personally, I&#39;ve created a small library for that. <a href="https://github.com/xslim/TKSenTestAsync">TKSenTestAsync</a>. Just add <code>pod &#39;TKSenTestAsync&#39;</code> and the code above can be re-written as</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='obj-c'><span class='line'><span class="p">[</span><span class="n">self</span> <span class="nl">runTestWithBlock:</span><span class="o">^</span><span class="p">{</span>
</span><span class='line'>        <span class="p">[</span><span class="n">Thing</span> <span class="nl">doSomethingOnSuccess:</span><span class="o">^</span><span class="p">(</span><span class="n">NSArray</span> <span class="o">*</span><span class="n">objects</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">expect</span><span class="p">(</span><span class="n">objects</span><span class="p">).</span><span class="n">toNot</span><span class="p">.</span><span class="n">beNil</span><span class="p">();</span>
</span><span class='line'>         <span class="p">[</span><span class="n">self</span> <span class="n">blockTestCompleted</span><span class="p">];</span> <span class="c1">// required</span>
</span><span class='line'>    <span class="p">}</span> <span class="nl">failure:</span><span class="o">^</span><span class="p">(</span><span class="n">NSError</span> <span class="o">*</span><span class="n">error</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">[</span><span class="n">self</span> <span class="n">blockTestCompleted</span><span class="p">];</span> <span class="c1">// required</span>
</span><span class='line'>    <span class="p">}];</span>
</span><span class='line'><span class="p">}];</span>
</span></code></pre></td></tr></table></div></figure>

<p>looks much more clear?</p>

<h2>CoreData and.. yeah, RestKit stuff</h2>

<p>Well, currently I&#39;m using <a href="https://github.com/RestKit/RestKit">RestKit</a> a lot, and a nice thing about it, that it has few nice helpers for Unit testing. </p>

<p>First of all, you need to add it&#39;s testing sub-library. Currently, due to some bug in main cocoapods <code>spec</code>, you need to write in your <code>Podfile</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">pod</span> <span class="s1">&#39;RestKit&#39;</span><span class="p">,</span> <span class="ss">podspec</span><span class="p">:</span> <span class="s1">&#39;https://github.com/RestKit/RestKit/raw/development/RestKit.podspec&#39;</span>
</span><span class='line'><span class="n">pod</span> <span class="s1">&#39;RestKit/Testing&#39;</span><span class="p">,</span> <span class="ss">podspec</span><span class="p">:</span> <span class="s1">&#39;https://github.com/RestKit/RestKit/raw/development/RestKit.podspec&#39;</span>
</span></code></pre></td></tr></table></div></figure>

<p>Now, before starting, check that you have included <code>Your.xcdatamodeld</code> in Unit tests target.</p>

<p>Setting up stuff:</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='obj-c'><span class='line'>    <span class="n">RKManagedObjectStore</span> <span class="o">*</span><span class="n">store</span> <span class="o">=</span> <span class="p">[</span><span class="n">RKTestFactory</span> <span class="n">managedObjectStore</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">RKManagedObjectStore</span> <span class="nl">setDefaultStore:</span><span class="n">store</span><span class="p">];</span>
</span></code></pre></td></tr></table></div></figure>

<p>Now I found a small bug in this step&#8230; in my case, a directory was missing in iPhone Simulator, so the above code was failing. To fix this, just run following before</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='obj-c'><span class='line'><span class="k">+</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">checkPathForCoreDataFile</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">NSString</span> <span class="o">*</span><span class="n">path</span> <span class="o">=</span> <span class="n">RKApplicationDataDirectory</span><span class="p">();</span>
</span><span class='line'>    <span class="n">NSError</span> <span class="o">*</span><span class="n">error</span> <span class="o">=</span> <span class="nb">nil</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">BOOL</span> <span class="n">isDir</span> <span class="o">=</span> <span class="n">YES</span><span class="p">;</span>
</span><span class='line'>    <span class="n">NSFileManager</span> <span class="o">*</span><span class="n">fm</span><span class="o">=</span> <span class="p">[</span><span class="n">NSFileManager</span> <span class="n">defaultManager</span><span class="p">];</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">[</span><span class="n">fm</span> <span class="nl">fileExistsAtPath:</span><span class="n">path</span> <span class="nl">isDirectory:</span><span class="o">&amp;</span><span class="n">isDir</span><span class="p">])</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">[</span><span class="n">fm</span> <span class="nl">createDirectoryAtPath:</span><span class="n">path</span> <span class="nl">withIntermediateDirectories:</span><span class="n">YES</span> <span class="nl">attributes:</span><span class="nb">nil</span> <span class="nl">error:</span><span class="o">&amp;</span><span class="n">error</span><span class="p">])</span> <span class="p">{</span>
</span><span class='line'>            <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;Error: Create folder failed&quot;</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></code></pre></td></tr></table></div></figure>

<p>Now, let&#39;s test 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>
<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>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">testCoreDataIntegration</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">RKManagedObjectStore</span> <span class="o">*</span><span class="n">managedObjectStore</span> <span class="o">=</span> <span class="p">[</span><span class="n">RKManagedObjectStore</span> <span class="n">defaultStore</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">expect</span><span class="p">(</span><span class="n">managedObjectStore</span><span class="p">).</span><span class="n">toNot</span><span class="p">.</span><span class="n">beNil</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">NSManagedObjectContext</span> <span class="o">*</span><span class="n">moc</span> <span class="o">=</span> <span class="n">managedObjectStore</span><span class="p">.</span><span class="n">persistentStoreManagedObjectContext</span><span class="p">;</span>
</span><span class='line'>    <span class="n">expect</span><span class="p">(</span><span class="n">moc</span><span class="p">).</span><span class="n">toNot</span><span class="p">.</span><span class="n">beNil</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>    <span class="n">Article</span> <span class="o">*</span><span class="n">mo</span> <span class="o">=</span> <span class="p">[</span><span class="n">RKTestFactory</span> <span class="nl">insertManagedObjectForEntityForName:</span><span class="s">@&quot;Article&quot;</span> <span class="nl">inManagedObjectContext:</span><span class="n">moc</span> <span class="nl">withProperties:</span><span class="nb">nil</span><span class="p">];</span>
</span><span class='line'>    <span class="n">mo</span><span class="p">.</span><span class="n">title</span> <span class="o">=</span> <span class="s">@&quot;SomeObject&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">[</span><span class="n">moc</span> <span class="nl">saveToPersistentStore:</span><span class="nb">NULL</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">expect</span><span class="p">(</span><span class="n">mo</span><span class="p">).</span><span class="n">toNot</span><span class="p">.</span><span class="n">beNil</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>    <span class="n">NSFetchRequest</span> <span class="o">*</span><span class="n">fetchRequest</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSFetchRequest</span> <span class="n">alloc</span><span class="p">]</span> <span class="nl">initWithEntityName:</span><span class="s">@&quot;Article&quot;</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">NSError</span> <span class="o">*</span><span class="n">error</span> <span class="o">=</span> <span class="nb">nil</span><span class="p">;</span>
</span><span class='line'>    <span class="n">NSArray</span> <span class="o">*</span><span class="n">objects</span> <span class="o">=</span> <span class="p">[</span><span class="n">moc</span> <span class="nl">executeFetchRequest:</span><span class="n">fetchRequest</span> <span class="nl">error:</span><span class="o">&amp;</span><span class="n">error</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">expect</span><span class="p">(</span><span class="n">objects</span><span class="p">).</span><span class="n">toNot</span><span class="p">.</span><span class="n">beNil</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<h2>Putting it all together</h2>

<p>I can write a lot of code here, but the easiest thing is to point you to the library I&#39;m currently developing, which includes all this tests: <a href="https://github.com/AppFellas/RKInjective">RKInjective</a></p>

<p>You should check the <code>RKInjectiveTests</code> folder contents.</p>

<p>My next article will be about testing a small game engine using <a href="https://github.com/allending/Kiwi">Kiwi</a> test framework. </p>

<h2>The end.</h2>

<p>Well, I hope you liked the stuff I covered here. I hope it can help you in your work. Please leave your comments, tweets, etc. I&#39;ll be happy.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Routes and embedded documents]]></title>
    <link href="http://kalapun.com/blog/2012/08/30/routes-and-embedded-documents/"/>
    <updated>2012-08-30T14:40:00+03:00</updated>
    <id>http://kalapun.com/blog/2012/08/30/routes-and-embedded-documents</id>
    <content type="html"><![CDATA[<p>Following my previous post <a href="http://kalapun.com/blog/2012/08/29/mongoid-custom-relation-between-embedded-documents/">Mongoid custom relation between embedded documents</a></p>

<p>Interesting how to set-up Routes and MVC for embedded documents? I&#39;ll try to tell you how I did it.</p>

<p>As I mentioned in previous post, my main document <code>Event</code> looks like</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="k">class</span> <span class="nc">Event</span>
</span><span class='line'>  <span class="c1"># cutted</span>
</span><span class='line'>  <span class="n">embeds_many</span> <span class="ss">:acts</span>
</span><span class='line'>  <span class="n">embeds_many</span> <span class="ss">:areas</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>

<!-- more -->

<h2>Routing</h2>

<p>In <code>routes.rb</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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="n">resources</span> <span class="ss">:events</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">resources</span> <span class="ss">:acts</span>
</span><span class='line'>    <span class="n">resources</span> <span class="ss">:areas</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>

<p>Now we can access the <code>Acts</code> and <code>Areas</code> with urls like <code>/events/:event_id/acts/</code>,  <code>/events/:event_id/acts/:id</code>, and same for <code>areas</code></p>

<p>To see the all the routes you can use command <code>rake routes</code> in terminal</p>

<h2>Controllers</h2>

<p>In all controllers for embedded documents, we need to have access to parent document. We can achieve this by adding <code>before_filter</code> to our controllers.</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="k">class</span> <span class="nc">ActsController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
</span><span class='line'>  <span class="n">before_filter</span> <span class="ss">:check_event!</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">check_event!</span>
</span><span class='line'>    <span class="vi">@event</span> <span class="o">=</span> <span class="no">Event</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:event_id</span><span class="o">]</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="o">!</span><span class="vi">@event</span>
</span><span class='line'>      <span class="n">redirect_to</span> <span class="n">root_path</span><span class="p">,</span> <span class="ss">:alert</span> <span class="o">=&gt;</span> <span class="s2">&quot;Event not found!&quot;</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>And also we need to change the actions to use our parent document</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">def</span> <span class="nf">index</span>
</span><span class='line'>    <span class="vi">@acts</span> <span class="o">=</span> <span class="vi">@event</span><span class="o">.</span><span class="n">acts</span><span class="o">.</span><span class="n">all</span>
</span><span class='line'>    <span class="c1"># Respond code</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">show</span>
</span><span class='line'>    <span class="vi">@act</span> <span class="o">=</span> <span class="vi">@event</span><span class="o">.</span><span class="n">acts</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:id</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>    <span class="c1"># Respond code</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>

<p>Also, we need to change the creation method, so the child document will be added to the parent</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='ruby'><span class='line'>  <span class="k">def</span> <span class="nf">create</span>
</span><span class='line'>    <span class="vi">@act</span> <span class="o">=</span> <span class="no">Act</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:act</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">respond_to</span> <span class="k">do</span> <span class="o">|</span><span class="nb">format</span><span class="o">|</span>
</span><span class='line'>      <span class="k">if</span> <span class="vi">@event</span><span class="o">.</span><span class="n">acts</span> <span class="o">&lt;&lt;</span> <span class="vi">@act</span>
</span><span class='line'>        <span class="vi">@event</span><span class="o">.</span><span class="n">save</span>
</span><span class='line'>        <span class="nb">format</span><span class="o">.</span><span class="n">html</span> <span class="p">{</span> <span class="n">redirect_to</span> <span class="o">[</span><span class="vi">@event</span><span class="p">,</span> <span class="vi">@act</span><span class="o">]</span><span class="p">,</span> <span class="n">notice</span><span class="p">:</span> <span class="s1">&#39;Act was successfully created.&#39;</span> <span class="p">}</span>
</span><span class='line'>        <span class="c1"># Other format code</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="c1"># Else code</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>

<p>Notice the adding code <code>@event.acts &lt;&lt; @act</code> and  the redirect code <code>redirect_to [@event, @act]</code></p>

<h2>Views</h2>

<p>For every <code>link_to</code> in your view, you need to add relation to <code>Event</code> document, and also some paths needs changing.</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='ruby'><span class='line'><span class="o">=</span> <span class="n">link_to</span> <span class="s1">&#39;Show&#39;</span><span class="p">,</span> <span class="o">[</span><span class="vi">@event</span><span class="p">,</span> <span class="vi">@act</span><span class="o">]</span>
</span><span class='line'><span class="o">=</span> <span class="n">link_to</span> <span class="s1">&#39;Edit&#39;</span><span class="p">,</span> <span class="n">edit_event_act_path</span><span class="p">(</span><span class="vi">@event</span><span class="p">,</span> <span class="n">act</span><span class="p">)</span>
</span><span class='line'><span class="o">=</span> <span class="n">link_to</span> <span class="s1">&#39;New Act&#39;</span><span class="p">,</span> <span class="n">new_event_act_path</span>
</span></code></pre></td></tr></table></div></figure>

<p>For forms, I&#39;m using <code>simple_form</code> gem, but basicaly the only thing you need to change is to put the <code>@event</code> there</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="o">=</span> <span class="n">simple_form_for</span><span class="p">(</span><span class="o">[</span><span class="vi">@event</span><span class="p">,</span> <span class="vi">@act</span><span class="o">]</span><span class="p">,</span> <span class="n">html</span><span class="p">:{</span><span class="n">class</span><span class="ss">:&#39;form-horizontal&#39;</span><span class="p">})</span> <span class="k">do</span> <span class="o">|</span><span class="n">f</span><span class="o">|</span>
</span><span class='line'>  <span class="c1"># inputs go here</span>
</span></code></pre></td></tr></table></div></figure>
  

<p>I hope this short post will help you getting started&#8230;</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Mongoid custom relation between embedded documents]]></title>
    <link href="http://kalapun.com/blog/2012/08/29/mongoid-custom-relation-between-embedded-documents/"/>
    <updated>2012-08-29T16:40:00+03:00</updated>
    <id>http://kalapun.com/blog/2012/08/29/mongoid-custom-relation-between-embedded-documents</id>
    <content type="html"><![CDATA[<p>Imagine we have a Mongoid document, where we have two embedded documents. And now we want to make some relation between them. What you can think of at first is to use</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_many</span> <span class="ss">:acts</span><span class="p">,</span> <span class="ss">:foreign_key</span> <span class="o">=&gt;</span> <span class="s1">&#39;event_id&#39;</span>
</span></code></pre></td></tr></table></div></figure>

<p>But that won&#39;t work. Mongoid is not capable at this moment to support this between embedded documents :(</p>

<p>But we can try to implement our own, custom relationship.</p>

<p>WARNING: This post is only my attempt to make it happen. It can contain bugs, or there can be other ways how to make it work easier. If you found some - let me know.</p>

<!-- more -->

<h2>Overview</h2>

<p>So let&#39;s say we have a main document called <code>Event</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Event</span>
</span><span class='line'>  <span class="kp">include</span> <span class="no">Mongoid</span><span class="o">::</span><span class="no">Document</span>
</span><span class='line'>  <span class="n">field</span> <span class="ss">:name</span><span class="p">,</span> <span class="n">type</span><span class="p">:</span> <span class="nb">String</span>
</span><span class='line'>  <span class="n">embeds_many</span> <span class="ss">:acts</span>
</span><span class='line'>  <span class="n">embeds_many</span> <span class="ss">:areas</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>

<p>As you see, it embeds documents <code>Act</code> and <code>Area</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Act</span>
</span><span class='line'>  <span class="kp">include</span> <span class="no">Mongoid</span><span class="o">::</span><span class="no">Document</span>
</span><span class='line'>  <span class="kp">include</span> <span class="no">Mongoid</span><span class="o">::</span><span class="no">MultiParameterAttributes</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">field</span> <span class="ss">:title</span><span class="p">,</span> <span class="n">type</span><span class="p">:</span> <span class="nb">String</span>
</span><span class='line'>  <span class="n">field</span> <span class="ss">:start_at</span><span class="p">,</span> <span class="n">type</span><span class="p">:</span> <span class="no">DateTime</span>
</span><span class='line'>  <span class="n">field</span> <span class="ss">:end_at</span><span class="p">,</span> <span class="n">type</span><span class="p">:</span> <span class="no">DateTime</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">default_scope</span> <span class="n">asc</span><span class="p">(</span><span class="ss">:start_at</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">embedded_in</span> <span class="ss">:event</span>
</span></code></pre></td></tr></table></div></figure>
  

<p>and </p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<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='ruby'><span class='line'><span class="k">class</span> <span class="nc">Area</span>
</span><span class='line'>  <span class="kp">include</span> <span class="no">Mongoid</span><span class="o">::</span><span class="no">Document</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">field</span> <span class="ss">:name</span><span class="p">,</span> <span class="n">type</span><span class="p">:</span> <span class="nb">String</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">embedded_in</span> <span class="ss">:event</span>
</span></code></pre></td></tr></table></div></figure>
  

<h2>Ralationship</h2>

<p>Let&#39;s add some custom relationship:</p>

<p>In <code>Act</code> we want to relate to one <code>Area</code>, so we need an <code>field :area_id, type: String</code> to track that. In <code>Area</code> document we will need to track array of <code>acts</code>, so we&#39;ll add <code>field :act_ids, type: Array</code></p>

<p>Now, let&#39;s add some custom relationship management to <code>Act</code> document</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="k">def</span> <span class="nf">area</span>
</span><span class='line'>    <span class="nb">self</span><span class="o">.</span><span class="n">event</span><span class="o">.</span><span class="n">areas</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="nb">self</span><span class="o">.</span><span class="n">area_id</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">area_name</span>
</span><span class='line'>    <span class="nb">self</span><span class="o">.</span><span class="n">area</span><span class="o">.</span><span class="n">name</span> <span class="k">rescue</span> <span class="kp">nil</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">area_id</span><span class="o">=</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">act_id</span> <span class="o">=</span> <span class="nb">self</span><span class="o">.</span><span class="n">id</span><span class="o">.</span><span class="n">to_s</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">area</span> <span class="o">=</span> <span class="nb">self</span><span class="o">.</span><span class="n">area</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">area</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>      <span class="n">area</span> <span class="o">=</span> <span class="n">find_area_by_id</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="k">super</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">if</span> <span class="n">area</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">blank?</span>
</span><span class='line'>      <span class="n">area</span><span class="o">.</span><span class="n">pull</span><span class="p">(</span><span class="ss">:act_ids</span><span class="p">,</span> <span class="n">act_id</span><span class="p">)</span> <span class="c1"># remove old one        </span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>      <span class="n">area</span><span class="o">.</span><span class="n">pull</span><span class="p">(</span><span class="ss">:act_ids</span><span class="p">,</span> <span class="n">act_id</span><span class="p">)</span>
</span><span class='line'>      <span class="n">area</span> <span class="o">=</span> <span class="n">find_area_by_id</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span class='line'>      <span class="n">area</span><span class="o">.</span><span class="n">add_to_set</span><span class="p">(</span><span class="ss">:act_ids</span><span class="p">,</span> <span class="n">act_id</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">super</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">find_area_by_id</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">self</span><span class="o">.</span><span class="n">event</span><span class="o">.</span><span class="n">areas</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">#around_destroy</span>
</span><span class='line'>  <span class="n">before_destroy</span> <span class="k">do</span> <span class="o">|</span><span class="n">document</span><span class="o">|</span>
</span><span class='line'>    <span class="c1">#Handle callback here.</span>
</span><span class='line'>    <span class="n">area</span> <span class="o">=</span> <span class="nb">self</span><span class="o">.</span><span class="n">area</span>
</span><span class='line'>    <span class="n">area</span><span class="o">.</span><span class="n">pull</span><span class="p">(</span><span class="ss">:act_ids</span><span class="p">,</span> <span class="nb">self</span><span class="o">.</span><span class="n">id</span><span class="o">.</span><span class="n">to_s</span><span class="p">)</span> <span class="k">if</span> <span class="n">area</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>

<p>And for <code>Area</code></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="k">def</span> <span class="nf">act_ids</span><span class="o">=</span><span class="p">(</span><span class="n">values</span><span class="p">)</span>
</span><span class='line'>    <span class="n">values</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">old_values</span> <span class="o">=</span> <span class="nb">self</span><span class="o">.</span><span class="n">act_ids</span> <span class="o">||</span> <span class="o">[]</span>
</span><span class='line'>    <span class="n">old_values</span> <span class="o">=</span> <span class="n">old_values</span> <span class="o">-</span> <span class="n">values</span>
</span><span class='line'>    <span class="n">old_values</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">act_id</span><span class="o">|</span>
</span><span class='line'>      <span class="n">act</span> <span class="o">=</span> <span class="n">find_act_with_id</span><span class="p">(</span><span class="n">act_id</span><span class="p">)</span>
</span><span class='line'>      <span class="n">act</span><span class="o">.</span><span class="n">unset</span><span class="p">(</span><span class="ss">:area_id</span><span class="p">)</span> <span class="k">if</span> <span class="n">act</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">new_values</span> <span class="o">=</span> <span class="p">(</span><span class="n">values</span> <span class="o">-</span> <span class="n">old_values</span><span class="p">)</span> <span class="o">||</span> <span class="o">[]</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">new_values</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">act_id</span><span class="o">|</span>
</span><span class='line'>      <span class="n">act</span> <span class="o">=</span> <span class="n">find_act_with_id</span><span class="p">(</span><span class="n">act_id</span><span class="p">)</span>
</span><span class='line'>      <span class="k">if</span> <span class="n">act</span>
</span><span class='line'>        <span class="k">if</span> <span class="o">!</span><span class="n">act</span><span class="o">.</span><span class="n">area_id</span><span class="o">.</span><span class="n">blank?</span>
</span><span class='line'>          <span class="nb">self</span><span class="o">.</span><span class="n">event</span><span class="o">.</span><span class="n">areas</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">act</span><span class="o">.</span><span class="n">area_id</span><span class="p">)</span><span class="o">.</span><span class="n">pull</span><span class="p">(</span><span class="ss">:act_ids</span><span class="p">,</span> <span class="n">act_id</span><span class="p">)</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>        <span class="n">act</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="ss">:area_id</span><span class="p">,</span> <span class="nb">self</span><span class="o">.</span><span class="n">id</span><span class="o">.</span><span class="n">to_s</span><span class="p">)</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>    <span class="k">super</span><span class="p">(</span><span class="n">values</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">find_act_with_id</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">self</span><span class="o">.</span><span class="n">event</span><span class="o">.</span><span class="n">acts</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">rescue</span> <span class="kp">nil</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">acts</span>
</span><span class='line'>    <span class="nb">self</span><span class="o">.</span><span class="n">event</span><span class="o">.</span><span class="n">acts</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="nb">self</span><span class="o">.</span><span class="n">act_ids</span> <span class="o">||</span> <span class="o">[]</span><span class="p">)</span> <span class="k">rescue</span> <span class="o">[]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">acts</span><span class="o">=</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">self</span><span class="o">.</span><span class="n">act_ids</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">map</span><span class="p">(</span><span class="o">&amp;</span><span class="ss">:id</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">before_destroy</span> <span class="k">do</span> <span class="o">|</span><span class="n">document</span><span class="o">|</span>
</span><span class='line'>    <span class="c1">#Handle callback here.</span>
</span><span class='line'>    <span class="nb">self</span><span class="o">.</span><span class="n">act_ids</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">act_id</span><span class="o">|</span>
</span><span class='line'>      <span class="n">act</span> <span class="o">=</span> <span class="n">find_act_with_id</span><span class="p">(</span><span class="n">act_id</span><span class="p">)</span>
</span><span class='line'>      <span class="n">act</span><span class="o">.</span><span class="n">unset</span><span class="p">(</span><span class="ss">:area_id</span><span class="p">)</span> <span class="k">if</span> <span class="n">act</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>Again, this post is just my attempt to make it work. If you have any comments how to improve this - let me know</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Userscripts and Apple dev site]]></title>
    <link href="http://kalapun.com/blog/2012/07/13/userscripts-and-apple-dev-site/"/>
    <updated>2012-07-13T11:34:00+03:00</updated>
    <id>http://kalapun.com/blog/2012/07/13/userscripts-and-apple-dev-site</id>
    <content type="html"><![CDATA[<p>If you are a pro developer for Apple stuff (ios, mac), you may have a situation, when you are in different teams, and sometimes, the team name can be same. For example, there can be a team <em>Company</em> for AppStore and team <em>Company</em> for Enterprise. So I was bored gessing which one to choose and decided to make a <em>Greesemonkey</em> script for that.</p>

<p><img src="http://kalapun.com/images/2012-07-13/team_select.png" alt=""></p>

<!-- more -->

<h2>Usage</h2>

<p>If you are using Safari, install small extension NinjaKit, for adding support of greesemonkey scripts</p>

<ul>
<li><a href="https://github.com/os0x/NinjaKit">https://github.com/os0x/NinjaKit</a></li>
</ul>

<p>Now point your browser to my script on userscripts.org and install it</p>

<ul>
<li><a href="http://userscripts.org/scripts/show/138339">http://userscripts.org/scripts/show/138339</a></li>
</ul>

<h2>The Code</h2>

<p>Well, if you wanna know the code behind the script, here you go:</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='javascript'><span class='line'><span class="c1">// ==UserScript==</span>
</span><span class='line'><span class="c1">// @name        Apple Developer Team select Rename</span>
</span><span class='line'><span class="c1">// @description Changes Team name by adding Team ID</span>
</span><span class='line'><span class="c1">// @author      Taras Kalapun &lt;t.kalapun@gmail.com&gt;</span>
</span><span class='line'><span class="c1">// @include     http*://developer.apple.com/devcenter/selectTeam*</span>
</span><span class='line'><span class="c1">// ==/UserScript==</span>
</span><span class='line'><span class="nx">teams</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="s2">&quot;teams&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="nx">i</span><span class="o">&lt;</span><span class="nx">teams</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">){</span>
</span><span class='line'>  <span class="nx">teams</span><span class="p">.</span><span class="nx">options</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">text</span> <span class="o">=</span> <span class="nx">teams</span><span class="p">.</span><span class="nx">options</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">text</span><span class="o">+</span><span class="s2">&quot; (&quot;</span><span class="o">+</span><span class="nx">teams</span><span class="p">.</span><span class="nx">options</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">value</span><span class="o">+</span><span class="s2">&quot;)&quot;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Generating API docs from RSpec tests]]></title>
    <link href="http://kalapun.com/blog/2012/06/01/generating-api-docs-from-rspec-tests/"/>
    <updated>2012-06-01T14:32:00+03:00</updated>
    <id>http://kalapun.com/blog/2012/06/01/generating-api-docs-from-rspec-tests</id>
    <content type="html"><![CDATA[<p>In this small post I&#39;ll show how I use RSpec to test and generate docs for my API.</p>

<p>Full documentation for the gem and it&#39;s DSL you can find on it&#39;s homepage <a href="http://github.com/zipmark/rspec_api_documentation">rspec_api_documentation</a></p>

<p>First of all, you will need nice gem <code>rspec_api_documentation</code>, so edit your <code>Gemfile</code> and add
<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">gem</span> <span class="s1">&#39;rspec_api_documentation&#39;</span><span class="p">,</span> <span class="ss">:group</span> <span class="o">=&gt;</span> <span class="o">[</span><span class="ss">:test</span><span class="p">,</span> <span class="ss">:development</span><span class="o">]</span><span class="p">,</span> <span class="ss">:git</span> <span class="o">=&gt;</span> <span class="s2">&quot;git://github.com/zipmark/rspec_api_documentation.git&quot;</span>
</span></code></pre></td></tr></table></div></figure> </p>

<!-- more -->

<h2>Rake helper task</h2>

<p>Before we proceed, Let&#39;s create rake task for testing API without generation <code>lib/tasks/spec_api.rake</code>
<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="nb">require</span> <span class="s1">&#39;rspec/core/rake_task&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">desc</span> <span class="s1">&#39;Run API specs test in spec/acceptance&#39;</span>
</span><span class='line'>  <span class="no">RSpec</span><span class="o">::</span><span class="no">Core</span><span class="o">::</span><span class="no">RakeTask</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s1">&#39;spec:api&#39;</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">t</span><span class="o">|</span>
</span><span class='line'>  <span class="n">t</span><span class="o">.</span><span class="n">pattern</span> <span class="o">=</span> <span class="s1">&#39;spec/acceptance/**/*_spec.rb&#39;</span>
</span><span class='line'>  <span class="c1">#t.rspec_opts = [&quot;--format RspecApiDocumentation::ApiFormatter&quot;]</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure></p>

<p>Now if we will run <code>rake spec:api</code> it will run tests in files <code>spec/acceptance/*_spec.rb</code> for testing API without generationg docs. So don&#39;t forget to create that folder.</p>

<h2>Spec helper &amp; override</h2>

<p>Also, I create <code>spec/api_helper.rb</code> that contains some helpers for my tests.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">prefill_db_for_api</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;Creating DB data&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Some factory_girl DB prefilling</span>
</span><span class='line'>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Overrides for customizing API docs generator</span>
</span><span class='line'>
</span><span class='line'><span class="k">module</span> <span class="nn">RspecApiDocumentation</span>
</span><span class='line'>  <span class="k">class</span> <span class="nc">RackTestClient</span> <span class="o">&lt;</span> <span class="no">ClientBase</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">request_headers</span>
</span><span class='line'>      <span class="n">my_headers</span> <span class="o">=</span> <span class="n">env_to_headers</span><span class="p">(</span><span class="n">last_request</span><span class="o">.</span><span class="n">env</span><span class="p">)</span>
</span><span class='line'>      <span class="n">my_headers</span><span class="o">.</span><span class="n">reject!</span> <span class="p">{</span><span class="o">|</span><span class="n">k</span><span class="p">,</span><span class="n">v</span><span class="o">|</span> <span class="n">v</span><span class="o">.</span><span class="n">empty?</span><span class="p">}</span>
</span><span class='line'>      <span class="n">my_headers</span><span class="o">.</span><span class="n">reject!</span> <span class="p">{</span><span class="o">|</span><span class="n">k</span><span class="p">,</span><span class="n">v</span><span class="o">|</span> <span class="p">(</span><span class="n">v</span> <span class="o">==</span> <span class="s1">&#39;example.org&#39;</span><span class="p">)}</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">alias_method</span> <span class="ss">:old_do_request</span><span class="p">,</span> <span class="ss">:do_request</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">do_request</span><span class="p">(</span><span class="nb">method</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span>
</span><span class='line'>      <span class="n">old_do_request</span><span class="p">(</span><span class="nb">method</span><span class="p">,</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="vg">$base_url</span><span class="si">}#{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">class</span> <span class="nc">Curl</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">url</span>
</span><span class='line'>      <span class="s2">&quot;</span><span class="si">#{</span><span class="n">host</span><span class="si">}#{</span><span class="vg">$base_url</span><span class="si">}#{</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>

<h2>Spec API test Example</h2>

<p>I&#39;ll show you a sample test file 
<code>spec/acceptance/business_spec.rb</code></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;spec_helper&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;api_helper&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;rspec_api_documentation/dsl&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">resource</span> <span class="s2">&quot;Business v1.1&quot;</span> <span class="k">do</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">before</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">prefill_db_for_api</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="vg">$base_url</span> <span class="o">=</span> <span class="s1">&#39;/api/v1_1&#39;</span>
</span><span class='line'>  <span class="n">let</span><span class="p">(</span><span class="ss">:client</span><span class="p">)</span> <span class="p">{</span> <span class="no">RspecApiDocumentation</span><span class="o">::</span><span class="no">RackTestClient</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="nb">self</span><span class="p">,</span> <span class="ss">:headers</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="s2">&quot;HTTP_ACCEPT&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;application/json&quot;</span> <span class="p">})</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">post</span> <span class="s2">&quot;/login&quot;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">parameter</span> <span class="ss">:email</span><span class="p">,</span> <span class="s2">&quot;Employee email&quot;</span><span class="p">,</span> <span class="ss">:required</span> <span class="o">=&gt;</span> <span class="kp">true</span>
</span><span class='line'>    <span class="n">parameter</span> <span class="ss">:password</span><span class="p">,</span> <span class="s2">&quot;Employee password&quot;</span><span class="p">,</span> <span class="ss">:required</span> <span class="o">=&gt;</span> <span class="kp">true</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">let</span><span class="p">(</span><span class="ss">:email</span><span class="p">)</span> <span class="p">{</span> <span class="no">Employee</span><span class="o">.</span><span class="n">first</span><span class="o">.</span><span class="n">email</span> <span class="p">}</span>
</span><span class='line'>    <span class="n">let</span><span class="p">(</span><span class="ss">:password</span><span class="p">)</span> <span class="p">{</span> <span class="s1">&#39;test22&#39;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">scope_parameters</span> <span class="ss">:employee</span><span class="p">,</span> <span class="ss">:all</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">example</span> <span class="s2">&quot;Authenticate with login and password&quot;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">do_request</span>
</span><span class='line'>      <span class="c1">#puts &#39;login resp &#39; + response_body.inspect</span>
</span><span class='line'>      <span class="n">status</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="mi">200</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">employee</span> <span class="o">=</span> <span class="no">Employee</span><span class="o">.</span><span class="n">first</span>
</span><span class='line'>      <span class="n">item</span> <span class="o">=</span> <span class="no">JSON</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">response_body</span><span class="p">)</span>
</span><span class='line'>      <span class="n">item</span><span class="o">[</span><span class="s2">&quot;authentication_token&quot;</span><span class="o">].</span><span class="n">should_not</span> <span class="n">be_empty</span>
</span><span class='line'>      <span class="n">item</span><span class="o">[</span><span class="s2">&quot;authentication_token&quot;</span><span class="o">].</span><span class="n">should</span> <span class="n">eq</span><span class="p">(</span><span class="n">employee</span><span class="o">.</span><span class="n">authentication_token</span><span class="p">)</span>
</span><span class='line'>      <span class="n">item</span><span class="o">[</span><span class="s2">&quot;email&quot;</span><span class="o">]</span> <span class="o">==</span> <span class="n">employee</span><span class="o">.</span><span class="n">email</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">get</span> <span class="s2">&quot;/products&quot;</span> <span class="k">do</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1"># Explictly pre-set authentication_token</span>
</span><span class='line'>    <span class="n">let</span><span class="p">(</span><span class="ss">:authentication_token</span><span class="p">)</span> <span class="p">{</span> <span class="no">Employee</span><span class="o">.</span><span class="n">first</span><span class="o">.</span><span class="n">authentication_token</span> <span class="p">}</span>
</span><span class='line'>    <span class="n">let</span><span class="p">(</span><span class="ss">:client</span><span class="p">)</span> <span class="p">{</span> <span class="no">RspecApiDocumentation</span><span class="o">::</span><span class="no">RackTestClient</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="nb">self</span><span class="p">,</span> <span class="ss">:headers</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="s2">&quot;HTTP_ACCEPT&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="s1">&#39;HTTP_X_RABATME_AUTH_TOKEN&#39;</span> <span class="o">=&gt;</span> <span class="n">authentication_token</span> <span class="p">})</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">example</span> <span class="s2">&quot;Load products for current shop&quot;</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">explanation</span> <span class="s2">&quot;Products that are only available for this shop. Model: ShopProduct&quot;</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">do_request</span>
</span><span class='line'>      <span class="n">status</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="mi">200</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">product</span> <span class="o">=</span> <span class="no">ShopProduct</span><span class="o">.</span><span class="n">first</span>
</span><span class='line'>      <span class="n">items</span> <span class="o">=</span> <span class="no">JSON</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">response_body</span><span class="p">)</span>
</span><span class='line'>      <span class="nb">puts</span> <span class="n">items</span><span class="o">.</span><span class="n">inspect</span>
</span><span class='line'>      <span class="n">item</span> <span class="o">=</span> <span class="n">items</span><span class="o">.</span><span class="n">first</span>
</span><span class='line'>      <span class="n">item</span><span class="o">[</span><span class="s2">&quot;id&quot;</span><span class="o">].</span><span class="n">should_not</span> <span class="n">be_empty</span>
</span><span class='line'>      <span class="n">item</span><span class="o">[</span><span class="s2">&quot;id&quot;</span><span class="o">].</span><span class="n">should</span> <span class="n">eq</span><span class="p">(</span><span class="n">product</span><span class="o">.</span><span class="n">_id</span><span class="o">.</span><span class="n">to_s</span><span class="p">)</span>
</span><span class='line'>      <span class="n">item</span><span class="o">[</span><span class="s2">&quot;points&quot;</span><span class="o">].</span><span class="n">should</span> <span class="n">eq</span><span class="p">(</span><span class="n">product</span><span class="o">.</span><span class="n">points</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>

<p>Now when you will run <code>rake docs:generate</code> it will run tests &amp; generate API docs for you. If you wont only to run tests - you do <code>rake spec:api</code></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fixing TextMate2 TODO bundle]]></title>
    <link href="http://kalapun.com/blog/2012/05/25/fixing-textmate2-todo-bundle/"/>
    <updated>2012-05-25T13:59:00+03:00</updated>
    <id>http://kalapun.com/blog/2012/05/25/fixing-textmate2-todo-bundle</id>
    <content type="html"><![CDATA[<p>Having problems looking your TODO list in TextMate2? Run this script to have a fix.</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='sh'><span class='line'><span class="nb">cd</span> ~/Library/Application<span class="se">\ </span>Support/TextMate/Managed/Bundles/TODO.tmbundle/Support/lib <span class="o">&amp;&amp;</span> rm -rf settings.rb <span class="o">&amp;&amp;</span> curl -O http://ebundles.googlecode.com/svn-history/r216/trunk/Bundles/TODO.tmbundle/Support/lib/settings.rb
</span></code></pre></td></tr></table></div></figure>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How I RestKit]]></title>
    <link href="http://kalapun.com/blog/2012/05/17/how-i-restkit/"/>
    <updated>2012-05-17T13:28:00+03:00</updated>
    <id>http://kalapun.com/blog/2012/05/17/how-i-restkit</id>
    <content type="html"><![CDATA[<p>In this short post I&#39;ll show how I use <a href="http://restkit.org">RestKit</a> library in my iOS projects.</p>

<p>First of all, I want to say that for managing all my libraries in iOS projects I use <a href="http://cocoapods.org">CocoaPods</a> (kind of Gemfile bundler, but for iOS), which I strongly recommend using.</p>

<p>So, RestKit&#8230; open up your <code>Podfile</code> and add
<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="n">dependency</span> <span class="s1">&#39;RestKit/Network&#39;</span>
</span><span class='line'><span class="n">dependency</span> <span class="s1">&#39;RestKit/UI&#39;</span>
</span><span class='line'><span class="n">dependency</span> <span class="s1">&#39;RestKit/ObjectMapping&#39;</span>
</span><span class='line'><span class="n">dependency</span> <span class="s1">&#39;RestKit/ObjectMapping/CoreData&#39;</span>
</span><span class='line'><span class="n">dependency</span> <span class="s1">&#39;RestKit/ObjectMapping/JSON&#39;</span>
</span></code></pre></td></tr></table></div></figure></p>

<p>I also use <a href="https://github.com/farcaller/Injective">Injective</a> dependency a lot, so I add <code>dependency &#39;Injective&#39;</code> to my Podfile
&lt;!&#8211; more &#8211;&gt;</p>

<p>Next, run <code>pod install</code> which will download latest RestKit (In my case - version <code>0.10.0</code>) and integrate it to your project.</p>

<h2>The code</h2>

<p>Examples I&#39;ll provide will use <code>RM</code> class prefix, and API I&#39;ll refer is from my start-up <code>rabat.me</code>. First I&#39;ll write examples without data persistancy, than I&#39;ll provide examples how to use CoreData. Also, I add <code>#import &lt;RestKit/RestKit.h&gt;</code> and <code>#import &quot;IJContext.h&quot;</code> to my <code>App-Prefix.pch</code></p>

<p>You can find full source code of the project on GitHub <a href="https://github.com/xslim/RabatMe">https://github.com/xslim/RabatMe</a></p>

<h2>Initialization</h2>

<p>For initializing Injective library, edit your <code>AppDelegate.m</code>
<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='obj-c'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">BOOL</span><span class="p">)</span><span class="nf">application:</span><span class="p">(</span><span class="n">UIApplication</span> <span class="o"><em></span><span class="p">)</span><span class="nv">application</span> <span class="nf">didFinishLaunchingWithOptions:</span><span class="p">(</span><span class="n">NSDictionary</span> <span class="o"></em></span><span class="p">)</span><span class="nv">launchOptions</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="p">[</span><span class="n">IJContext</span> <span class="nl">setDefaultContext:</span><span class="p">[[</span><span class="n">IJContext</span> <span class="n">alloc</span><span class="p">]</span> <span class="n">init</span><span class="p">]];</span>
</span></code></pre></td></tr></table></div></figure></p>

<p>What I also like doing, is initializing RestKit-s logging, so I can use it in my app and changing verbocity level from enviroment variables.
<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='obj-c'><span class='line'><span class="c1">// This goes to application:didFinishLaunchingWithOptions:</span>
</span><span class='line'><span class="n">RKLogInitialize</span><span class="p">();</span>
</span><span class='line'><span class="n">RKLogConfigureFromEnvironment</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure></p>

<p>Create class <code>RMApiConnector</code> which we will use for all our RestKit bootstrapping and network connections.
<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>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="n">NSString</span> <span class="o"><em></span> <span class="k">const</span> <span class="n">RMErrorDomain</span> <span class="o">=</span> <span class="s">@&quot;org.API.ErrorDomain&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@interface</span> <span class="nc">RMApiConnector</span> <span class="p">()</span>
</span><span class='line'><span class="o">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nl">fireErrorBlock:</span><span class="p">(</span><span class="n">RKRequestDidFailLoadWithErrorBlock</span><span class="p">)</span><span class="n">failBlock</span> <span class="nl">onErrorInResponse:</span><span class="p">(</span><span class="n">RKResponse</span> <span class="o"></em></span><span class="p">)</span><span class="n">response</span><span class="p">;</span>
</span><span class='line'><span class="k">@end</span>
</span><span class='line'>
</span><span class='line'><span class="k">@implementation</span> <span class="nc">RMApiConnector</span>
</span><span class='line'>
</span><span class='line'><span class="n">injective_register_singleton</span><span class="p">(</span><span class="n">RMApiConnector</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="o">-</span> <span class="p">(</span><span class="kt">id</span><span class="p">)</span><span class="n">init</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">self</span> <span class="o">=</span> <span class="p">[</span><span class="n">super</span> <span class="n">init</span><span class="p">];</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">[</span><span class="n">self</span> <span class="n">setupConnector</span><span class="p">];</span>
</span><span class='line'>        <span class="p">[</span><span class="n">self</span> <span class="n">setupMapping</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">self</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></p>

<p><code>injective_register_singleton</code> will add RMApiConnector to singleton collection on DI, so we will be able to access it like 
<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='obj-c'><span class='line'><span class="n">RMApiConnector</span> <span class="o">*</span><span class="n">connector</span> <span class="o">=</span> <span class="p">[</span><span class="n">RMApiConnector</span> <span class="n">injectiveInstantiate</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure></p>

<h2>Setting up Object Loader</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<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>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">setupConnector</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">NSString</span> <span class="o">*</span><span class="n">baseUrl</span> <span class="o">=</span> <span class="s">@&quot;http://example.org/api/&quot;</span>
</span><span class='line'>    <span class="n">RKObjectManager</span> <span class="o">*</span><span class="n">manager</span> <span class="o">=</span> <span class="p">[</span><span class="n">RKObjectManager</span> <span class="n">sharedManager</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">manager</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">manager</span> <span class="o">=</span> <span class="p">[</span><span class="n">RKObjectManager</span> <span class="nl">objectManagerWithBaseURL:</span><span class="p">[</span><span class="n">RKURL</span> <span class="nl">URLWithString:</span><span class="n">baseUrl</span><span class="p">]];</span>
</span><span class='line'>        <span class="n">manager</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">serviceUnavailableAlertEnabled</span> <span class="o">=</span> <span class="n">YES</span><span class="p">;</span>
</span><span class='line'>        <span class="n">manager</span><span class="p">.</span><span class="n">requestQueue</span><span class="p">.</span><span class="n">showsNetworkActivityIndicatorWhenBusy</span> <span class="o">=</span> <span class="n">YES</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">manager</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">baseURL</span> <span class="o">=</span> <span class="p">[</span><span class="n">RKURL</span> <span class="nl">URLWithString:</span><span class="n">baseUrl</span><span class="p">];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<h2>Setting up Object Mapping</h2>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<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>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">setupMapping</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">RKObjectMappingProvider</span> <span class="o">*</span><span class="n">omp</span> <span class="o">=</span> <span class="p">[</span><span class="n">RKObjectManager</span> <span class="n">sharedManager</span><span class="p">].</span><span class="n">mappingProvider</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">RKObjectMapping</span> <span class="o">*</span><span class="n">productMapping</span> <span class="o">=</span> <span class="p">[</span><span class="n">RMProduct</span> <span class="n">mapping</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">omp</span> <span class="nl">addObjectMapping:</span><span class="n">productMapping</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">omp</span> <span class="nl">setObjectMapping:</span><span class="n">productMapping</span> <span class="nl">forResourcePathPattern:</span><span class="s">@&quot;/products&quot;</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">RKObjectMapping</span> <span class="o">*</span><span class="n">shopMapping</span> <span class="o">=</span> <span class="p">[</span><span class="n">RMShop</span> <span class="n">mapping</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">omp</span> <span class="nl">addObjectMapping:</span><span class="n">shopMapping</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">omp</span> <span class="nl">setObjectMapping:</span><span class="n">shopMapping</span> <span class="nl">forResourcePathPattern:</span><span class="s">@&quot;/shops/:id&quot;</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">omp</span> <span class="nl">setObjectMapping:</span><span class="n">shopMapping</span> <span class="nl">forResourcePathPattern:</span><span class="s">@&quot;/shops/near/:lat/:lng/:radius&quot;</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<p>The mapping itself I store with Models like
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="k">@class</span> <span class="nc">RKObjectMapping</span>;
</span><span class='line'>
</span><span class='line'><span class="k">@interface</span> <span class="nc">RMShop</span> : <span class="nc">NSObject</span>
</span><span class='line'>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">)</span> <span class="n">NSString</span> <span class="o"><em></span><span class="n">itemId</span><span class="p">;</span>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">)</span> <span class="n">NSNumber</span> <span class="o"></em></span><span class="n">points</span><span class="p">;</span>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">)</span> <span class="n">NSString</span> <span class="o"><em></span><span class="n">name</span><span class="p">;</span>
</span><span class='line'><span class="c1">// Some other properties</span>
</span><span class='line'>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">)</span> <span class="n">NSArray</span> <span class="o"></em></span><span class="n">products</span><span class="p">;</span>
</span><span class='line'><span class="k">@property</span> <span class="p">(</span><span class="n">nonatomic</span><span class="p">,</span> <span class="n">strong</span><span class="p">)</span> <span class="n">NSArray</span> <span class="o"><em></span><span class="n">rewards</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">+</span> <span class="p">(</span><span class="n">RKObjectMapping</span> <span class="o"></em></span><span class="p">)</span><span class="nf">mapping</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure></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='obj-c'><span class='line'><span class="k">@implementation</span> <span class="nc">RMShop</span>
</span><span class='line'>
</span><span class='line'><span class="k">@synthesize</span> <span class="n">itemId</span><span class="p">,</span> <span class="n">points</span><span class="p">;</span> <span class="c1">// and others</span>
</span><span class='line'>
</span><span class='line'><span class="k">+</span> <span class="p">(</span><span class="n">RKObjectMapping</span> <span class="o">*</span><span class="p">)</span><span class="nf">mapping</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">RKObjectMapping</span> <span class="o">*</span><span class="n">objectMapping</span> <span class="o">=</span> <span class="p">[</span><span class="n">RKObjectMapping</span> <span class="nl">mappingForClass:</span><span class="p">[</span><span class="n">self</span> <span class="n">class</span><span class="p">]</span> <span class="nl">usingBlock:</span><span class="o">^</span><span class="p">(</span><span class="n">RKObjectMapping</span> <span class="o">*</span><span class="n">mapping</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="p">[</span><span class="n">mapping</span> <span class="nl">mapAttributes:</span><span class="s">@&quot;name&quot;</span><span class="p">,</span> <span class="s">@&quot;address&quot;</span><span class="p">,</span> <span class="s">@&quot;distance&quot;</span><span class="p">,</span> <span class="s">@&quot;location&quot;</span><span class="p">,</span> <span class="s">@&quot;points&quot;</span><span class="p">,</span> <span class="nb">nil</span><span class="p">];</span>
</span><span class='line'>        <span class="p">[</span><span class="n">mapping</span> <span class="nl">mapKeyPathsToAttributes:</span>
</span><span class='line'>         <span class="s">@&quot;id&quot;</span><span class="p">,</span> <span class="s">@&quot;itemId&quot;</span><span class="p">,</span>
</span><span class='line'>         <span class="s">@&quot;description&quot;</span><span class="p">,</span> <span class="s">@&quot;descriptionText&quot;</span><span class="p">,</span>
</span><span class='line'>         <span class="s">@&quot;distance_unit&quot;</span><span class="p">,</span> <span class="s">@&quot;distanceUnit&quot;</span><span class="p">,</span>
</span><span class='line'>         <span class="nb">nil</span><span class="p">];</span>
</span><span class='line'>    <span class="p">}];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">objectMapping</span> <span class="nl">hasMany:</span><span class="s">@&quot;products&quot;</span> <span class="nl">withMapping:</span><span class="p">[</span><span class="n">RMProduct</span> <span class="n">mapping</span><span class="p">]];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">objectMapping</span> <span class="nl">hasMany:</span><span class="s">@&quot;rewards&quot;</span> <span class="nl">withMapping:</span><span class="p">[</span><span class="n">RMReward</span> <span class="n">mapping</span><span class="p">]];</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">objectMapping</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">@end</span>
</span></code></pre></td></tr></table></div></figure>

<h2>Creating API requests</h2>

<p>Let&#39;s create few requests
<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>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">loadNearbyShopsForLocation:</span><span class="p">(</span><span class="n">CLLocation</span> <span class="o"><em></span><span class="p">)</span><span class="nv">location</span> <span class="nf">onLoad:</span><span class="p">(</span><span class="n">RKObjectLoaderDidLoadObjectsBlock</span><span class="p">)</span><span class="nv">loadBlock</span> <span class="nf">onError:</span><span class="p">(</span><span class="n">RKRequestDidFailLoadWithErrorBlock</span><span class="p">)</span><span class="nv">failBlock</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">NSString</span> <span class="o"></em></span><span class="n">params</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSDictionary</span> <span class="nl">dictionaryWithKeysAndObjects:</span>
</span><span class='line'>                        <span class="s">@&quot;lat&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">NSNumber</span> <span class="nl">numberWithDouble:</span><span class="n">location</span><span class="p">.</span><span class="n">coordinate</span><span class="p">.</span><span class="n">latitude</span><span class="p">],</span>
</span><span class='line'>                        <span class="s">@&quot;lng&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">NSNumber</span> <span class="nl">numberWithDouble:</span><span class="n">location</span><span class="p">.</span><span class="n">coordinate</span><span class="p">.</span><span class="n">longitude</span><span class="p">],</span>
</span><span class='line'>                        <span class="s">@&quot;radius&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">NSNumber</span> <span class="nl">numberWithInt:</span><span class="mi">20</span><span class="p">],</span> <span class="c1">// later change this to accuracy</span>
</span><span class='line'>                        <span class="nb">nil</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">NSString</span> <span class="o"><em></span><span class="n">url</span> <span class="o">=</span> <span class="p">[</span><span class="s">@&quot;/shops/near/:lat/:lng/:radius&quot;</span> <span class="nl">interpolateWithObject:</span><span class="n">params</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">RKObjectManager</span> <span class="o"></em></span><span class="n">manager</span> <span class="o">=</span> <span class="p">[</span><span class="n">RKObjectManager</span> <span class="n">sharedManager</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">manager</span> <span class="nl">loadObjectsAtResourcePath:</span><span class="n">url</span> <span class="nl">usingBlock:</span><span class="o"><sup></span>&lt;span</sup> class=&quot;p&quot;&gt;(</span><span class="n">RKObjectLoader</span> <span class="o"><em></span><span class="n">loader</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">loader</span><span class="p">.</span><span class="n">onDidLoadObjects</span> <span class="o">=</span> <span class="n">loadBlock</span><span class="p">;</span>
</span><span class='line'>        <span class="n">loader</span><span class="p">.</span><span class="n">onDidFailWithError</span> <span class="o">=</span> <span class="n">failBlock</span><span class="p">;</span>
</span><span class='line'>        <span class="n">loader</span><span class="p">.</span><span class="n">onDidFailLoadWithError</span> <span class="o">=</span> <span class="n">failBlock</span><span class="p">;</span>
</span><span class='line'>        <span class="n">loader</span><span class="p">.</span><span class="n">onDidLoadResponse</span> <span class="o">=</span> <span class="o"><sup></span>&lt;span</sup> class=&quot;p&quot;&gt;(</span><span class="n">RKResponse</span> <span class="o"></em></span><span class="n">response</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="p">[</span><span class="n">self</span> <span class="nl">fireErrorBlock:</span><span class="n">failBlock</span> <span class="nl">onErrorInResponse:</span><span class="n">response</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></code></pre></td></tr></table></div></figure>
What we can see here, is that I&#39;m using block-based API of RestKit. <code>loadBlock</code> will get array of loaded objects. <code>failBlock</code> will get <code>NSError</code> object on error. Also I&#39;m using <code>fireErrorBlock:onErrorInResponse:</code> helper to get error message from my API</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">fireErrorBlock:</span><span class="p">(</span><span class="n">RKRequestDidFailLoadWithErrorBlock</span><span class="p">)</span><span class="nv">failBlock</span> <span class="nf">onErrorInResponse:</span><span class="p">(</span><span class="n">RKResponse</span> <span class="o">*</span><span class="p">)</span><span class="nv">response</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">[</span><span class="n">response</span> <span class="n">isOK</span><span class="p">])</span> <span class="p">{</span>
</span><span class='line'>        <span class="kt">id</span> <span class="n">parsedResponse</span> <span class="o">=</span> <span class="p">[</span><span class="n">response</span> <span class="nl">parsedBody:</span><span class="nb">NULL</span><span class="p">];</span>
</span><span class='line'>        <span class="n">NSString</span> <span class="o">*</span><span class="n">errorText</span> <span class="o">=</span> <span class="nb">nil</span><span class="p">;</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">([</span><span class="n">parsedResponse</span> <span class="nl">isKindOfClass:</span><span class="p">[</span><span class="n">NSDictionary</span> <span class="n">class</span><span class="p">]])</span> <span class="p">{</span>
</span><span class='line'>            <span class="n">errorText</span> <span class="o">=</span> <span class="p">[</span><span class="n">parsedResponse</span> <span class="nl">objectForKey:</span><span class="s">@&quot;error&quot;</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="n">errorText</span><span class="p">)</span> <span class="n">failBlock</span><span class="p">([</span><span class="n">self</span> <span class="nl">errorWithMessage:</span><span class="n">errorText</span> <span class="nl">code:</span><span class="p">[</span><span class="n">response</span> <span class="n">statusCode</span><span class="p">]]);</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">//id parsedResponse = [response parsedBody:NULL];</span>
</span><span class='line'>        <span class="c1">//RKLogTrace(@&quot;response: [%@] %@\n%@&quot;, [parsedResponse class], parsedResponse, [response bodyAsString]);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<p>What if we want to make a <em>POST</em> call? Easy. Just tell the loader <code>loader.method = RKRequestMethodPOST;</code> and pass <code>NSDictionary</code> <em>POST</em> params to <code>loader.params</code></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="n">RKObjectManager</span> <span class="o">*</span><span class="n">manager</span> <span class="o">=</span> <span class="p">[</span><span class="n">RKObjectManager</span> <span class="n">sharedManager</span><span class="p">];</span>
</span><span class='line'><span class="p">[</span><span class="n">manager</span> <span class="nl">loadObjectsAtResourcePath:</span><span class="s">@&quot;/stamps&quot;</span> <span class="nl">usingBlock:</span><span class="o">^</span><span class="p">(</span><span class="n">RKObjectLoader</span> <span class="o">*</span><span class="n">loader</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">loader</span><span class="p">.</span><span class="n">method</span> <span class="o">=</span> <span class="n">RKRequestMethodPOST</span><span class="p">;</span>
</span><span class='line'>    <span class="n">loader</span><span class="p">.</span><span class="n">params</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSDictionary</span> <span class="nl">dictionaryWithKeysAndObjects:</span>
</span><span class='line'>                         <span class="s">@&quot;code&quot;</span><span class="p">,</span> <span class="n">clientCode</span><span class="p">,</span>
</span><span class='line'>                         <span class="s">@&quot;products&quot;</span><span class="p">,</span> <span class="n">productsToSend</span><span class="p">,</span>
</span><span class='line'>                         <span class="nb">nil</span><span class="p">];</span>
</span></code></pre></td></tr></table></div></figure>

<p>What if we don&#39;t need to load any objects? Let&#39;s say we want to make client Authentication.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">authenticateWithLogin:</span><span class="p">(</span><span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">login</span> <span class="nf">password:</span><span class="p">(</span><span class="n">NSString</span> <span class="o">*</span><span class="p">)</span><span class="nv">password</span> <span class="nf">onLoad:</span><span class="p">(</span><span class="n">RKRequestDidLoadResponseBlock</span><span class="p">)</span><span class="nv">loadBlock</span> <span class="nf">onFail:</span><span class="p">(</span><span class="n">RKRequestDidFailLoadWithErrorBlock</span><span class="p">)</span><span class="nv">failBlock</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="p">[[</span><span class="n">RKClient</span> <span class="n">sharedClient</span><span class="p">]</span> <span class="nl">post:</span><span class="s">@&quot;/login&quot;</span> <span class="nl">usingBlock:</span><span class="o">^</span><span class="p">(</span><span class="n">RKRequest</span> <span class="o">*</span><span class="n">request</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="n">request</span><span class="p">.</span><span class="n">params</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSDictionary</span> <span class="nl">dictionaryWithKeysAndObjects:</span>
</span><span class='line'>                          <span class="s">@&quot;employee[email]&quot;</span><span class="p">,</span> <span class="n">login</span><span class="p">,</span>
</span><span class='line'>                          <span class="s">@&quot;employee[password]&quot;</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span>
</span><span class='line'>                          <span class="nb">nil</span><span class="p">];</span>
</span><span class='line'>        <span class="n">request</span><span class="p">.</span><span class="n">onDidLoadResponse</span> <span class="o">=</span> <span class="o">^</span><span class="p">(</span><span class="n">RKResponse</span> <span class="o">*</span><span class="n">response</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>            <span class="kt">id</span> <span class="n">parsedResponse</span> <span class="o">=</span> <span class="p">[</span><span class="n">response</span> <span class="nl">parsedBody:</span><span class="nb">NULL</span><span class="p">];</span>
</span><span class='line'>            <span class="n">NSString</span> <span class="o">*</span><span class="n">token</span> <span class="o">=</span> <span class="p">[</span><span class="n">parsedResponse</span> <span class="nl">valueForKey:</span><span class="s">@&quot;authentication_token&quot;</span><span class="p">];</span>
</span><span class='line'>            <span class="c1">//NSLog(@&quot;response: [%@] %@&quot;, [parsedResponse class], parsedResponse);</span>
</span><span class='line'>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="n">token</span><span class="p">.</span><span class="n">length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;response status: %d, token: %@&quot;</span><span class="p">,</span> <span class="n">response</span><span class="p">.</span><span class="n">statusCode</span><span class="p">,</span> <span class="n">token</span><span class="p">);</span>
</span><span class='line'>                <span class="p">[[</span><span class="n">RKClient</span> <span class="n">sharedClient</span><span class="p">]</span> <span class="nl">setValue:</span><span class="n">token</span> <span class="nl">forHTTPHeaderField:</span><span class="s">@&quot;X-Rabatme-Auth-Token&quot;</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>                <span class="k">if</span> <span class="p">(</span><span class="n">loadBlock</span><span class="p">)</span> <span class="n">loadBlock</span><span class="p">(</span><span class="n">response</span><span class="p">);</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>            <span class="p">[</span><span class="n">self</span> <span class="nl">fireErrorBlock:</span><span class="n">failBlock</span> <span class="nl">onErrorInResponse:</span><span class="n">response</span><span class="p">];</span>
</span><span class='line'>        <span class="p">};</span>
</span><span class='line'>        <span class="n">request</span><span class="p">.</span><span class="n">onDidFailLoadWithError</span> <span class="o">=</span> <span class="n">failBlock</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<h2>Integrating CoreData</h2>

<p>Great. What about CoreData? Change <em>RMApiConnector</em>&#39;s <em>init</em> method
<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='obj-c'><span class='line'><span class="k">if</span> <span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="p">[</span><span class="n">self</span> <span class="n">setupConnector</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">self</span> <span class="n">setupDB</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">self</span> <span class="n">setupMapping</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></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='obj-c'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">setupDB</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">RKObjectManager</span> <span class="o">*</span><span class="n">manager</span> <span class="o">=</span> <span class="p">[</span><span class="n">RKObjectManager</span> <span class="n">sharedManager</span><span class="p">];</span>
</span><span class='line'>    <span class="n">manager</span><span class="p">.</span><span class="n">objectStore</span> <span class="o">=</span> <span class="p">[</span><span class="n">RKManagedObjectStore</span> <span class="nl">objectStoreWithStoreFilename:</span><span class="s">@&quot;HotSpots.sqlite&quot;</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<p>For mapping Managed Objects you do
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='obj-c'><span class='line'><span class="k">-</span> <span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="nf">setupMapping</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">RKObjectManager</span> <span class="o"><em></span><span class="n">manager</span> <span class="o">=</span> <span class="p">[</span><span class="n">RKObjectManager</span> <span class="n">sharedManager</span><span class="p">];</span>
</span><span class='line'>    <span class="n">RKObjectMappingProvider</span> <span class="o"></em></span><span class="n">omp</span> <span class="o">=</span> <span class="p">[</span><span class="n">RKObjectManager</span> <span class="n">sharedManager</span><span class="p">].</span><span class="n">mappingProvider</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">RKManagedObjectMapping</span> <span class="o">*</span><span class="n">hotSpotMapping</span> <span class="o">=</span> <span class="p">[</span><span class="n">RKManagedObjectMapping</span> <span class="nl">mappingForClass:</span><span class="p">[</span><span class="n">HotSpot</span> <span class="n">class</span><span class="p">]</span> <span class="nl">inManagedObjectStore:</span><span class="n">manager</span><span class="p">.</span><span class="n">objectStore</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">hotSpotMapping</span> <span class="nl">mapAttributes:</span><span class="s">@&quot;name&quot;</span><span class="p">,</span> <span class="s">@&quot;city&quot;</span><span class="p">,</span> <span class="s">@&quot;country&quot;</span><span class="p">,</span> <span class="s">@&quot;latitude&quot;</span><span class="p">,</span> <span class="s">@&quot;longitude&quot;</span><span class="p">,</span> <span class="s">@&quot;type&quot;</span><span class="p">,</span> <span class="s">@&quot;zipcode&quot;</span><span class="p">,</span> <span class="nb">nil</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">hotSpotMapping</span> <span class="nl">mapKeyPathsToAttributes:</span>
</span><span class='line'>     <span class="s">@&quot;address&quot;</span><span class="p">,</span> <span class="s">@&quot;street&quot;</span><span class="p">,</span>
</span><span class='line'>     <span class="s">@&quot;description&quot;</span><span class="p">,</span> <span class="s">@&quot;details&quot;</span><span class="p">,</span>
</span><span class='line'>     <span class="s">@&quot;id&quot;</span><span class="p">,</span> <span class="s">@&quot;hotSpotID&quot;</span><span class="p">,</span>
</span><span class='line'>     <span class="s">@&quot;openinghours&quot;</span><span class="p">,</span> <span class="s">@&quot;openingHours&quot;</span><span class="p">,</span>
</span><span class='line'>     <span class="nb">nil</span><span class="p">];</span>
</span><span class='line'>    <span class="n">hotSpotMapping</span><span class="p">.</span><span class="n">primaryKeyAttribute</span> <span class="o">=</span> <span class="s">@&quot;hotSpotID&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="p">[</span><span class="n">omp</span> <span class="nl">addObjectMapping:</span><span class="n">hotSpotMapping</span><span class="p">];</span>
</span><span class='line'>    <span class="p">[</span><span class="n">omp</span> <span class="nl">setObjectMapping:</span><span class="n">hotSpotMapping</span> <span class="nl">forResourcePathPattern:</span><span class="s">@&quot;app/location&quot;</span><span class="p">];</span>
</span></code></pre></td></tr></table></div></figure></p>

<p>Now if Object Mapper will see that the object he&#39;s mapping is a <code>NSManagedObject</code> he will check the DB if the&#39;r already object with same primaryId. If yes - he&#39;ll update it with new values, if no - he&#39;ll create one for you.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rails, Maps and ActiveAdmin]]></title>
    <link href="http://kalapun.com/blog/2012/05/17/rails-maps-and-activeadmin/"/>
    <updated>2012-05-17T07:16:00+03:00</updated>
    <id>http://kalapun.com/blog/2012/05/17/rails-maps-and-activeadmin</id>
    <content type="html"><![CDATA[<p>In this short post I&#39;ll tell how I made <a href="https://github.com/apneadiving/Google-Maps-for-Rails">Google-Maps-for-Rails</a> be able to work with <a href="http://activeadmin.info">ActiveAdmin</a>.</p>

<p>Let&#39;s asume you have a working configured Rails 3.2, MongoDB and ActiveAdmin.</p>

<p>First you need to install gem - <code>gem &#39;gmaps4rails&#39;</code>, then run <code>rails g gmaps4rails:install</code></p>

<!-- more -->

<p>Let&#39;s add maps for our model object <code>Shop</code>.
<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="k">class</span> <span class="nc">Shop</span>
</span><span class='line'>  <span class="kp">include</span> <span class="no">Mongoid</span><span class="o">::</span><span class="no">Document</span>
</span><span class='line'>  <span class="kp">include</span> <span class="no">Mongoid</span><span class="o">::</span><span class="no">Timestamps</span>
</span><span class='line'>  <span class="kp">include</span> <span class="no">Mongoid</span><span class="o">::</span><span class="no">Spacial</span><span class="o">::</span><span class="no">Document</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">field</span> <span class="ss">:location</span><span class="p">,</span> <span class="ss">:type</span> <span class="o">=&gt;</span> <span class="nb">Array</span><span class="p">,</span> <span class="ss">:spacial</span> <span class="o">=&gt;</span> <span class="p">{</span><span class="ss">:lat</span> <span class="o">=&gt;</span> <span class="ss">:lat</span><span class="p">,</span> <span class="ss">:lng</span> <span class="o">=&gt;</span> <span class="ss">:lng</span><span class="p">,</span> <span class="ss">:return_array</span> <span class="o">=&gt;</span> <span class="kp">true</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">index</span> <span class="o">[[</span><span class="ss">:location</span><span class="p">,</span> <span class="no">Mongo</span><span class="o">::</span><span class="no">GEO2D</span><span class="o">]]</span><span class="p">,</span> <span class="ss">:min</span> <span class="o">=&gt;</span> <span class="o">-</span><span class="mi">180</span><span class="p">,</span> <span class="ss">:max</span> <span class="o">=&gt;</span> <span class="mi">180</span><span class="p">,</span> <span class="ss">:bits</span> <span class="o">=&gt;</span> <span class="mi">24</span><span class="p">,</span> <span class="ss">:background</span> <span class="o">=&gt;</span> <span class="kp">true</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure></p>

<p>We need to change it a bit and add this things:
<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="kp">include</span> <span class="no">Gmaps4rails</span><span class="o">::</span><span class="no">ActsAsGmappable</span>
</span><span class='line'>  <span class="n">acts_as_gmappable</span> <span class="ss">:process_geocoding</span> <span class="o">=&gt;</span> <span class="kp">false</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">latitude</span>
</span><span class='line'>    <span class="n">location</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">longitude</span>
</span><span class='line'>    <span class="n">location</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure></p>

<p>Now let&#39;s edit our <code>app/admin/shops.rb</code>
<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="n">show</span> <span class="ss">:title</span> <span class="o">=&gt;</span> <span class="nb">proc</span><span class="p">{</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">shop</span><span class="o">.</span><span class="n">business</span><span class="o">.</span><span class="n">name</span> <span class="k">if</span> <span class="n">shop</span><span class="o">.</span><span class="n">business</span><span class="si">}</span><span class="s2"> / </span><span class="si">#{</span><span class="n">shop</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&quot;</span> <span class="p">}</span> <span class="k">do</span>
</span><span class='line'><span class="n">attributes_table</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">row</span> <span class="ss">:name</span>
</span><span class='line'>  <span class="n">row</span><span class="p">(</span><span class="ss">:location</span><span class="p">)</span> <span class="p">{</span><span class="o">|</span><span class="n">o</span><span class="o">|</span> <span class="n">gmaps</span><span class="p">(</span><span class="s2">&quot;markers&quot;</span> <span class="o">=&gt;</span> <span class="p">{</span><span class="n">data</span><span class="p">:</span> <span class="n">o</span><span class="o">.</span><span class="n">to_gmaps4rails</span><span class="p">},</span> <span class="s2">&quot;map_options&quot;</span> <span class="o">=&gt;</span>  <span class="p">{</span> <span class="n">auto_zoom</span><span class="p">:</span> <span class="kp">false</span><span class="p">,</span> <span class="n">zoom</span><span class="p">:</span> <span class="mi">15</span> <span class="p">})</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">row</span> <span class="ss">:address</span>
</span><span class='line'>  <span class="n">row</span> <span class="ss">:description</span>
</span><span class='line'>  <span class="n">row</span> <span class="ss">:created_at</span>
</span><span class='line'>  <span class="n">row</span> <span class="ss">:updated_at</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>

<p>If we will try to test it - we won&#39;t see a map, because ActiveAdmin is not auto loading our scripts and styles. So let&#39;s try fix that.</p>

<p>First, we need to add gmaps4rails css &amp; javascript files for loading.</p>

<p><code>app/assets/stylesheets/active_admin.css.scss</code>
<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='css'><span class='line'><span class="k">@import</span> <span class="s2">&quot;gmaps4rails&quot;</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure></p>

<p><code>app/assets/javascripts/active_admin.js</code>
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="c1">//= require gmaps4rails/gmaps4rails.base</span>
</span><span class='line'><span class="c1">//= require gmaps4rails/gmaps4rails.googlemaps</span>
</span></code></pre></td></tr></table></div></figure></p>

<p>Now, we need to make custom view for out maps, that will also load google-map javascript. Create file <code>app/views/gmaps4rails/_gmaps4rails.html.erb</code> With contents:
<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>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">src=</span><span class="s">&#39;<a href="http://maps.google.com/maps/api/js?sensor=true&amp;#39">http://maps.google.com/maps/api/js?sensor=true&amp;#39</a>;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">src=</span><span class="s">&#39;<a href="http://google-maps-utility-library-v3.googlecode.com/svn/tags/markerclusterer/1.0/src/markerclusterer_compiled.js&amp;#39">http://google-maps-utility-library-v3.googlecode.com/svn/tags/markerclusterer/1.0/src/markerclusterer_compiled.js&amp;#39</a>;</span><span class="nt">&gt;&lt;/script&gt;</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="err">&lt;</span>% case dom.map_provider %&gt;
</span><span class='line'><span class="err">&lt;</span>% when &quot;mapquest&quot; %&gt;
</span><span class='line'><span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;&lt;%= dom.map_id %&gt;&quot;</span> <span class="na">style=</span><span class="s">&quot;width:750px; height:475px;&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span><span class='line'><span class="err">&lt;</span>% when &quot;bing&quot; %&gt;
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;&lt;%= dom.map_id %&gt;&quot;</span> <span class="na">class=</span><span class="s">&quot;&lt;%= dom.map_class %&gt;&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'><span class="err">&lt;</span>% else %&gt;
</span><span class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;&lt;%= dom.container_class %&gt;&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">&quot;&lt;%= dom.map_id %&gt;&quot;</span> <span class="na">class=</span><span class="s">&quot;&lt;%= dom.map_class %&gt;&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span><span class='line'><span class="err">&lt;</span>% end %&gt;
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">&quot;text/javascript&quot;</span> <span class="na">charset=</span><span class="s">&quot;utf-8&quot;</span><span class="nt">&gt;</span>
</span><span class='line'> <span class="o">&lt;%=</span><span class="nx">raw</span> <span class="nx">options</span><span class="p">.</span><span class="nx">to_gmaps4rails</span> <span class="o">%&gt;</span>
</span><span class='line'><span class="nt">&lt;/script&gt;</span>
</span></code></pre></td></tr></table></div></figure></p>

<p>Now if we test showing our model in ActiveAdmin, we will see a nice map. But let&#39;s add few more things. Edit your <code>Shop</code> model again and add this code:
<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="k">def</span> <span class="nf">gmaps4rails_title</span>
</span><span class='line'>    <span class="nb">self</span><span class="o">.</span><span class="n">name</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">gmaps4rails_infowindow</span>
</span><span class='line'>    <span class="s2">&quot;&lt;b&gt;</span><span class="si">#{</span><span class="nb">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&lt;/b&gt;&lt;br /&gt;&lt;i&gt;</span><span class="si">#{</span><span class="nb">self</span><span class="o">.</span><span class="n">description</span><span class="si">}</span><span class="s2">&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;</span><span class="si">#{</span><span class="nb">self</span><span class="o">.</span><span class="n">address</span><span class="si">}</span><span class="s2">&lt;br /&gt;&lt;i&gt;</span><span class="si">#{</span><span class="nb">self</span><span class="o">.</span><span class="n">location</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">&#39;, &#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&lt;/i&gt;&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure></p>

<p>Now our markers will be clickable and will show nice info window. </p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Capistrano helpers]]></title>
    <link href="http://kalapun.com/blog/2012/05/16/capistrano-helpers/"/>
    <updated>2012-05-16T16:37:00+03:00</updated>
    <id>http://kalapun.com/blog/2012/05/16/capistrano-helpers</id>
    <content type="html"><![CDATA[<p>While working on new rails project, I&#39;ve made few lazy helpers for Capistrano <code>cap</code> command that I want to share. All of them are in my <code>deploy.rb</code> file.
&lt;!&#8211; more &#8211;&gt;</p>

<p>Forwarding your id_rsa key for remote pulling the repo
<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="n">ssh_options</span><span class="o">[</span><span class="ss">:forward_agent</span><span class="o">]</span> <span class="o">=</span> <span class="kp">true</span>
</span><span class='line'><span class="n">before</span> <span class="s1">&#39;deploy:update&#39;</span><span class="p">,</span> <span class="s1">&#39;local:sshadd&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">namespace</span> <span class="ss">:local</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">desc</span> <span class="s2">&quot;Localy run ssh-add&quot;</span>
</span><span class='line'>  <span class="n">task</span> <span class="ss">:sshadd</span><span class="p">,</span> <span class="ss">:roles</span> <span class="o">=&gt;</span> <span class="ss">:app</span> <span class="k">do</span>
</span><span class='line'>    <span class="nb">system</span> <span class="s2">&quot;ssh-add&quot;</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>

<p>Running remote bundle install
<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="n">after</span> <span class="s1">&#39;deploy:update&#39;</span><span class="p">,</span> <span class="s1">&#39;bundle:install&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">namespace</span> <span class="ss">:bundle</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">desc</span> <span class="s2">&quot;Installs the application dependencies&quot;</span>
</span><span class='line'>  <span class="n">task</span> <span class="ss">:install</span><span class="p">,</span> <span class="ss">:roles</span> <span class="o">=&gt;</span> <span class="ss">:app</span> <span class="k">do</span>
</span><span class='line'>    <span class="c1"># For production, exclude gems from development &amp; test groups</span>
</span><span class='line'>    <span class="n">run</span> <span class="s2">&quot;cd </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2"> &amp;&amp; </span><span class="si">#{</span><span class="n">bundle_cmd</span><span class="si">}</span><span class="s2"> --without development test&quot;</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>

<p>Restarting Thin server
<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="n">after</span> <span class="s1">&#39;deploy:update&#39;</span><span class="p">,</span> <span class="s1">&#39;thin:restart&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">namespace</span> <span class="ss">:thin</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">desc</span> <span class="s2">&quot;Restart Thin&quot;</span>
</span><span class='line'>  <span class="n">task</span> <span class="ss">:restart</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">invoke_command</span> <span class="s2">&quot;cd </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2"> &amp;&amp; bundle exec thin restart -C </span><span class="si">#{</span><span class="n">deploy_to</span><span class="si">}</span><span class="s2">/current/thin.yml&quot;</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>

<p>Helpers to syncing local and remote MongoDB
<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">set</span> <span class="ss">:mongodbname_prod</span><span class="p">,</span> <span class="s1">&#39;ximity_me_development&#39;</span>
</span><span class='line'><span class="n">set</span> <span class="ss">:mongodbname_dev</span><span class="p">,</span> <span class="s1">&#39;ximity_me_development&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">namespace</span> <span class="ss">:syncdb</span> <span class="k">do</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">desc</span> <span class="s1">&#39;Synchronize MongoDB local -&gt; production.&#39;</span>
</span><span class='line'>  <span class="n">task</span> <span class="ss">:dev2prod</span><span class="p">,</span> <span class="ss">:hosts</span> <span class="o">=&gt;</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">application</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">database</span> <span class="o">=</span> <span class="n">mongodbname_dev</span>
</span><span class='line'>    <span class="n">dev_database</span> <span class="o">=</span> <span class="n">database</span>
</span><span class='line'>    <span class="n">filename</span> <span class="o">=</span> <span class="s2">&quot;database.</span><span class="si">#{</span><span class="n">database</span><span class="si">}</span><span class="s2">.</span><span class="si">#{</span><span class="no">Time</span><span class="o">.</span><span class="n">now</span><span class="o">.</span><span class="n">strftime</span> <span class="s1">&#39;%Y-%m-%d_%H-%M-%S&#39;</span><span class="si">}</span><span class="s2">.tar.bz2&quot;</span>
</span><span class='line'>    <span class="nb">system</span> <span class="s2">&quot;/usr/local/bin/mongodump -db </span><span class="si">#{</span><span class="n">database</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>    <span class="nb">system</span> <span class="s2">&quot;tar -cjf </span><span class="si">#{</span><span class="n">filename</span><span class="si">}</span><span class="s2"> dump/</span><span class="si">#{</span><span class="n">database</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>    <span class="n">upload</span> <span class="n">filename</span><span class="p">,</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">shared_path</span><span class="si">}</span><span class="s2">/</span><span class="si">#{</span><span class="n">filename</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>    <span class="nb">system</span> <span class="s2">&quot;rm -rf </span><span class="si">#{</span><span class="n">filename</span><span class="si">}</span><span class="s2"> | rm -rf dump&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">database</span> <span class="o">=</span> <span class="n">mongodbname_prod</span>
</span><span class='line'>    <span class="n">run</span> <span class="s2">&quot;tar -xjvf </span><span class="si">#{</span><span class="n">shared_path</span><span class="si">}</span><span class="s2">/</span><span class="si">#{</span><span class="n">filename</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>    <span class="n">run</span> <span class="s2">&quot;/usr/local/bin/mongorestore </span><span class="si">#{</span><span class="n">fetch</span><span class="p">(</span><span class="ss">:db_drop</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2"> -db </span><span class="si">#{</span><span class="n">database</span><span class="si">}</span><span class="s2"> dump/</span><span class="si">#{</span><span class="n">dev_database</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>    <span class="n">run</span> <span class="s2">&quot;rm -rf dump&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">desc</span> <span class="s1">&#39;Synchronize MongoDB production -&gt; local.&#39;</span>
</span><span class='line'>  <span class="n">task</span> <span class="ss">:prod2dev</span><span class="p">,</span> <span class="ss">:hosts</span> <span class="o">=&gt;</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">application</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">database</span> <span class="o">=</span> <span class="n">mongodbname_dev</span>
</span><span class='line'>    <span class="n">dev_database</span> <span class="o">=</span> <span class="n">database</span>
</span><span class='line'>    <span class="n">filename</span> <span class="o">=</span> <span class="s2">&quot;database.</span><span class="si">#{</span><span class="n">database</span><span class="si">}</span><span class="s2">.</span><span class="si">#{</span><span class="no">Time</span><span class="o">.</span><span class="n">now</span><span class="o">.</span><span class="n">strftime</span> <span class="s1">&#39;%Y-%m-%d_%H-%M-%S&#39;</span><span class="si">}</span><span class="s2">.tar.bz2&quot;</span>
</span><span class='line'>    <span class="n">run</span> <span class="s2">&quot;cd </span><span class="si">#{</span><span class="n">shared_path</span><span class="si">}</span><span class="s2"> &amp;&amp; /usr/local/bin/mongodump -db </span><span class="si">#{</span><span class="n">database</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>    <span class="n">run</span> <span class="s2">&quot;cd </span><span class="si">#{</span><span class="n">shared_path</span><span class="si">}</span><span class="s2"> &amp;&amp; tar -cjf </span><span class="si">#{</span><span class="n">filename</span><span class="si">}</span><span class="s2"> dump/</span><span class="si">#{</span><span class="n">database</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>    <span class="n">download</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">shared_path</span><span class="si">}</span><span class="s2">/</span><span class="si">#{</span><span class="n">filename</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">filename</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>    <span class="n">run</span> <span class="s2">&quot;cd </span><span class="si">#{</span><span class="n">shared_path</span><span class="si">}</span><span class="s2"> &amp;&amp; rm -rf </span><span class="si">#{</span><span class="n">filename</span><span class="si">}</span><span class="s2"> | rm -rf dump&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">database</span> <span class="o">=</span> <span class="n">mongodbname_prod</span>
</span><span class='line'>    <span class="nb">system</span> <span class="s2">&quot;tar -xjvf </span><span class="si">#{</span><span class="n">filename</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>    <span class="nb">system</span> <span class="s2">&quot;/usr/local/bin/mongorestore </span><span class="si">#{</span><span class="n">fetch</span><span class="p">(</span><span class="ss">:db_drop</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2"> -db </span><span class="si">#{</span><span class="n">database</span><span class="si">}</span><span class="s2"> dump/</span><span class="si">#{</span><span class="n">dev_database</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>    <span class="nb">system</span> <span class="s2">&quot;rm -rf </span><span class="si">#{</span><span class="n">filename</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>    <span class="nb">system</span> <span class="s2">&quot;rm -rf dump&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">desc</span> <span class="s1">&#39;Generate indexes.&#39;</span>
</span><span class='line'>  <span class="n">task</span> <span class="ss">:reindex</span><span class="p">,</span> <span class="ss">:host</span> <span class="o">=&gt;</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">application</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">run</span> <span class="s2">&quot;cd </span><span class="si">#{</span><span class="n">current_path</span><span class="si">}</span><span class="s2"> &amp;&amp; bundle exec rake db:mongoid:create_indexes --trace&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure></p>

<p>Do you have any useful helpers for <code>cap</code> ?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fonts in iOS project]]></title>
    <link href="http://kalapun.com/blog/2012/05/16/fonts-in-ios-project/"/>
    <updated>2012-05-16T16:34:00+03:00</updated>
    <id>http://kalapun.com/blog/2012/05/16/fonts-in-ios-project</id>
    <content type="html"><![CDATA[<p>Small piece of code that will show you available font names for using in you iOS project
<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='obj-c'><span class='line'><span class="n">NSArray</span> <span class="o"><em></span><span class="n">fonts</span> <span class="o">=</span> <span class="p">[</span><span class="n">UIFont</span> <span class="n">familyNames</span><span class="p">];</span>
</span><span class='line'><span class="k">for</span> <span class="p">(</span><span class="n">NSString</span> <span class="o"></em></span><span class="n">fName</span> <span class="k">in</span> <span class="n">fonts</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'> <span class="err"> </span> <span class="err"> </span><span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;---&gt; %@ :&quot;</span><span class="p">,</span> <span class="n">fName</span><span class="p">);</span>
</span><span class='line'> <span class="err"> </span> <span class="err"> </span><span class="n">NSLog</span><span class="p">(</span><span class="s">@&quot;</span><span class="se">\n</span><span class="s">%@&quot;</span><span class="p">,</span> <span class="p">[</span><span class="n">UIFont</span> <span class="nl">fontNamesForFamilyName:</span><span class="n">fName</span><span class="p">]);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Start reading details]]></title>
    <link href="http://kalapun.com/blog/2012/04/07/start-reading-details/"/>
    <updated>2012-04-07T20:31:00+03:00</updated>
    <id>http://kalapun.com/blog/2012/04/07/start-reading-details</id>
    <content type="html"><![CDATA[<p>I wonder when people will start reading some details before asking a lot of questions?
Like the questions &quot;Let&#39;s meet today in center (Kiev)?&quot; or &quot;Oh, so where do you live now?&quot;. Come on, people.</p>

<p><img src="http://kalapun.com/images/2012-04-07/1.png" alt=""></p>

<!-- more -->

<p><img src="http://kalapun.com/images/2012-04-07/2.png" alt=""></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CLANG performSelector leak]]></title>
    <link href="http://kalapun.com/blog/2012/04/07/clang-performselector-leak/"/>
    <updated>2012-04-07T17:16:00+03:00</updated>
    <id>http://kalapun.com/blog/2012/04/07/clang-performselector-leak</id>
    <content type="html"><![CDATA[<p>If you ever get a compiler warning <em>performSelector may cause a leak because its selector is unknown</em> you can suppress it in LLVM 3.0:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<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='obj-c'><span class='line'><span class="cp">#pragma clang diagnostic push</span>
</span><span class='line'><span class="cp">#pragma clang diagnostic ignored &quot;-Warc-performSelector-leaks&quot;</span>
</span><span class='line'>    <span class="p">[</span><span class="n">self</span><span class="p">.</span><span class="n">target</span> <span class="nl">performSelector:</span><span class="k">@selector</span><span class="p">(</span><span class="nl">someAction:</span><span class="p">)</span> <span class="nl">withObject:</span><span class="n">self</span><span class="p">];</span>
</span><span class='line'><span class="cp">#pragma clang diagnostic pop</span>
</span></code></pre></td></tr></table></div></figure>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CocoaPods]]></title>
    <link href="http://kalapun.com/blog/2012/04/06/cocoapods/"/>
    <updated>2012-04-06T15:16:00+03:00</updated>
    <id>http://kalapun.com/blog/2012/04/06/cocoapods</id>
    <content type="html"><![CDATA[<p>As CocoaPods is a ruby thing, you install it via gem:
<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'>$ sudo gem install cocoapods
</span><span class='line'>$ pod setup</span></code></pre></td></tr></table></div></figure>
&lt;!&#8211; more &#8211;&gt;</p>

<p>Installing missing libs:</p>

<p><em>RestKit 0.10.0</em>
<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'>PodSpecName=&quot;RestKit&quot;; PodSpecVersion=&quot;0.10.0&quot;; PodSpecHome=&quot;${HOME}/.cocoapods/master&quot;; PodRepoUrl=&quot;<a href="https://github.com/xslim/Specs">https://github.com/xslim/Specs</a>&quot; PodSpecFile=&quot;${PodSpecHome}/${PodSpecName}/${PodSpecVersion}/${PodSpecName}.podspec&quot;; if [ ! -f  &quot;${PodSpecFile}&quot; ]; then echo &quot;Will download to ${PodSpecFile}&quot;; mkdir -p $(dirname ${PodSpecFile}) ; curl -L &quot;${PodRepoUrl}/Specs/raw/master${PodSpecName}/${PodSpecVersion}/${PodSpecName}.podspec&quot; -o &quot;${PodSpecFile}&quot; ; echo &quot;Done.&quot;  ; fi </span></code></pre></td></tr></table></div></figure></p>

<p><em>LibComponentLogging-NSLogger</em>
<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'>PodSpecName=&quot;LibComponentLogging-NSLogger&quot;; PodSpecVersion=&quot;1.0.4&quot;; PodSpecHome=&quot;${HOME}/.cocoapods/master&quot;; PodRepoUrl=&quot;<a href="https://github.com/xslim/Specs">https://github.com/xslim/Specs</a>&quot; PodSpecFile=&quot;${PodSpecHome}/${PodSpecName}/${PodSpecVersion}/${PodSpecName}.podspec&quot;; if [ ! -f  &quot;${PodSpecFile}&quot; ]; then echo &quot;Will download to ${PodSpecFile}&quot;; mkdir -p $(dirname ${PodSpecFile}) ; curl -L &quot;${PodRepoUrl}/Specs/raw/master${PodSpecName}/${PodSpecVersion}/${PodSpecName}.podspec&quot; -o &quot;${PodSpecFile}&quot; ; echo &quot;Done.&quot;  ; fi </span></code></pre></td></tr></table></div></figure></p>

<p>After installing CocoaPods, update the project:
<code>cd project-dir</code></p>

<p>If it&#39;s first time you are installing:
<code>pod install MyProject.xcodeproj</code></p>

<p>Next time, you just update it with
<code>pod install</code></p>

<p><strong>UPDATE:</strong> <em>RestKit 0.10.0</em> and <em>LibComponentLogging-NSLogger</em> are now in CocoaPods specs, no need for manual install</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Usefull Octopress links]]></title>
    <link href="http://kalapun.com/blog/2012/03/30/usefull-octopress-links/"/>
    <updated>2012-03-30T20:31:00+03:00</updated>
    <id>http://kalapun.com/blog/2012/03/30/usefull-octopress-links</id>
    <content type="html"><![CDATA[<ul>
<li><a href="http://octopress.org">Octopress.org</a></li>
<li><a href="http://melandri.net/2012/02/14/octopress-theme-customization/">Theme customization</a></li>
<li><a href="http://www.stripegenerator.com/">Cool Stripe generator</a></li>
<li>Nice looking font <a href="http://www.theleagueofmoveabletype.com/league-gothic">LeagueGothic</a></li>
</ul>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Рецензия на книгу ReWork]]></title>
    <link href="http://kalapun.com/blog/2012/01/03/review-rework/"/>
    <updated>2012-01-03T00:00:00+02:00</updated>
    <id>http://kalapun.com/blog/2012/01/03/review-rework</id>
    <content type="html"><![CDATA[<p><img src="http://joviawebstudio.com/images/sized/images/uploads/rework-cover-250x380.jpg" alt=""> </p>

<p><strong>ReWork</strong> - книга о ведении бизнеса от известной в IT кругах компании <a href="http://37signals.com">37 Signals</a>. Да да, именно тех 37 Signals которые создали Ruby on Rails и Basecamp. Она стала бестселлером в Америке сразу после выхода. </p>

<p>Авторы книги - Джейсон Фрайд и Дэвид Хайнемайер еще до этой книги выпустили бестселлер Getting Real. Так же у них есть замечательный блог - <a href="http://37signals.com/svn">Signal vs Noise</a>, на который подписано более 115 000 человек.
&lt;!&#8211; more &#8211;&gt;</p>

<p>Удивительно что в компании  37 Signals, которая на рынке уже 10 лет, на данный момент работает всего 14 постоянных сотрудников, а программами, созданными этой компанией, пользуется более 3 миллионов человек по всему миру. Самые известные программные продукты компании: Basecamp - система управления проектами, Backpack - система управления знаниями, Highrise - система CRM.</p>

<p>При прочтении книги у меня было ощущение что со мной делятся секретами успеха в бизнесе мои друзья. Делятся легко и непринужденно, живо и искренне. Я постоянно сравниваю данные советы с личным опытом или опытом знакомых бизнесменов. Почти со всеми советами я соглашаюсь сразу, некоторые перечитываю по несколько раз что бы лучше понять. Некоторые так и не понимаю. Но все они заставляют включать серое вещество и смотреть на привычные вещи совсем под другим углом.</p>

<p>Нужны ли огромные инвестиции? Нужен ли вам офис? Нужно ли расти? Нужны ли совещания вообще? Нужен ли вам четкий бизнес план? Или гораздо выгоднее импровизировать?</p>

<p>Авторы на протяжении всей книги доказывают что привычный путь ведения бизнеса не всегда самый лучший. Они дают четкие стратегии и на своем опыте показывают как стоит вести бизнес и какие распространенные ошибки могут быть.</p>

<h2>Структура</h2>

<p>Книга написана простыми словами, без всяких заумностей, читается на одном дыхании. Каждая глава разбита на 5-6 блока: </p>

<ol>
<li>заголовок - как краткое правило</li>
<li>обсуждение проблемы, с которой сталкивается большинство бизнесменов или начинающих</li>
<li>немного теории, с объяснениями что и почему</li>
<li>пример как было сделано хорошо или плохо в других компаниях</li>
<li>личный пример</li>
<li>краткий вывод</li>
</ol>

<h2>Оно вам надо?</h2>

<p>Стоит ли читать книгу если вы занимаетесь бизнесом или  только задумываетесь - однозначно. Я изначально прослушал ее как аудиокнигу на английском языке, потом прочитал на английском и теперь опять на русском.</p>

<p>Вам все еще что то мешает начать свой бизнес? Прочитайте ReWork и начинайте действовать!</p>

<h2>Пару заметок из книги</h2>

<p>Стоит сказать что делать заметки и цитаты с книги очень сложно, ибо авторы и так выбросили всю воду, оставили только четкий понятный текст мотивирующий к действию.</p>

<ul>
<li>Помните известную байку о том, что, по мнению инженеров, шмель летать не может: аэродинамические качества не позволяют? Каждый май миллионы шмелей легко опровергают сложные научные расчеты.</li>
<li>Реальный мир – это не место, а всего лишь предлог. Оправдание, чтобы не действовать</li>
<li>Игнорируйте реальный мир</li>
<li>Определите очередную наиболее важную задачу и займитесь ею</li>
<li>Симпатичную рубашку, крем для бритья и зубную щетку можно купить, уже добравшись до места</li>
<li>Вам не нужно иметь степень МВА, модный костюм, портфель или склонность к риску выше обычного. Вам нужна идея, немного уверенности и небольшое усилие, чтобы начать</li>
<li>Если вы собираетесь что-то сделать, фокусируйтесь на том, что будет иметь значение</li>
<li>простой и очевидный способ создать первоклассный продукт или услугу – сделать что-то, что бы вы сами хотели использовать</li>
<li>Значение имеет только то, что вы делаете, а не то, о чем вы думаете, говорите или что планируете</li>
<li>Возьмите камеру, немного пленки и снимите абсолютно любой фильм</li>
<li>Ответственность за достижение ваших целей и осуществление мечтаний лежит полностью на вас</li>
<li>идеальное время никогда не наступит. Вы всегда либо слишком молоды, либо слишком стары, либо слишком заняты, либо слишком устали, либо еще что-нибудь</li>
<li>Нет смысла продавать лишние пару сэндвичей, если хлеб не так хорош</li>
<li>Мы скорее предпочтем потерять часть клиентов, если будем уверены, что это поможет оставшимся сильнее любить наши продукты</li>
<li>Отстаивать свои убеждения – не означает просто записать их. Это означает верить в них и жить ими</li>
<li>Внешние деньги – это план «Z»</li>
<li>Начинайте бизнес, а не стартап</li>
<li>Масштаб растет из-за: долгосрочных договоров; избыточного персонала; долгосрочных решений; встреч; невнятных процедур; запасов (физических или ментальных); лишнего оборудования, программного обеспечения, технологических процессов; долгосрочных планов развития; офисных политик.</li>
<li>Путь к великому начинается с отбрасывания всего, что хорошо лишь в умеренных дозах</li>
<li>Создайте половину продукта, а не недоделанный продукт</li>
<li>Если я это уберу, будет ли все еще существовать то, что я продаю?</li>
<li>если вы хотите открыть палатку по продаже хот-догов, вы можете беспокоиться о приправах, самой палатке, названии, оформлении. Но первое, о чем вам стоит позаботиться, – это о самих хот-догах. Хот-доги – это эпицентр. Все остальное вторично</li>
<li>Игнорируйте детали на ранних стадиях</li>
<li>Длительные проекты пагубно влияют на командный дух. Чем больше времени занимает разработка, тем менее вероятен запуск</li>
<li>Отделяйте все лишнее, пока у вас не останется только самое важное. Затем сделайте это снова</li>
<li>Когда что-то не работает, обычный подход заключается в том, чтобы бросать на решение проблемы больше ресурсов. Больше людей, времени и денег. Все это в итоге приводит к разрастанию проблемы. Правильный подход – действовать в обратном направлении, то есть сокращать</li>
<li>Вы же хотите создать что-то замечательное. Мы говорим о том, что лучший путь достичь этого – через последовательные итерации. Перестаньте думать о том, что будет работать, – выясните это на практике</li>
<li>Отложите все, что вам не нужно для запуска. Создавайте все жизненно необходимое сейчас, а все роскошества оставьте на потом</li>
<li>Запускайтесь сейчас</li>
<li>Перерывы – враги продуктивности</li>
<li>ваш день находится в осаде постоянных перерывов. Ваша задача – отвоевать его обратно</li>
<li>Если вы находите свой способ решения задачи достаточно хорошим, останавливайтесь на нем. Это гораздо лучше, чем тратить ресурсы или, что хуже, ничего не делать из-за того, что вы не придумали более красивое решение</li>
<li>Вместо планирования одного проекта, рассчитанного на 12 недель, разбейте его на 12 однонедельных проектов</li>
<li>существует отличный способ оградить себя от подражателей – самим стать частью своего продукта или услуги</li>
<li>Проблема копирования заключается в следующем: пропускается стадия понимания, осознания глубинных механизмов, с помощью которых растет бизнес. При слепом подражании воспроизводится последний из слоев без того, чтобы понять, какие слои находятся под ним.</li>
<li>вы можете себе позволить обучать других. Большие компании никогда не смогут этого делать, потому что одержимы манией секретности</li>
<li>Обучайте – и вы «привяжете» к себе людей так, как не снилось поклонникам традиционных маркетинговых приемов</li>
<li>Большинство вещей, о которых вы переживаете, так никогда и не произойдут.</li>
<li>Если вы хотите работать с человеком долгое время, не нужно рассчитывать на то, что работа будет полностью занимать его жизнь.</li>
<li>Если вы хотите, чтобы что-то было сделано, поручите выполнение самому занятому человеку</li>
<li>Если вдохновение пришло к вам в пятницу, пожертвуйте выходными и полностью погрузитесь в проект. В состоянии подъема вы можете за 24 часа выполнить объем работы, на который в обычной ситуации пришлось бы потратить пару недель</li>
</ul>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How to get iBooks Hightlihts]]></title>
    <link href="http://kalapun.com/blog/2012/01/03/Get-iBooks-Highlights/"/>
    <updated>2012-01-03T00:00:00+02:00</updated>
    <id>http://kalapun.com/blog/2012/01/03/Get-iBooks-Highlights</id>
    <content type="html"><![CDATA[<p>So for example you want to get the highligtings from iBooks, what you need is few steps:</p>

<ul>
<li>Get some app to mount iBooks Folder (like <a href="http://www.macroplant.com/phonedisk/">PhoneDisk</a>)</li>
<li>Download AEAnnotation sqlite database from Documents/storeFiles to some local folder</li>
<li>cd in that folder with your terminal application and execute </li>
</ul>

<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'>sqlite3 AEAnnotation_*_local.sqlite 'select `ZANNOTATIONSELECTEDTEXT`, `ZANNOTATIONASSETID` from `ZAEANNOTATION` where (`ZANNOTATIONSELECTEDTEXT` not NULL) order by `ZANNOTATIONASSETID`,`ZPLLOCATIONRANGESTART`'</span></code></pre></td></tr></table></div></figure>

<!-- more -->

<p>You will see list of notes and Boor IDs to which they are associated</p>

<ul>
<li>Find out the Book ID you need (Example: <code>06CA7575F9AACCAC5027272BA8926BB1</code>)</li>
<li>execute the command</li>
</ul>

<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'>sqlite3 AEAnnotation_*_local.sqlite 'select `ZANNOTATIONSELECTEDTEXT` from `ZAEANNOTATION` where (`ZANNOTATIONASSETID` = "06CA7575F9AACCAC5027272BA8926BB1") AND (`ZANNOTATIONSELECTEDTEXT` not NULL) order by `ZPLLOCATIONRANGESTART`'</span></code></pre></td></tr></table></div></figure>

<p>And you will get your highlights !</p>

<h2>Few dev notes</h2>

<ul>
<li>Create Cocoa app for Exporting iBooks Highlights</li>
<li>Use <a href="https://github.com/xslim/mobileDeviceManager">https://github.com/xslim/mobileDeviceManager</a> to get data from device</li>
<li>Open <code>BKLibrary_database/iBooks_*.sqlite</code> (*BKL*) and <code>storeFiles/AEAnnotation_*.sqlite</code> (*AEA*)</li>
<li>Interconnection by <code>BKL-&gt;ZBKBOOKINFO-&gt;ZPLUGINASSETID</code> and <code>AEA-&gt;ZAEANNOTATION-&gt;ZANNOTATIONASSETID</code></li>
</ul>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[PHP to AD LDAP connection]]></title>
    <link href="http://kalapun.com/blog/2011/12/27/php-to-ad-ldap-connection/"/>
    <updated>2011-12-27T16:11:00+02:00</updated>
    <id>http://kalapun.com/blog/2011/12/27/php-to-ad-ldap-connection</id>
    <content type="html"><![CDATA[<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">ds</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">ds</span> <span class="o">=</span> <span class="nb">ldap_connect</span><span class="p">(</span><span class="nv">$host</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">ds</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nb">ldap_set_option</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">ds</span><span class="p">,</span> <span class="nx">LDAP_OPT_PROTOCOL_VERSION</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
</span><span class='line'>      <span class="nb">ldap_set_option</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">ds</span><span class="p">,</span> <span class="nx">LDAP_OPT_REFERRALS</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="o">!@</span><span class="nb">ldap_bind</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">ds</span><span class="p">,</span> <span class="nv">$login</span><span class="p">,</span> <span class="nv">$passwd</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="k">return</span> <span class="nv">$this</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

<!-- more -->

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="x">public function searchUser($s) {</span>
</span><span class='line'><span class="x">  $attributes = array(&#39;sAMAccountName&#39;, &#39;cn&#39;);</span>
</span><span class='line'><span class="x">  $filter = &#39;(&amp;(objectCategory=user)(displayName=*&#39;.$s.&#39;*))&#39;;</span>
</span><span class='line'><span class="x">  $sr = ldap_search($this-&gt;ds, $this-&gt;dn, $filter, $attributes);</span>
</span><span class='line'><span class="x">  $num_enntries = ldap_count_entries($this-&gt;ds, $sr);</span>
</span><span class='line'><span class="x">  $users = array();</span>
</span><span class='line'><span class="x">  if ($num_enntries &gt; 0) {</span>
</span><span class='line'><span class="x">      $info = ldap_get_entries($this-&gt;ds, $sr);</span>
</span><span class='line'><span class="x">      foreach($info as $u) {</span>
</span><span class='line'><span class="x">          if (!empty($u[&#39;cn&#39;][0]))</span>
</span><span class='line'><span class="x">          $users[] = array(</span>
</span><span class='line'><span class="x">                  &#39;login&#39; =&gt; $u[&#39;samaccountname&#39;][0],</span>
</span><span class='line'><span class="x">                  &#39;name&#39;  =&gt; $u[&#39;cn&#39;][0],</span>
</span><span class='line'><span class="x">              );</span>
</span><span class='line'><span class="x">      }</span>
</span><span class='line'><span class="x">      return $users;</span>
</span><span class='line'><span class="x">  } else {</span>
</span><span class='line'><span class="x">      return false;</span>
</span><span class='line'><span class="x">  }</span>
</span><span class='line'><span class="x">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="x">include(&quot;pChart/pData.class&quot;);</span>
</span><span class='line'><span class="x">include(&quot;pChart/pChart.class&quot;);</span>
</span><span class='line'>
</span><span class='line'><span class="x">// Dataset definition </span>
</span><span class='line'><span class="x">$DataSet = new pData;</span>
</span><span class='line'><span class="x">$DataSet-&gt;AddPoint($data,&quot;Serie1&quot;);</span>
</span><span class='line'><span class="x">$DataSet-&gt;AddPoint($legend,&quot;Serie2&quot;); </span>
</span><span class='line'><span class="x">$DataSet-&gt;AddAllSeries();</span>
</span><span class='line'><span class="x">$DataSet-&gt;SetAbsciseLabelSerie(&quot;Serie2&quot;);</span>
</span><span class='line'>
</span><span class='line'><span class="x">// Initialise the graph</span>
</span><span class='line'><span class="x">$graph = new pChart(720,350);</span>
</span><span class='line'><span class="x">$graph-&gt;loadColorPalette(&#39;hard_bright.txt&#39;);</span>
</span><span class='line'>
</span><span class='line'><span class="x">// Draw the pie chart</span>
</span><span class='line'><span class="x">$graph-&gt;setFontProperties(&quot;Fonts/tahoma.ttf&quot;,12);</span>
</span><span class='line'><span class="x">$graph-&gt;drawTitle(50,20,&#39;Top 20 Incominf for &#39;.$date ,0,0,0);  </span>
</span><span class='line'>
</span><span class='line'><span class="x">$graph-&gt;setFontProperties(&quot;Fonts/tahoma.ttf&quot;,9);</span>
</span><span class='line'>
</span><span class='line'><span class="x">$graph-&gt;drawPieGraph($DataSet-&gt;GetData(),$DataSet-&gt;GetDataDescription(),210,160,180,PIE_PERCENTAGE,TRUE,50,20,5);</span>
</span><span class='line'><span class="x">$graph-&gt;drawPieLegend(420,5,$DataSet-&gt;GetData(),$DataSet-&gt;GetDataDescription(),250,250,250);</span>
</span><span class='line'>
</span><span class='line'><span class="x">$graph-&gt;Stroke();</span>
</span></code></pre></td></tr></table></div></figure>
]]></content>
  </entry>
  
</feed>
