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

  <title><![CDATA[Alexander Beletsky's development blog]]></title>
  <link href="http://beletsky.net/atom.xml" rel="self"/>
  <link href="http://beletsky.net/"/>
  <updated>2020-02-26T11:31:59+01:00</updated>
  <id>http://beletsky.net/</id>
  <author>
    <name><![CDATA[Alexander Beletsky]]></name>
    <email><![CDATA[alexander.beletsky@gmail.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Your First Steps in a Front-end Developer Career]]></title>
    <link href="http://beletsky.net/2018/10/your-first-steps-in-a-front-end-developer-career.html"/>
    <updated>2018-10-05T14:50:00+02:00</updated>
    <id>http://beletsky.net/2018/10/your-first-steps-in-a-front-end-developer-career</id>
    <content type="html"><![CDATA[<p>A couple of weeks ago, I’ve been contacted by a friend of mine, who is just starting his career as a front-end developer.</p>

<p>It’s very typical when a start of the journey is <em>frustrating</em>, and there is nothing better than the advice from the people who already <strong>been there</strong>.</p>

<p>I never thought about that question carefully, but I formulated something quick for him. But later I decided to elaborate on it and share it with a bigger audience.</p>

<!-- MORE -->


<h2>There Is No Recipe</h2>

<p>The thing is &ndash; there is <strong>no just simple recipe</strong>. If there is, I guess it would sound like that &ndash; <em>&ldquo;practice, practice, practice&rdquo;</em>.</p>

<p>It’s not a secret that you have to dedicate much time to your craft. And I really mean a lot.</p>

<p>If you are starting your career and be lucky enough to have a job, you have to come back home and work on side projects. If you are a student, you come back after the school and work on side projects, watch courses and read good books.</p>

<p>Through my career, I realized, it were the side projects which contributed to my experience <strong>the most</strong>.</p>

<p>Here is the thing, at the workplace you have to perform. At the work, you have a lot of constraints &ndash; existing codebase, architecture, set of libraries and frameworks, the team rules, etc.</p>

<p>It’s not always an educational environment at the workplace. You have to solve business goals, not primarily to educate yourself. Rarely, both things are coming in parallel, but it’s rather an exceptional case.</p>

<p>So, prepare yourself mentally <strong>to work a lot</strong> and spend evenings with your IDE opened, instead of watching a favorite series on Netflix or going out (even thought, it&rsquo;s also very important to do from time to time).</p>

<h2>JavaScript Foundation</h2>

<p>JavaScript is the <strong>assembly language</strong> of the web. Without a proper understanding of the language, you have nothing to do in the front-end world.</p>

<p>The good news is, you don’t have to be <em>Douglas Crockford</em> to be a successful developer. I’ll tell you what &ndash; I’ve spent quite sometime in the profession, but details of language opened up to me <strong>way later</strong>. It&rsquo;s totally normal if you don&rsquo;t understand the depths of language. It will come.</p>

<p>However, there a <strong>fundamental parts</strong> that you have to be very comfortable with:</p>

<ul>
<li>Data types</li>
<li>Arithmetic operations</li>
<li>Boolean and conditional operators</li>
<li>Understanding of OOP paradigm (prototypical inheritance)</li>
<li>Understanding of functional paradigm (functors, applicators, immutability)</li>
</ul>


<p>I also recommend, to start learning Node.js directly.</p>

<p>All modern tools for front-end require Node.js. Developing simple applications and running than from command line is way more convenient comparing of dealing with the browser.</p>

<h2>Browsers and DOM</h2>

<p>Besides that, you should be able to understand how <strong>browsers work</strong> and in particular understand the concept of the DOM.</p>

<ul>
<li>How DOM functions and it’s basic components</li>
<li>Events, events propagation, and handlers</li>
<li>DOM API, window object</li>
<li>DOM selectors</li>
</ul>


<p>Here you should be able to write simple, pure JavaScript applications by listens to controls and perform simple DOM manipulations, as setting values, classes, properties.</p>

<h2>UI Development</h2>

<p>In my career, I came from backend and desktop applications UI and the first sight HTML, and CSS seems to be easy. It&rsquo;s not even a real programming language, just a set of declarations, right? Not really.</p>

<p>Even if your goal is not to be a designer, you should develop useful skills and a taste for <strong>good design</strong>. So the best thing to do is to steal cool ideas.</p>

<p>No kidding, just pick up the site you like the most and try to copy it. Remember, the famous guy said &ndash; «Un artista copia, un gran artista roba» (Good artists copy, great artists steal).</p>

<p>Make your hands dirty with HTML &amp; CSS.</p>

<p>Be fluent in creating, simple and good looking interfaces. Find a freelance job of turning PSD or Sketch into HTML / CSS. You will get exceptionally important skills.</p>

<h2>Client / Server Communication</h2>

<p>Browser applications don’t exist in isolation. They do talk to servers to get the data and push data back.</p>

<p>Without going too crazy, you will hugely benefit from understanding the following things:</p>

<ul>
<li>Basics of the HTTP protocol</li>
<li>The concept of REST (HTTP verbs and resources)</li>
<li><code>fetch</code> API</li>
<li>Optionally: the concept of GraphQL and how it differs from REST</li>
</ul>


<p>There are tons of open API’s you can do <strong>cool stuff</strong> with. Pick one and build the simple application against it.</p>

<p>I remember one of the projects I did <a href="https://github.com/alexbeletsky/github-commits-widget">alexbeletsky/github-commits-widget</a>. A simple app that connects to Github API and makes a widget of contributions to a project. I had a lot of fun with it.</p>

<h2>Development Frameworks</h2>

<p>And only after the first three parts, which on its own might take a year, or even more I would suggest you take a look at some UI development framework.</p>

<p>The JS ecosystem is famous to create <em>“fatigue”</em>. Tools are complex, configurations are confusing, don’t start with React or Angular, just because you heard that they are cool.</p>

<p>Maybe till the time you are comfortable with JS/HTML/CSS those things are dead already (front-end development framework has a tendency to survive for 3-5 years and then entirely overtaken by competitors.. don’t bother with that race).</p>

<p>However, if you are reading the article 2018, I would recommend you to focus on React.js. The ecosystem is stable, million of tutorials, open source projects, meetups. You won’t feel the lack of information, that’s for sure.</p>

<p>Having all three parts behind your shoulders will make you <strong>confident</strong> with any front-end frameworks because all of them are designed to simplify complicated things or making things more performant. The foundation of development, as DOM manipulations, HTML/CSS would remain the same.</p>

<p>Even if the framework could encapsulate any particular detail, you will be confident enough to understand, what’s <strong>actually going</strong> on there.</p>

<p>At the end I would just share the list of resources that helped or influenced me during my own journey:</p>

<ul>
<li><a href="https://devchat.tv/js-jabber/">JavaScript Jabber Podcast</a></li>
<li><a href="https://eloquentjavascript.net/">Eloquent JavaScript Book</a></li>
<li><a href="http://shop.oreilly.com/product/9780596517748.do">JavaScript: The Good Parts</a></li>
<li><a href="https://reactpodcast.simplecast.fm/">React Podcast</a></li>
<li><a href="https://egghead.io/">EggHead Video Courses</a></li>
</ul>


<p>Hope you find that helpful and I wish you the best in this interesting and exciting journey!</p>

<p>Enjoy the ride.</p>

<p><small>
<em>Originally published on <a href="https://medium.com/blogfoster-engineering/your-first-steps-in-a-front-end-developer-career-8b792771c857">Medium</a> in <a href="https://medium.com/blogfoster-engineering">Product &amp; Engineering blogfoster blog</a></em>
</small></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Redux For Better in-App Analytics]]></title>
    <link href="http://beletsky.net/2016/07/redux-for-better-in-app-analytics.html"/>
    <updated>2016-07-01T14:50:00+02:00</updated>
    <id>http://beletsky.net/2016/07/redux-for-better-in-app-analytics</id>
    <content type="html"><![CDATA[<p>Lean startup, the term coined by Eric Ries, affected the way we build new products and services. Essentially, it says that every business idea has to be turned to a series of testable <em>hypotheses</em>. Based on these hypotheses we <strong>build</strong> or introduce the changes to existing products. Those changes have to be <strong>measurable</strong>, so we collect the results of actions we did. Based on results we prove or disapprove particular hypothesis. During the cycle, we derive <strong>learnings</strong>, these learnings give a foundation for a next <em>Build-Measure-Learn</em> cycle.</p>

<!-- MORE -->


<p>For web-based products, measurements typically mean collecting of different user behavior metrics. Based on these metrics we can see, what users are <em>doing</em> in the application, their behavior has a direct influence on a product.</p>

<p>Many projects I participated, had &ldquo;Add Analytics&rdquo; as a bottom-most task in development backlog. Ignoring the task, made it hard to implement later stages. You need something like <code>analytics.trackEvent('something happened', { data: 123 });</code> in many places, making code looks ugly and quite easy to miss some important details.</p>

<h2>Redux</h2>

<p>In my <a href="http://engineering.blogfoster.com/the-functional-approach-to-ui/">previous</a> article, I already mentioned the Redux similarities to <a href="http://martinfowler.com/eaaDev/EventSourcing.html">Event Sourcing</a> architecture paradigm. One of the most interesting side-effects of Event Sourcing is <code>Audit Log</code>.</p>

<p>Audit Log gives you an ability to look back and see what happened. As the original idea of Redux, it allows you travel back in time.</p>

<p>If you follow Redux rules, everything that happens in your application is represented as an <code>action</code>. In terms of analytics, it means you <em>already</em> have all events defined, you don&rsquo;t need to find the place where to inject <code>analytics.trackEvent()</code> code.</p>

<p>Take a look into this 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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kr">import</span> <span class="p">{</span> <span class="nx">createConstants</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;../utils&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="kr">const</span> <span class="nx">constants</span> <span class="o">=</span> <span class="nx">createConstants</span><span class="p">(</span>
</span><span class='line'>  <span class="c1">// account actions</span>
</span><span class='line'>  <span class="s1">&#39;ACCOUNT_FORM_RESET&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;ACCOUNT_FORM_CHANGE&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;ACCOUNT_FORM_ERRORS&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;ACCOUNT_FORM_ERRORS_CLEAN&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;ACCOUNT_ACCESS_TOKEN_FETCHING&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;ACCOUNT_ACCESS_TOKEN_FETCHED&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;ACCOUNT_ACCESS_TOKEN_FETCH_FAILED&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;ACCOUNT_EMAIL_CONFIRMED&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;ACCOUNT_EMAIL_CONFIRMATION_FAILED&#39;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// create website actions</span>
</span><span class='line'>  <span class="s1">&#39;CREATE_WEBSITE_BLOG_URL_CHANGED&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;CREATE_WEBSITE_BLOG_TITLE_CHANGED&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;CREATE_WEBSITE_BLOG_TITLE_RESOLVE_FAILED&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;CREATE_WEBSITE_STATE_LOADING&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;CREATE_WEBSITE_STATE_LOADED&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;CREATE_WEBSITE_WIZARD_STEP_NEXT&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;CREATE_WEBSITE_WIZARD_STEP_PREV&#39;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// ...</span>
</span></code></pre></td></tr></table></div></figure>


<p>Those are constants for action types. Our goal is to turn those action types, into meaningful analytics events.</p>

<h2>Analytics Server</h2>

<p>At blogfoster, we are using custom analytics solution. Essentially it&rsquo;s an HTTP API, which receives an event and stores and distributes it for further processing. It makes it easy from integration perspective both for the web and mobile clients.</p>

<p>Even the back-end is quite complex there, the interface is rather simple,</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='js'><span class='line'><span class="nx">HTTP</span> <span class="nx">POST</span> <span class="o">/</span><span class="nx">v1</span><span class="o">/</span><span class="nx">event</span>
</span><span class='line'>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="nx">eventType</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">payload</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Middleware</h2>

<p>If you have worked with <a href="http://expressjs.com/">Express.js</a> or <a href="http://koajs.com/">Koa.js</a> frameworks, then you should already be familiar with a <em>middleware</em> concept. Middlewares are functions that could be injected into response-request pipeline and designed to produce different side-effects (e.g. request modification, logging, redirections, performance measurements, etc.)</p>

<p>Redux introduces the concept of middleware as well, which makes library not only flexible but applicable for <em>real-world</em> applications. We know that Redux is essentially all about synchronous workflow, but the nature of web applications is asynchronous (events, client/server communications) and this is where middleware shines.</p>

<p>The API of Redux middleware is pretty elegant; it&rsquo;s not hard to implement own functions. If we inject the function, that can analyze the action and send data to analytics server, we will reach our goal, without touching any application logic.</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='js'><span class='line'><span class="kr">import</span> <span class="p">{</span> <span class="nx">client</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;../analytics&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="kr">const</span> <span class="nx">handleAction</span> <span class="o">=</span> <span class="p">(</span><span class="nx">store</span><span class="p">,</span> <span class="nx">next</span><span class="p">,</span> <span class="nx">action</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">action</span><span class="p">.</span><span class="nx">meta</span> <span class="o">||</span> <span class="o">!</span><span class="nx">action</span><span class="p">.</span><span class="nx">meta</span><span class="p">.</span><span class="nx">analytics</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="nx">next</span><span class="p">(</span><span class="nx">action</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kr">const</span> <span class="p">{</span> <span class="nx">eventType</span><span class="p">,</span> <span class="nx">eventPayload</span> <span class="p">}</span> <span class="o">=</span> <span class="nx">action</span><span class="p">.</span><span class="nx">meta</span><span class="p">.</span><span class="nx">analytics</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">client</span><span class="p">(</span><span class="nx">options</span><span class="p">).</span><span class="nx">track</span><span class="p">(</span><span class="nx">eventType</span><span class="p">,</span> <span class="nx">eventPayload</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">next</span><span class="p">(</span><span class="nx">action</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kr">export</span> <span class="kd">function</span> <span class="nx">createAnalytics</span><span class="p">(</span><span class="nx">options</span> <span class="o">=</span> <span class="p">{})</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">store</span> <span class="o">=&gt;</span> <span class="nx">next</span> <span class="o">=&gt;</span> <span class="nx">action</span> <span class="o">=&gt;</span> <span class="nx">handleAction</span><span class="p">(</span><span class="nx">store</span><span class="p">,</span> <span class="nx">next</span><span class="p">,</span> <span class="nx">action</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, the <code>handleAction()</code> function checks, if there is <code>meta</code> data related to <code>analytics</code> exists in action, it will pass it to <code>client</code> that would when to make HTTP request to analytics server.</p>

<h2>Configuring store</h2>

<p>We need to apply middleware function now, it&rsquo;s done via <code>applyMiddleware()</code> Redux helper,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<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='js'><span class='line'><span class="kr">import</span> <span class="p">{</span> <span class="nx">createStore</span><span class="p">,</span> <span class="nx">applyMiddleware</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;redux&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kr">import</span> <span class="p">{</span> <span class="nx">createAnalytics</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;../middleware&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="kr">const</span> <span class="nx">middlewares</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>  <span class="nx">thunk</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">createLogger</span><span class="p">(),</span>
</span><span class='line'>  <span class="nx">createAnalytics</span><span class="p">({</span> <span class="nx">host</span><span class="o">:</span> <span class="s1">&#39;ANALYTICS_HOST&#39;</span><span class="p">,</span> <span class="nx">token</span><span class="o">:</span> <span class="s1">&#39;ANALYTICS_TOKEN&#39;</span> <span class="p">})</span>
</span><span class='line'><span class="p">];</span>
</span><span class='line'>
</span><span class='line'><span class="kr">const</span> <span class="nx">enchancer</span> <span class="o">=</span> <span class="nx">applyMiddleware</span><span class="p">(...</span><span class="nx">middlewares</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kr">export</span> <span class="k">default</span> <span class="kd">function</span> <span class="nx">configureStore</span><span class="p">(</span><span class="nx">rootReducer</span><span class="p">,</span> <span class="nx">initialState</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">createStore</span><span class="p">(</span><span class="nx">rootReducer</span><span class="p">,</span> <span class="nx">initialState</span><span class="p">,</span> <span class="nx">enchancer</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Augmenting Actions</h2>

<p>I came up with a small utility function, to minimize modification of existing action creators as much as possible,</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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kr">import</span> <span class="nx">constants</span> <span class="nx">from</span> <span class="s1">&#39;../../constants&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="kr">export</span> <span class="kd">function</span> <span class="nx">loadedDashboardState</span><span class="p">(</span><span class="nx">website</span><span class="p">,</span> <span class="nx">status</span><span class="p">,</span> <span class="nx">news</span><span class="p">,</span> <span class="nx">revenues</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">trackable</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">type</span><span class="o">:</span> <span class="nx">constants</span><span class="p">.</span><span class="nx">DASHBOARD_STATE_LOADED</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">payload</span><span class="o">:</span> <span class="p">{</span> <span class="nx">website</span><span class="p">,</span> <span class="nx">status</span><span class="p">,</span> <span class="nx">news</span><span class="p">,</span> <span class="nx">revenues</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>      <span class="s1">&#39;Dashboard opened&#39;</span><span class="p">,</span>      <span class="c1">// &lt;- event name</span>
</span><span class='line'>      <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="nx">website</span><span class="p">.</span><span class="nx">name</span> <span class="p">}</span>   <span class="c1">// &lt;- additional event data</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kr">export</span> <span class="kd">function</span> <span class="nx">loadingDashboardStateFailed</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">resp</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">trackable</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">type</span><span class="o">:</span> <span class="nx">constants</span><span class="p">.</span><span class="nx">DASHBOARD_STATE_LOADING_FAILED</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">payload</span><span class="o">:</span> <span class="p">{</span> <span class="nx">err</span><span class="p">,</span> <span class="nx">resp</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>      <span class="s1">&#39;Dashboard loading failed&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="p">{</span> <span class="nx">error</span><span class="o">:</span> <span class="nx">resp</span><span class="p">.</span><span class="nx">text</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Where <code>trackable()</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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kr">export</span> <span class="kd">function</span> <span class="nx">trackable</span><span class="p">(</span><span class="nx">action</span><span class="p">,</span> <span class="nx">event</span><span class="p">,</span> <span class="nx">properties</span> <span class="o">=</span> <span class="p">{})</span> <span class="p">{</span>
</span><span class='line'>  <span class="kr">const</span> <span class="nx">analytics</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">eventType</span><span class="o">:</span> <span class="nx">event</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">eventPayload</span><span class="o">:</span> <span class="nx">properties</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="p">{</span> <span class="p">...</span><span class="nx">action</span><span class="p">,</span> <span class="nx">meta</span><span class="o">:</span> <span class="p">{</span> <span class="nx">analytics</span> <span class="p">}</span> <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&rsquo;s it. Now go through all action creators and wrap actions you need to log into <code>trackable()</code> function, so they became trackable, and middleware would send them to the analitycs server.</p>

<h2>Recap</h2>

<p>Even if you don&rsquo;t think about analytics from the very beginning, Redux architecture allows you to plug it in whenever you want (or need it). Based on <code>Audit Log</code> you can watch and turn actions into corresponding analytics events. Middleware functions would allow to hook all actions and turn them into analytical events.</p>

<p><strong>PS</strong>. During my writing time, developers from <a href="https://github.com/rangle">Rangle.io</a> participated <em>React-Europe</em> conference and gave a nice talk about the topic above. So, I would recommend you to <a href="https://www.youtube.com/watch?v=MBTgiMLujek">check it out</a> for further details.</p>

<p><em>Originally published at <a href="http://engineering.blogfoster.com/redux-for-better-in-app-analytics/">blogfoster Engineering</a>.</em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Higher Order Components: Theory and Practice]]></title>
    <link href="http://beletsky.net/2016/05/higher-order-components-theory-and-practice.html"/>
    <updated>2016-05-07T14:47:00+02:00</updated>
    <id>http://beletsky.net/2016/05/higher-order-components-theory-and-practice</id>
    <content type="html"><![CDATA[<p>What I enjoy the most working with React.js is its <a href="http://engineering.blogfoster.com/the-functional-approach-to-ui/">functional approach</a> for building UI&rsquo;s. Everything you see on a screen is essentially a component. Components are <em>composed</em> of other components, making complex interfaces possible.</p>

<p>Higher-order components concept goes back to <a href="https://en.wikipedia.org/wiki/Higher-order_function">higher-order functions</a>, <em>functional programming</em> concept, describing the function that takes other function(s) and returns a function. In exactly the same way, higher-order component takes another component(s) and return a component.</p>

<p>Where might it be useful? Let’s consider a few practical cases.</p>

<!-- MORE -->


<h2>Authentication and Authorization</h2>

<p>Web applications have different areas, which are accessible depending on user’s authentication and access control.</p>

<p>There are <em>guest</em> routes, like <code>/signup</code>, <code>/signin</code>, <code>/forgot-password</code> etc, as well as <em>private</em> routes, <code>/dashboard</code>, <code>/user-profile</code> and so on.</p>

<p>For example,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kr">const</span> <span class="nx">routes</span> <span class="o">=</span> <span class="p">(</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/signup&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">SignUp</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/signin&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">SignIn</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/welcome-on-board&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">Welcome</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/forgot-password&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">ForgotPassword</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/signout&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">SignOut</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">App</span><span class="p">}</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;dashboard&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;dashboard&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">Dashboard</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;profile&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;user-profile&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">UserProfile</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="err">/Route&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;*&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">FourOFour</span><span class="p">}</span> <span class="nx">status</span><span class="o">=</span><span class="p">{</span><span class="mi">404</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="err">/Route&gt;</span>
</span><span class='line'><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>What we want to do: Everything under <code>/</code> URL is protected from unauthorized access.</p>

<p>One solution could be to extend <code>App</code> itself, with <code>componentDidMount</code> and <code>componentDidUpdate</code> and check if the user is authenticated. If not, redirect the user to <code>/signin</code>. It sounds right from the very beginning, but this solution has two drawbacks.</p>

<p>Firstly, it violates the <em>single responsibility</em> principle, what now mixes up functionality to <code>App</code> component, that originally doesn’t belong to it. And secondly, in case we want to introduce another route with similar behavior, that logic has to be present there as well, that would lead to some code duplications.</p>

<p>Let’s introduce a higher-order component for that,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<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='js'><span class='line'><span class="kr">import</span> <span class="nx">React</span><span class="p">,</span> <span class="p">{</span> <span class="nx">PropTypes</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;react&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kr">import</span> <span class="p">{</span> <span class="nx">connect</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;react-redux&#39;</span><span class="p">;</span>
</span><span class='line'><span class="kr">import</span> <span class="p">{</span> <span class="nx">push</span> <span class="p">}</span> <span class="nx">from</span> <span class="s1">&#39;react-router-redux&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="kr">export</span> <span class="k">default</span> <span class="kd">function</span> <span class="nx">requiresAuth</span><span class="p">(</span><span class="nx">Component</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kr">class</span> <span class="nx">AuthenticatedComponent</span> <span class="kr">extends</span> <span class="nx">React</span><span class="p">.</span><span class="nx">Component</span> <span class="p">{</span>
</span><span class='line'>    <span class="kr">static</span> <span class="nx">propTypes</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">user</span><span class="o">:</span> <span class="nx">PropTypes</span><span class="p">.</span><span class="nx">object</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">dispatch</span><span class="o">:</span> <span class="nx">PropTypes</span><span class="p">.</span><span class="nx">func</span><span class="p">.</span><span class="nx">isRequired</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">componentDidMount</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">_checkAndRedirect</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">componentDidUpdate</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">_checkAndRedirect</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">_checkAndRedirect</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="kr">const</span> <span class="p">{</span> <span class="nx">dispatch</span> <span class="p">}</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</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="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">user</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">dispatch</span><span class="p">(</span><span class="nx">push</span><span class="p">(</span><span class="s1">&#39;/signin&#39;</span><span class="p">));</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">render</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="p">(</span>
</span><span class='line'>        <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&quot;authenticated&quot;</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="p">{</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">user</span> <span class="o">?</span> <span class="o">&lt;</span><span class="nx">Component</span> <span class="p">{...</span><span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">}</span> <span class="o">/&gt;</span> <span class="o">:</span> <span class="kc">null</span> <span class="p">}</span>
</span><span class='line'>        <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span><span class='line'>      <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kr">const</span> <span class="nx">mapStateToProps</span> <span class="o">=</span> <span class="p">(</span><span class="nx">state</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">user</span><span class="o">:</span> <span class="nx">state</span><span class="p">.</span><span class="nx">account</span><span class="p">.</span><span class="nx">user</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">connect</span><span class="p">(</span><span class="nx">mapStateToProps</span><span class="p">)(</span><span class="nx">AuthenticatedComponent</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>We are using Redux here, but in general, the concept doesn’t depend on Redux at all.</p>

<p>So, <code>requiresAuth</code> is a function that takes <code>Component</code> and returns <code>AuthenticatedComponent</code>. <code>AuthenticatedComponent</code> wraps the original component, plus it checks if the user already authenticated, in case he is not, it will redirect to <code>/signup</code>.</p>

<p>Updated routing,</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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kr">const</span> <span class="nx">routes</span> <span class="o">=</span> <span class="p">(</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/signup&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">SignUp</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/signin&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">SignIn</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/welcome-on-board&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">Welcome</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/forgot-password&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">ForgotPassword</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/signout&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">SignOut</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="cm">/* App component is wrapped with requiresAuth()  */</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/app&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">requiresAuth</span><span class="p">(</span><span class="nx">App</span><span class="p">)}</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;dashboard&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;dashboard&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">Dashboard</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;profile&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;user-profile&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">UserProfile</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="err">/Route&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/config&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">requiresAuth</span><span class="p">(</span><span class="nx">Config</span><span class="p">)}</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;page&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;page&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">PageConfig</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="err">/Route&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;*&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">FourOFour</span><span class="p">}</span> <span class="nx">status</span><span class="o">=</span><span class="p">{</span><span class="mi">404</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="err">/Route&gt;</span>
</span><span class='line'><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>By extending <code>requiresAuth</code> with additional parameters, it’s very easy to add some ACL functionality,</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='javascript'><span class='line'><span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/app&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">requiresAuth</span><span class="p">(</span><span class="nx">App</span><span class="p">,</span> <span class="p">{</span> <span class="nx">role</span><span class="o">:</span> <span class="s1">&#39;user&#39;</span><span class="p">,</span> <span class="nx">redirectTo</span><span class="o">:</span> <span class="s1">&#39;/signin&#39;</span> <span class="p">})}</span><span class="o">&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;dashboard&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;dashboard&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">Dashboard</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;invoices&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;user-profile&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">UserProfile</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="err">/Route&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/config&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">requiresAuth</span><span class="p">(</span><span class="nx">Config</span><span class="p">,</span> <span class="p">{</span> <span class="nx">role</span><span class="o">:</span> <span class="s1">&#39;admin&#39;</span><span class="p">,</span> <span class="nx">redirectTo</span><span class="o">:</span> <span class="s1">&#39;/app&#39;</span> <span class="p">})}</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;page&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;page&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">PageConfig</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="err">/Route&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, <code>_checkAndRedirect()</code> function is modified to take a role into account,</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='javascript'><span class='line'><span class="nx">_checkAndRedirect</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kr">const</span> <span class="p">{</span> <span class="nx">dispatch</span><span class="p">,</span> <span class="nx">user</span> <span class="p">}</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">;</span>
</span><span class='line'>  <span class="kr">const</span> <span class="p">{</span> <span class="nx">role</span><span class="p">,</span> <span class="nx">redirectTo</span> <span class="p">}</span>  <span class="o">=</span> <span class="nx">options</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="nx">user</span> <span class="o">||</span> <span class="o">!</span><span class="nx">user</span><span class="p">.</span><span class="nx">role</span> <span class="o">===</span> <span class="nx">role</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">dispatch</span><span class="p">(</span><span class="nx">push</span><span class="p">(</span><span class="nx">redirectTo</span> <span class="o">||</span> <span class="s1">&#39;/signin&#39;</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>Redirections</h2>

<p>Another case is a redirection of a user. A redirect is forced for some users in specific conditions. For instance, we might want a user to complete some actions during his onboarding, and prevent access to a particular route, if these actions are not completed.</p>

<p>Otherwise, if onboarding is completed, we want to redirect a user to the dashboard.</p>

<p>To make it possible, we introduce <code>checkBoarding()</code> function and a corresponding <code>CompletedComponent</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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kr">export</span> <span class="k">default</span> <span class="kd">function</span> <span class="nx">checkBoarded</span><span class="p">(</span><span class="nx">Component</span><span class="p">,</span> <span class="p">{</span> <span class="nx">withValue</span><span class="p">,</span> <span class="nx">redirectTo</span> <span class="p">})</span> <span class="p">{</span>
</span><span class='line'>  <span class="kr">class</span> <span class="nx">CompletedComponent</span> <span class="kr">extends</span> <span class="nx">React</span><span class="p">.</span><span class="nx">Component</span> <span class="p">{</span>
</span><span class='line'>    <span class="kr">static</span> <span class="nx">propTypes</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">state</span><span class="o">:</span> <span class="nx">PropTypes</span><span class="p">.</span><span class="nx">object</span><span class="p">.</span><span class="nx">isRequired</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">dispatch</span><span class="o">:</span> <span class="nx">PropTypes</span><span class="p">.</span><span class="nx">func</span><span class="p">.</span><span class="nx">isRequired</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">componentDidMount</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">_checkAndRedirect</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">componentDidUpdate</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">_checkAndRedirect</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">_checkAndRedirect</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="kr">const</span> <span class="p">{</span> <span class="nx">dispatch</span> <span class="p">}</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_shouldRedirect</span><span class="p">())</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">dispatch</span><span class="p">(</span><span class="nx">push</span><span class="p">(</span><span class="nx">redirectTo</span><span class="p">));</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">_shouldRedirect</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">user</span><span class="p">.</span><span class="nx">boarded</span> <span class="o">===</span> <span class="nx">withValue</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">render</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="p">(</span>
</span><span class='line'>        <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&quot;boarded&quot;</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="p">{</span> <span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">_shouldRedirect</span><span class="p">()</span> <span class="o">?</span> <span class="o">&lt;</span><span class="nx">Component</span> <span class="p">{...</span><span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">}</span> <span class="o">/&gt;</span> <span class="o">:</span> <span class="kc">null</span> <span class="p">}</span>
</span><span class='line'>        <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span><span class='line'>      <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kr">const</span> <span class="nx">mapStateToProps</span> <span class="o">=</span> <span class="p">(</span><span class="nx">state</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">state</span><span class="o">:</span> <span class="nx">state</span><span class="p">.</span><span class="nx">account</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">connect</span><span class="p">(</span><span class="nx">mapStateToProps</span><span class="p">)(</span><span class="nx">CompletedComponent</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Routing,</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='javascript'><span class='line'><span class="kr">const</span> <span class="nx">routes</span> <span class="o">=</span> <span class="p">(</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/signup&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">SignUp</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/signin&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">SignIn</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// applied here..</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/welcome-on-board&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">checkBoarded</span><span class="p">(</span><span class="nx">Welcome</span><span class="p">,</span> <span class="p">{</span> <span class="nx">withValue</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">redirectTo</span><span class="o">:</span> <span class="s1">&#39;/app/dashboard&#39;</span><span class="p">})</span> <span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/forgot-password&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">ForgotPassword</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/signout&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">SignOut</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// .. and here</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/app&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">checkBoarded</span><span class="p">(</span><span class="nx">requiresAuth</span><span class="p">(</span><span class="nx">App</span><span class="p">),</span> <span class="p">{</span> <span class="nx">withValue</span><span class="o">:</span> <span class="kc">false</span><span class="o">:</span> <span class="nx">redirectTo</span><span class="o">:</span> <span class="s1">&#39;/welcome-on-board&#39;</span> <span class="p">})}</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;dashboard&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;dashboard&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">Dashboard</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;profile&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;user-profile&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">UserProfile</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="err">/Route&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/config&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">requiresAuth</span><span class="p">(</span><span class="nx">Config</span><span class="p">)}</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;page&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;page&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">PageConfig</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="err">/Route&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;*&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">FourOFour</span><span class="p">}</span> <span class="nx">status</span><span class="o">=</span><span class="p">{</span><span class="mi">404</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="err">/Route&gt;</span>
</span><span class='line'><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Setting up context</h2>

<p>Some routes (or more typically, group of routes), require some data context. Say, <code>/website/1</code> and <code>/website/1/banners</code>, <code>/websites/1/revenues</code> all requires that website with <code>id:1</code> is loaded and available as part of the state.</p>

<p>Instead of loading the same data in each component, we might use higher-order component.</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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kr">export</span> <span class="k">default</span> <span class="kd">function</span> <span class="nx">websiteContext</span><span class="p">(</span><span class="nx">Component</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kr">class</span> <span class="nx">WebsiteContextComponent</span> <span class="kr">extends</span> <span class="nx">React</span><span class="p">.</span><span class="nx">Component</span> <span class="p">{</span>
</span><span class='line'>    <span class="kr">static</span> <span class="nx">propTypes</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">dispatch</span><span class="o">:</span> <span class="nx">PropTypes</span><span class="p">.</span><span class="nx">func</span><span class="p">.</span><span class="nx">isRequired</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">state</span><span class="o">:</span> <span class="nx">PropTypes</span><span class="p">.</span><span class="nx">object</span><span class="p">.</span><span class="nx">isRequire</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">params</span><span class="o">:</span> <span class="nx">PropTypes</span><span class="p">.</span><span class="nx">shape</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">websiteId</span><span class="o">:</span> <span class="nx">PropTypes</span><span class="p">.</span><span class="nx">string</span><span class="p">.</span><span class="nx">isRequired</span>
</span><span class='line'>      <span class="p">})</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">componentDidMount</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">_setCurrentWebsite</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">componentDidUpdate</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">this</span><span class="p">.</span><span class="nx">_setCurrentWebsite</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">_setCurrentWebsite</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="kr">const</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">dispatch</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">params</span><span class="o">:</span> <span class="p">{</span> <span class="nx">websiteId</span> <span class="p">},</span>
</span><span class='line'>        <span class="nx">state</span><span class="o">:</span> <span class="p">{</span> <span class="nx">websites</span> <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// prepare context data here..</span>
</span><span class='line'>      <span class="kr">const</span> <span class="nx">website</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">websites</span><span class="p">,</span> <span class="p">{</span> <span class="nx">id</span><span class="o">:</span> <span class="nx">websiteId</span> <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">dispatch</span><span class="p">(</span><span class="nx">loadContextWebsite</span><span class="p">(</span><span class="nx">website</span><span class="p">));</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">render</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="kr">const</span> <span class="p">{</span> <span class="nx">state</span><span class="o">:</span> <span class="p">{</span> <span class="nx">website</span> <span class="p">}</span> <span class="p">}</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">return</span> <span class="p">(</span>
</span><span class='line'>        <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">className</span><span class="o">=</span><span class="s2">&quot;website-context&quot;</span><span class="o">&gt;</span>
</span><span class='line'>          <span class="p">{</span> <span class="nx">website</span> <span class="o">?</span> <span class="o">&lt;</span><span class="nx">Component</span> <span class="p">{...</span><span class="k">this</span><span class="p">.</span><span class="nx">props</span><span class="p">}</span> <span class="o">/&gt;</span> <span class="o">:</span> <span class="kc">null</span> <span class="p">}</span>
</span><span class='line'>        <span class="o">&lt;</span><span class="err">/div&gt;</span>
</span><span class='line'>      <span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kr">const</span> <span class="nx">mapStateToProps</span> <span class="o">=</span> <span class="p">(</span><span class="nx">state</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">state</span><span class="o">:</span> <span class="nx">state</span><span class="p">.</span><span class="nx">application</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">connect</span><span class="p">(</span><span class="nx">mapStateToProps</span><span class="p">)(</span><span class="nx">WebsiteContextComponent</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Routing,</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='javascript'><span class='line'><span class="kr">const</span> <span class="nx">routes</span> <span class="o">=</span> <span class="p">(</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/signup&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">SignUp</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/signin&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">SignIn</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// applied here..</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/welcome-on-board&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">checkBoarded</span><span class="p">(</span><span class="nx">Welcome</span><span class="p">,</span> <span class="p">{</span> <span class="nx">withValue</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">redirectTo</span><span class="o">:</span> <span class="s1">&#39;/app/dashboard&#39;</span><span class="p">})</span> <span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/forgot-password&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">ForgotPassword</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/signout&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">SignOut</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// .. and here</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/app&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">checkBoarded</span><span class="p">(</span><span class="nx">requiresAuth</span><span class="p">(</span><span class="nx">App</span><span class="p">),</span> <span class="p">{</span> <span class="nx">withValue</span><span class="o">:</span> <span class="kc">false</span><span class="o">:</span> <span class="nx">redirectTo</span><span class="o">:</span> <span class="s1">&#39;/welcome-on-board&#39;</span> <span class="p">})}</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;dashboard&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;dashboard&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">Dashboard</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;profile&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;user-profile&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">UserProfile</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;websites&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;websites/:id&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">websiteContext</span><span class="p">(</span><span class="nx">Websites</span><span class="p">)}</span><span class="o">&gt;</span>
</span><span class='line'>        <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;banners&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;banners&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">Dashboard</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>        <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;revenues&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;revenues&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">Revenues</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="err">/Route&gt;</span>
</span><span class='line'>
</span><span class='line'>      <span class="o">&lt;</span><span class="err">/Route&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="err">/Route&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/config&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">requiresAuth</span><span class="p">(</span><span class="nx">Config</span><span class="p">)}</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">name</span><span class="o">=</span><span class="s2">&quot;page&quot;</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;page&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">PageConfig</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="err">/Route&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;*&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">FourOFour</span><span class="p">}</span> <span class="nx">status</span><span class="o">=</span><span class="p">{</span><span class="mi">404</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="err">/Route&gt;</span>
</span><span class='line'><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Compose all the things</h2>

<p>We sometimes need to apply a few higher-order components on the same route. As from routing above, we can see that <code>/app</code> route both <code>requiresAuth()</code> and <code>checkBoarded()</code>. Sooner or later, you might have 3-4 function calls there; that makes <code>Routes</code> a bit bulky.</p>

<p>Fortunately, higher-order components are easily composable,</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>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kr">const</span> <span class="nx">CheckedWelcome</span> <span class="o">=</span> <span class="nx">composeComponents</span><span class="p">(</span>
</span><span class='line'>  <span class="nx">Welcome</span><span class="p">,</span>
</span><span class='line'>  <span class="p">[</span>
</span><span class='line'>    <span class="p">(</span><span class="nx">c</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">checkBoarded</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span> <span class="p">{</span> <span class="nx">withValue</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span> <span class="nx">redirectTo</span><span class="o">:</span> <span class="s1">&#39;/app/dashboard&#39;</span> <span class="p">}),</span>
</span><span class='line'>    <span class="p">(</span><span class="nx">c</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">requiresAuth</span><span class="p">(</span><span class="nx">c</span><span class="p">)</span>
</span><span class='line'>  <span class="p">]</span>
</span><span class='line'><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kr">const</span> <span class="nx">CheckApp</span> <span class="o">=</span> <span class="nx">composeComponents</span><span class="p">(</span>
</span><span class='line'>  <span class="nx">App</span><span class="p">,</span>
</span><span class='line'>  <span class="p">[</span>
</span><span class='line'>    <span class="p">(</span><span class="nx">c</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">checkBoarded</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span> <span class="p">{</span> <span class="nx">withValue</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span> <span class="nx">redirectTo</span><span class="o">:</span> <span class="s1">&#39;/welcome-on-board&#39;</span><span class="p">}),</span>
</span><span class='line'>    <span class="p">(</span><span class="nx">c</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">requiresAuth</span><span class="p">(</span><span class="nx">c</span><span class="p">),</span>
</span><span class='line'>    <span class="p">(</span><span class="nx">c</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">requiresSmth</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span> <span class="p">{</span> <span class="nx">options</span><span class="o">:</span> <span class="p">{}</span> <span class="p">})</span>
</span><span class='line'>  <span class="p">]</span>
</span><span class='line'><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kr">const</span> <span class="nx">routes</span> <span class="o">=</span> <span class="p">(</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="c1">// much more clean route definition</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/welcome-on-board&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">CheckedWelcome</span><span class="p">}</span> <span class="o">/&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">Route</span> <span class="nx">path</span><span class="o">=</span><span class="s2">&quot;/app&quot;</span> <span class="nx">component</span><span class="o">=</span><span class="p">{</span><span class="nx">CheckedApp</span><span class="p">}</span><span class="o">&gt;</span>
</span><span class='line'>      <span class="c1">// ...</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="err">/Route&gt;</span>
</span><span class='line'>  <span class="o">&lt;</span><span class="err">/Route&gt;</span>
</span><span class='line'><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>composeComponents()</code> is a simple reducer utility function,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kr">export</span> <span class="kd">function</span> <span class="nx">composeComponents</span><span class="p">(</span><span class="nx">component</span><span class="p">,</span> <span class="nx">wrappers</span> <span class="o">=</span> <span class="p">[])</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">wrappers</span><span class="p">.</span><span class="nx">reduce</span><span class="p">((</span><span class="nx">c</span><span class="p">,</span> <span class="nx">wrapper</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">wrapper</span><span class="p">(</span><span class="nx">c</span><span class="p">),</span> <span class="nx">component</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>So, higher-order components is a great concept that aims to <a href="https://medium.com/@dan_abramov/mixins-are-dead-long-live-higher-order-components-94a0d2f9e750#.ujvvraysa">replace Mixins</a> as composition mechanism. My experience showed they are great as containers wrappers, but in general, they have many practical applications.</p>

<p><em>Originally published at <a href="http://engineering.blogfoster.com/higher-order-components-theory-and-practice/">blogfoster Engineering</a>.</em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Functional Approach to UI]]></title>
    <link href="http://beletsky.net/2016/04/the-functional-approach-to-ui.html"/>
    <updated>2016-04-03T14:45:00+02:00</updated>
    <id>http://beletsky.net/2016/04/the-functional-approach-to-ui</id>
    <content type="html"><![CDATA[<p>A state is a representation of a system in a given time. Traditionally, we deal with <em>mutable</em> state storages, like SQL and NoSQL databases.</p>

<p>Each update destroys previous value, there is no history what value had been stored a minute ago, an hour ago or 5 years ago.</p>

<!-- MORE -->


<h2>Events and Immutability</h2>

<p>Are there any alternatives, that allow mitigating that drawback?</p>

<p>One of the oldest professions in the world (not what you think) already have an answer for that. In <em>accounting</em> the only way to modify the balance is to introduce a credit or debit record.</p>

<p>If an accountant makes a mistake of placing <em>$100 debit</em>, she simply can’t erase an entry. Instead, she introduces a contra-operation, new entry that says <em>$100 credit</em>, that should compensate balance and return it to the previous state.</p>

<p>That principle makes a foundation for <em>Event Sourcing</em> architectural style. In Event Sourcing, there is an initial state and series of events, each event represents a <em>change</em> it introduces to the state. Every event is stored, and can not be deleted or modified, state is derived from events. Both are <strong>immutable</strong>.</p>

<p>The state of a whole system can be described with such formula:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Snext = F(S, event);</span></code></pre></td></tr></table></div></figure>


<p>To get the state of the system for given moment of time, we need to take an initial state and <em>replay</em> all events that happened before.</p>

<h2>UI as Function of State</h2>

<p>An imperative approach is dominant now, and front-end applications are not the exception. We are using MVC / MVVM on a client, fetching data from a server, imperatively modifying it and storing back.</p>

<p>The state of UI is distributed all around, there is no central place, where it’s stored. It’s rather a mix of states in models, states in DOM with a bunch of side-effects.</p>

<p>What if we imagine such central place and the whole UI of our application, as a function of it?</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>UI = F(S);</span></code></pre></td></tr></table></div></figure>


<p>Means, UI is a function of a state.</p>

<p><a href="https://facebook.github.io/react/">React</a> is a library that gives the ability to treat UI like that. React represents the UI as a hierarchy of components, each of the components is a <a href="https://facebook.github.io/react/docs/displaying-data.html#components-are-just-like-functions">function</a>, that takes some properties as input and returns a markup. The whole UI is a composition of such functions.</p>

<p>But how to deal with the state to avoid the problems we already had with an imperative approach to UI?</p>

<h2>Predictable State</h2>

<p><a href="https://github.com/gaearon">Dan Abramov</a>, in his famous talk of <a href="https://www.youtube.com/watch?v=xsSnOQynTHs">Time Travel Debugging</a> came to the idea, of bringing event sourcing principles of state handling to the client, solving one of the most painful issues.</p>

<p><a href="http://redux.js.org/">Redux</a> represents the state as,</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Snext = R(S, action);</span></code></pre></td></tr></table></div></figure>


<p>Combining it with UI part,</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>UI = F(S);
</span><span class='line'>UI = F(R(state, action));</span></code></pre></td></tr></table></div></figure>


<p><strong>F</strong> &ndash; <code>React</code> component function, <strong>R</strong> &ndash; <code>Reducer</code>, a function that transforms the current state, based on <em>action</em> that happened in an application.</p>

<p>In Redux architecture, we have a <em>store</em> that holds the application state and provides an interface for changing that state, by <em>dispatching</em> actions. An <em>Action</em> holds it’s type as well as payload, which reducer uses to produce next state.</p>

<p>Like in Event Souring, actions are just plain objects, they can be logged, serialized, stored, and later replayed for debugging or testing purposes.</p>

<h2>React with Redux</h2>

<p>Even if Redux stresses it’s not designed to be used especially with React, React and Redux make a perfect couple.</p>

<p>React allows you to treat the UI as a function of the state, Redux allows you to manage that state in a predictable way. <a href="https://github.com/reactjs/react-redux">React-Redux</a> binding <em>connects</em> React component to Redux state, and every time it changes, component gets new state and UI re-rendering triggers.</p>

<p>In other words, with each change, the whole UI is re-rendered. Because of React re-rendering is based on virtual DOM diff algorithms, complete re-render doesn’t bring huge performance penalties, comparing to other frameworks.</p>

<p>Unidirectional data flow makes it easy to understand what’s going on in complex interfaces. As I <a href="http://engineering.blogfoster.com/jumpstart-to-react-redux-development/">jumped in</a> with Redux with-out considerable experience with React itself, I would say once <em>state</em> part as a problem is solved, React part becomes a simple one.</p>

<p><em>Originally published at <a href="http://engineering.blogfoster.com/the-functional-approach-to-ui/">blogfoster Engineering</a>.</em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Likeastore is Shutting Down]]></title>
    <link href="http://beletsky.net/2016/02/likeastore-is-shutting-down.html"/>
    <updated>2016-02-18T15:14:00+01:00</updated>
    <id>http://beletsky.net/2016/02/likeastore-is-shutting-down</id>
    <content type="html"><![CDATA[<p>In July 2013, we’ve launched Likeastore. We wanted to solve one problem &ndash; keep content that <em>caught your attention</em> in one place. To make it happen we’ve built a solution that synchronizes favorited items from different social networks with a beautiful dashboard and browser extension to provide great search experience.</p>

<!-- MORE -->


<p><img src="https://cloud.githubusercontent.com/assets/304929/16522647/6da14c56-3f9f-11e6-85d2-b695b50c82d3.png" alt="dashboard" /></p>

<p>Very quickly we <a href="http://blog.likeastore.com/post/63065511711/weve-got-1000-beta-users-and-thats-awesome">grew</a> up from 0 to 1.000 users that gave us huge motivation to go on. Both of us had good-paying jobs at that time but we decided to <a href="http://beletsky.net/2013/12/i-quit-my-job.html">follow</a> our dream. It was a dream to build a company that makes our world a little bit better place. A company where you feel the meaning and purpose of life by solving complex problems and working on something you truly love.</p>

<p>Mark Zuckerberg once said: <em>“Move fast and break things”</em>. At Likestore we moved very fast, breaking nothing (well, <a href="http://blog.likeastore.com/post/87183811320/outage-report">almost</a> nothing). It could be silly to talk about culture in the team of two but we had a <em>great culture</em> there, especially technical one. Without a doubt, Likeastore was the best project we worked so far.</p>

<p>Today we are <strong>shutting down</strong>.</p>

<p>Many of you have noticed the lack of progress in the latest months. Silently project started to die and we feel <em>very sorry</em> for that. Likeastore worked without any attention from engineering. We wanted to make it run as long as possible using its stability.</p>

<p>But let’s be honest to ourselves, without marketing and growth, without incredible user support and passion, every product is doomed. We were naive and energized but sooner or later you meet reality. Reality punched us in a face and taught some valuable lessons.</p>

<p>We want to say <em>huge</em> thanks for all our users and supporters. A lot of people helped this project, a lot of users shared their feedback, we <em>really, really</em> appreciate it!</p>

<p><strong>PS</strong>. We decided to open-source <a href="https://github.com/likeastore">everything</a> we worked on for last 2 years, including <a href="https://github.com/likeastore/app">application</a>, <a href="https://github.com/likeastore/collector">synchronization</a> engine, and many useful <a href="https://github.com/likeastore">libraries</a>, to say thanks to the OSS community and hopefully help other developers.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Jumpstart to React+Redux Development]]></title>
    <link href="http://beletsky.net/2016/02/jumpstart-to-react-plus-redux-development.html"/>
    <updated>2016-02-10T14:35:00+01:00</updated>
    <id>http://beletsky.net/2016/02/jumpstart-to-react-plus-redux-development</id>
    <content type="html"><![CDATA[<p>Somewhere November 2015, we realized that our existing product requires a proper update since it remained in a beta phase, for quite some time. We were thinking, what would be the best approach to take?</p>

<p>There are many things you need to consider, but primarily &ndash; business and technological risks. For companies, with an established customers base, value proposition and product, taking a risk of a massive rewrite is always very high. For startups, speed to market and responsiveness to change is a priority, so they are pivoting and rewriting products from scratch.</p>

<!-- MORE -->


<h2>Our approach</h2>

<p>At <a href="http://www.blogfoster.com/">blogfoster</a>, we are kind of in the middle. The young company, hitting product-market fit, having customers and making revenues. We thought about a combined approach. Enhance our existing front-end application, by substituting some pieces of it, using a technological stack for further growth and development speed.</p>

<p>We had a common opinion about the technology that we would like to pick up. Having a good awareness of which technologies are taking off now, we had the confidence to bet on them.</p>

<p>We agreed on the following: <a href="https://facebook.github.io/react/">React</a> for handling UI, <a href="https://github.com/rackt/redux">Redux</a> for managing state, <a href="https://github.com/webpack/webpack">Webpack</a> as bundler, and ES2015 with <a href="https://babeljs.io/">Babel</a>, as programming language. On the server side, <a href="http://hapijs.com/">Hapi.js</a> for the REST API, MySQL and <a href="http://docs.sequelizejs.com/en/latest/">Sequilize</a> as a data storage and access.</p>

<p>Since almost all of libraries and tools, mainly a front-end ones, mentioned above were new to us, our CTO <a href="https://github.com/dominicumbeer">Dominic</a>, proposed an approach of starting up with developing of boilerplates both for new server and client, so we build our applications based on them.</p>

<p>The goal was to build some simple application, which would involve quite typical web applications operations, e.g. routing, rendering, fetching and sending data to a REST API. Since signin/signup is the entrance of all applications, it makes sense to implement it as a first prototype.</p>

<p>I was pretty sure, I need about two days on that.</p>

<p>It took me a week to get it in shape so that we&rsquo;re confident to continue with it. React, Redux, Webpack, Babel are quite hard to combine, if you are doing it at the first time.</p>

<p>Honestly, I had a lot of frustration with the <a href="https://github.com/blogfoster/front-stack-boilerplate">boilerplate</a> implementation. On the way, I seriously thought a few times if it is the right approach we are going to take.</p>

<h2>Webpack</h2>

<p><a href="https://github.com/webpack/webpack">Webpack</a> appeared to be a huge piece of software, with very unintuitive API. A configuration of Webpack is more difficult, comparing to grunt/gulp + browserify + tools setup. I started to see Webpack as huge kitchen sink. Transpiring, bundling, optimizing, hot-reloading, server deployment &ndash; all is in the box.</p>

<p>But once it’s configured, you realize it is worth.</p>

<p><img width="1171" alt="screenshot 2016-01-30 13 25 31" src="https://cloud.githubusercontent.com/assets/304929/12695647/182e7662-c755-11e5-9216-f2c50d18d169.png"></p>

<p>First of all, it works quite fast. Our application is still small, but it takes only 1.6s to fully rebuild it. Secondly, Webpack is much more than simple a build tool. It introduces you to another way of working with web resources such as sources, styles and images.</p>

<p>Finally, Hot Reload is something that makes development with Webpack really fun. Having the experience of updating a portion of the applications without refreshing the page is totally awesome.</p>

<h2>Babel and ES2015</h2>

<p>Babel 6 has been released at the end of October. I started to use it from the very beginning, but it was quite a mistake. A lot of libraries still had dependencies on Babel 5 and refused to work properly. I had a bunch of cryptic error messages in a console, read a bunch of GitHub issues before I realized that. That forced me to step back for <a href="https://github.com/gaearon/react-hot-loader">react-hot-reloader</a>, instead of <a href="https://github.com/gaearon/react-transform-boilerplate">react-transform</a> since it wasn’t yet ported to Babel 6 and we still have some small <a href="https://github.com/feross/standard/issues/372">issues</a> after Babel updates.</p>

<p>But now, if you ask me &ndash; would you like to switch back to ES5, I would likely say no. I wasn’t happy when I heard the first time that ES6 will have classes. But, implementing React components as classes, makes a lot of sense.</p>

<p>Moreover, spread operator, fat arrow functions, and new scoping rules make programming with ES2015 as a much more pleasant process.</p>

<h2>Redux</h2>

<p><a href="https://github.com/rackt/redux">Redux</a> is one of the most popular JavaScript libraries ever. Taking the functional programming approach, combined with a nice API and a great timing of the release, Redux is de-facto default Flux implementation for React-based applications.</p>

<p>It requires a lot of paradigm shifts, cause it’s very different from MVC/MVVM libraries I used to work with.</p>

<p>Redux philosophy is based on the fact, that the whole application state is represented as <em>one big object</em>. The application’s UI, becomes a <em>function of this</em> state object. The only way to change the state, is to <em>dispatch</em> an action. An action contains it’s type and some payload, which is passed to a reducer function. The reducer function produces a new instance of the state. Based on the updated state, the application re-renders their UI.</p>

<p>As you see, all that approach is pretty much synchronous. It was quite hard for me to understand how to introduce asynchronous behavior there. I was very happy once my <a href="https://github.com/gaearon/redux-thunk">redux-thunk</a> implementation started to work.</p>

<p>Besides, hooking up Redux to React the application was not super straightforward. I spent some time with an understanding of the configuration of the storages, connected components, etc.</p>

<p>I’m still having a lot of questions. I not really happy with all the code you need to write if you want to introduce new actions. And I don’t know yet how to test <a href="http://stackoverflow.com/questions/33997081/react-redux-loading-application-state-in-component-constructor">properly</a> all that stuff.</p>

<p>But Redux gives a nice tooling around, plus better confidence of what’s going on in the application. Since all actions could be logged, and state never overwrote it’s much more easy to debug and introduce new functionality.</p>

<h2>React</h2>

<p>0.14 is the latest React release, released in October.</p>

<p>First of all, it <em>just works</em>. I feel so great dealing with React, since it brings so less surprises. The concept of a component is simple and very native.</p>

<p>I’m not sure yet if I use everything right. Designing the component hierarchy is still a question, that requires a bit more practice.</p>

<p>I’m happy with the error messages that React provides. The messages pointing you directly to the exact problem. Compared to other libraries, which produce nothing more as encrypted error messages (yes, <a href="https://daveceddia.com/angular-2-errors/">angular</a>). Making UI&rsquo;s with React feels great.</p>

<p>Currently, we started to involve our designers to work directly with JSX instead of HTML and we are looking forward to see the impact there.</p>

<p><img width="1287" alt="screenshot 2016-01-30 13 37 55" src="https://cloud.githubusercontent.com/assets/304929/12695696/b561681c-c756-11e5-99e6-0c73627720f9.png"></p>

<p>Second, React is likely the biggest change to front-end development in the last 5 years. Virtual DOM, diff tree and partial re-rendering &ndash; quite a masterpiece library. I can’t say it feels totally perfect for me, but it feels really good.</p>

<h2>ESLint</h2>

<p>I have to mention ESLint. Previously, I used JSHint, but unfortunately, they decided not to support latest language features until official support.</p>

<p>But ESLint actually becomes so much nicer. It so simple to configure and it’s so helpful, that I can not imagine to develop without it anymore.</p>

<p><img width="975" alt="screenshot 2016-01-30 13 41 17" src="https://cloud.githubusercontent.com/assets/304929/12695714/2d8eca14-c757-11e5-905f-a66065111587.png"></p>

<p>Both Atom and Sublime have ESLint support, and it will be the only choice if you want to go the ES6/React/Webpack way with linting.</p>

<h2>Conclusions</h2>

<p>After the <a href="https://github.com/blogfoster/front-stack-boilerplate">boilerplate</a> has been concluded, we started with the implementation of our new application based on that. It works fine so far, not ideally, but good enough. During the flight, we skipped our idea of changing pieces of existing app and started new project from scratch.</p>

<p>Greenfield development + latest libraries and tools make whole development process nice and fun.</p>

<p><em>Originally published at <a href="http://engineering.blogfoster.com/jumpstart-to-react-redux-development/">blogfoster Engineering</a>.</em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[NPM for Everything]]></title>
    <link href="http://beletsky.net/2015/04/npm-for-everything.html"/>
    <updated>2015-04-02T15:26:00+02:00</updated>
    <id>http://beletsky.net/2015/04/npm-for-everything</id>
    <content type="html"><![CDATA[<p>JS ecosystem is famous for it&rsquo;s wide range of packages and tools. Besides the default package manager, which comes with Node.js &ndash; NPM (node package manager), there are Bower.js, Jam.js and many more.</p>

<p>For a quite long period, my default setup was like &ndash; NPM for all server-side components and Bower.js for client-side stuff. It worked quite good together, especially in conjunction with Require.js.</p>

<p>But recently, I switched to <em>NPM only</em> setup. That allowed me to use CommonJS style both front and back ends and got rid of task runners as Grunt and Gulp.</p>

<!-- MORE -->


<h1>CommonJS</h1>

<p>Doing a lot of back-end coding I really get used to <code>CommonJS</code> style, which is simple, practical and powerful. CommonJS modularization is plain 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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">module</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// export the module</span>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">module</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>and</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// use the module</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">module</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./module&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Node.js highly popularized Common.js approach. And NPM appeared to be one of the best package managers ever developed.</p>

<p>But for front-end, NPM was not that suitable. First of all, because of browsers do not understand Common.js style of modules. Second, <code>npm</code> modules are being placed to <code>./node_modules</code> folder, with is typically the root of project, that made things complicated to refer those scripts from <code>index.html</code> and configure server to server static resources from <code>./node_modules</code> folder.</p>

<p>Browserify came to change this.</p>

<h1>Browserify</h1>

<p>Browserify is JavaScript transpiling tool, with allows to:</p>

<ol>
<li>Use Common.js style for front-end applications.</li>
<li>Allowed to use various <code>npm</code> packages directly in a browser.</li>
</ol>


<p>A lot of pure front-end frameworks and libraries were published to <code>npm</code>. In fact, it&rsquo;s more and more used for front-end libraries as <a href="http://blog.npmjs.org/post/101775448305/npm-and-front-end-packaging">according to</a> NPM developers.</p>

<p>Of cause, nothing comes for free. The cost of Browserify is a <em>build step</em>. You have to introduce to transform Common.js application into a <em>bundle</em> which is loaded and executed by a browser.</p>

<p>Moreover, some packages are still being hosted on Bower. Even, it&rsquo;s possible to use Bower packages together with NPM packages (by means of debowerify transformation) I quickly realized, that this approach is very unpractical.</p>

<p>So, during the last few months my main <a href="https://github.com/pulls?q=is%3Apr+author%3Aalexbeletsky+is%3Aclosed">contributions</a> on GitHub was adopting of some front-end packages, to be conformant to Common.js and publishing them on NPM after.</p>

<h1>The setup</h1>

<p>The NPM now is the only one package manager to use, both for front-end and backend.</p>

<p>All dependencies are mentioned on one file <code>package.json</code> instead of several files.. and you will never forget to run <code>bower install</code>, since <code>npm install</code> will do install everything.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="s2">&quot;dependencies&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;async&quot;</span><span class="o">:</span> <span class="s2">&quot;^0.9.0&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;babelify&quot;</span><span class="o">:</span> <span class="s2">&quot;^5.0.4&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;body-parser&quot;</span><span class="o">:</span> <span class="s2">&quot;^1.9.0&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;colors&quot;</span><span class="o">:</span> <span class="s2">&quot;^1.0.2&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;cors&quot;</span><span class="o">:</span> <span class="s2">&quot;^2.4.2&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;envify&quot;</span><span class="o">:</span> <span class="s2">&quot;^3.4.0&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;express&quot;</span><span class="o">:</span> <span class="s2">&quot;^4.9.5&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;method-override&quot;</span><span class="o">:</span> <span class="s2">&quot;^2.2.0&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;moment&quot;</span><span class="o">:</span> <span class="s2">&quot;^2.8.3&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;morgan&quot;</span><span class="o">:</span> <span class="s2">&quot;^1.3.2&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;node-logentries&quot;</span><span class="o">:</span> <span class="s2">&quot;^0.1.4&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;react&quot;</span><span class="o">:</span> <span class="s2">&quot;^0.13.1&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;respawn&quot;</span><span class="o">:</span> <span class="s2">&quot;^1.0.1&quot;</span>
</span><span class='line'>  <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>The server side 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='js'><span class='line'><span class="kd">var</span> <span class="nx">express</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;express&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// configurations...</span>
</span><span class='line'>
</span><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="nx">port</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">logger</span><span class="p">.</span><span class="nx">info</span><span class="p">(</span><span class="s1">&#39;editor-app listening on port &#39;</span> <span class="o">+</span> <span class="nx">port</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="nx">env</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>The client side 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='js'><span class='line'><span class="kd">var</span> <span class="nx">React</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;react&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">Component</span> <span class="o">=</span> <span class="nx">React</span><span class="p">.</span><span class="nx">create</span><span class="p">({</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span>  <span class="o">=</span> <span class="nx">Component</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The same style, feels nice and clean.</p>

<h1>No task runners</h1>

<p>NPM is not only package manager. It&rsquo;s also very simple task runner (or scripts runner). There is a special section, called <code>scripts</code> responsible for that. Originally it&rsquo;s been used to run some package related tasks (run tests, perform pre/post install configurations).</p>

<p>Traditionally Grunt.js and Gulp.js are ones that used dealing with compiling static assests. But CLI interface of many tools and stream piping could replace them.</p>

<p>As example, I&rsquo;ll show pretty typical setup:</p>

<ul>
<li>build JavaScript with <code>browserify</code> and apply minification</li>
<li>build Sass with <code>node-sass</code> and apply minification</li>
<li>run watcher and rebuild changed assets</li>
</ul>


<h2>Building JavaScript</h2>

<p>The <code>browserify</code> need to be installed globally,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>npm install -g browserify
</span></code></pre></td></tr></table></div></figure>


<p>In <code>package.json</code>, in <code>scripts</code> section, will add such script,</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='js'><span class='line'>  <span class="s2">&quot;scripts&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;build-js&quot;</span><span class="o">:</span> <span class="s2">&quot;browserify public/js/app.js -o public/build/app.js&quot;</span><span class="p">,</span>
</span></code></pre></td></tr></table></div></figure>


<p>Since I also use several transformations in my applications, the Browserify have to properly configured for that. It check&rsquo;s if <code>package.json</code> contains <code>browserify</code> section, and if it does &ndash; will use it contents as own options.</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='js'><span class='line'>  <span class="s2">&quot;browserify&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;transform&quot;</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>      <span class="s2">&quot;babelify&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="s2">&quot;envify&quot;</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>Building Sass</h2>

<p>As with Browserify, <code>node-sass</code> need to be installed globally,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>npm install -g node-sass
</span></code></pre></td></tr></table></div></figure>


<p>Then <code>package.json</code> changes,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="s2">&quot;scripts&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;build-js&quot;</span><span class="o">:</span> <span class="s2">&quot;browserify public/js/app.js -o public/build/app.js&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;build-sass&quot;</span><span class="o">:</span> <span class="s2">&quot;node-sass public/sass/main.scss public/build/main.css&quot;</span><span class="p">,</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Minification</h2>

<p>Now, let&rsquo;s minify both assets using one of the best concepts ever &ndash; Unix pipes.</p>

<p>We need two packages additionally, <code>uglifyjs</code> and <code>cleancss</code>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>npm install -g uglifyjs clean-css
</span></code></pre></td></tr></table></div></figure>


<p>And corresponding scripts,</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='js'><span class='line'>  <span class="s2">&quot;scripts&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;build-js&quot;</span><span class="o">:</span> <span class="s2">&quot;browserify public/js/app.js -o public/build/app.js&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;build-sass&quot;</span><span class="o">:</span> <span class="s2">&quot;node-sass public/sass/main.scss public/build/main.css&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="c1">// minifying</span>
</span><span class='line'>    <span class="s2">&quot;build-min-js&quot;</span><span class="o">:</span> <span class="s2">&quot;browserify public/js/app.js | uglifyjs -o public/build/app.min.js&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;build-min-sass&quot;</span><span class="o">:</span> <span class="s2">&quot;node-sass public/sass/main.scss | cleancss -o public/build/main.min.css&quot;</span><span class="p">,</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Watching</h2>

<p>Now, let&rsquo;s apply watching. One of the watchers I use for several years already, that works best for me is <code>nodemon</code>.</p>

<p><code>nodemon</code> is not only able to watch file changes and restart node processes if necessary, but also running custom commands.</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='js'><span class='line'>  <span class="s2">&quot;scripts&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;build-js&quot;</span><span class="o">:</span> <span class="s2">&quot;browserify public/js/app.js -o public/build/app.js&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;build-sass&quot;</span><span class="o">:</span> <span class="s2">&quot;node-sass public/sass/main.scss public/build/main.css&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;build-min-js&quot;</span><span class="o">:</span> <span class="s2">&quot;browserify public/js/app.js | uglifyjs -o public/build/app.min.js&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;build-min-sass&quot;</span><span class="o">:</span> <span class="s2">&quot;node-sass public/sass/main.scss | cleancss -o public/build/main.min.css&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="c1">// watching</span>
</span><span class='line'>    <span class="s2">&quot;watch-js&quot;</span><span class="o">:</span> <span class="s2">&quot;nodemon -e js -w public/js -x &#39;npm run build-js&#39;&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="s2">&quot;watch-sass&quot;</span><span class="o">:</span> <span class="s2">&quot;nodemon -e scss -w public/sass -x &#39;npm run build-sass&#39;&quot;</span><span class="p">,</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Complex tasks</h2>

<p>Typically, you need to run few tasks simultaneously, e.g. build all scripts or watch all application. We can combine commands, by running background tasks,</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='js'><span class='line'><span class="s2">&quot;build&quot;</span><span class="o">:</span> <span class="s2">&quot;npm run build-js &amp; npm run build-sass&quot;</span><span class="p">,</span>
</span><span class='line'><span class="s2">&quot;watch&quot;</span><span class="o">:</span> <span class="s2">&quot;npm run watch-js &amp; npm run watch-sass&quot;</span><span class="p">,</span>
</span></code></pre></td></tr></table></div></figure>


<p>To build full app,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>npm run build
</span></code></pre></td></tr></table></div></figure>


<p>or to <em>watch</em> 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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>npm run watch
</span></code></pre></td></tr></table></div></figure>


<h2>Using dev-dependencies</h2>

<p>Global packages are not cool, cause they might be missing on developers box there application is cloned. Moreover, dependency management becomes a bit more complex, if you need to work on different projects depending on different tools versions. As <a href="https://github.com/bcomnes">@bcomnes</a> very correctly noticed, all tools as <code>browserify</code>, <code>uglify</code> etc. can be installed as local <code>dev-dependency</code>, which are fetched during <code>npm install</code> and will be available to call inside project folder as global commands,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>npm install --save-dev browserify uglifyjs node-sass clean-css
</span></code></pre></td></tr></table></div></figure>


<p>So, the <code>package.json</code> got such update,</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='json'><span class='line'><span class="s2">&quot;devDependencies&quot;</span><span class="err">:</span> <span class="p">{</span>
</span><span class='line'>  <span class="nt">&quot;browserify&quot;</span><span class="p">:</span> <span class="s2">&quot;^9.0.7&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nt">&quot;clean-css&quot;</span><span class="p">:</span> <span class="s2">&quot;^3.1.9&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nt">&quot;node-sass&quot;</span><span class="p">:</span> <span class="s2">&quot;^2.1.1&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nt">&quot;uglifyjs&quot;</span><span class="p">:</span> <span class="s2">&quot;^2.4.10&quot;</span>
</span><span class='line'><span class="p">}</span><span class="err">,</span>
</span></code></pre></td></tr></table></div></figure>


<h1>Takeaways</h1>

<ul>
<li>Once you implement front end library, consider <a href="https://github.com/umdjs/umd">UMD</a> so your modules are reusable in any environment.</li>
<li>Embrace CommonJS, use Browserify/Webpack/Whatever to use CommonJS (or ES6) on client.</li>
<li>For many cases, you really don&rsquo;t need Grunt or Gulp, all is easily doable with NPM scripts.</li>
</ul>


<p>As example, please refer to <a href="https://github.com/alexbeletsky/brick">brick</a>, the project I currently use as boilerplate for new applications.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Configuring Front-End Applications]]></title>
    <link href="http://beletsky.net/2015/01/configuring-front-end-applications.html"/>
    <updated>2015-01-29T19:42:00+01:00</updated>
    <id>http://beletsky.net/2015/01/configuring-front-end-applications</id>
    <content type="html"><![CDATA[<p>Typically front-end applications have particular configuration, depending on environment. It could be access tokens, API URL&rsquo;s, applications settings etc. For quite long period of time I solved that problem by exposing <code>window.env</code> variable, populated either by server rendering or by plugins as <code>html-build</code> .. or just directly referencing <code>&lt;script src="config/my.env.js"&gt;</code>, where <code>my.env.js</code> needed to be updated before actual deployment.</p>

<p>Spending much time on backend and working with Node.js/CommonJS I liked simplicity of <code>config</code> pattern and wanted to reuse that pattern on frontend. It&rsquo;s really straightforward and framework-agnostic approach.</p>

<!--MORE-->


<h2>Config pattern</h2>

<p>Config pattern is something I <a href="https://github.com/likeastore/notifier/blob/master/config">frequently</a> <a href="https://github.com/likeastore/jobber/tree/master/config">use</a> for Node.js apps. It simply the folder with <code>index.js</code> file, containing such code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">env</span> <span class="o">=</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">APP_ENV</span> <span class="o">||</span> <span class="s1">&#39;development&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">config</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">development</span><span class="o">:</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./development.config&#39;</span><span class="p">),</span>
</span><span class='line'>  <span class="nx">production</span><span class="o">:</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./production.config&#39;</span><span class="p">),</span>
</span><span class='line'>  <span class="nx">staging</span><span class="o">:</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./staging.config&#39;</span><span class="p">)</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">config</span><span class="p">[</span><span class="nx">env</span><span class="p">];</span>
</span></code></pre></td></tr></table></div></figure>


<p>The folder contains such files, <code>development.config.js</code>, <code>staging.config.js</code>, <code>production.config.js</code> etc.</p>

<p>The config files, simply export the object with configuration,</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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">config</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">connection</span><span class="o">:</span> <span class="s1">&#39;mongodb://localhost:27017/notifierdb&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">accessToken</span><span class="o">:</span> <span class="s1">&#39;1234&#39;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">hook</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">url</span><span class="o">:</span> <span class="s1">&#39;http://localhost:5000/api/notify/&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">token</span><span class="o">:</span> <span class="s1">&#39;fake-hook-token&#39;</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">logentries</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">token</span><span class="o">:</span> <span class="kc">null</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">transport</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// ...</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// ...</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">config</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The module actually needed in configuration would <code>require</code> the <code>config</code> folder, for instance:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">request</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;request&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">config</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../config&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">fetchActions</span><span class="p">(</span><span class="nx">user</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">apiUrl</span> <span class="o">=</span> <span class="nx">config</span><span class="p">.</span><span class="nx">api</span><span class="p">.</span><span class="nx">url</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">token</span> <span class="o">=</span> <span class="nx">config</span><span class="p">.</span><span class="nx">api</span><span class="p">.</span><span class="nx">token</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">request</span><span class="p">({</span><span class="nx">url</span><span class="o">:</span> <span class="nx">apiUrl</span> <span class="o">+</span> <span class="s1">&#39;/actions/&#39;</span> <span class="o">+</span> <span class="nx">user</span><span class="p">,</span> <span class="nx">headers</span><span class="o">:</span> <span class="p">{</span><span class="nx">token</span><span class="o">:</span> <span class="nx">token</span><span class="p">},</span> <span class="nx">callback</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">fetchActions</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Browserify</h2>

<p><a href="http://browserify.org/">Browserify</a> is a pre-processor (or call it transpiler) for javascript. It embraces CommonJS style of modularity and brings popular <code>npm</code> modules on client site. It&rsquo;s simply awesome project (many thx to <a href="https://twitter.com/substack">substack</a> for it) that makes a lot of sense to me.</p>

<p>With Browserify you can write browser javascript in the same way you do on backend with Node.js. It implements <code>require()</code> call and bundles the application consists on different modules into one, executable in browser.</p>

<p>Usually, <code>browserify</code> is not run manually, but rather by means of JS build tools as <code>grunt</code> or <code>gulp</code>.</p>

<p>I&rsquo;m going to adopt Node.js <code>config</code> pattern for frontend with browserify.</p>

<h2>Prepare the configuration</h2>

<p>By analogy of node applications, let&rsquo;s create a <code>config</code> folder inside our <code>js</code> folder.</p>

<p><img src="https://lh6.googleusercontent.com/-tO5KVRhVjM8/VMqJVRGXiFI/AAAAAAAAi4o/2aWT3zOkNhk/w2236-h1132-no/Screenshot%2B2015-01-29%2B20.21.58.png" alt="config structure" /></p>

<p><code>index.js</code> file is exactly the same as mentioned above, config files contains application dependent settings.</p>

<p>With example of Angular.js application, here is the <code>service</code> that used as data provider,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">config</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../config&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">drivers</span> <span class="p">(</span><span class="nx">$http</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">apiUrl</span> <span class="o">=</span> <span class="nx">config</span><span class="p">.</span><span class="nx">api</span><span class="p">.</span><span class="nx">url</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">fetch</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">url</span> <span class="o">=</span> <span class="nx">apiUrl</span> <span class="o">+</span> <span class="s1">&#39;/api/drivers&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>          <span class="k">return</span> <span class="nx">$http</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">url</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">drivers</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you just try that, it would work as charm.. but only for <code>development</code> environment.</p>

<h2>Setting up NODE_ENV</h2>

<p>The problem though, <code>browserify</code> have no idea what to put into <code>process.env.NODE_ENV</code> variable, since it is <code>undefined</code> &ndash; <code>development</code> configuration is always selected.</p>

<p>Fortunately, <code>browserify</code> architecture supports, so called <code>transforms</code>, middleware components capable to customize browserify behaviour. One of handly transform function is <a href="https://github.com/hughsk/envify">envify</a> by <a href="https://github.com/hughsk">Hugh Kennedy</a>.</p>

<p>What <code>envify</code> allows to do is basically replacement of <code>process.env.NODE_ENV</code> to particular value, eg.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="k">if</span> <span class="p">(</span><span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">NODE_ENV</span> <span class="o">===</span> <span class="s2">&quot;development&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;development only&#39;</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>with <code>NODE_ENV</code> set to &ldquo;production&rdquo;, will appear 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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="k">if</span> <span class="p">(</span><span class="s2">&quot;production&quot;</span> <span class="o">===</span> <span class="s2">&quot;development&quot;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">&#39;development only&#39;</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is exactly what we need, to make <code>config/index.js</code> work properly.</p>

<p>Since I use <code>grunt</code>, I&rsquo;ll show how to integrate <code>envify</code> in the workflow (approach for <code>gulp</code> would be similar),</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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">envify</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;envify/custom&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">grunt</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">grunt</span><span class="p">.</span><span class="nx">initConfig</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">browserify</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">dev</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">files</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>                  <span class="s1">&#39;source/build/app.js&#39;</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;source/js/app.js&#39;</span><span class="p">]</span>
</span><span class='line'>              <span class="p">},</span>
</span><span class='line'>              <span class="nx">options</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>                  <span class="nx">browserifyOptions</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>                      <span class="nx">debug</span><span class="o">:</span> <span class="kc">true</span>
</span><span class='line'>                  <span class="p">},</span>
</span><span class='line'>                  <span class="nx">transform</span><span class="o">:</span> <span class="p">[</span><span class="nx">envify</span><span class="p">({</span>
</span><span class='line'>                      <span class="nx">NODE_ENV</span><span class="o">:</span> <span class="s1">&#39;development&#39;</span>
</span><span class='line'>                  <span class="p">})]</span>
</span><span class='line'>              <span class="p">},</span>
</span><span class='line'>          <span class="p">},</span>
</span><span class='line'>          <span class="nx">stage</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">files</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>                  <span class="s1">&#39;source/build/app.js&#39;</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;source/js/app.js&#39;</span><span class="p">]</span>
</span><span class='line'>              <span class="p">},</span>
</span><span class='line'>              <span class="nx">options</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>                  <span class="nx">transform</span><span class="o">:</span> <span class="p">[</span><span class="nx">envify</span><span class="p">({</span>
</span><span class='line'>                      <span class="nx">NODE_ENV</span><span class="o">:</span> <span class="s1">&#39;staging&#39;</span>
</span><span class='line'>                  <span class="p">})]</span>
</span><span class='line'>              <span class="p">}</span>
</span><span class='line'>          <span class="p">},</span>
</span><span class='line'>          <span class="nx">prod</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">files</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>                  <span class="s1">&#39;source/build/app.js&#39;</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;source/js/app.js&#39;</span><span class="p">]</span>
</span><span class='line'>              <span class="p">},</span>
</span><span class='line'>              <span class="nx">options</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>                  <span class="nx">transform</span><span class="o">:</span> <span class="p">[</span><span class="nx">envify</span><span class="p">({</span>
</span><span class='line'>                      <span class="nx">NODE_ENV</span><span class="o">:</span> <span class="s1">&#39;production&#39;</span>
</span><span class='line'>                  <span class="p">})]</span>
</span><span class='line'>              <span class="p">}</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>  <span class="c1">// ...</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, once the <code>grunt build:dev</code> or <code>grunt build:prod</code> is run, it will populate correct <code>NODE_ENV</code> value and the rest of transpiled application would work as expected.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Health Monitoring of Services and Databases]]></title>
    <link href="http://beletsky.net/2014/09/health-monitoring-of-http-services-and-databases.html"/>
    <updated>2014-09-19T18:27:00+02:00</updated>
    <id>http://beletsky.net/2014/09/health-monitoring-of-http-services-and-databases</id>
    <content type="html"><![CDATA[<p>Once you are up and running your primary job is to monitor that all your services are in good health. If something bad happens, network issue or crashes &ndash; you have to be notified on that as soon as possible. Hardering of the HTTP services and databases became a one of primary activities for any startup.</p>

<p>There few products on market that can do that, <a href="http://pingdom.com">Pingdom</a> and <a href="http://newrelic.com">New Relic</a> probably the most know. But they are paid and not that flexible as I want. So, I&rsquo;ve created <a href="https://github.com/likeastore/heartbeat">likeastore/heartbeat</a> that for a month or so helps me to provide quality service.</p>

<!-- MORE -->


<p>It&rsquo;s really easy to setup and deploy on any server or Dokku/Heroku environment.</p>

<h2>Overview</h2>

<p>The core of heartbeat is about ~300 <a href="https://github.com/likeastore/heartbeat/blob/master/source/hearbeat.js">lines of code</a>, so it&rsquo;s not a big deal to look inside to understand it principles of work. But in general, it&rsquo;s continuously running loop, that executes the small jobs who runs particular check strategy and report results if anything is wrong.</p>

<p>To make use of it you just need to clone the repo and update <a href="https://github.com/likeastore/heartbeat/blob/master/config/index.js">config/index.js</a> with your configuration.</p>

<h2>Notifications</h2>

<p>Heartbeat can use 2 types of notifications at the moment. <a href="https://mandrillapp.com/">Mandril</a> based emails and <a href="https://www.twilio.com/">Twilio</a> based SMSs.</p>

<p>Both requires you to create accounts there and provide API access keys.</p>

<p>That&rsquo;s what&rsquo;s configured on <a href="https://github.com/likeastore/heartbeat/blob/master/config/index.js#L67">transport</a> section of configuration:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">transport</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">mandrill</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">token</span><span class="o">:</span> <span class="s1">&#39;fake-token&#39;</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">twilio</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">sid</span><span class="o">:</span> <span class="s1">&#39;fake-sid&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">token</span><span class="o">:</span> <span class="s1">&#39;fake-token&#39;</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>instead of <code>fake-token</code> and <code>fake-sid</code> you provide your real values there.</p>

<p>You have to specify the recipents for notifications, that happens in <a href="https://github.com/likeastore/heartbeat/blob/master/config/index.js#L56">notify</a> section of configuration:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">notify</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">email</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">from</span><span class="o">:</span> <span class="s1">&#39;heartbeat@likeastore.com&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">to</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;devs@likeastore.com&#39;</span><span class="p">]</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">sms</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">to</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;+3805551211&#39;</span><span class="p">,</span> <span class="s1">&#39;+3805551212&#39;</span><span class="p">]</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, you specifying <code>from</code> and <code>to</code> emails, as well as <code>phone</code> numbers to send SMS.</p>

<h2>Monitoring</h2>

<p>Now the main part, configure monitoring options. The <a href="https://github.com/likeastore/heartbeat/blob/master/config/index.js#L10">monitor</a> section of configuration is responsible for that. At the moment, it provides provides 5 different monitoring strategies.</p>

<ul>
<li>HTTP</li>
<li>JSON</li>
<li>MongoDB</li>
<li>Ping</li>
<li>Resolve</li>
</ul>


<h3>HTTP</h3>

<p>The <code>HTTP</code> sends GET request to specified URL and checks the response code. If response code <code>!==200</code> the error notification is reported.</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='js'><span class='line'><span class="nx">http</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nx">url</span><span class="o">:</span> <span class="s1">&#39;https://likeastore.com&#39;</span>
</span><span class='line'>    <span class="p">},</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nx">url</span><span class="o">:</span> <span class="s1">&#39;https://stage.likeastore.com&#39;</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><code>http</code> is an array of urls to monitor.</p>

<h3>JSON</h3>

<p>The <code>JSON</code> strategy suits the best for HTTP API&rsquo;s. It could request particular URL receive JSON response and compare it to expected result.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">json</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nx">url</span><span class="o">:</span> <span class="s1">&#39;https://app.likeastore.com/api/monitor&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">response</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="s2">&quot;app&quot;</span><span class="o">:</span><span class="s2">&quot;app.likeastore.com&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="s2">&quot;env&quot;</span><span class="o">:</span><span class="s2">&quot;production&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="s2">&quot;version&quot;</span><span class="o">:</span><span class="s2">&quot;0.0.52&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="s2">&quot;apiUrl&quot;</span><span class="o">:</span><span class="s2">&quot;/api&quot;</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>


<h3>MongoDB</h3>

<p>MongoDB is a commonly part of web applications infrastructure. You need to have a connection string and then you specify the checking query. It could be <code>find</code> query or <code>insert</code> query.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<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='js'><span class='line'><span class="nx">mongo</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="nx">connection</span><span class="o">:</span> <span class="s1">&#39;mongodb://localhost:27017/likeastoredb&#39;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">collections</span><span class="o">:</span> <span class="p">[</span><span class="s1">&#39;users&#39;</span><span class="p">],</span>
</span><span class='line'>        <span class="nx">query</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">db</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">db</span><span class="p">.</span><span class="nx">users</span><span class="p">.</span><span class="nx">findOne</span><span class="p">({</span><span class="nx">email</span><span class="o">:</span> <span class="s1">&#39;alexander.beletsky@gmail.com&#39;</span><span class="p">},</span> <span class="nx">callback</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Resolve</h3>

<p>Resolve is something that makes <code>heartbeat</code> a little different. It usually the thing that one <code>domain names</code> is configured for different <code>ip addresses</code>. As it name stands, <code>resolve</code> would resolve all ip&rsquo;s associated with domain name and ping them separately. If even one of them fails, the notification is created.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">resolve</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>      <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;google.com&#39;</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><code>nslookup</code> for <code>google.com</code> returns,</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>
</pre></td><td class='code'><pre><code class=''><span class='line'>› nslookup google.com
</span><span class='line'>Server:       192.168.1.1
</span><span class='line'>Address:  192.168.1.1#53
</span><span class='line'>
</span><span class='line'>Non-authoritative answer:
</span><span class='line'>Name: google.com
</span><span class='line'>Address: 173.194.113.198
</span><span class='line'>Name: google.com
</span><span class='line'>Address: 173.194.113.199
</span><span class='line'>Name: google.com
</span><span class='line'>Address: 173.194.113.200
</span><span class='line'>Name: google.com
</span><span class='line'>Address: 173.194.113.201
</span><span class='line'>Name: google.com
</span><span class='line'>Address: 173.194.113.206
</span><span class='line'>Name: google.com
</span><span class='line'>Address: 173.194.113.192
</span><span class='line'>Name: google.com
</span><span class='line'>Address: 173.194.113.193
</span><span class='line'>Name: google.com
</span><span class='line'>Address: 173.194.113.194
</span><span class='line'>Name: google.com
</span><span class='line'>Address: 173.194.113.195
</span><span class='line'>Name: google.com
</span><span class='line'>Address: 173.194.113.196
</span><span class='line'>Name: google.com
</span><span class='line'>Address: 173.194.113.197</span></code></pre></td></tr></table></div></figure>


<p>All that addresses will be checked separately.</p>

<h3>Ping</h3>

<p>Finally it&rsquo;s <code>ping</code>, the simples operation. It just pings given <code>ip</code> address.</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='js'><span class='line'><span class="nx">ping</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>      <span class="nx">ip</span><span class="o">:</span> <span class="s1">&#39;37.139.9.95&#39;</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 the interval</h2>

<p>You can specify the interval of checking. By default it&rsquo;s 10 seconds, but you can do more frequent checks if you want.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">interval</span><span class="o">:</span> <span class="mi">5000</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Running and deploying</h2>

<p>If the configuration is set, you can run heartbeat by,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>node app.js
</span></code></pre></td></tr></table></div></figure>


<p>The log optionally could be forwared to <a href="logentries.com">Logentries</a>, by setting up <a href="https://github.com/likeastore/heartbeat/blob/master/config/index.js#L6">config/index.js#logentries</a> section.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Email, SMS and Push Notifications Server]]></title>
    <link href="http://beletsky.net/2014/08/notifier-email-sms-push-notifications.html"/>
    <updated>2014-08-22T15:38:00+02:00</updated>
    <id>http://beletsky.net/2014/08/notifier-email-sms-push-notifications</id>
    <content type="html"><![CDATA[<p>I recently came up with very convenient component &ndash; <a href="https://github.com/likeastore/notifier">likeastore/notifier</a>. Notifier is easy to setup Email, SMS and Push Notifications Server. It&rsquo;s been open sourced few month, very specific to <a href="https://likeastore.com">Likeastore</a> needs, but due to great <a href="https://github.com/likeastore/notifier/graphs/contributors">contributions</a> it became very generic and can be used in your projects as well.</p>

<p>Once you need to setup infrastructure for notifications in your application, it will be really easy to do. It provides transport of <a href="https://github.com/jimrubenstein/node-mandrill">Mandrill</a>, <a href="https://github.com/twilio/twilio-node">Twilio</a>, <a href="https://github.com/ToothlessGear/node-gcm">Android</a> and <a href="https://github.com/argon/node-apn">iOS</a> push notifications.</p>

<!-- MORE -->


<h2>Starting up</h2>

<p>The project already has comprehensive <a href="https://github.com/likeastore/notifier/blob/master/README.md">README</a> that explains initial steps. At the moment, the server is available as github repository that you need to clone and prepare entry point for it. I&rsquo;m thinking to pack the things into one <code>npm</code> module. If you see it makes sense, please let me know.</p>

<p>To start, you need to clone the repo,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>git clone https://github.com/likeastore/notifier.git
</span></code></pre></td></tr></table></div></figure>


<p>And then create <code>app.js</code> file, there all setup of <code>notifer</code> taking place.</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='js'><span class='line'><span class="kd">var</span> <span class="nx">notifier</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./source/notifier&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// TODO: configuration</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// start the server</span>
</span><span class='line'><span class="nx">notifier</span><span class="p">.</span><span class="nx">start</span><span class="p">(</span><span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">PORT</span> <span class="o">||</span> <span class="mi">7000</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s go straight to <code>configuration</code> part.</p>

<h2>Events, Actions and Executors</h2>

<p>The <code>notifier</code> is HTTP server, that receives <code>event</code> and turns that event into corresponding <code>action</code>. One event could create as many actions as needed. Actions is something that later is going to be <code>executed</code>.</p>

<p>The basic setup consits of 3 parts: receive event, resolve event and execute it.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">notifier</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">receive</span><span class="p">(</span><span class="s1">&#39;incoming-event&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">event</span><span class="p">,</span> <span class="nx">actions</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span> <span class="cm">/* ... */</span> <span class="p">})</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="s1">&#39;created-action&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">action</span><span class="p">,</span> <span class="nx">actions</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span> <span class="cm">/* ... */</span> <span class="p">})</span>
</span><span class='line'>    <span class="p">.</span><span class="nx">execute</span><span class="p">(</span><span class="s1">&#39;created-action&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">action</span><span class="p">,</span> <span class="nx">transport</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span> <span class="cm">/* ... */</span> <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Say, we have <code>user-registered</code> event which we need to send a welcome email,</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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">notifier</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">receive</span><span class="p">(</span><span class="s1">&#39;user-registered&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">e</span><span class="p">,</span> <span class="nx">actions</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">actions</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="s1">&#39;send-welcome&#39;</span><span class="p">,</span> <span class="p">{</span><span class="nx">user</span><span class="o">:</span> <span class="nx">e</span><span class="p">.</span><span class="nx">user</span><span class="p">},</span> <span class="nx">callback</span><span class="p">);</span>
</span><span class='line'>  <span class="p">})</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="s1">&#39;send-welcome&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">action</span><span class="p">,</span> <span class="nx">actions</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">db</span><span class="p">.</span><span class="nx">users</span><span class="p">.</span><span class="nx">findOne</span><span class="p">({</span><span class="nx">email</span><span class="o">:</span> <span class="nx">action</span><span class="p">.</span><span class="nx">user</span><span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">user</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>          <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">user</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="k">return</span> <span class="nx">callback</span><span class="p">({</span><span class="nx">message</span><span class="o">:</span> <span class="s1">&#39;user not found&#39;</span><span class="p">,</span> <span class="nx">email</span><span class="o">:</span> <span class="nx">action</span><span class="p">.</span><span class="nx">email</span><span class="p">});</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>          <span class="kd">var</span> <span class="nx">data</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">email</span><span class="o">:</span> <span class="nx">action</span><span class="p">.</span><span class="nx">user</span><span class="p">,</span>
</span><span class='line'>              <span class="nx">user</span><span class="o">:</span> <span class="nx">_</span><span class="p">.</span><span class="nx">pick</span><span class="p">(</span><span class="nx">user</span><span class="p">,</span> <span class="nx">userPick</span><span class="p">)</span>
</span><span class='line'>          <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>          <span class="nx">actions</span><span class="p">.</span><span class="nx">resolved</span><span class="p">(</span><span class="nx">action</span><span class="p">,</span> <span class="nx">data</span><span class="p">,</span> <span class="nx">callback</span><span class="p">);</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>  <span class="p">})</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">execute</span><span class="p">(</span><span class="s1">&#39;send-welcome&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">action</span><span class="p">,</span> <span class="nx">transport</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">vars</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>          <span class="p">{</span><span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;USERID&#39;</span><span class="p">,</span> <span class="nx">content</span><span class="o">:</span> <span class="nx">action</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">user</span><span class="p">.</span><span class="nx">_id</span><span class="p">},</span>
</span><span class='line'>          <span class="p">{</span><span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;USER_NAME&#39;</span><span class="p">,</span> <span class="nx">content</span><span class="o">:</span> <span class="nx">action</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">user</span><span class="p">.</span><span class="nx">displayName</span> <span class="o">||</span> <span class="nx">action</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">user</span><span class="p">.</span><span class="nx">name</span><span class="p">}</span>
</span><span class='line'>      <span class="p">];</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">transport</span><span class="p">.</span><span class="nx">mandrill</span><span class="p">(</span><span class="s1">&#39;/messages/send-template&#39;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">template_name</span><span class="o">:</span> <span class="s1">&#39;welcome-email&#39;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">template_content</span><span class="o">:</span> <span class="p">[],</span>
</span><span class='line'>          <span class="nx">message</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">auto_html</span><span class="o">:</span> <span class="kc">null</span><span class="p">,</span>
</span><span class='line'>              <span class="nx">to</span><span class="o">:</span> <span class="p">[{</span><span class="nx">email</span><span class="o">:</span> <span class="nx">action</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">email</span><span class="p">}],</span>
</span><span class='line'>              <span class="nx">global_merge_vars</span><span class="o">:</span> <span class="nx">vars</span><span class="p">,</span>
</span><span class='line'>              <span class="nx">preserve_recipients</span><span class="o">:</span> <span class="kc">false</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>      <span class="p">},</span> <span class="nx">callback</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<ul>
<li><code>recieve</code> &ndash; receives event from outside and turns the event into corresponding action.</li>
<li><code>resolve</code> &ndash; step to extend action with additional data, email, name of user etc.</li>
<li><code>execute</code> &ndash; uses the transport to transmit the event</li>
</ul>


<h2>Transports</h2>

<p>Mandrill provides support from emails notifications,</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='js'><span class='line'><span class="p">.</span><span class="nx">execute</span><span class="p">(</span><span class="s1">&#39;send-welcome&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">action</span><span class="p">,</span> <span class="nx">transport</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">vars</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>      <span class="p">{</span><span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;USERID&#39;</span><span class="p">,</span> <span class="nx">content</span><span class="o">:</span> <span class="nx">action</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">user</span><span class="p">.</span><span class="nx">_id</span><span class="p">},</span>
</span><span class='line'>      <span class="p">{</span><span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;USER_NAME&#39;</span><span class="p">,</span> <span class="nx">content</span><span class="o">:</span> <span class="nx">action</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">user</span><span class="p">.</span><span class="nx">displayName</span> <span class="o">||</span> <span class="nx">action</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">user</span><span class="p">.</span><span class="nx">name</span><span class="p">}</span>
</span><span class='line'>  <span class="p">];</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">transport</span><span class="p">.</span><span class="nx">mandrill</span><span class="p">(</span><span class="s1">&#39;/messages/send-template&#39;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">template_name</span><span class="o">:</span> <span class="s1">&#39;welcome-email&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">template_content</span><span class="o">:</span> <span class="p">[],</span>
</span><span class='line'>      <span class="nx">message</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">auto_html</span><span class="o">:</span> <span class="kc">null</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">to</span><span class="o">:</span> <span class="p">[{</span><span class="nx">email</span><span class="o">:</span> <span class="nx">action</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">email</span><span class="p">}],</span>
</span><span class='line'>          <span class="nx">global_merge_vars</span><span class="o">:</span> <span class="nx">vars</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">preserve_recipients</span><span class="o">:</span> <span class="kc">false</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">},</span> <span class="nx">callback</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Twilio is used for sms,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">.</span><span class="nx">execute</span><span class="p">(</span><span class="s1">&#39;send-verify-sms&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">transport</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">transport</span><span class="p">.</span><span class="nx">twilio</span><span class="p">.</span><span class="nx">messages</span><span class="p">.</span><span class="nx">create</span><span class="p">({</span>
</span><span class='line'>          <span class="nx">to</span><span class="o">:</span> <span class="nx">a</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">phone</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">from</span><span class="o">:</span> <span class="s1">&#39;+12282201270&#39;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">body</span><span class="o">:</span> <span class="s1">&#39;Verification code: 1111&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="p">},</span> <span class="nx">callback</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>For Android push notifications,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">.</span><span class="nx">execute</span><span class="p">(</span><span class="s1">&#39;send-android-push-notification&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">transport</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">tokens</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>  <span class="nx">tokens</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">a</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">token</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">transport</span><span class="p">.</span><span class="nx">android</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">message</span><span class="o">:</span> <span class="p">{</span><span class="nx">key1</span><span class="o">:</span> <span class="s1">&#39;value1&#39;</span><span class="p">,</span> <span class="nx">key2</span><span class="o">:</span> <span class="s1">&#39;value2&#39;</span><span class="p">},</span>
</span><span class='line'>      <span class="nx">tokens</span><span class="o">:</span> <span class="nx">tokens</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">retries</span><span class="o">:</span> <span class="mi">3</span>
</span><span class='line'>  <span class="p">},</span> <span class="nx">callback</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>For Apple push notifications,</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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">.</span><span class="nx">execute</span><span class="p">(</span><span class="s1">&#39;send-ios-push-notification&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">transport</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">tokens</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>  <span class="nx">tokens</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">a</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">token</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">transport</span><span class="p">.</span><span class="nx">ios</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">production</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span> <span class="c1">// use specific gateway based on &#39;production&#39; property.</span>
</span><span class='line'>      <span class="nx">passphrase</span><span class="o">:</span> <span class="s1">&#39;secretPhrase&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">alert</span><span class="o">:</span> <span class="p">{</span> <span class="s2">&quot;body&quot;</span> <span class="o">:</span> <span class="s2">&quot;Your turn!&quot;</span><span class="p">,</span> <span class="s2">&quot;action-loc-key&quot;</span> <span class="o">:</span> <span class="s2">&quot;Play&quot;</span> <span class="p">,</span> <span class="s2">&quot;launch-image&quot;</span> <span class="o">:</span> <span class="s2">&quot;mysplash.png&quot;</span><span class="p">},</span>
</span><span class='line'>      <span class="nx">badge</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">tokens</span><span class="o">:</span> <span class="nx">tokens</span>
</span><span class='line'>  <span class="p">},</span> <span class="nx">callback</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Configuration</h2>

<p>Before the run, you need to make sure the <code>notifier</code> is configured properly. Security tokens and connections strings to MongoDB. If you use Logentries, you can provide token and all logs will be submitted there.</p>

<p>The <code>accessToken</code> is a shared secret between server and client, to prevent unauthorized access.</p>

<p>The <a href="https://github.com/likeastore/notifier/blob/master/config/production.config.js">config</a> is using ENV variables on production and hardcoded values for development and staging.</p>

<h2>Clients</h2>

<p><code>notifier</code> can be used by any HTTP client, in most simple case <code>curl</code>,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span><span class="nb">echo</span> <span class="s1">&#39;{&quot;event&quot;: &quot;incoming-event&quot;}&#39;</span> | curl -H <span class="s2">&quot;Content-Type:application/json&quot;</span> -d @- http://notifier.likeastore.com/api/events?access_token<span class="o">=</span>ACCESS_TOKEN
</span></code></pre></td></tr></table></div></figure>


<p>We already have Node.js client <a href="https://github.com/DemocracyOS/notifier-client">DemocracyOS/notifier-client</a> and plan to have browser client as well. But in essence it&rsquo;s just HTTP post with <code>event</code> payload and <code>access_token</code> in query string, so basically it can be used from any language and platform.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Secure Deployment of ElasticSearch]]></title>
    <link href="http://beletsky.net/2014/07/secure-deployment-of-elasticsearch.html"/>
    <updated>2014-07-18T12:34:00+02:00</updated>
    <id>http://beletsky.net/2014/07/secure-deployment-of-elasticsearch</id>
    <content type="html"><![CDATA[<p>Remember my success <a href="http://beletsky.net/2014/05/got-tired-of-mongodb-full-text.html">story</a> of moving from MongoDB full text search index to <a href="http://www.elasticsearch.com">ElasticSearch</a>? After about one month of work our search service unexpectedly stopped. I received a bunch of emails from <a href="http://logentiries.com">Logentries</a> and <a href="http://newrelic.com">NewRelic</a> that server is no longer responsive.</p>

<p>Once I logged on to <a href="https://www.digitalocean.com/?refcode=de56d081b272">DigitalOcean</a> account, I&rsquo;ve seen message from administrators that server is sending a lot of traffic (UDP Flood), very likely compromised and therefore stopped. The link they give as <a href="https://www.digitalocean.com/community/questions/my-droplet-is-locked-by-support-staff-because-because-of-an-outgoing-flood-or-ddos-what-do-i-do">instructions</a> to fix the problem was quite comprehensive, but the most important info was in comments. A lot of people who were hit by problem had ElasticSearch deployed on their machines.</p>

<!-- MORE -->


<p>It appeared, if ES is left on default configuration with port opened outside, it will be easy target for bad guys, both of Java and ES vulnerability. Basically, I had to restore server from scratch, but this time I&rsquo;m not goint to be naive, server have to be properly secured.</p>

<p>I&rsquo;ll describe my setup that involves: Node.js, Dokku / Docker, SSL.</p>

<h2>Clean DigitalOcean image</h2>

<p>I had to reinstall my machine from scratch, so instead of creating plain Ubuntu 14 server, but I decided to go dokku/docker path. Something that I tried <a href="http://beletsky.net/2013/09/paas-in-your-pocket-with-dokku.html">before</a> and very happy with the <a href="http://beletsky.net/2013/08/digitalocean-plus-dokku-equals-10-heroku.html">results</a>. <a href="https://www.digitalocean.com/?refcode=de56d081b272">DigitalOcean</a> offers pre-packed image with dokku/docker already on board. As usually it takes just a few seconds to spin up machine on DO.</p>

<p>The plan was the following: deploy ElasticSearch instance inside Docker container, disable dynamic script features of Elastic, deploy Node.js based proxy server with custom authentication by Dokku and link those containers, so only Node.js proxy will have access to Elastic. Finally, all traffic between will by crypted by SSL.</p>

<p>The benefits are obvious, no more <code>:9200</code> is outside the machine, one potential vulnerability with dynamic script feature is disabled, only authenticated client could access Elastic server.</p>

<h2>Deployment of ElasticSearch in Docker</h2>

<p>First we need to have Docker image of ElasticSearch. There few ES plugging for Dokku, I decided to install one by myself, since I thought it is easier to configure. There is a great instruction from Docker <a href="https://registry.hub.docker.com/u/dockerfile/elasticsearch/">here</a>.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>docker pull docker pull dockerfile/elasticsearch
</span></code></pre></td></tr></table></div></figure>


<p>Once the image is there, we need to prepare volume there Elastic stores data and configuration.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span><span class="nb">cd</span> /
</span><span class='line'><span class="nv">$ </span>mkdir elastic
</span></code></pre></td></tr></table></div></figure>


<p>Elastic folder should contain <code>elasticsearch.yml</code> file, with all required configurations. My case is very simple, I have a cluster of one machine, so default configuration applies to me. One thing, that I mentioned above &ndash; I need to disable dynamic scripting features.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>nano elasticsearch.yml
</span></code></pre></td></tr></table></div></figure>


<p>The content of the file is just one string,</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=''><span class='line'>script.disable_dynamic: true</span></code></pre></td></tr></table></div></figure>


<p>Once it&rsquo;s done, we are ready to launch the server inside Docker container. Since, it could be done few times (during configuration and debugging), I&rsquo;ve created a small shell script,</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'>docker run --name elastic -d -p 127.0.0.1:9200:9200 -p 127.0.0.1:9300:9300 -v /elastic:/data dockerfile/elasticsearch /elasticsearch/bin/elasticsearch -Des.config<span class="o">=</span>/data/elasticsearch.yml
</span></code></pre></td></tr></table></div></figure>


<p>Please note the important thing, <code>-p 127.0.0.1:9200:9200</code> &ndash; here we are binding <code>:9200</code> to be only accessible on <code>localhost</code>. I&rsquo;ve spend some hours to close <code>:9200</code> by <code>iptables</code> without any success, but that thing works as expected. Thanks a lot to <a href="https://twitter.com/darkproger">@darkproger</a> and <a href="https://twitter.com/kkdoo">@kkdoo</a> for great help.</p>

<p><code>-v /elastic:/data</code> will map the containers volume <code>/data</code> to local one <code>/elastic</code>.</p>

<h2>Front-end Node.js server</h2>

<p>Now, we need to deploy front-end proxy server. It would proxy all traffic from <code>http://localhost:9200</code> into outside world, securely. I&rsquo;ve created small project, based on <a href="https://github.com/nodejitsu/node-http-proxy">http-proxy</a> called <a href="https://github.com/likeastore/elastic-proxy">elastic-proxy</a>. It&rsquo;s very simple one and can be easily re-used.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>git clone https://github.com/likeastore/elastic-proxy
</span><span class='line'><span class="nv">$ </span><span class="nb">cd </span>elastic-proxy
</span></code></pre></td></tr></table></div></figure>


<p>The server itself,</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='js'><span class='line'><span class="kd">var</span> <span class="nx">http</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;http&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">httpProxy</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;http-proxy&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">url</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;url&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">config</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./config&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">logger</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./source/utils/logger&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">port</span> <span class="o">=</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">PORT</span> <span class="o">||</span> <span class="mi">3010</span><span class="p">;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">proxy</span> <span class="o">=</span> <span class="nx">httpProxy</span><span class="p">.</span><span class="nx">createProxyServer</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">parseAccessToken</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">request</span> <span class="o">=</span> <span class="nx">url</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">url</span><span class="p">,</span> <span class="kc">true</span><span class="p">).</span><span class="nx">query</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">referer</span> <span class="o">=</span> <span class="nx">url</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">headers</span><span class="p">.</span><span class="nx">referer</span> <span class="o">||</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="kc">true</span><span class="p">).</span><span class="nx">query</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">request</span><span class="p">.</span><span class="nx">access_token</span> <span class="o">||</span> <span class="nx">referer</span><span class="p">.</span><span class="nx">access_token</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">server</span> <span class="o">=</span> <span class="nx">http</span><span class="p">.</span><span class="nx">createServer</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">accessToken</span> <span class="o">=</span> <span class="nx">parseAccessToken</span><span class="p">(</span><span class="nx">req</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">logger</span><span class="p">.</span><span class="nx">info</span><span class="p">(</span><span class="s1">&#39;request: &#39;</span> <span class="o">+</span> <span class="nx">req</span><span class="p">.</span><span class="nx">url</span> <span class="o">+</span> <span class="s1">&#39; accessToken: &#39;</span> <span class="o">+</span> <span class="nx">accessToken</span> <span class="o">+</span> <span class="s1">&#39; referer: &#39;</span> <span class="o">+</span> <span class="nx">req</span><span class="p">.</span><span class="nx">headers</span><span class="p">.</span><span class="nx">referer</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="nx">accessToken</span> <span class="o">||</span> <span class="nx">accessToken</span> <span class="o">!==</span> <span class="nx">config</span><span class="p">.</span><span class="nx">accessToken</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">res</span><span class="p">.</span><span class="nx">statusCode</span> <span class="o">=</span> <span class="mi">401</span><span class="p">;</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">res</span><span class="p">.</span><span class="nx">end</span><span class="p">(</span><span class="s1">&#39;Missing access_token query parameter&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">proxy</span><span class="p">.</span><span class="nx">web</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="p">{</span><span class="nx">target</span><span class="o">:</span> <span class="nx">config</span><span class="p">.</span><span class="nx">target</span><span class="p">,</span> <span class="nx">rejectUnauthorized</span><span class="o">:</span> <span class="kc">false</span><span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">server</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="nx">port</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">logger</span><span class="p">.</span><span class="nx">info</span><span class="p">(</span><span class="s1">&#39;Likeastore Elastic-Proxy started at: &#39;</span> <span class="o">+</span> <span class="nx">port</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>It proxies all the requests and only by-pass ones, who provide <code>access_token</code> as query parameter. The <code>access_token</code> value is <a href="https://github.com/likeastore/elastic-proxy/blob/master/config/production.config.js">configured</a> on server, by applications environment variable <code>PROXY_ACCESS_TOKEN</code>.</p>

<p>As you already <a href="https://www.digitalocean.com/community/tutorials/how-to-use-the-dokku-one-click-digitalocean-image-to-deploy-a-python-flask-app">prepared</a> Dokku all you need to do is to push application to your server.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>git push master production
</span></code></pre></td></tr></table></div></figure>


<p>After the deployment, you should go to server to configure applications environment,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>dokku config proxy <span class="nb">set </span><span class="nv">PROXY_ACCESS_TOKEN</span><span class="o">=</span><span class="s2">&quot;your_secret_value&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>I wanted to have SSL and it&rsquo;s very easy to configure with Dokku. Just place your <code>server.crt</code> and <code>server.key</code> to <code>/home/dokku/proxy/tls</code> folder.</p>

<p>Proxy have to be <a href="https://github.com/scottatron/dokku-rebuild">redeployed</a> afterward, to apply configuration changes. Try proxy by hitting it&rsquo;s URL, in my case <a href="https://search.likeastore.com">https://search.likeastore.com</a>. If everything is good, it will reply,</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=''><span class='line'>Missing access_token query parameter</span></code></pre></td></tr></table></div></figure>


<h2>Link containers</h2>

<p>We need to link both containers, so Node.js application is able to access ElasticSeach container. I really liked <a href="https://github.com/rlaneve/dokku-link">dokku-link</a> plugin, that does exactly that&rsquo;s required in very easy way. So, will install 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>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span><span class="nb">cd</span> /var/lib/dokku/plugins
</span><span class='line'><span class="nv">$ </span>git clone https://github.com/rlaneve/dokku-link
</span></code></pre></td></tr></table></div></figure>


<p>Now, we need to link containers,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">$ </span>dokku link proxy elastic
</span></code></pre></td></tr></table></div></figure>


<p>And application have to be redeployed again. If everything is good, you will be able to access the server by <code>https://proxy.yourserver.com?access_token=your_secret_value</code> and see the response from ElasticSearch,</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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="nx">status</span><span class="o">:</span> <span class="mi">200</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">name</span><span class="o">:</span> <span class="s2">&quot;Tundra&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">version</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">number</span><span class="o">:</span> <span class="s2">&quot;1.2.1&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">build_hash</span><span class="o">:</span> <span class="s2">&quot;6c95b759f9e7ef0f8e17f77d850da43ce8a4b364&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">build_timestamp</span><span class="o">:</span> <span class="s2">&quot;2014-06-03T15:02:52Z&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">build_snapshot</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">lucene_version</span><span class="o">:</span> <span class="s2">&quot;4.8&quot;</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="nx">tagline</span><span class="o">:</span> <span class="s2">&quot;You Know, for Search&quot;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Reconfigure the client</h2>

<p>Depending on a client you use, you need to apply a little tweak to configuration. Basically, we need to use <code>access_token</code> for all our request. For Node.js applications,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">client</span> <span class="o">=</span> <span class="nx">elasticsearch</span><span class="p">.</span><span class="nx">Client</span><span class="p">({</span>
</span><span class='line'>  <span class="nx">host</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">protocol</span><span class="o">:</span> <span class="s1">&#39;https&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">host</span><span class="o">:</span> <span class="s1">&#39;search.likeastore.com&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">port</span><span class="o">:</span> <span class="mi">443</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">query</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">access_token</span><span class="o">:</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">ELASTIC_ACCESS_TOKEN</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="nx">requestTimeout</span><span class="o">:</span> <span class="mi">5000</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Again, <code>ELASTIC_ACCESS_TOKEN</code> is env variable to hold <code>your_secret_value</code> token.</p>

<p>Now, restart the application, make sure everything is running and exhale.</p>

<p><strong>PS</strong>. I would like to say thank to <a href="https://www.digitalocean.com/?refcode=de56d081b272">DigitalOcean</a> for support and a little credit I received as downtime compensation. Thats awesome.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Lessons Learned Working On Startup]]></title>
    <link href="http://beletsky.net/2014/07/working-on-startup.html"/>
    <updated>2014-07-03T10:41:00+02:00</updated>
    <id>http://beletsky.net/2014/07/working-on-startup</id>
    <content type="html"><![CDATA[<p>Last year, July 2013 public version of Likeastore been <a href="http://beletsky.net/2013/07/likeastore-app-goes-to-public.html">released</a>. It gave momentum to change the mind, went out of comfort zone, reconsider priorities and literally change my life. Earlier I <a href="http://beletsky.net/2014/03/from-side-project-to-start.html">blogged</a> about transformation of Likeastore from side project to startup.</p>

<p>Today, I want to share some info on where are we now and lessons I learned so far.</p>

<!-- MORE -->


<h2>Focus on search</h2>

<p>One of the most significant <a href="http://www.amazon.com/The-Startup-Owners-Manual-Step-By-Step/dp/0984999302">books</a> on startups, defines startup as temporary organization aims to find sustainable business idea. It&rsquo;s not about coding, testing or anything related to development. It&rsquo;s all about the search.</p>

<p>The biggest mistake of Likeastore, we never did any kind of search before the project started. It was a cool idea that made sense to me and I wanted to make it happen. Development is very expensive process. It&rsquo;s not possible to do good looking and well functioning product without long hours of work. And we worked hard.</p>

<p>Many times I heard opinion <em>&ldquo;work smarter, not harder&rdquo;</em>. That principle transformed to something we know now as <a href="http://theleanstartup.com/">Lean Startup</a>, that basically says <em>&ldquo;do as less as possible before your idea is validated&rdquo;</em>. The only way to validate it is to show it to people and talk to that people after. There is no truth inside the organization, founders might have vision but that vision could be wrong.</p>

<p>Engaging with users, processing the feedback and correction of idea is something that called is Customer Development. Customer Development is vital part of search. Unfortunately, we never accomplish any kind of customer development and currently we suffer that. &ldquo;Likeastore is so cool idea&rdquo; &ndash; we still receiving that kind of emails from our users, that stays for 3 weeks and then slipping away.</p>

<p>Working smarter is hard. For me, that&rsquo;s completely different set of skills and habits. The founder is the one who is able to tweak himself for new conditions and focus on search.</p>

<h2>Coding is easy part</h2>

<p>Being the programmer and spent over 10 years in software development I was sure that I&rsquo;m doing the most complex part of work. All those business guys, product owners and so on, seemed to be auxiliary people, sometimes ones who are just interfere the work.</p>

<p>Working in the company, together with business people, your area of responsibility is primarily the code. But at the end of the day, you don&rsquo;t know what&rsquo;s happening after deployment. How customers work with your code, are they happy.. are they ready to pay the money? Business people care about it and plan on what exactly need to be done further. You turning their ideas into code and get salary not because your code is good, but because business works.</p>

<p>Working in startup is different. No more product owner who says what to do next. You are the product owner. And generating ideas is hard. Talking to customers is hard. Search of product/market fit is hard.</p>

<p>Being able to sit and spend 10 hours for programming is fun for me, but it turned out it&rsquo;s the most easiest part of journey.</p>

<h2>Measure everything</h2>

<p>The code is deployed, some traffic lead to site &ndash; now what? In Likeastore we were blind for quite long time without good understanding of what actually happening inside the application.</p>

<p>The truth is, without data it&rsquo;s not possible to make decisions. We are now utilize <a href="http://mixpanel.com">Mixpanel</a>, <a href="http://www.google.com/analytics/">Google Analytics</a>, <a href="https://github.com/seismolabs/seismo">Seismo</a> custom dashboards etc. in order to understand what&rsquo;s works or not.</p>

<p><em>Build, Measure, Learn</em> &ndash; the mantra of Lean Startup. What we focused on previously is <em>Build</em> part only and that&rsquo;s not right. Startup is ability to make educated guesses, guesses should be based on learnings, learnings are based on measurements.</p>

<p>We are at very stage, but now working hard to create good framework for analytics and measurements.</p>

<h2>Build your own culture</h2>

<p>Even if your are very small, culture plays major role. At the early stage you affect the culture, later stages culture affects you. At Likeastore, we care about marketing and development culture much.</p>

<p>Being based on <a href="http://beletsky.net/2013/12/open-source.html">open source</a> we try to contribute back to open source. I&rsquo;m really happy with our <a href="https://github.com/likeastore">github</a> profile and only predict it&rsquo;s going to grow. We try to open source as much as possible, sometimes even solutions that quite specific to Likeastore.</p>

<p>Our later obsession with metrics and numbers will be part of culture as well. As founder you should see where you want to be in 2-3 years, not only in terms of product, but the way other people know about the company. For me, saying &ldquo;I work on Likeastore&rdquo; means a lot and I want it mean a lot for everyone works here.</p>

<h2>Listen what they say</h2>

<p>It&rsquo;s a common practice for business accelerators accepts teams with at least 2-3 founders. I didn&rsquo;t really understand why.</p>

<p>There are few things here. First of all, if you are not able to inspire at least one person with your idea it&rsquo;s likely going to fail. Second, founders should complement each others skills. There are <a href="http://www.marsdd.com/news-and-insights/hacker-hustler-and-designer-building-the-tech-team/">rule of 3</a> that ideal startup team should consists of hacker, hustler, designer.</p>

<p>But there is more important aspect. Founders have to talk all the time, brainstorm and share ideas, discuss competitors etc. You need at least 2 people for discussion. More importantly, you should be able to share your idea with other people. Once we&rsquo;ve <a href="http://beletsky.net/2013/12/likeastore-is-becoming-a-company.html">joined</a> business accelerator, first advice that I received &ndash; &ldquo;talk to other teams, they will help you&rdquo;. I didn&rsquo;t take that advice seriously and I was really wrong. Startups are huge community and you either part of that community or out.</p>

<p>You have to both talk a lot and listen what they say. Co-founders, users, colleagues &ndash; they know something you don&rsquo;t. It doesn&rsquo;t mean you have to do everything they say, but definitely <a href="http://dcurt.is/there-is-no-solution-to-this-problem">listen</a> and analyze.</p>

<p>We are now team of 3 and it feels really good. Each of us have own experience, so we need to combine and make something real out of it. Don&rsquo;t keep secrets, share the stuff. Doesn&rsquo;t matter what exactly your role is, talk to the team, talk to other guys, feel the influence.</p>

<p>Don&rsquo;t close the door of your garage.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using Mixpanel from Chrome Extensions]]></title>
    <link href="http://beletsky.net/2014/05/using-mixpanel-analytics-from-chrome-extensions.html"/>
    <updated>2014-05-22T11:15:00+02:00</updated>
    <id>http://beletsky.net/2014/05/using-mixpanel-analytics-from-chrome-extensions</id>
    <content type="html"><![CDATA[<p>Recently we&rsquo;ve released Google Chrome <a href="https://chrome.google.com/webstore/detail/likeastore/einhadilfmpdfmmjnnppomcccmlohjad?hl=en-US&amp;utm_source=chrome-ntp-launcher">extension</a> for <a href="https://likeastore.com">Likeastore</a> that allows to extend your Google search results with relevant information from your likes. Development of Chrome extensions appeared to be interesting process, but essentially it&rsquo;s nothing more as web development, since primary technologies are still HTML/CSS/JS.</p>

<p>The most important thing for every startup are metrics. In web application we use <a href="https://mixpanel.com">Mixpanel</a> together with <a href="https://www.google.com.ua/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0CCkQFjAA&amp;url=http%3A%2F%2Fwww.google.com%2Fanalytics%2F&amp;ei=0sB9U_OyJMvc4QSYsYCoDA&amp;usg=AFQjCNFz3Lrd3h9xlat60IUur_H8rmADdw&amp;sig2=3VSXbRKyt9hgF6viPp2ahA&amp;bvm=bv.67229260,d.bGE">Google Analytics</a> and <a href="https://github.com/seismolabs">Seismo</a>. For browser extension I also needed some simple metrics, like &ldquo;usage&rdquo;, &ldquo;clicks&rdquo;, &ldquo;shares&rdquo; etc. Unfortunately, if you just try to reference <code>mixpanel-2.2.min.js</code> it won&rsquo;t work.</p>

<!-- MORE -->


<p>Instead, you will see error message in console,</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=''><span class='line'>Mixpanel error: 'mixpanel' object not initialized. Ensure you are using the latest version of the Mixpanel JS Library along with the snippet we provide.</span></code></pre></td></tr></table></div></figure>


<p>There are few reasons for that. One is described in SO <a href="http://stackoverflow.com/questions/15837450/content-security-policy-cannot-load-mixpanel-in-chrome-extension">question</a>. But after I did same manipulations as answer mentioned it still didn&rsquo;t work. For extension I only have content script, there is no place there I can put <code>&lt;script&gt;&lt;/script&gt;</code> tag with markup. It seems like <code>mixpanel-2.2.min.js</code> have some dependencies that just prevents it to start normally inside extension, not usual web application.</p>

<p>I had no time to investigate the problem deeply, but instead found workaround that works.</p>

<h2>Mixpanel HTTP API</h2>

<p>Besides platform-dependent libraries, Mixpanel provides access to <a href="https://mixpanel.com/help/reference/http">HTTP API</a>. This is the most &ldquo;pure&rdquo; way of communication between services, so I decided to try it.</p>

<p>Since, I already used <code>jQuery</code> in my application, I ended-up with such module,</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='js'><span class='line'><span class="p">;(</span><span class="kd">function</span> <span class="p">(</span><span class="nb">window</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">api</span> <span class="o">=</span> <span class="s1">&#39;https://api.mixpanel.com&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">app</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">app</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">app</span> <span class="o">||</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">mixpanel</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">init</span><span class="p">(</span><span class="nx">token</span><span class="p">,</span> <span class="nx">user</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">mixpanel</span><span class="p">.</span><span class="nx">token</span> <span class="o">=</span> <span class="nx">token</span><span class="p">;</span>
</span><span class='line'>      <span class="nx">mixpanel</span><span class="p">.</span><span class="nx">distinct_id</span> <span class="o">=</span> <span class="nx">user</span><span class="p">.</span><span class="nx">email</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">track</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">payload</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">event</span><span class="o">:</span> <span class="nx">event</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">distinct_id</span><span class="o">:</span> <span class="nx">mixpanel</span><span class="p">.</span><span class="nx">distinct_id</span><span class="p">,</span>
</span><span class='line'>              <span class="nx">token</span><span class="o">:</span> <span class="nx">mixpanel</span><span class="p">.</span><span class="nx">token</span><span class="p">,</span>
</span><span class='line'>              <span class="nx">browser</span><span class="o">:</span> <span class="nx">app</span><span class="p">.</span><span class="nx">browser</span><span class="p">.</span><span class="nx">name</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>      <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">data</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">base64</span><span class="p">(</span><span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">payload</span><span class="p">));</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">url</span> <span class="o">=</span> <span class="nx">api</span> <span class="o">+</span> <span class="s1">&#39;/track?data=&#39;</span> <span class="o">+</span> <span class="nx">data</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">$</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">url</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">app</span><span class="p">.</span><span class="nx">analytics</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">init</span><span class="o">:</span> <span class="nx">init</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">track</span><span class="o">:</span> <span class="nx">track</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="p">})(</span><span class="nb">window</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here, I&rsquo;m using <a href="https://gist.github.com/alexbeletsky/3f850467bc23d40ef51e">this</a> implementation of <code>base64</code> (copied from <code>mixpanel-2.2.js</code>). So, to track the <code>event</code> you just HTTP GET to Mixpanel API, with a payload of base64&#8217;ed JSON string of <code>event</code> and <code>properties</code>.</p>

<h2>Initialization</h2>

<p>To init <code>mixpanel</code> you need both <code>token</code> and <code>distinct_id</code>. The <code>distinct_id</code> is unique value, that Mixpanel generates itself and stores the value to cookie, to identify the user. If you send events from different applications, say web app, mobile web extension etc. &ndash; I would recommend to user <code>mixpanel.alias()</code> call, so you &ldquo;link&rdquo; unknown <code>distinct_id</code> with some user&rsquo;s attribute (<code>id</code> from database or <code>email</code> would work).</p>

<p>On our web application, once user logged on we call <code>mixpanel.alias()</code> with email of user, so all other applications could use that as <code>distinct_id</code> of user.</p>

<p>The entry point of content script is <code>run()</code> method, where user is fetched from server and initialize <code>mixpanel</code> module,</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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">ready</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">user</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">app</span><span class="p">.</span><span class="nx">analytics</span><span class="p">.</span><span class="nx">init</span><span class="p">(</span><span class="s1">&#39;[MIXPANEL_TOKEN_HERE]&#39;</span><span class="p">,</span> <span class="nx">user</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="k">return</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">run</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">api</span> <span class="o">+</span> <span class="s1">&#39;/users/me&#39;</span><span class="p">)</span>
</span><span class='line'>          <span class="p">.</span><span class="nx">done</span><span class="p">(</span><span class="nx">ready</span><span class="p">)</span>
</span><span class='line'>          <span class="p">.</span><span class="nx">done</span><span class="p">(</span><span class="nx">search</span><span class="p">)</span>
</span><span class='line'>          <span class="p">.</span><span class="nx">fail</span><span class="p">(</span><span class="nx">login</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>Tracking</h2>

<p>Once content script injects it&rsquo;s HTML into target page DOM, it&rsquo;s possible to listen to DOM events and call <code>.track()</code> function.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">self</span><span class="p">.</span><span class="nx">bindEvents</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">self</span><span class="p">.</span><span class="nx">$</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s1">&#39;.item a&#39;</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">app</span><span class="p">.</span><span class="nx">analytics</span><span class="p">.</span><span class="nx">track</span><span class="p">(</span><span class="s1">&#39;search extension results clicked&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">self</span><span class="p">.</span><span class="nx">$</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="s1">&#39;.ls-more a&#39;</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">app</span><span class="p">.</span><span class="nx">analytics</span><span class="p">.</span><span class="nx">track</span><span class="p">(</span><span class="s1">&#39;search extension more clicked&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">app</span><span class="p">.</span><span class="nx">analytics</span><span class="p">.</span><span class="nx">track</span><span class="p">(</span><span class="s1">&#39;search extension&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Conclusions</h2>

<p>I consider Mixpanel HTTP API as very nice substitution of library, in those rare cases when library is not applicable. This would work perfectly if you need simple events tracking. If you interested, feel free to check <a href="https://github.com/likeastore/browser-extension">sources</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Got Tired of MongoDB Full Text Index]]></title>
    <link href="http://beletsky.net/2014/05/got-tired-of-mongodb-full-text.html"/>
    <updated>2014-05-15T11:29:00+02:00</updated>
    <id>http://beletsky.net/2014/05/got-tired-of-mongodb-full-text</id>
    <content type="html"><![CDATA[<p>We use MongoDB as our primary data source in <a href="https://likeastore.com">Likeastore</a> and went the way of MongoDB Full Text Search. Everything were fine initially, but after a while it became obvious that MongoDB FTS could not satisfy me any more.</p>

<p>I knew about search oriented storages as <a href="http://www.elasticsearch.org/">ElasticSearch</a>, <a href="http://sphinxsearch.com/">Sphinx</a>, <a href="http://lucene.apache.org/solr/">Solr</a>, etc. but the migration process always seemed a bit scary to me. After a bit of elaboration I decided to go with Elastic and the migration was quite fun and not so difficult as I initially expected.</p>

<!-- MORE -->


<h2>What&rsquo;s wrong with MongoDB?</h2>

<p>We are using MongoDB 2.4 and full text search is experimental feature there. By default, it&rsquo;s turned off on production instances of MongoHQ. Anyway, it&rsquo;s very easy to turn it on and run <code>text</code> commands against it. But we met it&rsquo;s bottleneck when indexed collection start to grow (>3M documents).</p>

<p>We are doing a lot of <code>inserts</code> and if you have full text index, each <code>insert</code> triggers index re-calculation. Few weeks ago I&rsquo;ve noticed huge performance issues of our DB. After first glance of monitoring information it&rsquo;s was pretty clear that <code>Locked</code> index is >110% and a lot requests got timed-out. Application became low responsive.</p>

<p>It could be potentially solved by moving on more powerful server (more CPU and RAM) or by sharding database into few instances. Both costs money. Costs are something that I would like to avoid, if possible. It was time to move to specialized solution.</p>

<p>This is the reason to deploy ElasticSearch &ndash; put less strain on MongoDB and to use as an asynchronous index.</p>

<h2>Migration plan</h2>

<p>Before starting out, I&rsquo;ve consulted with my guru <a href="http://www.vinaysahni.com/">Vinay Sahni</a> and his experience of ElasticSeach in <a href="http://www.supportfu.com/">SupportFu</a>. The general feedback on ElasticSeach was really nice. They don&rsquo;t use any <a href="https://github.com/richardwilly98/elasticsearch-river-mongodb">rivers</a> instead use <code>after_save</code> hook of their ORM, so each time new document is created it&rsquo;s pushed to ElasticSearch index.</p>

<p>I decided to go similar way, so my migration plan was:</p>

<ol>
<li>Export all existing documents to ElasticSearch.</li>
<li>Correct the code and after each new insert send update to ElasticSearch.</li>
</ol>


<p>In my situation it&rsquo;s a bit simpler, by the fact, I have only one collection to index and major part of DB operations are <code>inserts</code> not <code>updates</code>, otherwise I believe using of <code>river</code> has more sense (and a more effort to setup).</p>

<h2>Deploy instance on Digital Ocean</h2>

<p>I&rsquo;ve spin-up <a href="https://www.digitalocean.com/?refcode=de56d081b272">Digital Ocean</a> droplet and used that great <a href="https://www.digitalocean.com/community/articles/how-to-install-elasticsearch-on-an-ubuntu-vps">instructions</a> for installation (btw, I recommend to install from Debian package, since it&rsquo;s easier to run elastic as <code>init.d</code> service).</p>

<p>Just in 10 minutes you have working ElasticSeach cluster, ready to rock.</p>

<h2>Migrate MongoDB data to ElasticSearch index</h2>

<p>Then I needed to move about 12GB of data from my production MongoDB instance to Elastic. To accomplish that, I&rsquo;ve created really simple tool &ndash; <a href="https://github.com/likeastore/elaster">elaster</a>. Elaster streams MongoDB collection into ElasticSearch index, based on <a href="https://github.com/likeastore/elaster/blob/master/config/index.js">configuration</a> you provide.</p>

<p>I&rsquo;ve installed <code>nodejs</code> on ElasticSeach server, cloned elaster there and run,</p>

<p><img src="https://pbs.twimg.com/media/Bmpa3QGCcAAOHSZ.png:large" alt="elaster" /></p>

<p>Both elaster and application code use <a href="https://www.npmjs.org/package/elasticsearch">elasticsearch</a> npm package.</p>

<p>The whole process took ~2 hours.</p>

<h2>Update the application code</h2>

<p>Right after documents are inserted to MongoDB and initialized with <code>_id</code>, they are ready to be saved to index. I use bulk operation for that,</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<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='js'><span class='line'><span class="nx">index</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">items</span><span class="p">,</span> <span class="nx">state</span><span class="p">,</span> <span class="nx">callback</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="nx">items</span> <span class="o">||</span> <span class="nx">items</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">items</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">commands</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>  <span class="nx">items</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">item</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">commands</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span><span class="s1">&#39;index&#39;</span><span class="o">:</span> <span class="p">{</span><span class="s1">&#39;_index&#39;</span><span class="o">:</span> <span class="s1">&#39;items&#39;</span><span class="p">,</span> <span class="s1">&#39;_type&#39;</span><span class="o">:</span> <span class="s1">&#39;item&#39;</span><span class="p">,</span> <span class="s1">&#39;_id&#39;</span><span class="o">:</span> <span class="nx">item</span><span class="p">.</span><span class="nx">_id</span><span class="p">.</span><span class="nx">toString</span><span class="p">()}});</span>
</span><span class='line'>      <span class="nx">commands</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">item</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">elastic</span><span class="p">.</span><span class="nx">bulk</span><span class="p">({</span><span class="nx">body</span><span class="o">:</span> <span class="nx">commands</span><span class="p">},</span> <span class="nx">callback</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Simple search query</h2>

<p>ElasticSearch comes with very nice <a href="http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl.html">Query DSL</a>. I&rsquo;m very new to the technology, so I&rsquo;ve managed to create really simple query, which already gives quite nice results.</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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">fullTextItemSearch</span> <span class="p">(</span><span class="nx">user</span><span class="p">,</span> <span class="nx">query</span><span class="p">,</span> <span class="nx">paging</span><span class="p">,</span> <span class="nx">callback</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="nx">query</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="p">{</span> <span class="nx">data</span><span class="o">:</span> <span class="p">[],</span> <span class="nx">nextPage</span><span class="o">:</span> <span class="kc">false</span> <span class="p">});</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">page</span> <span class="o">=</span> <span class="nx">paging</span><span class="p">.</span><span class="nx">page</span> <span class="o">||</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">elastic</span><span class="p">.</span><span class="nx">search</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">index</span><span class="o">:</span> <span class="s1">&#39;items&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">from</span><span class="o">:</span> <span class="p">(</span><span class="nx">page</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="nx">paging</span><span class="p">.</span><span class="nx">pageSize</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">size</span><span class="o">:</span> <span class="nx">paging</span><span class="p">.</span><span class="nx">pageSize</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">body</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">query</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">filtered</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>                  <span class="nx">query</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>                      <span class="s1">&#39;query_string&#39;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>                          <span class="nx">query</span><span class="o">:</span> <span class="nx">query</span>
</span><span class='line'>                      <span class="p">},</span>
</span><span class='line'>                  <span class="p">},</span>
</span><span class='line'>                  <span class="nx">filter</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>                      <span class="nx">term</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>                          <span class="nx">user</span><span class="o">:</span> <span class="nx">user</span><span class="p">.</span><span class="nx">email</span>
</span><span class='line'>                      <span class="p">}</span>
</span><span class='line'>                  <span class="p">}</span>
</span><span class='line'>              <span class="p">}</span>
</span><span class='line'>          <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">resp</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">callback</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">items</span> <span class="o">=</span> <span class="nx">resp</span><span class="p">.</span><span class="nx">hits</span><span class="p">.</span><span class="nx">hits</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">hit</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">hit</span><span class="p">.</span><span class="nx">_source</span><span class="p">;</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">callback</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="p">{</span><span class="nx">data</span><span class="o">:</span> <span class="nx">items</span><span class="p">,</span> <span class="nx">nextPage</span><span class="o">:</span> <span class="nx">items</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="nx">paging</span><span class="p">.</span><span class="nx">pageSize</span><span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>It just uses <code>query_string</code> and <code>filter</code> term, to filter out results for given user. The interface of Search API remained the same, just instead of querying MongoDB, now we query ElasticSearch.</p>

<h2>Summary</h2>

<p>The main conclusion is &ndash; ElasticSearch is kind of technology that works out of the box. It&rsquo;s very complex inside, but have great interface that hides all the complexity. First and good enough results can be archived very quickly.</p>

<p>In the same time, the technology requires time and effort to understand it and to use it right. I have absolutely no experience with full text search, so it&rsquo;s really journey for me.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Integration or Unit Tests Trade-Off]]></title>
    <link href="http://beletsky.net/2014/04/integration-tests-for-express-dot-js-middleware.html"/>
    <updated>2014-04-23T11:19:00+02:00</updated>
    <id>http://beletsky.net/2014/04/integration-tests-for-express-dot-js-middleware</id>
    <content type="html"><![CDATA[<p>Recently, I&rsquo;ve released small Express.js extension for easy switching application to <code>maintenance</code> mode. Sometimes, you just want to run patch against database or change the infrastructure of product, but instead of showing blank <code>nginx</code> 503 error page, you want to have nice looking HTML, saying will be back soon.</p>

<p>The <code>maintenance</code> package is now available on <a href="https://www.npmjs.org/package/maintenance">npm</a> and you welcome to use it. But I would like to share the way I developed and test it.</p>

<!-- More -->


<p>So, <code>maintenance</code> is a function that takes <code>app</code> instance and <code>options</code> as a parameters. Then it augments <code>app</code> with additional endpoint (if there is such preference) and injects middleware function that would render maintenance page in case of mode is set to <code>true</code>.</p>

<p>It&rsquo;s really small piece functionality, but still I wanted to make sure, it&rsquo;s gonna work in my application without annoying restarts of servers and debugging the stuff. And TDD is right approach to solve the pain.</p>

<p>TDD is quite commonly trade-off of <code>unit tests</code> and <code>integration tests</code>. And it&rsquo;s always up to developer which direction go in particular case. Let&rsquo;s take a look on my case:</p>

<p>If you go <code>unit test</code> way, it would be something like that:</p>

<ul>
<li>call <code>maintenance</code> function, pass mock of <code>express</code> instance

<ul>
<li>verify that new <code>route</code> is added after function completes</li>
<li>verify that all <code>route.callbacks</code> now have callback to check the mode</li>
<li>verify that <code>route.callbacks[0]</code> contains mode check function</li>
</ul>
</li>
<li>call <code>route.callbacks[0]</code>, mock <code>req</code> and <code>res</code> object

<ul>
<li>verify that <code>res.render</code> called with <code>maintanance.html</code> argument</li>
<li>etc..</li>
</ul>
</li>
</ul>


<p>Is all of that kind of <strong>suck</strong>? It is, since it would take too much effort for mocking the stuff.. But more important, all of that is nothing more as just testing of <strong>implementation details</strong> of Express.js, but not <strong>behavior details</strong> of application.</p>

<p>Now, let&rsquo;s consider <code>integration tests</code> way for same stuff:</p>

<ul>
<li>run application in normal mode

<ul>
<li>send HTTP GET and make sure that response is fine</li>
</ul>
</li>
<li>run application is maintenance mode

<ul>
<li>send HTTP GET and make sure that response contains maintenance page</li>
</ul>
</li>
<li>run application in normal mode

<ul>
<li>send HTTP GET and make sure that response is fine</li>
<li>sent HTTP POST to maintenance endpoint</li>
<li>send HTTP GET and make sure that response contains maintenance page</li>
</ul>
</li>
</ul>


<p>Does it look like real <strong>behavior</strong> testing? Indeed, test acts as <code>user</code> and checks that application actually behaves right, doesn&rsquo;t matter of implementation details.</p>

<p>With spending more time with Express.js and Node.js I see much <a href="http://beletsky.net/2014/03/testable-apis-with-node-dot-js.html">more value</a> in integration way of testing. It&rsquo;s very easy to spin-up a server and send HTTP requests and check responses.</p>

<p>If you are interested, check out <a href="https://github.com/likeastore/maintenance/blob/master/test/spec/maintenence.spec.js">specification</a> and <a href="https://github.com/likeastore/maintenance/blob/master/test/app/app.js">test application</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Side-Project to Startup in One Year]]></title>
    <link href="http://beletsky.net/2014/03/from-side-project-to-start.html"/>
    <updated>2014-03-31T13:09:00+02:00</updated>
    <id>http://beletsky.net/2014/03/from-side-project-to-start</id>
    <content type="html"><![CDATA[<p>Today is exactly <a href="http://beletsky.net/2013/03/likeastore-application-built-on.html">one year</a> as we started <a href="https://likeastore.com">Likeastore</a> project. It went through a different stages, from hack to side-project and finally transformed to real <a href="http://beletsky.net/2013/12/likeastore-is-becoming-a-company.html">startup</a>.</p>

<p>The year, seems to be a huge period of time. It is, but I have to say it&rsquo;s only few last months (from the middle of December till today), we are fully dedicated to project. It&rsquo;s been great ride so far, so I wish to share some interesting moments.</p>

<!--More-->


<h2>What we started with</h2>

<p>Let me remind you, <a href="https://likeastore.com">Likeastore</a> is a web application that allow users to connect their social accounts and collect all their favorite items from them. We are 2 founders, me and <a href="https://twitter.com/voronianski">Dima</a> who committed themselves to build product that matters.</p>

<p>As founders we felt that &ldquo;likes&rdquo; are kind of new way of bookmarking. Then you favorite something on social network you do 2 things &ndash; you send appreciate to author content, as well as marking the content as interesting to you.</p>

<p>The problem that we try to solve. First, there are too many sources of information (social networks) where we spend time and receive content from, so tracking all social likes is extremely difficult. And second, it&rsquo;s very hard to find exact favorite item since social networks provide poor search functionality.</p>

<p>So, our initial hypothesis for application was &ndash; <em>people want to collect their likes in one place and be able to search them</em>.</p>

<h2>Where are we now</h2>

<p>After successful demonstration on hackathon, we&rsquo;ve reimplemented application from scratch and did first private beta in May 2013. It was pretty painful, since after 10 minutes of fly my inbox was full of error messages. But, general impression of people we spoken was positive. We&rsquo;ve crossed the line from hack to side project.</p>

<p>Our public beta released at July 2013. All major issues were solved, the infrastructure established and UI/UX of product were done. We were lucky enough to be featured by Codrops and after by SmashingMagazine twitter, which gave us first 500 beta users.</p>

<p>At the end of 2013 we&rsquo;ve dropped our full time jobs, joined business accelerator and totally focused on a product. I would say, that was the point then we crossed the next line, from side-project to startup.</p>

<p>We are at the full speed, full time, 2 people dedicated to Likeastore. And since then, we did major step forward. Let me share some of current statistics:</p>

<ul>
<li>6.370 <strong>signups</strong> (+ ~4.000 from January till today)</li>
<li>2.700.000 <strong>likes collected</strong> (+ ~1.500.00 from January till today)</li>
<li>~200 <strong>active users</strong> (+185 from January till today)</li>
<li>~600 <strong>feedback emails received</strong></li>
<li>452 <strong>collections created</strong></li>
</ul>


<h2>How does it feel like</h2>

<p>First of all, time flows 2x faster compare to anything I was involved before. You put yourself in a very constraint environment: lack of money, lack of time, not clear whats happens tomorrow. Multitasking is second name of startup, you don&rsquo;t have time to be focused on one task during the day.</p>

<p>Every day you feel ups and downs. The mood is changing constantly. You have growth and receive users feedback &ndash; it feels great. You talk to investors or mentors that find weaks and leaks of idea &ndash; it feels bad. And it&rsquo;s all the time like that.</p>

<p>Founders job here is to supporters to each other, motivate for further wins.</p>

<h2>What we learned so far</h2>

<p><strong> Product / Market Fit </strong> &ndash; basically all you do in startup is finding a balance between value you can propose and market that meets that value. It doesn&rsquo;t matter what the initial idea is, more important is to be able to change direction and put maximum efforts to find the fit. The search could be blind or educated, educated search is probably more successful.</p>

<p>You will never know about that fit, before you try. Almost no idea will survive after it hits the customers. Steve Blanks calls that as &ldquo;getting out of the building&rdquo;, talk to people and show your product before you even built it and spend a lot of money for it.</p>

<p>The product have to solve real customer pain or need to survive.</p>

<p><strong> Metrics are important </strong> &ndash; all decisions have to be taken on metrics. Retention, Cohort analysis, Viral coefficients &ndash; that was all new words for me and only now I realize how metrics are important.</p>

<p>Startup dashboard that aggregates major metrics and KPI&rsquo;s is something that founders spend a lot of time with, finding new strategies and forecasting startup future. Measure everything.</p>

<p><strong> Marketing and Growth </strong> &ndash; current market is already very tight. People are constantly releasing new web and mobile applications, solving different problems, targeting different customer groups. You are a drop of water in the ocean and you have to be noticed to have growth.</p>

<p>I see marketing as car&rsquo;s engine starter &ndash; you built the car, put powerful engine, comfortable chairs and high quality audio system. But without starter, engine won&rsquo;t start and car won&rsquo;t move.</p>

<p>At least basic marketing skills are vital for startup. If founders are more technically oriented (as we are) someone either have to learn it, or you have to hire specialist to help.</p>

<h2>Smooth pivot</h2>

<p>We are growing, average 10% per week. In the same time, we have quite low retention coefficient. People are quite excited about idea of application, but very fast they simply forget about and don&rsquo;t come back.</p>

<p>To be successful on B2C segment, you have to have hundred thousands of users to be sustainable. Likeastore is very far from sustain state as for now.</p>

<p>In the other hand, startup is great place to change your mind. I change my mind all the time. The change of mind in startup have a fancy word for it &ndash; pivot. Pivot is the change of direction that startup does, to find it&rsquo;s product / market fit.</p>

<p>We are going to pivot Likeastore in a very smooth way. As we previously was &ldquo;Dropbox of Likes&rdquo;, just allowing to collect and search.. we now want to try something like &ldquo;Pinterest of Likes&rdquo;, allowing people to collect best content into sharable collections, following that collections and collaborating on them.</p>

<h2>Ultimate goal</h2>

<p>We are putting our bar much higher. Our ultimate goal now is to gather 20.000 users at the end of the May 2014. If it happens, that would mean the idea of Likeastore is alive, otherwise the chances it survives are very low.</p>

<p>Both me and Dima really believe in what we do. We have the vision, will try to turn it to reality and either pivot or try something completely new.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Testable API's with Node.js]]></title>
    <link href="http://beletsky.net/2014/03/testable-apis-with-node-dot-js.html"/>
    <updated>2014-03-04T15:36:00+01:00</updated>
    <id>http://beletsky.net/2014/03/testable-apis-with-node-dot-js</id>
    <content type="html"><![CDATA[<p>API is heart of modern web application. It&rsquo;s all about to make it easy to consume, scale and make sure it works as expected. Currently I follow &ldquo;all open API methods must have tests&rdquo; (AOAMMHT) principle. I used to work with .NET technologies, where testing of API&rsquo;s was about calling methods of corresponding controller object, which typically was unit testing &ndash; mocking up all controller dependencies, setting up expects of returned values.</p>

<p>I&rsquo;ve changed my mind on testing with Node.js/Express.js development. For API&rsquo;s I prefer &ldquo;end-to-end&rdquo; testing: setting up user account, authentication, HTTP calls to server, real calls to DB and serving JSON payload back. API&rsquo;s have to be tested from consumer point of few to be able to give some meaningful results.</p>

<!-- MORE -->


<h2>Tools and Frameworks</h2>

<p>Pretty standard setup: <a href="http://visionmedia.github.io/mocha/">mocha</a>, <a href="http://chaijs.com/">chai</a>, <a href="https://github.com/mikeal/request">request</a>.</p>

<p>Mocha is time proven tool for testing Node.js applications, Chai is good enough expectation framework and Request as one best HTTP clients I even worked with.</p>

<h2>Prepare application for testing</h2>

<p>Dependencies above is installed via <code>npm install</code> and should be saved to <code>package.json</code> file (with <code>--save</code> option). Your project structure should have <code>test</code> folder inside, which mocha is using as default to look tests inside. Few files should be added there, current structure I have that works.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<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=''><span class='line'>/test
</span><span class='line'>  /specs
</span><span class='line'>      auth.spec.js
</span><span class='line'>      ...
</span><span class='line'>  common.js
</span><span class='line'>  mocha.opts
</span><span class='line'>  utils.js
</span><span class='line'>  runMocha.js</span></code></pre></td></tr></table></div></figure>


<p><code>/api</code> folder is the one that would contain specifications for you API, <code>mocha.opts</code> &ndash; contains global mocha configuration, <code>common.js</code> is common require file, that all tests are using, <code>utils.js</code> &ndash; test helper that would contain everything you need during testing, <code>runMocha.js</code> utility that would be tests entry point.</p>

<h3>mocha.opts</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<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=''><span class='line'>--require ./test/common.js
</span><span class='line'>--reporter spec
</span><span class='line'>--ui bdd
</span><span class='line'>--recursive
</span><span class='line'>--colors
</span><span class='line'>--timeout 60000
</span><span class='line'>--slow 300</span></code></pre></td></tr></table></div></figure>


<p>Mocha options allow to require some additional javascript file, as well as setting up global Mocha settings as what reporter to use, timeouts etc.</p>

<h3>common.js</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">global</span><span class="p">.</span><span class="nx">chai</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;chai&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">global</span><span class="p">.</span><span class="nx">expect</span> <span class="o">=</span> <span class="nx">global</span><span class="p">.</span><span class="nx">chai</span><span class="p">.</span><span class="nx">expect</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>To do not require <code>chai</code> in each spec files, it&rsquo;s possible to require it once and place to global scope.</p>

<h3>runMocha.js</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<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='js'><span class='line'><span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">NODE_ENV</span> <span class="o">=</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">NODE_ENV</span> <span class="o">||</span> <span class="s1">&#39;test&#39;</span><span class="p">;</span>
</span><span class='line'><span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">TEST_ENV</span> <span class="o">=</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">TEST_ENV</span> <span class="o">||</span> <span class="s1">&#39;test&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">exit</span> <span class="o">=</span> <span class="nx">process</span><span class="p">.</span><span class="nx">exit</span><span class="p">;</span>
</span><span class='line'><span class="nx">process</span><span class="p">.</span><span class="nx">exit</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">code</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">setTimeout</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">exit</span><span class="p">();</span>
</span><span class='line'>  <span class="p">},</span> <span class="mi">200</span><span class="p">);</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../source/server&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../node_modules/mocha/bin/_mocha&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The secret sauce is last 2 lines. Since <code>require</code> is synchronous we first &ldquo;call&rdquo; API server to get up and after that &ldquo;call&rdquo; mocha engine to start testing. So, inside each tests we can do real HTTP calls to real HTTP servers. No mocks.</p>

<h3>package.json</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<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='js'><span class='line'><span class="c1">// ...</span>
</span><span class='line'><span class="s2">&quot;scripts&quot;</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>    <span class="s2">&quot;test&quot;</span><span class="o">:</span> <span class="s2">&quot;node test/runMocha&quot;</span><span class="p">,</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'><span class="c1">// ...</span>
</span></code></pre></td></tr></table></div></figure>


<p>Package file should contain script to call API tests with simple <code>npm test</code> command.</p>

<h2>Test driven API</h2>

<p>Mocha is using BDD (behaviour driven development) approach to testing. Comparing to classical TDD, BDD encourage to write specifications in plain English, which works good especially when you just starting with particular feature.</p>

<p>What I typically do is just writing down specification of API, without any thinking of how to implement it. Give you example of something that I worked with recently.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">request</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;request&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">testUtils</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;../utils&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">describe</span><span class="p">(</span><span class="s1">&#39;collections.spec.js&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">describe</span><span class="p">(</span><span class="s1">&#39;when non authorized&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">it</span> <span class="p">(</span><span class="s1">&#39;should not be authorized&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">describe</span><span class="p">(</span><span class="s1">&#39;when authorized&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">describe</span><span class="p">(</span><span class="s1">&#39;when new collection created&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">describe</span><span class="p">(</span><span class="s1">&#39;public&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">it</span><span class="p">(</span><span class="s1">&#39;should respond with 201 (created)&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>              <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>              <span class="nx">it</span><span class="p">(</span><span class="s1">&#39;should create new collection&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>              <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>              <span class="nx">it</span><span class="p">(</span><span class="s1">&#39;should have user&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>              <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>              <span class="nx">it</span><span class="p">(</span><span class="s1">&#39;should collection be public&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>              <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>              <span class="nx">describe</span><span class="p">(</span><span class="s1">&#39;and title is missing&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                  <span class="nx">it</span><span class="p">(</span><span class="s1">&#39;should respond with 412 (bad request)&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                  <span class="p">});</span>
</span><span class='line'>              <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>              <span class="nx">describe</span><span class="p">(</span><span class="s1">&#39;with description&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                  <span class="nx">it</span><span class="p">(</span><span class="s1">&#39;should respond with 201 (created)&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>                  <span class="nx">it</span><span class="p">(</span><span class="s1">&#39;should create new collection&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>                  <span class="p">});</span>
</span><span class='line'>              <span class="p">});</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1">// etc..</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>This is kind of skeleton I to have before start anything else.</p>

<h3>Unauthorized access</h3>

<p>If your API or part of it requires authorization, I prefer to 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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">token</span><span class="p">,</span> <span class="nx">user</span><span class="p">,</span> <span class="nx">url</span><span class="p">,</span> <span class="nx">headers</span><span class="p">,</span> <span class="nx">response</span><span class="p">,</span> <span class="nx">results</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nx">beforeEach</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">url</span> <span class="o">=</span> <span class="nx">testUtils</span><span class="p">.</span><span class="nx">getRootUrl</span><span class="p">()</span> <span class="o">+</span> <span class="s1">&#39;/api/collections&#39;</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">describe</span><span class="p">(</span><span class="s1">&#39;when non authorized&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">beforeEach</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">done</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">request</span><span class="p">.</span><span class="nx">get</span><span class="p">({</span><span class="nx">url</span><span class="o">:</span> <span class="nx">url</span><span class="p">,</span> <span class="nx">json</span><span class="o">:</span> <span class="kc">true</span><span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">resp</span><span class="p">,</span> <span class="nx">body</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">response</span> <span class="o">=</span> <span class="nx">resp</span><span class="p">;</span>
</span><span class='line'>          <span class="nx">done</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">it</span> <span class="p">(</span><span class="s1">&#39;should not be authorized&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">expect</span><span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">statusCode</span><span class="p">).</span><span class="nx">to</span><span class="p">.</span><span class="nx">equal</span><span class="p">(</span><span class="mi">401</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>testUtils.getRootUrl()</code> returns qualified URL for API, depending on test environment. During development, it&rsquo;s just <code>http://localhost:3000</code> where your <code>server.js</code> started.</p>

<h3>Authorized access</h3>

<p>Authorized access typically requires some kind of <code>access_token</code> sent either by headers or query string. Doesn&rsquo;t matter how, but <code>utils.js</code> must have method that would create new user and obtain access token from API. The actual implementation of such method would depend on your API auth mechanism.</p>

<p>All tests that required authorization access, should have such <code>beforeEach()</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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">beforeEach</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">done</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">testUtils</span><span class="p">.</span><span class="nx">createTestUserAndLoginToApi</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">createdUser</span><span class="p">,</span> <span class="nx">accessToken</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">token</span> <span class="o">=</span> <span class="nx">accessToken</span><span class="p">;</span>
</span><span class='line'>      <span class="nx">user</span> <span class="o">=</span> <span class="nx">createdUser</span><span class="p">;</span>
</span><span class='line'>      <span class="nx">headers</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;X-Access-Token&#39;</span><span class="o">:</span> <span class="nx">accessToken</span><span class="p">};</span>
</span><span class='line'>      <span class="nx">done</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>After <code>access_token</code> is acquired, it can be used as part of any authorized calls.</p>

<h3>Behavior tests</h3>

<p>Now, everything is ready to test the behavior of API. Nothing fancy here, just act as clients do. Send HTTP requests, receive responses and check HTTP statuses. I&rsquo;ll just post some code, so it would give you direction.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">describe</span><span class="p">(</span><span class="s1">&#39;when new collection created&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">describe</span><span class="p">(</span><span class="s1">&#39;public&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">beforeEach</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">collection</span> <span class="o">=</span> <span class="p">{</span><span class="nx">title</span><span class="o">:</span> <span class="s1">&#39;This is test collection&#39;</span><span class="p">,</span> <span class="kr">public</span><span class="o">:</span> <span class="kc">true</span><span class="p">};</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">beforeEach</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">done</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">request</span><span class="p">.</span><span class="nx">post</span><span class="p">({</span><span class="nx">url</span><span class="o">:</span> <span class="nx">url</span><span class="p">,</span> <span class="nx">headers</span><span class="o">:</span> <span class="nx">headers</span><span class="p">,</span> <span class="nx">body</span><span class="o">:</span> <span class="nx">collection</span><span class="p">,</span> <span class="nx">json</span><span class="o">:</span> <span class="kc">true</span><span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">resp</span><span class="p">,</span> <span class="nx">body</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">response</span> <span class="o">=</span> <span class="nx">resp</span><span class="p">;</span>
</span><span class='line'>              <span class="nx">results</span> <span class="o">=</span> <span class="nx">body</span><span class="p">;</span>
</span><span class='line'>              <span class="nx">done</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">it</span><span class="p">(</span><span class="s1">&#39;should respond with 201 (created)&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">expect</span><span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">statusCode</span><span class="p">).</span><span class="nx">to</span><span class="p">.</span><span class="nx">equal</span><span class="p">(</span><span class="mi">201</span><span class="p">);</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">it</span><span class="p">(</span><span class="s1">&#39;should create new collection&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">expect</span><span class="p">(</span><span class="nx">results</span><span class="p">.</span><span class="nx">title</span><span class="p">).</span><span class="nx">to</span><span class="p">.</span><span class="nx">be</span><span class="p">.</span><span class="nx">ok</span><span class="p">;</span>
</span><span class='line'>          <span class="nx">expect</span><span class="p">(</span><span class="nx">results</span><span class="p">.</span><span class="nx">_id</span><span class="p">).</span><span class="nx">to</span><span class="p">.</span><span class="nx">be</span><span class="p">.</span><span class="nx">ok</span><span class="p">;</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">it</span><span class="p">(</span><span class="s1">&#39;should have user&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">expect</span><span class="p">(</span><span class="nx">results</span><span class="p">.</span><span class="nx">user</span><span class="p">).</span><span class="nx">to</span><span class="p">.</span><span class="nx">equal</span><span class="p">(</span><span class="nx">user</span><span class="p">.</span><span class="nx">email</span><span class="p">);</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">it</span><span class="p">(</span><span class="s1">&#39;should collection be public&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">expect</span><span class="p">(</span><span class="nx">results</span><span class="p">.</span><span class="kr">public</span><span class="p">).</span><span class="nx">to</span><span class="p">.</span><span class="nx">equal</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">describe</span><span class="p">(</span><span class="s1">&#39;and title is missing&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">beforeEach</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">done</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">request</span><span class="p">.</span><span class="nx">post</span><span class="p">({</span><span class="nx">url</span><span class="o">:</span> <span class="nx">url</span><span class="p">,</span> <span class="nx">headers</span><span class="o">:</span> <span class="nx">headers</span><span class="p">,</span> <span class="nx">body</span><span class="o">:</span> <span class="p">{},</span> <span class="nx">json</span><span class="o">:</span> <span class="kc">true</span><span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">resp</span><span class="p">,</span> <span class="nx">body</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                  <span class="nx">response</span> <span class="o">=</span> <span class="nx">resp</span><span class="p">;</span>
</span><span class='line'>                  <span class="nx">results</span> <span class="o">=</span> <span class="nx">body</span><span class="p">;</span>
</span><span class='line'>                  <span class="nx">done</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>              <span class="p">});</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>          <span class="nx">it</span><span class="p">(</span><span class="s1">&#39;should respond with 412 (bad request)&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">expect</span><span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">statusCode</span><span class="p">).</span><span class="nx">to</span><span class="p">.</span><span class="nx">equal</span><span class="p">(</span><span class="mi">412</span><span class="p">);</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">describe</span><span class="p">(</span><span class="s1">&#39;with description&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">beforeEach</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">collection</span> <span class="o">=</span> <span class="p">{</span><span class="nx">title</span><span class="o">:</span> <span class="s1">&#39;This is test collection&#39;</span><span class="p">,</span> <span class="nx">description</span><span class="o">:</span> <span class="s1">&#39;description&#39;</span><span class="p">};</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>          <span class="nx">beforeEach</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">done</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">request</span><span class="p">.</span><span class="nx">post</span><span class="p">({</span><span class="nx">url</span><span class="o">:</span> <span class="nx">url</span><span class="p">,</span> <span class="nx">headers</span><span class="o">:</span> <span class="nx">headers</span><span class="p">,</span> <span class="nx">body</span><span class="o">:</span> <span class="nx">collection</span><span class="p">,</span> <span class="nx">json</span><span class="o">:</span> <span class="kc">true</span><span class="p">},</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">resp</span><span class="p">,</span> <span class="nx">body</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                  <span class="nx">response</span> <span class="o">=</span> <span class="nx">resp</span><span class="p">;</span>
</span><span class='line'>                  <span class="nx">results</span> <span class="o">=</span> <span class="nx">body</span><span class="p">;</span>
</span><span class='line'>                  <span class="nx">done</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
</span><span class='line'>              <span class="p">});</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>          <span class="nx">it</span><span class="p">(</span><span class="s1">&#39;should respond with 201 (created)&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">expect</span><span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">statusCode</span><span class="p">).</span><span class="nx">to</span><span class="p">.</span><span class="nx">equal</span><span class="p">(</span><span class="mi">201</span><span class="p">);</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>          <span class="nx">it</span><span class="p">(</span><span class="s1">&#39;should create new collection&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">expect</span><span class="p">(</span><span class="nx">results</span><span class="p">.</span><span class="nx">description</span><span class="p">).</span><span class="nx">to</span><span class="p">.</span><span class="nx">equal</span><span class="p">(</span><span class="s1">&#39;description&#39;</span><span class="p">);</span>
</span><span class='line'>          <span class="p">});</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Conclusions</h2>

<p>I think dynamic languages as JavaScript is great for testing API&rsquo;s. Having no types eliminates &ldquo;model-per-response&rdquo; classes, <code>request.js</code> is great for making HTTP calls and <code>mocha</code> makes specifications output looks nice. So, nevertheless of back-end technology you can try to use the approach and see how it works for you.</p>

<p>The setup of tests and starting up of API services are so lightweight in Node.js that makes test-first API development nice and pleasant thing.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Logs Driven Development]]></title>
    <link href="http://beletsky.net/2014/01/logs-driven-development.html"/>
    <updated>2014-01-25T13:12:00+01:00</updated>
    <id>http://beletsky.net/2014/01/logs-driven-development</id>
    <content type="html"><![CDATA[<p>One of the components I currently work on called <code>collector</code> and it has no tests. Collector is all about of building queue of tasks, executing them and store data to database after. Tasks are HTTP clients that requests API and process transform responses into generic forms.</p>

<p>I&rsquo;ve started it with tests using <a href="https://github.com/pgte/nock">nock</a> component to mock HTTP requests, but quickly I found those tests both hard to write and no real benefit cause real responses that could broke it differs from ones I mock inside the tests.</p>

<p>In the same time, I regularly change that component and after changes and deployments I pretty quickly see the regressions and non-expected behavior, cause all information I need is inside of application logs. I call that &ldquo;Logs Driven Development&rdquo;.</p>

<!-- More -->


<p>The key point of Logs Driven Development is then you know your logs so good, so you easily detect patterns and performance indicators, so if anything goes wrong, it became obvious. When reading logs of your application became a habit it works really well.</p>

<p>It probably have some similarities with <a href="http://en.wikipedia.org/wiki/Characterization_test">Characterization test</a>, where the behavior of application is clearly projected into logs. There are tools like <a href="http://approvaltests.sourceforge.net/">Approval Tests</a> that utilize that kind of testing and automate them.</p>

<p>That&rsquo;s of cause could not be taken seriously as recommended practice since it doesn&rsquo;t scale well.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Keeping Node.js Processes Running]]></title>
    <link href="http://beletsky.net/2014/01/keeping-node-dot-js-processes-running.html"/>
    <updated>2014-01-18T13:38:00+01:00</updated>
    <id>http://beletsky.net/2014/01/keeping-node-dot-js-processes-running</id>
    <content type="html"><![CDATA[<p>Node.js/Express.js is great for Web API&rsquo;s and applications. In contrast to known enterprise technologies, Node.js is very special. It&rsquo;s single process/threaded environment. In case of unhanded exception occurred Node.js virtual machine simply stops, leaving application in unresponsive state.</p>

<p>Due to <code>async</code> nature of Node.js <code>try/catch</code> not always works, even with <code>domains</code> and stuff you have a chance that application crashed on production while you sleep.</p>

<!-- More -->


<p>To mitigate the issue few <a href="http://stackoverflow.com/questions/1972242/auto-reload-of-files-in-node-js">known solutions</a> exist, common idea is that there is watchdog that keeping eye on <code>node</code> process and if crashed, restarts application again.</p>

<p>Recently I&rsquo;ve used great library by <a href="https://github.com/mafintosh">@mafintosh</a> called <a href="https://github.com/mafintosh/respawn">respawn</a>. I liked it&rsquo;s minimalistic style and decided to try it out.</p>

<p>The bare-bones code is very simple. Without modification of your application, just create file <code>monitor.js</code> with nearly such 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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">respawn</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;respawn&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">monitor</span> <span class="o">=</span> <span class="nx">respawn</span><span class="p">([</span><span class="s1">&#39;node&#39;</span><span class="p">,</span> <span class="s1">&#39;server.js&#39;</span><span class="p">],</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">env</span><span class="o">:</span> <span class="p">{</span><span class="nx">ENV_VAR</span><span class="o">:</span><span class="s1">&#39;test&#39;</span><span class="p">},</span> <span class="c1">// set env vars</span>
</span><span class='line'>    <span class="nx">cwd</span><span class="o">:</span> <span class="s1">&#39;.&#39;</span><span class="p">,</span>              <span class="c1">// set cwd</span>
</span><span class='line'>    <span class="nx">maxRestarts</span><span class="o">:</span><span class="mi">10</span><span class="p">,</span>        <span class="c1">// how many restarts are allowed within 60s</span>
</span><span class='line'>    <span class="nx">sleep</span><span class="o">:</span><span class="mi">1000</span><span class="p">,</span>            <span class="c1">// time to sleep between restarts</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">monitor</span><span class="p">.</span><span class="nx">start</span><span class="p">();</span> <span class="c1">// spawn and watch</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>monitor</code> will spawn new node process and in case of crash it will be restarted. You can also specify <code>maxRestars</code> (I recommend to do that, if something is really bad it won&rsquo;t be restarted infinitely) and <code>sleep</code> time.</p>

<p>I&rsquo;ve tried that, by implementing <code>/fail</code> end-point in my app, to see that <code>respawn</code> really works.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<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='js'><span class='line'><span class="nx">app</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;/fail&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">,</span> <span class="nx">next</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">setTimeout</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">nu</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</span><span class='line'>      <span class="nx">nu</span><span class="p">.</span><span class="nx">access</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s1">&#39;Hello World&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="p">},</span> <span class="mi">1000</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>if I try to hit <code>/fail</code> I&rsquo;ll see no results in browser, but if I go back to <code>/</code> the application is running in normal state.</p>

<p>But simple respawning of application is not complete solution. You need to know what exactly happened to be able to fix issue. <a href="http://beletsky.net/2013/07/think-ahead-think-logging.html">Proper logging</a> of your application is essential. I&rsquo;ll show my small setup around <code>respawn</code> that send critical message to <a href="https://logentries.com">Logentries</a>, so all crashes are logged.</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>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">respawn</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;respawn&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">util</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;util&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">logger</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;./source/utils/logger&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">proc</span> <span class="o">=</span> <span class="nx">respawn</span><span class="p">([</span><span class="s1">&#39;node&#39;</span><span class="p">,</span> <span class="s1">&#39;app.js&#39;</span><span class="p">],</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">cwd</span><span class="o">:</span> <span class="s1">&#39;.&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">maxRestarts</span><span class="o">:</span> <span class="mi">10</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">sleep</span><span class="o">:</span> <span class="mi">1000</span><span class="p">,</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">proc</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;spawn&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">util</span><span class="p">.</span><span class="nx">print</span><span class="p">(</span><span class="s1">&#39;application monitor started...&#39;</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">proc</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;exit&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">code</span><span class="p">,</span> <span class="nx">signal</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">logger</span><span class="p">.</span><span class="nx">fatal</span><span class="p">({</span><span class="nx">msg</span><span class="o">:</span> <span class="s1">&#39;process exited, code: &#39;</span> <span class="o">+</span> <span class="nx">code</span> <span class="o">+</span> <span class="s1">&#39; signal: &#39;</span> <span class="o">+</span> <span class="nx">signal</span><span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">proc</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;stdout&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">util</span><span class="p">.</span><span class="nx">print</span><span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">proc</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;stderr&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nx">logger</span><span class="p">.</span><span class="nx">error</span><span class="p">({</span><span class="nx">msg</span><span class="o">:</span> <span class="s1">&#39;process error&#39;</span><span class="p">,</span> <span class="nx">data</span><span class="o">:</span> <span class="nx">data</span><span class="p">.</span><span class="nx">toString</span><span class="p">()});</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">proc</span><span class="p">.</span><span class="nx">start</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>(details of logger you can find in this <a href="http://beletsky.net/2013/07/think-ahead-think-logging.html">post</a>)</p>

<p>All process output is goes to <code>stdout</code>, which is convinient for development, but in case of <code>stderr</code> or <code>exit</code> everything is logged to cloud and notification to <code>dev-team</code> sent.</p>

<p>It worked really nice, now I&rsquo;m not worry even if something bad happens on production, <code>respawn</code> will make sure that rest of users are not affected. As a developer you can much quicker found bug and push hotfix.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Looking Back to 2013]]></title>
    <link href="http://beletsky.net/2014/01/looking-back-to-2013.html"/>
    <updated>2014-01-04T11:05:00+01:00</updated>
    <id>http://beletsky.net/2014/01/looking-back-to-2013</id>
    <content type="html"><![CDATA[<p>Traditionally, first Saturday of New Year &ndash; time look back for year that passed. As usually, I do analisys throught a several aspects. Primary job, blogging and speaking, communities and side projects.</p>

<!-- More -->


<h2>Starting up company</h2>

<p>I no longer work for <a href="">e-conomic</a> where I spent almost 4 years. I have extended <a href="http://beletsky.net/2013/12/i-quit-my-job.html">explanation</a> for the reasons I did so. But in short, my current primarily goal is build my own company, something meaningful and remarkable.</p>

<p>I joined <em>funemployment</em> mode, changing my vision of building products. I treated startups as venture of several people, who just decided to build something cool. Reality if much more tough. Coding eventually becomes less priority thing in startup, but seeking for a sustainable business model become first one.</p>

<p>As passioned developer, it&rsquo;s really hard to change your mind. Instead of coding new features, you have to build a set of hypotheses and try to validate them as soon as possible. You have to find your target audience, valuable proposition and best user experience. Startup is all about uncertainty and <a href="https://likeastore.com">Likeastore</a> is currently in the most uncertain position.</p>

<p>I&rsquo;m really happy that now I can spend full-time effort for company. We&rsquo;ve joined <a href="http://eastlabs.co/">EastLabs</a> business accelerator program as most efficient way to gather required skills and experience.</p>

<h2>Speaking and blogging</h2>

<p>Comparing to 2012, I both speak and blog less. I don&rsquo;t think it&rsquo;s bad sign, but it&rsquo;s more a way of finding some balance.</p>

<p>I&rsquo;ve produced 27 blog post, against 63 of 2012. I covered various topics, I would say less specific that I did previously. I <a href="http://beletsky.net/2013/06/moved-from-blogger-to-octopress.html">switched</a> from blogger to github + octopress, feel great about so far.</p>

<p>As for stats, last year <a href="http://beletsky.net">beletsky.net</a> got: 68,182 visits, 53,248 unique visitors. That&rsquo;s much less than year <a href="http://beletsky.net/2013/01/looking-back-to-2012.html">before</a>, quite expected in the same time.</p>

<p>Top read content of 2013:</p>

<ul>
<li><a href="http://beletsky.net/2013/08/digitalocean-plus-dokku-equals-10-heroku.html">Digital Ocean + Dokku = 10$ Heroku</a> describing experience of building micro PaaS for internal needs on top of Dokku.</li>
<li><a href="http://beletsky.net/2013/09/playing-with-dokku-on-vagrant.html">Playing with Dokku on Vagrant</a> easy playground for Dokku based on Vagrant virtual environment.</li>
<li><a href="http://beletsky.net/2013/07/why-we-moved-from-appfog-to-nodejitsu.html">Why We Moved From AppFog to Nodejitsu</a> just my rant about AppFog quality of service.</li>
</ul>


<p>As for talks, I&rsquo;ve prepared 5 <a href="https://speakerdeck.com/alexbeletsky">presentations</a>. As achievement of 2013 I see my talk on <a href="https://www.youtube.com/watch?feature=player_embedded&amp;v=EaoRDrdqm-E">RejectJS</a> conference. It was so cool and I really liked Berlin.</p>

<h2>Communities</h2>

<p><a href="https://www.facebook.com/groups/574355212591240/">Kyiv Beer&#8217;N&#8217;Code</a> &ndash; still small, but it exists. We&rsquo;ve concluded season 2012-2013 very nicely. And season 2013-2014 is on it&rsquo;s way, but I have to admit we are now less active. Hope that after all Christmas and New Year holidays we will go back to nice discussions and coding together.</p>

<p><a href="http://kievalt.net/">Kyiv ALT.NET</a> &ndash; being not involved to .NET development for several years I could not contribute to that community anyhow. Unfortunately it&rsquo;s slowly dying now. Only had 3 meetups in 2013.</p>

<p>Being full-stack JS development I didn&rsquo;t participate in any Kyiv JS communities. I don&rsquo;t see much activity in those communities as well.</p>

<h2>Technologies</h2>

<p>As for technologies, 2013 for me was: Express.js, MongoDB, Angular.js, Docker, Dokku, Ubuntu, DigitalOcean.</p>

<h2>Side projects and contributions</h2>

<p>As for contributions I&rsquo;ve participated such projects:</p>

<ul>
<li><a href="https://github.com/progrium/dokku">Dokku</a> &ndash; Docker powered mini-Heroku in less than 100 lines of Bash.</li>
<li><a href="rockbot/vektor">vektor</a> &ndash; A robotics-focused linear algebra module.</li>
<li><a href="https://github.com/alexbeletsky/24pullrequests">24PullRequest</a> &ndash; Giving back little gifts of code for Christmas.</li>
<li><a href="https://github.com/alexbeletsky/grunt-hashres">grunt-hashres</a> &ndash; Grunt task for hashing js and css files.</li>
<li><a href="https://github.com/alexbeletsky/edge">edge</a> &ndash; Run .NET and node.js code in-process.</li>
<li><a href="https://github.com/alexbeletsky/flight">flight</a> &ndash; A lightweight, component-based JavaScript framework.</li>
</ul>


<p>For side projects, of cause it&rsquo;s <a href="https://likeastore.com">Likeastore</a> which started as side project, but became a platform of starting business with.</p>

<ul>
<li><a href="https://github.com/alexbeletsky/dokku-bower-install">dokku-bower-install</a> &ndash; Plugin for Dokku that installs bower dependecies, if needed.</li>
<li><a href="https://github.com/alexbeletsky/backbone-express-spa">backbone-express-spa</a> &ndash; Boilerplate + documentation of best practicies for Backbone.js + Express SPA development.</li>
<li><a href="https://github.com/alexbeletsky/jshint-run">jshint-run</a> &ndash; Tiny tool for running jshint, then you don&rsquo;t use grunt.</li>
<li><a href="https://github.com/alexbeletsky/toml-js">toml-js</a> &ndash; TOML parser implementation (node.js + browser).</li>
</ul>


<h2>Conclusions</h2>

<p>2013 was amazing in many aspects. 2014 will be year of Likeastore, <a href="http://beletsky.net/2013/12/open-source.html">open source</a> and experiments.</p>

<p>I wish to try some alternative technologies, like Go, Rust.</p>
]]></content>
  </entry>
  
</feed>
