<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Alexander Tarmolov</title>
        <description>yet another blog about web development</description>
        <link>http://tarmolov.ru/</link>
        <atom:link href="http://tarmolov.ru//rss.xml" rel="self" type="application/rss+xml" />
        
            <item>
                <title>How I use Evernote</title>
                <description>&lt;p&gt;&lt;img src=&quot;/i/evernote_my.png&quot; alt=&quot;My Evernote configuration&quot;&gt;&lt;/p&gt;

&lt;p&gt;This topic is about planning and collecting information. In my opinion, these processes are inevitable part of development.&lt;/p&gt;

&lt;p&gt;Obviously developers have to plan their activity and it doesn’t matter what kind of tools you use. It could be special applications, stickers, todo-lists or keeping all your plans in the head. To become more effective and professional developer we should study to plan and clear up what is important and what is not.&lt;/p&gt;

&lt;p&gt;In addition developers resolve issues every day (that is our job!). As a result a huge amount of experience is collected and often it is shared in the Internet.&lt;/p&gt;

&lt;p&gt;When you face a problem or a new issue, you will search solutions or helpful information in the Internet or through your bookmarks. Sometimes after a very long searches you find a profound article or great advice. Naturally, you want to save them because you don’t want to repeat yourself. So you as other developers need a system for collecting, sorting, and easy-access system.&lt;/p&gt;

&lt;p&gt;Currently I use the same system for planning and storing information. This system is &lt;a href=&quot;http://evernote.com/&quot;&gt;Evernote&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let’s talk about storing information first.&lt;/p&gt;

&lt;h3&gt;Evernote as a storage&lt;/h3&gt;

&lt;p&gt;I use only one notebook for storing information — &lt;code&gt;reference&lt;/code&gt;. I used to have several notebooks but then I realized that I had spent more time for sorting information than for using. So I decided to use single notebook and to mark my articles with tags. At the current moment I have 134 tags :)&lt;/p&gt;

&lt;p&gt;Evernote allows you to create tags hierarchy. It is absolutely up to you. For me a plain list works fine. In my opinion it is better to use full-text search built in Evernote which also allows you quickly find any tag. To be honest I barely expand my reference tags.&lt;/p&gt;

&lt;p&gt;Also I have a special auxiliary notebook — &lt;code&gt;!inbox&lt;/code&gt; which I use for all new information. That is a rule: all new articles and notes should pass through inbox. It is a GTD artifact and we’ll talk about it a little bit later. I marked &lt;code&gt;!inbox&lt;/code&gt; as a default notebook in my Evernote account; so, I am sure that all new content will be sent there.&lt;/p&gt;

&lt;p&gt;I use a few ways to add new content to Evernote.&lt;/p&gt;

&lt;h4&gt;Manual&lt;/h4&gt;

&lt;p&gt;It is obvious that you can manually add notes to Evernote. I use this method pretty often in the desktop client but I always add notes to the &lt;code&gt;!inbox&lt;/code&gt; notebook (remember the rule?). Mobile application works very slow in my iPhone 4; so, I use minimalistic &lt;a href=&quot;https://itunes.apple.com/us/app/fastever-quickly-create-evernote/id364580273?mt=8&quot;&gt;FastEver&lt;/a&gt; app for this issue in cases when I need to save a small note.&lt;/p&gt;

&lt;h4&gt;Web clipper&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/i/evernote_webclipper.png&quot; alt=&quot;Evernote Web Clipper&quot;&gt;&lt;/p&gt;

&lt;p&gt;Evernote team created an amazing extension for all popular browsers which called &lt;a href=&quot;http://evernote.com/webclipper/&quot;&gt;Evernote Web clipper&lt;/a&gt;. It provides an easy way to save web page or its part to your Evernote account. It could be done just in two clicks! I don’t know how I lived without it before ^^&lt;/p&gt;

&lt;p&gt;All clipped articles also are sent to &lt;code&gt;!inbox&lt;/code&gt; notebook.&lt;/p&gt;

&lt;h4&gt;Forwarding e-mails&lt;/h4&gt;

&lt;p&gt;Evernote also gives you an e-mail address which is connected with your account. So you can add notes by sending e-mails!&lt;/p&gt;

&lt;p&gt;Usually given e-mail looks ugly and unmemorable like &lt;code&gt;tarmolov.1ab2d@m.evernote.com&lt;/code&gt;. I suggest you create an extra e-mail account with memorable name like &lt;code&gt;tarmolov.2evernote@gmail.com&lt;/code&gt; and set up forwarding all e-mails to evernote e-mail.&lt;/p&gt;

&lt;p&gt;When somebody sends me an useful e-mail I always forward it to my evernote e-mail. As a result I never lose them and always can easily find these e-mails or even forward them to somebody else (evernote allows you to share notes by e-mail).&lt;/p&gt;

