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

  <title><![CDATA[Mikhail Nikalyukin]]></title>
  <link href="http://dpsk.github.io/atom.xml" rel="self"/>
  <link href="http://dpsk.github.io/"/>
  <updated>2014-08-06T15:11:17+04:00</updated>
  <id>http://dpsk.github.io/</id>
  <author>
    <name><![CDATA[Mikhail Nikalyukin]]></name>
    <email><![CDATA[idups1k@gmail.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Install R programming language on OS X with Homebrew]]></title>
    <link href="http://dpsk.github.io/blog/2014/08/06/install-r-programming-language-on-os-x-with-homebrew/"/>
    <updated>2014-08-06T13:25:00+04:00</updated>
    <id>http://dpsk.github.io/blog/2014/08/06/install-r-programming-language-on-os-x-with-homebrew</id>
    <content type="html"><![CDATA[<p>First of all here is a small video with highlight of R</p>

<div class="embed-video-container"><iframe src="http://www.youtube.com/embed/TR2bHSJ_eck" allowfullscreen></iframe></div>


<h2>Installation</h2>

<p>First of all, prerequisites for installing R with homebrew is XQuartz and homebrew itself. You can find XQuartz <a href="http://xquartz.macosforge.org">here</a>.</p>

<p>The installation itself is just couple of lines:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>brew update
</span><span class='line'>brew tap homebrew/science
</span><span class='line'>brew install gcc r
</span></code></pre></td></tr></table></div></figure>


<p>That&rsquo;s it, to test your environment just type <code>r</code> in the terminal and you will be prompted to r shell. To quit it use <code>q()</code> command.</p>

<p>If you are using zsh shell you also need to disable binding for r(by default it&rsquo;s mapped for repeating last command). You can do so by adding <code>disable r</code> line to the <code>.zshrc</code> file.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Track request time with the Faraday]]></title>
    <link href="http://dpsk.github.io/blog/2013/10/01/track-request-time-with-the-faraday/"/>
    <updated>2013-10-01T14:15:00+04:00</updated>
    <id>http://dpsk.github.io/blog/2013/10/01/track-request-time-with-the-faraday</id>
    <content type="html"><![CDATA[<p>I&rsquo;m frequently find myself in need to measure request time of remote request from my application to an API or service. Previously, i used simple block of ruby code with <code>start_time</code> and <code>end_time</code>. Finally i decided to find out more robust method of doing so. I&rsquo;m using <code>faraday</code> gem for remote requests, because it&rsquo;s easy extendable by middlewares and great overall. You can take a look at the project with collection of middlewares for faraday on <a href="https://github.com/lostisland/faraday_middleware">github</a>. This project contains <code>Instrumentation</code> middleware that we will use for tracking time of our request.</p>

<p>Before we start, here is an image of Dr. Faraday from LOST:</p>

<p><img class="center" src="http://dpsk.github.io/images/posts/faraday-lost.jpg" title="'Faraday'" ></p>

<p>By the way github handle of faraday author is @<strong>lost</strong>island. Coincidence? I don&rsquo;t think so :)</p>

<!--more-->


<p>To the work! Let&rsquo;s look inside the <a href="https://github.com/lostisland/faraday_middleware/blob/master/lib/faraday_middleware/instrumentation.rb">instrumentation middleware</a>:</p>

<figure class='code'><figcaption><span>instrumentation.rb </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='rb'><span class='line'><span class="k">module</span> <span class="nn">FaradayMiddleware</span>
</span><span class='line'>  <span class="k">class</span> <span class="nc">Instrumentation</span> <span class="o">&lt;</span> <span class="ss">Faraday</span><span class="p">:</span><span class="ss">:Middleware</span>
</span><span class='line'>    <span class="n">dependency</span> <span class="s1">&#39;active_support/notifications&#39;</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">app</span><span class="p">,</span> <span class="n">options</span> <span class="o">=</span> <span class="p">{})</span>
</span><span class='line'>      <span class="k">super</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
</span><span class='line'>      <span class="vi">@name</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="ss">:name</span><span class="p">,</span> <span class="s1">&#39;request.faraday&#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="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
</span><span class='line'>      <span class="ss">ActiveSupport</span><span class="p">:</span><span class="ss">:Notifications</span><span class="o">.</span><span class="n">instrument</span><span class="p">(</span><span class="vi">@name</span><span class="p">,</span> <span class="n">env</span><span class="p">)</span> <span class="k">do</span>
</span><span class='line'>        <span class="vi">@app</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Pretty straightforward, we just instrument event <code>'request.faraday'</code>. If you are not familiar with the <code>ActiveSupport::Notifications</code> mechanism you can read about it <a href="http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html">here</a>.</p>

<p>We should add this middleware to our faraday connection object:</p>

<figure class='code'><figcaption><span>faraday_connection_example.rb </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='rb'><span class='line'>  <span class="k">def</span> <span class="nf">connection</span>
</span><span class='line'>    <span class="no">Faraday</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="ss">url</span><span class="p">:</span> <span class="s2">&quot;http://google.com&quot;</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">faraday</span><span class="o">|</span>
</span><span class='line'>      <span class="n">faraday</span><span class="o">.</span><span class="n">use</span> <span class="ss">FaradayMiddleware</span><span class="p">:</span><span class="ss">:Instrumentation</span>
</span><span class='line'>      <span class="n">faraday</span><span class="o">.</span><span class="n">adapter</span>  <span class="no">Faraday</span><span class="o">.</span><span class="n">default_adapter</span>
</span><span class='line'>      <span class="n">faraday</span><span class="o">.</span><span class="n">response</span> <span class="ss">:logger</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>Let&rsquo;s subscribe to the <code>request.faraday</code> events with the <code>ActiveSupport::Notifications</code>. You can execute any code inside your subscribe block, save information and time to the file or database for example. I will use rails logger in my example:</p>

<figure class='code'><figcaption><span>config/initializers/notifications.rb </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="ss">ActiveSupport</span><span class="p">:</span><span class="ss">:Notifications</span><span class="o">.</span><span class="n">subscribe</span><span class="p">(</span><span class="s1">&#39;request.faraday&#39;</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="nb">name</span><span class="p">,</span> <span class="n">starts</span><span class="p">,</span> <span class="n">ends</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">env</span><span class="o">|</span>
</span><span class='line'>  <span class="n">url</span> <span class="o">=</span> <span class="n">env</span><span class="o">[</span><span class="ss">:url</span><span class="o">]</span>
</span><span class='line'>  <span class="n">http_method</span> <span class="o">=</span> <span class="n">env</span><span class="o">[</span><span class="ss">:method</span><span class="o">].</span><span class="n">to_s</span><span class="o">.</span><span class="n">upcase</span>
</span><span class='line'>  <span class="n">duration</span> <span class="o">=</span> <span class="n">ends</span> <span class="o">-</span> <span class="n">starts</span>
</span><span class='line'>  <span class="no">Rails</span><span class="o">.</span><span class="n">logger</span><span class="o">.</span><span class="n">info</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">url</span><span class="o">.</span><span class="n">host</span><span class="si">}</span><span class="s2">, </span><span class="si">#{</span><span class="n">http_method</span><span class="si">}</span><span class="s2">, </span><span class="si">#{</span><span class="n">url</span><span class="o">.</span><span class="n">request_uri</span><span class="si">}</span><span class="s2">, takes </span><span class="si">#{</span><span class="n">duration</span><span class="si">}</span><span class="s2"> seconds&quot;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&rsquo;s all, you are set and ready, whenever your application will send any request with the faraday connection, it will print request time information to your log file.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Install Jenkins CI for Rails project with Cucumber]]></title>
    <link href="http://dpsk.github.io/blog/2013/07/26/install-jenkins-ci-for-rails-project-with-cucumber/"/>
    <updated>2013-07-26T18:34:00+04:00</updated>
    <id>http://dpsk.github.io/blog/2013/07/26/install-jenkins-ci-for-rails-project-with-cucumber</id>
    <content type="html"><![CDATA[<h2>Jenkins</h2>

<p><img class="right" src="http://dpsk.github.io/images/posts/jenkins_logo.png" title="'Jenkins logo'" >
This is a short guide on how to setup Jenkins(Hudson) for Rails project with cucumber features. The steps are described for Ubuntu machine. First of all &ndash; what is Jenkins?</p>

<p>Jenkins is an award-winning application that monitors executions of repeated jobs, such as building a software project or jobs run by cron. Among those things, current Jenkins focuses on the following two jobs:</p>

<ul>
<li>Building/testing software projects continuously, just like CruiseControl or DamageControl. In a nutshell, Jenkins provides an easy-to-use so-called continuous integration system, making it easier for developers to integrate changes to the project, and making it easier for users to obtain a fresh build. The automated, continuous build increases the productivity.</li>
<li>Monitoring executions of externally-run jobs, such as cron jobs and procmail jobs, even those that are run on a remote machine. For example, with cron, all you receive is regular e-mails that capture the output, and it is up to you to look at them diligently and notice when it broke. Jenkins keeps those outputs and makes it easy for you to notice when something is wrong.</li>
</ul>


<p>Let&rsquo;s install Jenkins with following commands:</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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>  wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
</span><span class='line'>  sudo sh -c <span class="s1">&#39;echo deb http://pkg.jenkins-ci.org/debian binary/ &gt; /etc/apt/sources.list.d/jenkins.list&#39;</span>
</span><span class='line'>  sudo apt-get update
</span><span class='line'>  sudo apt-get install jenkins
</span></code></pre></td></tr></table></div></figure>


<p>From this point you can start jenkins like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo /etc/init.d/jenkins start
</span></code></pre></td></tr></table></div></figure>


<h2>NGINX</h2>

<p>Now we need to configure nginx for jenkins, the most basic setup will look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>upstream jenkins <span class="o">{</span>
</span><span class='line'>  server 127.0.0.1:8080;
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'>server <span class="o">{</span>
</span><span class='line'>  listen 111.111.111.111:80;
</span><span class='line'>  server_name jenkins.project_name.com *.jenkins.project_name.com;
</span><span class='line'>
</span><span class='line'>  try_files <span class="nv">$uri</span> @jenkins;
</span><span class='line'>
</span><span class='line'>  location @jenkins <span class="o">{</span>
</span><span class='line'>      proxy_pass http://jenkins;
</span><span class='line'>      proxy_set_header X-Forwarded-For <span class="nv">$proxy_add_x_forwarded_for</span>;
</span><span class='line'>      proxy_set_header Host <span class="nv">$http_host</span>;
</span><span class='line'>      proxy_redirect off;
</span><span class='line'>  <span class="o">}</span>
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>So now jenkins web interface is up and running at jenkins.project_name.com</p>

<h2>Jenkins User</h2>

<p>Jenkins using <code>jenkins</code> ubuntu user by default. We should add the pair of ssh keys to him, as well as install ruby. For this purposes login as jenkins
<code>sudo su jenkins</code>. <code>ssh-keygen -t rsa</code> to generate ssh keys. Install ruby with rvm or your ruby version manager of choice. Also we should add name and email to git for jenkins. So the list of commands will be following:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo su jenkins
</span><span class='line'>ssh-keygen -t rsa
</span><span class='line'><span class="se">\c</span>url -L https://get.rvm.io | bash -s stable --ruby
</span><span class='line'><span class="nb">echo</span> <span class="s2">&quot;source $HOME/.rvm/scripts/rvm&quot;</span> &gt;&gt; ~/.bash_profile
</span><span class='line'><span class="nb">source</span> ~/.bash_profile
</span><span class='line'>rvm install 1.9.3
</span><span class='line'>git config --global user.email <span class="s2">&quot;jenkins@example.com&quot;</span>
</span><span class='line'>git config --global user.name <span class="s2">&quot;Jenkins Hudson&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Jenkins Plugins</h2>

<p>Now let&rsquo;s install some useful plugins for Jenkins. Go to the  <em>Manage Jenkins &ndash;> Manage Plugins</em> and check following plugins:</p>

<ul>
<li>Git Client Plugin</li>
<li>GitHub Plugin</li>
<li>Ruby Plugin</li>
<li>Rake plugin</li>
<li>Cucumber plugin</li>
</ul>


<h2>Add project to Jenkins</h2>

<p>Now we a ready to add our project to Jenkins. Go to the <em>New Job &ndash;> Free-style</em> Navigate to <code>Source Code Management</code> menu and choose Git, enter your git repository address and specify the branch.</p>

<p><img src="http://dpsk.github.io/images/posts/hudson_git.png" title="Jenkins Git options" alt="Jenkins Git options"></p>

<p>Now we only need to specify commands for building our project. Specify &ldquo;Execute shell script&rdquo; and add following commands, you may want to change them for your needs:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#!/bin/bash -x</span>
</span><span class='line'><span class="nb">source</span> ~/.bash_profile
</span><span class='line'>rvm use 1.9.3
</span><span class='line'>bundle install
</span><span class='line'>cp config/database.yml.example database.yml
</span><span class='line'>rake db:test:prepare <span class="nv">RAILS_ENV</span><span class="o">=</span><span class="nb">test</span>
</span><span class='line'>cucumber
</span></code></pre></td></tr></table></div></figure>


<p>You also may want to add some notifications, for my project i&rsquo;m using hipchat notification, but the most easiest solution to setup is email notifications. You will need to add SMTP settings in the <em>Manage Jenkins &ndash;> System Configurations &ndash;> E-mail Notification</em>. After that just specify emails in the project settings.</p>

<p>If you want to run your rspec tests instead of cucumber, or run all together just change your build commands.</p>

<p>That&rsquo;s all, you are ready to go!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Faraday - using backup host for remote requests]]></title>
    <link href="http://dpsk.github.io/blog/2013/06/25/faraday-using-backup-host-for-remote-request/"/>
    <updated>2013-06-25T14:42:00+04:00</updated>
    <id>http://dpsk.github.io/blog/2013/06/25/faraday-using-backup-host-for-remote-request</id>
    <content type="html"><![CDATA[<p>Nowadays almost every Rails application interact with the remote service or API. The problem is that you can&rsquo;t fully trust those services and you forced to add a lot of test coverage and exception handling for this part of code. Once i worked with the API that had mirror server for case when the main one is unavailable. I write a middleware for <a href="https://github.com/lostisland/faraday">Faraday</a>, which will use backup host(provided by user) if the original one is unresponsive.</p>

<!--more-->


<p>First of all, what is Faraday? It&rsquo;s an awesome HTTP client library that provides a common interface over many adapters (such as Net::HTTP) and embraces the concept of Rack middleware when processing the request/response cycle. Middleware are classes that implement a call instance method. They hook into the request/response cycle. Our middleware will be hooked to the request cycle.</p>

<p>Now to our middleware. All we need from it is simple checking for errors, such as <code>Faraday::Error::TimeoutError</code> or <code>Faraday::ConnectionFailed</code>. If some errors from the list were araised, than we should switch request to the backup server. So let&rsquo;s jump to the code:</p>

<figure class='code'><figcaption><span>host_backup.rb </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='rb'><span class='line'><span class="k">def</span> <span class="nf">call</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
</span><span class='line'>  <span class="k">begin</span>
</span><span class='line'>    <span class="vi">@app</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">env</span><span class="p">)</span>
</span><span class='line'>  <span class="k">rescue</span> <span class="vi">@errmatch</span>
</span><span class='line'>    <span class="k">unless</span> <span class="n">env</span><span class="o">[</span><span class="ss">:url</span><span class="o">].</span><span class="n">host</span> <span class="o">==</span> <span class="vi">@options</span><span class="o">.</span><span class="n">host</span>
</span><span class='line'>      <span class="n">env</span><span class="o">[</span><span class="ss">:url</span><span class="o">].</span><span class="n">host</span> <span class="o">=</span> <span class="vi">@options</span><span class="o">.</span><span class="n">host</span>
</span><span class='line'>      <span class="k">retry</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">raise</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><code>call</code> is the main method for almost every faraday middleware. Here we just trying to catch any exception from the list, and switch the url of request if the exception was raised.</p>

<p>You can pass exception that you want to the <code>@errmatch</code> list. Here is the list of defaults:</p>

<figure class='code'><figcaption><span>host_backup.rb </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='rb'><span class='line'><span class="k">def</span> <span class="nf">exceptions</span>
</span><span class='line'> <span class="nb">Array</span><span class="p">(</span><span class="nb">self</span><span class="o">[</span><span class="ss">:exceptions</span><span class="o">]</span> <span class="o">||=</span> <span class="o">[</span><span class="ss">Errno</span><span class="p">:</span><span class="ss">:ETIMEDOUT</span><span class="p">,</span> <span class="s1">&#39;Timeout::Error&#39;</span><span class="p">,</span>
</span><span class='line'>                             <span class="ss">Faraday</span><span class="p">:</span><span class="ss">:ConnectionFailed</span><span class="p">,</span> <span class="ss">Faraday</span><span class="p">:</span><span class="ss">:Error</span><span class="o">::</span><span class="no">TimeoutError</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the end you can use this middleware like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<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="no">Faraday</span><span class="o">.</span><span class="n">new</span> <span class="k">do</span> <span class="o">|</span><span class="n">conn</span><span class="o">|</span>
</span><span class='line'>  <span class="n">conn</span><span class="o">.</span><span class="n">use</span> <span class="ss">FaradayMiddleware</span><span class="p">:</span><span class="ss">:HostBackup</span><span class="p">,</span> <span class="ss">host</span><span class="p">:</span> <span class="s2">&quot;backup-service.com&quot;</span><span class="p">,</span>
</span><span class='line'>                                          <span class="ss">exceptions</span><span class="p">:</span> <span class="o">[</span><span class="no">CustomException</span><span class="p">,</span> <span class="s1">&#39;Timeout::Error&#39;</span><span class="o">]</span>
</span><span class='line'>  <span class="n">conn</span><span class="o">.</span><span class="n">adapter</span> <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can grab this middleware from my <a href="https://github.com/dpsk/faraday_middleware/blob/22304990ca7c439cba23fd04d0b100d2fb221f34/lib/faraday_middleware/request/host_backup.rb">repository</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Connecting rails project with multiple databases]]></title>
    <link href="http://dpsk.github.io/blog/2013/06/21/connecting-rails-project-with-multiple-databases/"/>
    <updated>2013-06-21T16:22:00+04:00</updated>
    <id>http://dpsk.github.io/blog/2013/06/21/connecting-rails-project-with-multiple-databases</id>
    <content type="html"><![CDATA[<p>I want to share my experience with multiple database and Rails 3.2 application. Today on one of my project i was in need to implement support ticketing system. Database for this system was already working for a good amount of time, so i was forced to use it as a source. So let&rsquo;s start, first of all we should create base class in the <code>/app/models/</code>, so we can inherit models, that will use external database as source.</p>

<figure class='code'><figcaption><span>app/models/support_base.rb </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='rb'><span class='line'><span class="k">class</span> <span class="nc">SupportBase</span> <span class="o">&lt;</span> <span class="ss">ActiveRecord</span><span class="p">:</span><span class="ss">:Base</span>
</span><span class='line'>
</span><span class='line'>  <span class="nb">self</span><span class="o">.</span><span class="n">abstract_class</span> <span class="o">=</span> <span class="kp">true</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">databases</span> <span class="o">=</span> <span class="ss">YAML</span><span class="p">:</span><span class="ss">:load</span><span class="p">(</span><span class="no">IO</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">&#39;config/database_support.yml&#39;</span><span class="p">))</span>
</span><span class='line'>  <span class="n">establish_connection</span><span class="p">(</span><span class="n">databases</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="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>




<!--more-->


<p>The <code>self.abstract_class = true</code> tells Active Record to not look up for a table, since this class is only used to add customm settings we don&rsquo;t need any database table for it.</p>

<p>After that we should create a databases.rake file that will wrap database tasks for external database.</p>

<figure class='code'><figcaption><span>lib/tasks/databases.rake </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>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">namespace</span> <span class="ss">:support</span> <span class="k">do</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">desc</span> <span class="s2">&quot;Configure the variables that rails need in order to look up for the db</span>
</span><span class='line'><span class="s2">    configuration in a different folder&quot;</span>
</span><span class='line'>  <span class="n">task</span> <span class="ss">:set_custom_db_config_paths</span> <span class="k">do</span>
</span><span class='line'>    <span class="c1"># This is the minimum required to tell rails to use a different location</span>
</span><span class='line'>    <span class="c1"># for all the files related to the database.</span>
</span><span class='line'>    <span class="no">ENV</span><span class="o">[</span><span class="s1">&#39;SCHEMA&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="s1">&#39;db_support/schema.rb&#39;</span>
</span><span class='line'>    <span class="no">Rails</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">paths</span><span class="o">[</span><span class="s1">&#39;db&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="o">[</span><span class="s1">&#39;db_support&#39;</span><span class="o">]</span>
</span><span class='line'>    <span class="no">Rails</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">paths</span><span class="o">[</span><span class="s1">&#39;db/migrate&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="o">[</span><span class="s1">&#39;db_support/migrate&#39;</span><span class="o">]</span>
</span><span class='line'>    <span class="no">Rails</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">paths</span><span class="o">[</span><span class="s1">&#39;db/seeds&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="o">[</span><span class="s1">&#39;db_support/seeds.rb&#39;</span><span class="o">]</span>
</span><span class='line'>    <span class="no">Rails</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">paths</span><span class="o">[</span><span class="s1">&#39;config/database&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="o">[</span><span class="s1">&#39;config/database_support.yml&#39;</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">namespace</span> <span class="ss">:db</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">task</span> <span class="ss">:drop</span> <span class="o">=&gt;</span> <span class="ss">:set_custom_db_config_paths</span> <span class="k">do</span>
</span><span class='line'>      <span class="ss">Rake</span><span class="p">:</span><span class="ss">:Task</span><span class="o">[</span><span class="s2">&quot;db:drop&quot;</span><span class="o">].</span><span class="n">invoke</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">task</span> <span class="ss">:create</span> <span class="o">=&gt;</span> <span class="ss">:set_custom_db_config_paths</span> <span class="k">do</span>
</span><span class='line'>      <span class="ss">Rake</span><span class="p">:</span><span class="ss">:Task</span><span class="o">[</span><span class="s2">&quot;db:create&quot;</span><span class="o">].</span><span class="n">invoke</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">task</span> <span class="ss">:migrate</span> <span class="o">=&gt;</span> <span class="ss">:set_custom_db_config_paths</span> <span class="k">do</span>
</span><span class='line'>      <span class="ss">Rake</span><span class="p">:</span><span class="ss">:Task</span><span class="o">[</span><span class="s2">&quot;db:migrate&quot;</span><span class="o">].</span><span class="n">invoke</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">task</span> <span class="ss">:rollback</span> <span class="o">=&gt;</span> <span class="ss">:set_custom_db_config_paths</span> <span class="k">do</span>
</span><span class='line'>      <span class="ss">Rake</span><span class="p">:</span><span class="ss">:Task</span><span class="o">[</span><span class="s2">&quot;db:rollback&quot;</span><span class="o">].</span><span class="n">invoke</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">task</span> <span class="ss">:seed</span> <span class="o">=&gt;</span> <span class="ss">:set_custom_db_config_paths</span> <span class="k">do</span>
</span><span class='line'>      <span class="ss">Rake</span><span class="p">:</span><span class="ss">:Task</span><span class="o">[</span><span class="s2">&quot;db:seed&quot;</span><span class="o">].</span><span class="n">invoke</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>    <span class="n">namespace</span> <span class="ss">:test</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">task</span> <span class="ss">:prepare</span> <span class="o">=&gt;</span> <span class="ss">:set_custom_db_config_paths</span> <span class="k">do</span>
</span><span class='line'>        <span class="ss">Rake</span><span class="p">:</span><span class="ss">:Task</span><span class="o">[</span><span class="s2">&quot;db:test:prepare&quot;</span><span class="o">].</span><span class="n">invoke</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="n">task</span> <span class="ss">:version</span> <span class="o">=&gt;</span> <span class="ss">:set_custom_db_config_paths</span> <span class="k">do</span>
</span><span class='line'>      <span class="ss">Rake</span><span class="p">:</span><span class="ss">:Task</span><span class="o">[</span><span class="s2">&quot;db:version&quot;</span><span class="o">].</span><span class="n">invoke</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>We basically get all the standart rake database tasks wrapped in the support namespace and redefine application paths, so rake will run this commands on the external database.</p>

<h2>Now, let&rsquo;s create files that we mention in this task:</h2>

<ul>
<li><code>db_support</code> folder in the root of application</li>
<li><code>db_support/migrate</code> folder for migrations</li>
<li><code>db_support/seeds.rb</code> file with the seeds for support database</li>
<li><code>config/database_support.yml</code> file with the settings for database connection</li>
</ul>


<p>Here is an example of <code>database_support.yml</code>:</p>

<figure class='code'><figcaption><span>config/database_support.yml </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='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">mysql2</span>
</span><span class='line'>  <span class="l-Scalar-Plain">database</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">support_development</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">username</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">user</span>
</span><span class='line'>  <span class="l-Scalar-Plain">password</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">password</span>
</span><span class='line'>
</span><span class='line'><span class="l-Scalar-Plain">test</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">mysql2</span>
</span><span class='line'>  <span class="l-Scalar-Plain">database</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">support_test</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">username</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">user</span>
</span><span class='line'>  <span class="l-Scalar-Plain">password</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">password</span>
</span><span class='line'>
</span><span class='line'><span class="l-Scalar-Plain">production</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">mysql2</span>
</span><span class='line'>  <span class="l-Scalar-Plain">database</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">partners_external</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">ip</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">192.168.1.1</span>
</span><span class='line'>  <span class="l-Scalar-Plain">port</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">3306</span>
</span><span class='line'>  <span class="l-Scalar-Plain">username</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">external_username</span>
</span><span class='line'>  <span class="l-Scalar-Plain">password</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">external_password</span>
</span></code></pre></td></tr></table></div></figure>


<p>The key is that you still want to use local database in the development and for the tests.</p>

<p>At this point we are pretty much done, now we can use commands like <code>bundle exec rake support:db:create</code> to create development and test database. We also still able to use <code>bundle exec rake db:migrate</code> for the default database.</p>

<p>This solution is pretty extensible, so it wouldn&rsquo;t be hard to add as much databases as you need.</p>
]]></content>
  </entry>
  
</feed>