&lt;h4&gt;RSS&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/i/reeder.png&quot; alt=&quot;Reeder&quot;&gt;&lt;/p&gt;

&lt;p&gt;I read news and blogs as RSS feeds. For me it’s the most convenient way to absorb new information. I use a special app for this issue — &lt;a href=&quot;http://reederapp.com/&quot;&gt;Reeder&lt;/a&gt;. It is a clean and minimalistic rss reader and I love it so much. This application has a evernote button and you can send a useful blog post by just one click.&lt;/p&gt;

&lt;p&gt;Reeder is available only for iOS/OSX.&lt;/p&gt;

&lt;h4&gt;Skitch&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/i/evernote_skitch.png&quot; alt=&quot;Evernote Skitch&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://evernote.com/skitch/&quot;&gt;Skitch&lt;/a&gt; is a screenshot tool by Evernote. All your screenshots are uploading to Evernote account automatically and you should not do any extra actions.&lt;/p&gt;

&lt;p&gt;Usually I make a lot of screenshots at the work because it is a cool way to show my questions or explain something.&lt;/p&gt;

&lt;p&gt;However, I don’t want to see all these screenshots in my &lt;code&gt;!inbox&lt;/code&gt;. Majority of them is temporal and useless but some of them can make a good service in the future. Thus I add an extra notebook called &lt;code&gt;tmp&lt;/code&gt; especially for Skitch screenshots. At any time I can move particular screenshots from &lt;code&gt;tmp&lt;/code&gt; to &lt;code&gt;reference&lt;/code&gt; notebook.&lt;/p&gt;

&lt;h4&gt;IFTTT&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/i/ifttt.png&quot; alt=&quot;if this than that&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://ifttt.com&quot;&gt;IFTT&lt;/a&gt; is a superb service to automate your social activity. Currently I use it only for saving interesting tweets. Of course you can forward tweets to your evernote e-mail but I can show you better and easy way: jus favorite a tweet and it will appear in your Evernote account. Cool, huh? IFTT will do such magic for you if you use &lt;a href=&quot;https://ifttt.com/recipes/108658&quot;&gt;this recipe&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I strongly recommend you to automate all your possible social activities. It’s easy to do and save your time in the future.&lt;/p&gt;

&lt;h3&gt;Evernote as a management system&lt;/h3&gt;

&lt;p&gt;Evernote is a very flexible and customizable system. It can be adopted for various goals. I needed a management system; so, Evernote made it possible, too.&lt;/p&gt;

&lt;p&gt;First thing, which I tried, was TODO lists. I created a notebook called todo and stored all my goals and tasks there. It works fine while number of tasks is not big. When you sank in a sea of tasks GTD would save the day.&lt;/p&gt;

&lt;h4&gt;GTD&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/i/gtd.png&quot; alt=&quot;Get Things Done&quot;&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Getting_Things_Done&quot;&gt;GTD&lt;/a&gt; was firstly introduced by David Alan. This system helps you to organize all your everyday tasks. Initially it was developed for paper work but it can be used with digital means, too.&lt;/p&gt;

&lt;p&gt;Describing full concept of GTD is our of the article; so, I recommend you to read a classic book &lt;a href=&quot;http://www.amazon.com/Getting-Things-Done-Stress-Free-Productivity/dp/0142000280/&quot;&gt;Getting Things Done&lt;/a&gt; for more information. Below I&amp;#39;m going to show only basic ideas of GTD.&lt;/p&gt;

&lt;p&gt;Idea of GTD is about organizing information and working with issues. You should create a special place for them called inbox. That&amp;#39;s why I have &lt;code&gt;!inbox&lt;/code&gt; notebook and store all my new stuff there. Write everything which you think of. It is a golden rule. After that you can say to your brain, &amp;quot;It is ok, buddy. As you see I store your work in the good place. Stop thinking about it.&amp;quot; However, each day you must empty your inbox, sort and organize all your incoming staff. Otherwise you could sink into chaos.&lt;/p&gt;

&lt;p&gt;GTD suggests you to divide your big task into small ones and pick up the next step. It really helps you to complete even overwhelming tasks. Ok. How can it be applied in Evernote?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://darrencrawford.com/my-simple-gtd-evernote-combo/&quot;&gt;Approach by David Crawford&lt;/a&gt; works pretty good for me and I recommend you to check it out. David use notebooks &lt;code&gt;inbox&lt;/code&gt; for all incoming information, &lt;code&gt;next_actions&lt;/code&gt; for next steps, and &lt;code&gt;reference&lt;/code&gt; for all filtered information. Moreover, David tags all his actions in &lt;code&gt;next_actions&lt;/code&gt; notebook using a number of special tags like &lt;code&gt;@home&lt;/code&gt;, &lt;code&gt;@work&lt;/code&gt;, &lt;code&gt;@calls&lt;/code&gt;, and etc. It is so helpful! Are you at work? Just filter all notes by &lt;code&gt;@work&lt;/code&gt; tag and you will see all possible (planned) actions in this place.&lt;/p&gt;

&lt;p&gt;Here are my context tags:
&lt;img src=&quot;/i/evernote_context_tags.png&quot; alt=&quot;Context tags&quot;&gt;&lt;/p&gt;

&lt;p&gt;GTD helped me to sort all my stuff and add some order to my life. However, it doesn&amp;#39;t force me to make my tasks. I had sorted task lists for work and personal issues. They were becoming bigger and bigger. I had to admit that GTD doesn&amp;#39;t work for me.&lt;/p&gt;

&lt;h4&gt;Agile results&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/i/agile_results.png&quot; alt=&quot;Getting Results the Agile Way&quot;&gt;&lt;/p&gt;

&lt;p&gt;I needed something that forces me to do my planned activities and after some time I found it. It is &lt;a href=&quot;http://www.30daysofgettingresults.com/&quot;&gt;Agile results&lt;/a&gt; by J.D.Meier. Agile Results (AR) is not about doing more, it is about doing important things first. AR helps you to keep you own pace and it is flexible enough for everyone.&lt;/p&gt;

&lt;p&gt;Everyone has his own goals. I mean life goals, something important for you. It doesn&amp;#39;t matter what kind of goals you have. You care only about when and how they come true. AR helps you to concentrate on you important issues and step by step go to final destination.&lt;/p&gt;

&lt;p&gt;It is great that AR could be applied little by little and you don&amp;#39;t need change whole lifestyle to adopt this system. At first you could start with daily planning and then spread the system to whole week. Go in your own pace.&lt;/p&gt;

&lt;p&gt;I&amp;#39;ve started with Daily Planing. Every morning I created a note marked with the tag &lt;code&gt;#dailyoutcomes&lt;/code&gt; and contains the following text:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-&quot; data-lang=&quot;&quot;&gt;3 Wins for Today
----------------------------------
1.
2.
3.

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It is important to have at least 3 Wins per day. These wins helped me to concentrate my efforts during a day. Then I added Weekly Planing. Weekly planing can be divided into two parts.&lt;/p&gt;

&lt;p&gt;First is a note &amp;quot;3 Wins for the Week&amp;quot; (the same note, as for day). I create it every monday and mark it with the tag &lt;code&gt;#mondayvision&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-&quot; data-lang=&quot;&quot;&gt;3 Wins for Week
----------------------------------
1.
2.
3.

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And the second one is &amp;quot;How well you went and what you need to improve&amp;quot;. Usually I create it at weekend with the tag  &lt;code&gt;#fridayreflection&lt;/code&gt; and the following text:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-&quot; data-lang=&quot;&quot;&gt;3 Things Going Well
----------------------------------
1.
2.
3.

3 Things to Improve
----------------------------------
1.
2.
3.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It helps me to correct my current course and turn myself to right direction. It&amp;#39;s very simple and very powerful.&lt;/p&gt;

&lt;p&gt;You can use one notebook for AR or many of them. It is absolutely up to you. For example, J.D.Meier himself &lt;a href=&quot;http://blogs.msdn.com/b/jmeier/archive/2012/10/15/agile-results-in-evernote-with-one-notebook.aspx&quot;&gt;showed&lt;/a&gt; how you can use AR with Evernote. However I prefer tags only and save all my agile plans in &lt;code&gt;reference&lt;/code&gt; notebook.
&lt;img src=&quot;/i/evernote_ar_tags.png&quot; alt=&quot;Agile results tags&quot;&gt;&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Described system isn&amp;#39;t perfect or ideal but it&amp;#39;s very flexible and straightforward. Moreover, this system can be adopted for any changes. That&amp;#39;s what I want. In my opinion you cannot make perfect system for good but you can make a useful and cosy for the current moment.&lt;/p&gt;

&lt;p&gt;Just stay calm and carry on :)&lt;/p&gt;
</description>
                <pubDate>Wed, 26 Feb 2014 16:03:35 +0000</pubDate>
                <link>http://tarmolov.ru//blog/how-i-use-evernote</link>
                <guid isPermaLink="true">http://tarmolov.ru//blog/how-i-use-evernote</guid>
            </item>
        
            <item>
                <title>Simple BEM calendar</title>
                <description>&lt;p&gt;First of all, a little preface. A couple of weeks ago I got to know about Frontend Developer School run by &lt;a href=&quot;http://hh.ru/locale.do?language=EN&quot;&gt;HeadHunter&lt;/a&gt;. The entering assignment was to make a simple calendar. This issue seemed to be quite interesting for me and I decided to solve it using new &lt;a href=&quot;https://github.com/bem/bem-core/&quot;&gt;bem-core&lt;/a&gt; library.&lt;/p&gt;

&lt;p&gt;This article is divided into five parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Design&lt;/strong&gt; tells you how I designed my mini application.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tools&lt;/strong&gt; teaches you which tools make are handy and make your development cozy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Development&lt;/strong&gt; is dedicated to established solutions and problems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testing&lt;/strong&gt; shows you how I tested my project and made it stable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continuous integration&lt;/strong&gt; is the last one and it tells you about automatization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note.&lt;/strong&gt; It is a long article. If you do not want to read the whole post please go to project page on &lt;a href=&quot;https://github.com/tarmolov/bem-calendar#bem-calendar-&quot;&gt;github&lt;/a&gt; for short version :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note.&lt;/strong&gt; If you are not familiar with BEM methodology and want to learn more, &lt;a href=&quot;http://bem.info/&quot;&gt;bem.info&lt;/a&gt; is the best choice.&lt;/p&gt;

&lt;p&gt;Let us start with Design part.&lt;/p&gt;

&lt;h3&gt;Design&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://bem.info/&quot;&gt;BEM methodology&lt;/a&gt; teaches you that a first step of building web site is to mark out page blocks. In my case it is an easy peasy issue because of the simplicity of this page.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://raw.github.com/tarmolov/bem-calendar/master/doc/image/_blocks/image_blocks_all.png&quot;&gt;&lt;img src=&quot;https://raw.github.com/tarmolov/bem-calendar/master/doc/image/_blocks/image_blocks_all.png&quot; alt=&quot;Calendar blocks&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have only four major blocks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Toolbar with a couple of buttons.&lt;/li&gt;
&lt;li&gt;Search block with input and icon.&lt;/li&gt;
&lt;li&gt;Calendar navigation.&lt;/li&gt;
&lt;li&gt;And calendar itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I marked blocks on the screenshot below:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://raw.github.com/tarmolov/bem-calendar/master/doc/image/_blocks/image_blocks_main.png&quot;&gt;&lt;img src=&quot;https://raw.github.com/tarmolov/bem-calendar/master/doc/image/_blocks/image_blocks_main.png&quot; alt=&quot;Calendar blocks&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next step is much more interesting. How to connect these blocks and make the application work?&lt;/p&gt;

&lt;p&gt;It seems that I need a small but robust architecture for the calendar.&lt;/p&gt;

&lt;p&gt;I liked the approach presented by Nicholas C. Zakas and called &lt;a href=&quot;http://www.youtube.com/watch?v=7BGvy-S-Iag&quot;&gt;Scalable JavaScript Application Architecture&lt;/a&gt;. The major idea is to divide responsibility and business logic among several layers of an application. Each layer has knowledge only about adjacent layers.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://raw.github.com/tarmolov/bem-calendar/master/doc/image/_design/image_design_zakas.png&quot;&gt;&lt;img src=&quot;https://raw.github.com/tarmolov/bem-calendar/master/doc/image/_design/image_design_zakas.png&quot; alt=&quot;Level of abstractions&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my case this paradigm does not work completely because of bem-core. I will explain the reason later but now a couple of words about the library.&lt;/p&gt;

&lt;p&gt;In &lt;a href=&quot;https://github.com/bem/bem-core/&quot;&gt;the official page&lt;/a&gt; we can read the following definition:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;bem-core is a base library for web interface development. It provides the minimal stack for coding client-side JavaScript and templating.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;bem-core&lt;/code&gt; uses &lt;a href=&quot;https://github.com/ymaps/modules&quot;&gt;special module system&lt;/a&gt; that is not officially named yet; so I call it just YMaps Module System (YMS). It solves problems such as asynchronous &lt;code&gt;require&lt;/code&gt; and &lt;code&gt;provide&lt;/code&gt; which are absent in AMD and CommonJS. It is a compact and robust module system; therefore, I strongly recommend you to try it in your new project.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;bem-core&lt;/code&gt; provides a lot of useful modules (and the module system itself) but I have included this library in the project because of &lt;a href=&quot;http://bem.info/articles/bem-js-main-terms/&quot;&gt;i-bem&lt;/a&gt;. It is a helper for creating BEM blocks in declarative way.&lt;/p&gt;

&lt;p&gt;So why cannot I implement this paradigm completely? The case is bem-core uses jQuery which penetrated into all parts of &lt;code&gt;i-bem&lt;/code&gt;. As a result you have to use jQuery in your BEM blocks because blocks know about base library.&lt;/p&gt;

&lt;p&gt;My architecture overview is presented in a diagram below:
&lt;a href=&quot;https://raw.github.com/tarmolov/bem-calendar/master/doc/image/_design/image_design_tarmolov.png&quot;&gt;&lt;img src=&quot;https://raw.github.com/tarmolov/bem-calendar/master/doc/image/_design/image_design_tarmolov.png&quot; alt=&quot;Architecture overview&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see that BEM is not displayed on the diagram. In my opinion base architecture should not depend on BEM or other methodology.&lt;/p&gt;

&lt;p&gt;There are a few differences from Zakas approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every layer is aware of the base library: everything needs jQuery :)&lt;/li&gt;
&lt;li&gt;Component manager is responsible for starting and stopping components.&lt;/li&gt;
&lt;li&gt;Modules are named components because I already have modules from &lt;code&gt;YMS&lt;/code&gt; (conflict names).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For storing an application data I use a simple active model which can be accessed through the sandbox, too. However, components do not know where the model comes from. That is important.&lt;/p&gt;

&lt;p&gt;I have only four visual components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Calendar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Navigation&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Search&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Toolbar&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And one (&lt;code&gt;Sync&lt;/code&gt;) is non-visual for synching my application with localStorage.&lt;/p&gt;

&lt;p&gt;Each component represents itself using BEM block with the same name (not necessary requirement). Once a component has been started, it creates BEM block as a View-Controller and puts it into DOM node taken from the Sandbox.&lt;/p&gt;

&lt;p&gt;In the calendar the components work as controllers an communicate only through the model i.e. indirectly. Also I want to emphasize that the components are very simple &lt;a href=&quot;http://en.wikipedia.org/wiki/Mediator_pattern&quot;&gt;mediators&lt;/a&gt;. The majority of code is concentrated in BEM blocks.&lt;/p&gt;

&lt;p&gt;More details you can see on the class diagram:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://raw.github.com/tarmolov/bem-calendar/master/doc/uml/_class/uml_class_main.png&quot;&gt;&lt;img src=&quot;https://raw.github.com/tarmolov/bem-calendar/master/doc/uml/_class/uml_class_main.png&quot; alt=&quot;Class diagram&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Application start sequence is obvious and straightforward:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://raw.github.com/tarmolov/bem-calendar/master/doc/uml/_sequence/uml_sequence_application-start.png&quot;&gt;&lt;img src=&quot;https://raw.github.com/tarmolov/bem-calendar/master/doc/uml/_sequence/uml_sequence_application-start.png&quot; alt=&quot;Application start&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It looks quite simple and works the same way ;)&lt;/p&gt;

&lt;p&gt;I wanted to achieve a stable core of my application; therefore, I had defined interfaces for major classes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tarmolov/bem-calendar/blob/master/blocks/interface/i-sandbox.js&quot;&gt;ISandbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tarmolov/bem-calendar/blob/master/blocks/interface/i-component.js&quot;&gt;IComponent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tarmolov/bem-calendar/blob/master/blocks/interface/i-bemview.js&quot;&gt;IBEMView&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They are the boundary elements of my application. Sandbox connects application and components. Components connect with BEM blocks which implement &lt;code&gt;IBemView&lt;/code&gt; interface.&lt;/p&gt;

&lt;p&gt;Using interfaces is always increasing stability of your application.&lt;/p&gt;

&lt;h3&gt;Tools&lt;/h3&gt;

&lt;p&gt;When you use BEM your code is divided into great number of blocks. Then files will be concatenated and minified. Of course we can do it manually but usually we use special tools for this issue.&lt;/p&gt;

&lt;p&gt;At first, it was a make-platform. Then &lt;a href=&quot;https://github.com/bem/bem-tools&quot;&gt;bem-tools&lt;/a&gt; were created. And then &lt;code&gt;enb&lt;/code&gt; came.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://enb-make.info/&quot;&gt;enb&lt;/a&gt; is a powerful and fast builder. In development mode you even do not notice that your files have been built. It works just amazingly!&lt;/p&gt;

&lt;p&gt;Also &lt;code&gt;enb&lt;/code&gt; has a perfect documentation (at this moment only Russian version available), a range of technologies, and easy way to create new ones. New versions with fixed bugs and improvements are published frequently. I strongly recommend you to use this builder for your BEM projects.&lt;/p&gt;

&lt;p&gt;Moreover, &lt;code&gt;enb&lt;/code&gt; makes it possible to get rid of dependencies for javascript modules because it can read them from &lt;code&gt;YMS&lt;/code&gt; declarations. As a result I have added only 7 files with dependencies!&lt;/p&gt;

&lt;p&gt;&lt;code&gt;bem-core&lt;/code&gt; recommends you to use &lt;a href=&quot;http://bem.info/articles/bemhtml-intro/&quot;&gt;BEMHTML&lt;/a&gt; template engine by default. However, I recommend to use &lt;a href=&quot;github.com/enb-make/bh&quot;&gt;bh&lt;/a&gt; template engine. It is small, easy to use, and much faster than &lt;code&gt;BEMHTML&lt;/code&gt;. You just write CommonJS modules:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-&quot; data-lang=&quot;&quot;&gt;module.exports = function (bh) {
    bh.match('button', function (ctx) {
        ctx.tag('button');
    });
};
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Next two tools are about validation javascript code: &lt;a href=&quot;https://github.com/ikokostya/jshint-groups&quot;&gt;jshint-groups&lt;/a&gt; and &lt;a href=&quot;https://github.com/mdevils/node-jscs&quot;&gt;jscs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The first of them is a &lt;a href=&quot;http://jshint.com/&quot;&gt;jshint&lt;/a&gt; wrapper. It provides possibility to add different rules for checking files with &lt;code&gt;jshint&lt;/code&gt;. There are tests, templates, client, and server javascript in your project. Now you can write separate and suitable &lt;code&gt;jshint&lt;/code&gt; rules for all of them. It is a flexible way to lint your code.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;jscs&lt;/code&gt; is a javascript codestyle checker. It will make sure that your code is written in one consistent codestyle! It provides a lots of predefined rules. If you do not find suitable rules you  &lt;a href=&quot;https://github.com/mdevils/node-jscs/blob/master/CONTRIBUTION.md&quot;&gt;can add new ones&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The last one is &lt;a href=&quot;https://github.com/csscomb/csscomb.js&quot;&gt;csscomb&lt;/a&gt;. This tool formats your CSS code. I love when CSS rules are formatted in the same order and are divided into groups. In my opinion such nice-looking code is easy to read and maintain.&lt;/p&gt;

&lt;p&gt;So what we have: &lt;code&gt;enb&lt;/code&gt;, &lt;code&gt;jshint-groups&lt;/code&gt;, &lt;code&gt;jscs&lt;/code&gt;, and &lt;code&gt;csscomb&lt;/code&gt;. This is a bunch of great tools and I advise you to use them in your everyday development.&lt;/p&gt;

&lt;h3&gt;Development&lt;/h3&gt;

&lt;p&gt;BEM claims that you should create absolutely independent blocks. In CSS blocks should be aware only about their elements and they do not have any knowledge about possible nested blocks. In order to change the style of nested blocks use mixins.&lt;/p&gt;

&lt;p&gt;For example, see bemjson for search block&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-&quot; data-lang=&quot;&quot;&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;block:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'search',&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;content:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;block:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'icon',&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;mix:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;block:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'search',&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;elem:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'icon'&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;mods:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;type:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'loupe'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;block:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'input',&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;mix:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;block:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'search',&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;elem:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'input'&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I mixed the elements of search blocks with nested icons and input blocks. For instance, it makes it possible to write CSS for position of icon block.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-&quot; data-lang=&quot;&quot;&gt;.search__icon
{
    position: absolute;
    top: 50%;
    left: -20px;

    margin-top: -6px;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If I decide to change icon block to megaicon block, I will not need to change styles in the search block. Cool, hah?&lt;/p&gt;

&lt;p&gt;The possible drawback is conflict styles of nested block and mixin. But I accept this shortcoming. It is kind of fee for such magic as mixins.&lt;/p&gt;

&lt;p&gt;In javascript &lt;code&gt;i-bem&lt;/code&gt; provides methods like &lt;code&gt;findBlockInside&lt;/code&gt;/&lt;code&gt;findBlockOn&lt;/code&gt; for finding nested blocks. It also provides methods &lt;code&gt;findBlockOutside&lt;/code&gt;/&lt;code&gt;findBlocksOutside&lt;/code&gt; which conflicts with the idea of independent blocks. I do not recommend to use this method in your project. Just &lt;a href=&quot;https://github.com/tarmolov/bem-aib&quot;&gt;disable them&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All javascript modules are wrapped using &lt;code&gt;YMS&lt;/code&gt;. For example,&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-&quot; data-lang=&quot;&quot;&gt;modules.define('i-bem__dom', function (provide, DOM) {

    DOM.decl('label', {

        setText: function (text) {
            this.domElem.text(text);
        },

        getText: function () {
            return this.domElem.text();
        }

    });

    provide(DOM);

});
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;However, declaration for navigation looks in a different way&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-&quot; data-lang=&quot;&quot;&gt;modules.define('search', [/** deps **/], function () {

    provide(DOM.decl('search', {
        // ...
    }));

});
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Please pay attention to module naming. In the first case it is &lt;code&gt;i-bem__dom&lt;/code&gt; but actually it is declared as &lt;code&gt;label&lt;/code&gt;. In the second case I declared the module with appropriate name. Why did I declare modules in two different ways?&lt;/p&gt;

&lt;p&gt;Definition depends on how you use the module in your application.&lt;/p&gt;

&lt;p&gt;Search module has been created manually in the search component; so, the code would be executed during the application initialization. On the other hand label is used latently in &lt;code&gt;form_type_event&lt;/code&gt;. This block should be initialized by executing &lt;code&gt;DOM.init&lt;/code&gt;. After that &lt;code&gt;i-bem&lt;/code&gt; inits only blocks declared in special way, i.e. as &lt;code&gt;i-bem__dom&lt;/code&gt; module.&lt;/p&gt;

&lt;p&gt;Be careful declaring your modules.&lt;/p&gt;

&lt;h3&gt;Testing&lt;/h3&gt;

&lt;p&gt;When you work in a big company like &lt;a href=&quot;http://yandex.com/&quot;&gt;Yandex&lt;/a&gt; your application is always intently checked by testing team.&lt;/p&gt;

&lt;p&gt;I am proud to say that we have an unbelievable testing team! Guys are really incredible! They can find bugs which can be reproduced in a very tricky way (sometimes I really hate them, lol). After careful check your application can be published in production without any doubts.&lt;/p&gt;

&lt;p&gt;However, this project is not a part of my job and I do not have great testers to verify my application. Therefore I undertook three steps to create a stable application.&lt;/p&gt;

&lt;p&gt;First step is a linting code with &lt;code&gt;jshint&lt;/code&gt; and &lt;code&gt;jscs&lt;/code&gt;. I have already told you about them in &lt;strong&gt;Tools&lt;/strong&gt; part. After this step I got consistent code.&lt;/p&gt;

&lt;p&gt;Unit testing is the next step. In my opinion tests are an important part of your code. Using &lt;code&gt;phantomjs&lt;/code&gt; to run tests in console or automatically after each commit, can speed up development and refactoring.&lt;/p&gt;

&lt;p&gt;Honestly, I usually write tests only after I have completed structure (backbone) of an application. I do not use TDD approach. Anyway without unit tests I have no guarantee that my application works properly :)&lt;/p&gt;

&lt;p&gt;I think it does not matter what kind of framework you choose for unit testing. For instance, I used &lt;a href=&quot;http://visionmedia.github.io/mocha/&quot;&gt;mocha&lt;/a&gt; + &lt;a href=&quot;http://chaijs.com/&quot;&gt;chai&lt;/a&gt; + &lt;a href=&quot;http://sinonjs.org/&quot;&gt;sinon&lt;/a&gt; for BEM calendar. Unit testing cannot completely save the day, though. They do not test the application in different browsers.&lt;/p&gt;

&lt;p&gt;I have a macbook and can test my calendar only in couple browsers and on one platform. First idea was to download virtual machines from &lt;a href=&quot;http://www.modern.ie/&quot;&gt;modern.ie&lt;/a&gt;. But I do not have much time to test the calendar in all virtual machines.&lt;/p&gt;

&lt;p&gt;So my choice is &lt;a href=&quot;http://www.browserstack.com/&quot;&gt;BrowserStack&lt;/a&gt; with a wide range of browsers and platforms. Firstly, this service runs your site in various browsers (25 in free version) and &lt;a href=&quot;http://www.browserstack.com/screenshots/18d918bb9bb188f9df08b436be34835ad01735f7&quot;&gt;creates screnshot for each of them&lt;/a&gt;. If you noticed an error on a screenshot you can run virtual machine in browser to explore its reason in detail.&lt;/p&gt;

&lt;p&gt;I hate doing extra actions for testing. So I created a special page &lt;a href=&quot;http://tarmolov.github.io/bem-calendar/pages/calendar-test/calendar-test.html&quot;&gt;calendar-test&lt;/a&gt; where my testing script adds event and opens popups. Now I can &lt;a href=&quot;http://www.browserstack.com/screenshots/0742d8374fe1836f15e8774719e465a2adade766&quot;&gt;quickly verify work of my application&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Linting code, unit testing, and browserStack help you to make an application very stable. Use them wise.&lt;/p&gt;

&lt;h3&gt;Continuous integration (CI)&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Continuous_integration&quot;&gt;CI&lt;/a&gt; is a good way to be calm about your project. At work I usually use &lt;a href=&quot;http://www.jetbrains.com/teamcity/&quot;&gt;TeamCity&lt;/a&gt; by JetBrains which is perfectly suitable for our work issues. Teamcity helps to automate everything in our development process and does it well. Unfortunately our teamcity server is not opened for everyone. Moreover Teamcity is not free and you should own a server for setting it up.&lt;/p&gt;

&lt;p&gt;To be honest I did not want to buy server for this project; so, I chose &lt;a href=&quot;http://travis-ci.org/&quot;&gt;Travis&lt;/a&gt; which is perfectly suitable for projects hosted on github.&lt;/p&gt;

&lt;p&gt;Many developers have heard about CI because it is in a fashion but they never used it. Why? Is it so complex to set up? Or could only serious guys use it? It is a myth. Try Travis. Probably it is the easiest CI tool to set up.&lt;/p&gt;

&lt;p&gt;You have to do only three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sign in &lt;a href=&quot;http://travis-ci.org/&quot;&gt;Travis CI&lt;/a&gt; and activate GitHub service Hook for your project.&lt;/li&gt;
&lt;li&gt;Add .travis.yaml file to your repository.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Travis CI config is rather simple. You need to specify only language and nodejs version.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-&quot; data-lang=&quot;&quot;&gt;language: node_js
node_js:
- 0.8
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This configuration is sufficient for linting your code and running unit tests! Do not forget to add &lt;code&gt;scripts&lt;/code&gt; section in your package.json.&lt;/p&gt;

&lt;p&gt;But I wanted more. My goal was to regenerate my demo after each successful build when all tests have been passed. I  googled a &lt;a href=&quot;http://sleepycoders.blogspot.ru/2013/03/sharing-travis-ci-generated-files.html&quot;&gt;blog post&lt;/a&gt; with a solution.&lt;/p&gt;

&lt;p&gt;In a nutshell, you should teach Travis to authenticate to your repository with push permission.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://help.github.com/articles/creating-an-access-token-for-command-line-use&quot;&gt;Create a github access token&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Encrypt your token and put it into a travis config so no one can use your token and break into your repo.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-&quot; data-lang=&quot;&quot;&gt;gem install travis
travis encrypt -r &amp;lt;user&amp;gt;/&amp;lt;repository&amp;gt; GH_TOKEN=&amp;lt;token&amp;gt; --add env.global
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After that action travis can not only clone your project repository but also push some changes to it. So I wrote a script &lt;a href=&quot;https://github.com/tarmolov/bem-calendar/blob/master/update-gh-pages.sh&quot;&gt;&lt;code&gt;update-gh-pages.sh&lt;/code&gt;&lt;/a&gt; and appended a new directive to travis config:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-&quot; data-lang=&quot;&quot;&gt;after_success: ./update-gh-pages.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now travis regenerates my demo for each push. It works like a magic.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;BEM calendar is a very simple application but this article is not about creating calendars. My goal is to show you principles of good development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Develop the design of your application carefully and lay the groundwork for future possible features.&lt;/li&gt;
&lt;li&gt;Use tools which help you write more accurate and stable code.&lt;/li&gt;
&lt;li&gt;Test your code not only with unit tests but use crossbrowser tests, too.&lt;/li&gt;
&lt;li&gt;Automate everything you can.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope this article provide will be useful for you further projects.&lt;/p&gt;

&lt;p&gt;And thanks to all those courageous who read this article down to the end :)&lt;/p&gt;

&lt;h3&gt;Thanks&lt;/h3&gt;

&lt;p&gt;I want to say a special thank to my girlfriend for invaluable support and making this post much better.&lt;/p&gt;

&lt;p&gt;Also I thank everyone who helped me to improve the post. Special thanks to &lt;a href=&quot;https://github.com/ignovak&quot;&gt;ignovak&lt;/a&gt;, &lt;a href=&quot;https://github.com/dfilatov&quot;&gt;dfilatov&lt;/a&gt;, and &lt;a href=&quot;https://github.com/dodev&quot;&gt;dodev&lt;/a&gt;.&lt;/p&gt;
</description>
                <pubDate>Sun, 22 Sep 2013 19:31:12 +0000</pubDate>
                <link>http://tarmolov.ru//blog/bem-calendar</link>
                <guid isPermaLink="true">http://tarmolov.ru//blog/bem-calendar</guid>
            </item>
        
            <item>
                <title>Initial commit</title>
                <description>&lt;p&gt;At long last I have started my blog. I am going to describe here my thoughts and ideas which relate with a web development. I will also plan to share my experience (successful and failed), my projects, and experiments.&lt;/p&gt;

&lt;p&gt;I chose &lt;a href=&quot;http://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt; as my blog engine because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;simple design;&lt;/li&gt;
&lt;li&gt;flexibility;&lt;/li&gt;
&lt;li&gt;local server for debugging and preview;&lt;/li&gt;
&lt;li&gt;markdown;&lt;/li&gt;
&lt;li&gt;gh-pages as free hosting;&lt;/li&gt;
&lt;li&gt;and, finally, I can write posts using my lovely vim ^^&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Special thanks to &lt;a href=&quot;http://kizu.ru/en&quot;&gt;Roman Komarov&lt;/a&gt; who gave me permission to borrow his idea of a clean design. The idea is simple: &lt;a href=&quot;http://en.wikipedia.org/wiki/Web_content#Content_is_king&quot;&gt;content is a king&lt;/a&gt;. No extra elements. No images. I love it.&lt;/p&gt;

&lt;p&gt;Then I tested my blog using &lt;a href=&quot;http://www.browserstack.com/&quot;&gt;BrowserStack&lt;/a&gt;. Actually it is a perfect tool for cross browser and cross platform testing ever. Why did I test my blog? I wanted to be sure that it works fine not only in desktop browsers but in mobile, too.&lt;/p&gt;

&lt;p&gt;Anyway, things are moving...&lt;/p&gt;
</description>
                <pubDate>Wed, 14 Aug 2013 23:27:07 +0000</pubDate>
                <link>http://tarmolov.ru//blog/initial-commit</link>
                <guid isPermaLink="true">http://tarmolov.ru//blog/initial-commit</guid>
            </item>
        
    </channel>
</rss>
