<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Блог Саши Косса</title>

  <icon>http://blog.nocorp.me/images/favicon.png</icon>
  <link href="http://blog.nocorp.me/feed" rel="self"/>
  <link href="http://blog.nocorp.me/"/>

  <updated>2012-08-18T02:22:05-07:00</updated>

  <id>http://blog.nocorp.me</id>

  <author>
    <name>Саша Косс</name>
    <email>koss@nocorp.me</email>
  </author>

  
    <entry>
      <title>О pushbio</title>
      <link href="http://blog.nocorp.me/2012/08/18/pushbio/"/>
      <updated>2012-08-18T00:00:00-07:00</updated>
      <id>http://blog.nocorp.me/2012/08/18/pushbio</id>
      <content type="html">&lt;h2&gt;Всем привет!&lt;/h2&gt;

&lt;p&gt;Неделю назад мне пришла в голову идея: попросить деньги в Твиттере на разработку приложения, которое уверен, что будет полезно многим.&lt;/p&gt;

&lt;p&gt;Обновить все свои социальные профили через одну форму.&lt;/p&gt;

&lt;p&gt;Хотите обновить юзерпик в Instagram, Facebook и Twitter? Сменили номер и хотите уведомить своих коллег и заказчиков в Basecamp и LinkedIn? Pushbio придуман для того, чтобы решать такие проблемы.&lt;/p&gt;

&lt;p&gt;Мне пообещали дать денег удивительное кол-во людей, за что я им очень благодарен! Этот мир, полный интересных людей и новых идей, не перестает меня удивлять.&lt;/p&gt;

&lt;p&gt;Я мечтал о таком приложении и вот мечта сбывается: как и обещал, я начал работать в выходные. Еще я обещал раскрыть все счета и номера для того, чтобы могли сказать мне:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://f.cl.ly/items/2t2J2j3w3U0d1C1z1r1l/shutup.jpg&quot; alt=&quot;&quot;&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Яндекс.Деньги: 41001278886883,&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://nocorp.me/063B2u3X1Z0T&quot;&gt;банковские реквизиты&lt;/a&gt; (в том числе и для оплаты через Альфа-Клик),&lt;/li&gt;
&lt;li&gt;PayPal: kossnocorp@gmail.com,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Номер карты (Visa) я пришлю в ответ на любое сообщение на емейл, skype: &lt;a href=&quot;skype:kossnocorp?add&quot;&gt;kossnocorp&lt;/a&gt;, Twitter: &lt;a href=&quot;http://twitter.com/kossnocorp&quot;&gt;@kossnocorp&lt;/a&gt; или телефонный номер: &lt;a href=&quot;tel:+66887689038&quot;&gt;+668-8768-9038&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Не забывайте подписаться и оставить какое-нибудь сообщение ;-).&lt;/p&gt;

&lt;p&gt;И я конечно не обижусь, если кто-то откажется от этой затеи :-).&lt;/p&gt;
</content>
    </entry>
  
    <entry>
      <title>Почему я люблю CoffeeScript</title>
      <link href="http://blog.nocorp.me/2012/04/03/why-i-love-coffeescript/"/>
      <updated>2012-04-03T00:00:00-07:00</updated>
      <id>http://blog.nocorp.me/2012/04/03/why-i-love-coffeescript</id>
      <content type="html">&lt;h2&gt;Почему я люблю CoffeeScript&lt;/h2&gt;

&lt;p&gt;Сейчас я занимаюсь рефакторингом &lt;a href=&quot;http://wannafun.ru/&quot;&gt;Wannafun&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Не всегда рефакторинг это приятное и простое занятие. Но в конце любого долгого пути всегда есть награда.&lt;/p&gt;

&lt;p&gt;Для меня это небольшой кусочек кода, которым я хотел бы с вами поделиться.&lt;/p&gt;

&lt;p&gt;Это реализация аналога &lt;a href=&quot;http://api.rubyonrails.org/classes/Module.html#method-i-delegate&quot;&gt;Rails'ового delegate&lt;/a&gt;:&lt;/p&gt;

&lt;pre lang=&quot;coffeescript&quot;&gt;&lt;code&gt;class Module

  @delegate: (args..., options) -&amp;gt;
    for fnName in args
      do (fnName) =&amp;gt;
        @::[fnName] = -&amp;gt; @[options.to][fnName].apply(@[options.to], arguments)


  constructor: -&amp;gt;
    @events = Events()


  @delegate('bind', 'unbind', 'trigger', to: 'events')
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Для любопытных: &lt;a href=&quot;https://gist.github.com/2290238&quot;&gt;какой JavaScript&lt;/a&gt; генерируется из этого CoffeeScript кода.&lt;/p&gt;
</content>
    </entry>
  
    <entry>
      <title>Как я перестал быть пользователем Vim и стал пользователем Sublime Text</title>
      <link href="http://blog.nocorp.me/2012/04/01/i-love-sublime-text-2/"/>
      <updated>2012-04-01T00:00:00-07:00</updated>
      <id>http://blog.nocorp.me/2012/04/01/i-love-sublime-text-2</id>
      <content type="html">&lt;h2&gt;Как я перестал быть пользователем Vim и стал пользователем Sublime Text 2&lt;/h2&gt;

&lt;p&gt;Я пользуюсь &lt;a href=&quot;http://www.vim.org/&quot;&gt;Vim'ом&lt;/a&gt; с 2009 года и я думал, что до самого заката своей карьеры буду растатить свой &lt;a href=&quot;http://www.vim.org/&quot;&gt;Vim&lt;/a&gt; конфиг.&lt;/p&gt;

&lt;p&gt;Но похоже этому не суждено сбыться. Буквально неделю назад случилось то, что я считал невозможным. Я нашел редактор на порядок удобнее чем &lt;a href=&quot;http://code.google.com/p/macvim/&quot;&gt;MacVim&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Первое чем подкупает &lt;a href=&quot;http://www.sublimetext.com/&quot;&gt;Sublime Text 2&lt;/a&gt; это интерфейс. Он гораздо проще в использовании нежели интерфейс &lt;a href=&quot;http://code.google.com/p/macvim/&quot;&gt;MacVim&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Все GUI элементы, поиск по проекту, файлам и коду, открытие файлов, drawer, все работает так, как должно работать. И также (по большей части) не требуют использования мыши.&lt;/p&gt;

&lt;p&gt;Я и раньше присматривался к альтернативам Vim'у. До этого были &lt;a href=&quot;http://www.jetbrains.com/ruby/&quot;&gt;RubyMine&lt;/a&gt;, &lt;a href=&quot;http://www.vicoapp.com/&quot;&gt;Vico&lt;/a&gt;, &lt;a href=&quot;http://chocolatapp.com/&quot;&gt;Chocolat&lt;/a&gt; и &lt;a href=&quot;http://kodapp.com/&quot;&gt;Kod&lt;/a&gt;. Ничего не продержалось у меня более получаса.&lt;/p&gt;

&lt;p&gt;Сразу после запуска я полез в настройки в поисках опции включающей vi-movements. Настройки — Python'овский словарь. Опций довольно много и они отлично задокументированы.&lt;/p&gt;

&lt;p&gt;Мне понравилось, что default'ные настройки все на виду, когда как у &lt;a href=&quot;http://www.vim.org/&quot;&gt;Vim'а&lt;/a&gt; — все в документации. Пользователю предлагается описывать свои предпочтения в отдельном словаре, который будет вмержен в default'ный.&lt;/p&gt;

&lt;p&gt;Когда я внес необходимые правки и сохранил файл, настройки автоматически применились.&lt;/p&gt;

&lt;p&gt;Не важно, что вы меняеете, включаете vi-movements, меняете шрифт или устанавливаете новое дополнение — настройки автоматически и мнгновенно применяются. Вы можете продолжать работать.&lt;/p&gt;

&lt;p&gt;После смены ноутбука, я решил завести новый &lt;a href=&quot;http://www.vim.org/&quot;&gt;Vim&lt;/a&gt;-конфиг. Но за последний год он так и не вырос до старого размера, потому что каждый раз когда хочешь что-то изменить понимаешь что тебе после исправлений прийдется закрыть и заново открыть редактор. Такая перспектива мнгновенно отбивает все желание.&lt;/p&gt;

&lt;p&gt;С &lt;a href=&quot;http://www.sublimetext.com/&quot;&gt;Sublime&lt;/a&gt; все по другому.&lt;/p&gt;

&lt;p&gt;Кроме интерфейса в &lt;a href=&quot;http://www.sublimetext.com/&quot;&gt;Sublime&lt;/a&gt; меня привлекли расширения, вернее сам язык на котором они написаны. Это Python.&lt;/p&gt;

&lt;p&gt;Python — душа &lt;a href=&quot;http://www.sublimetext.com/&quot;&gt;Sublime&lt;/a&gt;. Даже конфиг файл написан на Python. И конечно же смешно сравнивать такой замечательный язык программирования с VimL, настоящим кошмаром.&lt;/p&gt;

&lt;p&gt;Вот пример из &lt;a href=&quot;https://github.com/sublimehq/Vintage&quot;&gt;модуля Vintage&lt;/a&gt;, включающим vi-режимы:&lt;/p&gt;

&lt;pre lang=&quot;pyhton&quot;&gt;&lt;code&gt;class ViGotoLine(sublime_plugin.TextCommand):
    def run(self, edit, repeat=1, explicit_repeat=True, extend=False,
            ending='eof'):
        # G or gg
        if not explicit_repeat:
            self.view.run_command('move_to', {'to': ending, 'extend':extend})
        # &amp;lt;count&amp;gt;G or &amp;lt;count&amp;gt;gg
        else:
            new_address = int(repeat) - 1
            target_pt = self.view.text_point(new_address, 0)
            transform_selection(self.view, lambda pt: target_pt,
                extend=extend)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Лично меня это приводит в щенячий восторг.&lt;/p&gt;

&lt;p&gt;За эту неделю я не раз дергал своих товарищей, мол &amp;quot;поглядите какая няшная фишечка&amp;quot;. И я все еще продолжаю открывать и радоваться открытиям.&lt;/p&gt;

&lt;p&gt;Кроме всего, &lt;a href=&quot;http://www.sublimetext.com/&quot;&gt;Sublime Text 2&lt;/a&gt; стоит денег ($59). Это гарант того, что автор продолжит работу над своим замечательным проектом.&lt;/p&gt;

&lt;p&gt;Единственное чего мне не хватает: возможности быстро создать сплит текущего файла (&lt;code&gt;:sp&lt;/code&gt;). В остальном я доволен своим новым &amp;quot;коллегой&amp;quot;.&lt;/p&gt;
</content>
    </entry>
  
    <entry>
      <title>Муравьи</title>
      <link href="http://blog.nocorp.me/2012/03/24/ants/"/>
      <updated>2012-03-24T00:00:00-07:00</updated>
      <id>http://blog.nocorp.me/2012/03/24/ants</id>
      <content type="html">&lt;h2&gt;Муравьи&lt;/h2&gt;

&lt;p&gt;Буквально только что наблюдал как муравьи справляются с ЧП на работе.&lt;/p&gt;

&lt;p&gt;Я не нашел куда быстро выкинуть жевачку и оставил её на столе. В Таиланде, если ты оставил где-то, что-то сладкое — жди гостей. Один из вездесущих муравьев-разведчиков очень быстро найдет это и позовет всех своих товарищей.&lt;/p&gt;

&lt;p&gt;Я прокатил жевачку которую облепили маленькие темные муравьи, что бы посмотреть, насколько сильно она прилипла к столу. В результате этого несколько муравьев пострадало и несколько погибло.&lt;/p&gt;

&lt;p&gt;Не смотря на очевидную опасность муравьи не убежали далеко от места инцендента. Они практически сразу после того как жевачка перестала катиться по столу вернулись к своей работе. Но делали её в два раза быстрее. Муравьи которые не видели что произошло игонируя трупы своих коллег вели себя как и остальные до ЧП. Буквально за секунды работа продолжилась в том же темпе.&lt;/p&gt;

&lt;p&gt;В это же время один муравей пытался освободиться: его усы прилипли к поверхности жевачки и он никак не мог с этим справиться. Он тщетно пытался выдернуть их с помощью веса своего тела. Он еще 20 секунд ни на мнгновение не переставал бороться, делая одну попытку за другой.&lt;/p&gt;

&lt;p&gt;В итоге он понял что ничего таким образом не получиться и приступил к перегрызанию свобственных усов. Осободившись и быстро выпрямив обрубки он присоеденился к остальным муравьям.&lt;/p&gt;
</content>
    </entry>
  
    <entry>
      <title>Open Source Poker</title>
      <link href="http://blog.nocorp.me/2012/03/05/open-source-poker/"/>
      <updated>2012-03-05T00:00:00-08:00</updated>
      <id>http://blog.nocorp.me/2012/03/05/open-source-poker</id>
      <content type="html">&lt;h2&gt;Open source poker&lt;/h2&gt;

&lt;p&gt;Большинство разработчиков с которыми я знаком с энтузиазмом относятся к open source и участии в нем.&lt;/p&gt;

&lt;p&gt;Я придумал игру: в каком-либо сообществе разработчиков, в компании, или например среди программирующего наслеления деревушки в Тайланде принимаются следующие правила:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Каждый разработчик обязывается сделать хотя бы один пулл-реквест (коммит / ишус) в любой (хотя бы свой) open source проект;&lt;/li&gt;
&lt;li&gt;по истечении недели каждый участник игры платит в &amp;quot;банк&amp;quot; по 3$ ($2 / $1) за каждый пропущенный день;&lt;/li&gt;
&lt;li&gt;если в конце недели будут разработчики не пропустившие ни дня, то они делять банк;&lt;/li&gt;
&lt;li&gt;если таких не будет, деньги делятся между теми кто пропустил всего один раз (два / три / ..).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Правила могут варироваться. Как и награда, это может быть например премия от компании ;-). Так же можно учитывать &amp;quot;непрерывность&amp;quot; при делении банка или в размере премии.&lt;/p&gt;

&lt;p&gt;Этим постом я предлагаю свом коллегам поиграть в такую игру.&lt;/p&gt;
</content>
    </entry>
  
    <entry>
      <title>Использование Jade с Assets Pipeline</title>
      <link href="http://blog.nocorp.me/2012/01/05/jade-and-assets-pipeline/"/>
      <updated>2012-01-05T00:00:00-08:00</updated>
      <id>http://blog.nocorp.me/2012/01/05/jade-and-assets-pipeline</id>
      <content type="html">&lt;h2&gt;Использование Jade с Assets Pipeline&lt;/h2&gt;

&lt;p&gt;Мой текущий проект — большое одностраничное приложение. Одна из задач, которую мне пришлось решить — организация шаблонизации на клиенте. Опытом её решения я бы и хотел поделиться.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/rtomayko/tilt&quot;&gt;Tilt&lt;/a&gt;, одна из чудеснейших сторон Assets Pipeline, позволяет реализовать такую схему: шаблоны хранятся в директории &lt;code&gt;app/assets/javascripts/templates&lt;/code&gt;, подключаются в с помощью Sprockets директивы &lt;code&gt;#= require_tree ./templates&lt;/code&gt; и попадают на клиент в виде функций доступных через глобальную переменную &lt;code&gt;JST&lt;/code&gt;:&lt;/p&gt;

&lt;pre lang=&quot;javascript&quot;&gt;&lt;code&gt;var usersListEl = $( JST['users/index'](User.toJSON()) );
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Это очень красивое решение, потому что:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;т.к шаблоны попадают на клиент в виде готовых JS функций, это позволяет сократить время на генерацию HTML;&lt;/li&gt;
&lt;li&gt;шаблоны будут закэшированы;&lt;/li&gt;
&lt;li&gt;шаблоны храняться в отдельных файлах, что упрощает работу с ними.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;В сравнении с более распостраненным способом хранить JS шаблоны, который предлагают &lt;a href=&quot;http://handlebarsjs.com/&quot;&gt;Handlebars.js&lt;/a&gt; и &lt;a href=&quot;http://api.jquery.com/category/plugins/templates/&quot;&gt;jQuery Templates&lt;/a&gt;, это вовсе кажется прорывом:&lt;/p&gt;

&lt;pre lang=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;script id=&amp;quot;movieTemplate&amp;quot; type=&amp;quot;text/x-jquery-tmpl&amp;quot;&amp;gt;
  {{tmpl &amp;quot;summaryTemplate&amp;quot;}}
  &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Director: ${Director}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Мне оставалось выбрать язык и подключить его к Assets Pipeline.&lt;/p&gt;

&lt;p&gt;В предыдущем проекте, &lt;a href=&quot;http://m.groupon.ru/&quot;&gt;Groupon Mobile&lt;/a&gt;, я использовал &lt;a href=&quot;http://handlebarsjs.com/&quot;&gt;Handlebars&lt;/a&gt;. Не хочу говорить ничего плохого про него, но на этот раз мне хотелось работать с более приятным, максимально близким к Haml'у синтаксисом.&lt;/p&gt;

&lt;p&gt;Практически сразу мой выбор пал на &lt;a href=&quot;http://jade-lang.com/&quot;&gt;Jade&lt;/a&gt;, наиболее популярный шаблонизатор для Node.js. Он может работать как на сервере, так и на клиенте.&lt;/p&gt;

&lt;p&gt;Пример синтаксиса Jade (более детально с ним можно ознакомиться &lt;a href=&quot;https://github.com/visionmedia/jade&quot;&gt;на странице проекта на GitHub&lt;/a&gt;):&lt;/p&gt;

&lt;pre lang=&quot;jade&quot;&gt;&lt;code&gt;div(role='demo')
  h1 Jade — шаблонизатор для Node.js
  p Он может работать как на сервере, так и на клиенте.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Я &lt;a href=&quot;https://gist.github.com/1562389&quot;&gt;написал engine для Assets Pipeline&lt;/a&gt; который компилировал Jade в JS. Изначально я планировал упаковать его в gem, но потом наткнулся на &lt;a href=&quot;https://github.com/therabidbanana/tilt-jade&quot;&gt;уже готовый проект&lt;/a&gt;, который и рекомендую использовать.&lt;/p&gt;

&lt;p&gt;Все что вам нужно сделать, чтобы реализовать подобное у себя, это подключить &lt;code&gt;gem 'tilt-jade'&lt;/code&gt; (имена шаблонов должны заканчиваться на &lt;code&gt;.js.jst.jade&lt;/code&gt;).&lt;/p&gt;
</content>
    </entry>
  
    <entry>
      <title>Использование атрибута role FTW</title>
      <link href="http://blog.nocorp.me/2011/12/25/role/"/>
      <updated>2011-12-25T00:00:00-08:00</updated>
      <id>http://blog.nocorp.me/2011/12/25/role</id>
      <content type="html">&lt;h2&gt;Использование атрибута role FTW&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Атрибут role описанный в этой спецификации позволяет автору
аннотировать языки разметки семантической информацией о назначении
элемента, которая понятна машине.&lt;/p&gt;

&lt;p&gt;Варианты использования включают доступность, адаптацию под устройства,
обработку документа на сервере а так же сложное описание данных.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Это цитата из &lt;a href=&quot;http://www.w3.org/wiki/PF/XTech/HTML5/RoleAttribute#A_Role_Attribute_for_HTML5&quot;&gt;W3C спецификации описывающей атрибут role&lt;/a&gt;
и его назначние.&lt;/p&gt;

&lt;p&gt;Мы, в &lt;a href=&quot;http://evilmartians.ru/&quot;&gt;Evil Martians&lt;/a&gt; придумали как использовать
этот атрибут в своих целях.&lt;/p&gt;

&lt;p&gt;Представьте что перед вами стоит задача, обновить дизайн какой-либо страницы
вашего web-проекта. У вас есть готовая верстка которую надо натянуть на
уже работающий сайт. И конечно же эта замечательная страница напичкана
JS кодом привязанным к существующей структуре.&lt;/p&gt;

&lt;pre lang=&quot;js&quot;&gt;&lt;code&gt;$('.list .item img')
    .mouseenter(function () {
        $(this).rotateTo(30, 300)
    })
    .mouseleave(function () {
        $(this).rotateTo(0, 300)
    });
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Очевидно, что вам придется переписывать все селекторы согласно новой верстке.
И все было бы хорошо, если бы вам нужно было поправить всего один (или даже десять)
таких селекторов. На деле, скорее всего, их будет несколько десятков.&lt;/p&gt;

&lt;p&gt;Еще бывает что в процессе рефакторинга меняются имена классов или их набор.
Вам необходимо прошерстить все JS файлы на предмет использования классов
которые вы планируете поменять.&lt;/p&gt;

&lt;p&gt;И конечно же в обоих случаях конечный результат абсолютно непредсказуем, т.к
совершенно невозможно понять из разметки, какой класс используется в JS,
какой нет.&lt;/p&gt;

&lt;p&gt;Хорошей идеей кажется использование префиксов &lt;code&gt;.js-class_name&lt;/code&gt;, но к
такому классу однажды обязательно допишут стили, да и среди большого кол-ва
классов довольно трудно заметить класс с префиксом.&lt;/p&gt;

&lt;p&gt;Для того, что бы избежать вышеизложенных проблем, для &amp;quot;крепления&amp;quot; JS к
DOM элементам мы используем атрибут role.&lt;/p&gt;

&lt;p&gt;Это гораздо безопаснее использования префиксов, т.к привязать стили к role гораздо
труднее нежели к классу и морально сложнее нарушить соглашение об использовании role.&lt;/p&gt;

&lt;p&gt;С использованием role обновление верстки становится очень простой задачей: вам
достаточно дописать необходимые роли новым элементам и если вы не привязывались к
&amp;quot;&lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&quot;&gt;волшебным числам&lt;/a&gt;&amp;quot;
то все заработает с первого раза.&lt;/p&gt;

&lt;p&gt;Для того что бы упростить жизнь (спасибо &lt;a href=&quot;https://twitter.com/#!/alex_chrome&quot;&gt;@alex_chrome&lt;/a&gt;
за отличную идею) мы расширили синтаксис jQuery селекторов:&lt;/p&gt;

&lt;pre lang=&quot;javascript&quot;&gt;&lt;code&gt;$('@list @item @image')
    .mouseenter(function () {
        $(this).rotateTo(30, 300)
    })
    .mouseleave(function () {
        $(this).rotateTo(0, 300)
    });
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;$('@list @item @image')&lt;/code&gt; эквивалентно &lt;code&gt;$('[role=&amp;quot;list&amp;quot;] [role=&amp;quot;item] [role=&amp;quot;image&amp;quot;]')&lt;/code&gt;
и позволяет использовать &amp;quot;мульти роли&amp;quot;: &lt;code&gt;$('@list@coupons')&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Кроме плагина для jQuery, я написал версию которая расширяет &lt;code&gt;querySelectorAll&lt;/code&gt; и
позволяет использовать Role в &lt;a href=&quot;http://zeptojs.com/&quot;&gt;Zepto.js&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Выборки с использованием role работают медленнее, но разница составляет миллисекунды.
И даже при большом кол-ве выборок она не заметна.&lt;/p&gt;

&lt;p&gt;Кроме role, я бывает использую id, но в совершенно исключительных случаях. Потому, что
если сегодня конкретный элемент представлен на странице в единственном
экземпляре, завтра их может оказаться несколько. Даже если это не запланировано.&lt;/p&gt;

&lt;p&gt;Сегодня я зарелизил версию 1.0.0, которая работает без ошибок
во всех браузерах, включая IE6.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kossnocorp/role&quot;&gt;Репо&lt;/a&gt; (не забывайте жмакать &amp;quot;Watch&amp;quot;);&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://rubygems.org/gems/role-rails&quot;&gt;role-rails gem&lt;/a&gt;, для использования со Sprockets;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kossnocorp/role/blob/master/src/jquery.role.coffee&quot;&gt;jQuery&lt;/a&gt; адаптер (&lt;a href=&quot;https://github.com/kossnocorp/role/blob/master/lib/jquery.role.js&quot;&gt;JS версия&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kossnocorp/role/blob/master/src/role.coffee&quot;&gt;querySelectorAll&lt;/a&gt; адаптер (&lt;a href=&quot;https://github.com/kossnocorp/role/blob/master/lib/role.js&quot;&gt;JS версия&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
</content>
    </entry>
  
    <entry>
      <title>PipeGems — упаковщик JS библиотек в джемы</title>
      <link href="http://blog.nocorp.me/2011/12/16/pipegems/"/>
      <updated>2011-12-16T00:00:00-08:00</updated>
      <id>http://blog.nocorp.me/2011/12/16/pipegems</id>
      <content type="html">&lt;h2&gt;PipeGems — упаковщик JS библиотек в джемы&lt;/h2&gt;

&lt;p&gt;В начале сентября вместе с новым проектом на Rails 3.1 мне пришла в голову идея. Идея о том, как немного упростить жизнь front-end разработчикам.&lt;/p&gt;

&lt;p&gt;Одна из фич Assets Pipiline — возможность держать ассеты в джемах. Тем самым мы избавляемся от лишних файлов в репо и решаем проблему зависимостей, точно зная какая версия JS библиотеки включена в приложение.&lt;/p&gt;

&lt;p&gt;Выглядит это так:&lt;/p&gt;

&lt;pre lang=&quot;ruby&quot;&gt;&lt;code&gt;source 'http://rubygems.org'

# Подключаем конкретные версии jQuery и Spine.js
gem 'jquery-rails', '~&amp;gt; 1.0.19'
gem 'spine-rails',  '~&amp;gt; 0.0.9'
&lt;/code&gt;&lt;/pre&gt;

&lt;pre lang=&quot;coffeescript&quot;&gt;&lt;code&gt;#= require jquery
#= require spine
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Я подумал, а что если написать приложение, которое позволит через web-интерфейс быстро упаковать библиотеки в джемы?&lt;/p&gt;

&lt;p&gt;Буквально за неделю я написал работающий прототип. Вы заходите на сайт, создаете джем, указывая версию, загружаете туда JS файлики, подключаете дополнительный сорс в Gemfile и можете использовать:&lt;/p&gt;

&lt;pre lang=&quot;ruby&quot;&gt;&lt;code&gt;source 'http://pipegems.org'

gem 'pipe-awesome_jquery_plugin', '0.4.1'
&lt;/code&gt;&lt;/pre&gt;

&lt;pre lang=&quot;coffeescript&quot;&gt;&lt;code&gt;#= require awesome_jquery_plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Что бы эта штука заработала, кроме красивого интерфейса, мне нужен был план как сделать ее популярной. Я подумал, что если прийти с готовым приложением к Heroku и предложить спонсорство — это может дать хороший толчок к развитию проекта (и плюс over 9000 к надежности). Ну и бесплатный хостинг, само-собой. Для этого мне нужно было перенести хранение джемов в облака.&lt;/p&gt;

&lt;p&gt;И именно на этом этапе проект и завис. Я прошел примерно четверть пути, когда рабочий проект начал требовать к себе 100% внимания.&lt;/p&gt;

&lt;p&gt;Я планирую закончить PipeGems на зимних каникулах, и если кто-то хочет присоедениться к разработке или обсуждению идей, велком в &lt;a href=&quot;https://github.com/kossnocorp/pipegems&quot;&gt;репо&lt;/a&gt;, а так же в &lt;a href=&quot;mailto:koss@nocorp.me&quot;&gt;почту&lt;/a&gt; или &lt;a href=&quot;skype:kossnocorp?add&quot;&gt;скайп&lt;/a&gt;.&lt;/p&gt;
</content>
    </entry>
  
    <entry>
      <title>Что до меня долго доходило про работу в офисе</title>
      <link href="http://blog.nocorp.me/2011/12/14/about-working-in-office/"/>
      <updated>2011-12-14T00:00:00-08:00</updated>
      <id>http://blog.nocorp.me/2011/12/14/about-working-in-office</id>
      <content type="html">&lt;h2&gt;Что до меня долго доходило про работу в офисе&lt;/h2&gt;

&lt;p&gt;Так случилось, что большую часть времени за всю мою профессиональную деятельность я проработал один, сидя дома. И кажется, самые большие шаги я делал, не имея прямого контакта с людьми. За долгие годы я научился бороться с соблазнами квартиры в которой живешь.&lt;/p&gt;

&lt;p&gt;Но когда я прихожу в офис и работаю вместе с коллегами, это доставляет кучу фана. Огромное удовольствие — обсудить свою проблему с соратником в то время, пока наливаешь чашку кофе или чешешь ухо.&lt;/p&gt;

&lt;p&gt;Но насколько это продуктивно? И не только с точки зрения работы.&lt;/p&gt;

&lt;p&gt;Я заметил, что после рабочего дня, который непременно затянется из-за партии в FIFA, не испытываешь большого желания чесать языком. А время то самое оно для болтовни. Еще и работа движется не так быстро, как хотелось бы.&lt;/p&gt;

&lt;p&gt;Во многом это из-за того, что после каждого перекидывания парой фраз приходится заново входить в поток. Ну и темы для обсуждения нередко оторваны от рабочих задач.&lt;/p&gt;

&lt;p&gt;Вот и получается, что в одной комнате с XBox 360 работается проще, чем в комнате с коллегами.&lt;/p&gt;

&lt;p&gt;А дошло до меня вот что: за рабочим столом лучше всего сидеть молча. А на обеде обсуждать только текущие проекты. Потрепаться можно и потом, в баре или на кухне, с теми же коллегами. Но в свободное время. Которого по идеи от этого станет только больше.&lt;/p&gt;
</content>
    </entry>
  
    <entry>
      <title>Что если в день (месяц, год) планировать максимально всего по три, но самых важных дела?</title>
      <link href="http://blog.nocorp.me/2011/12/10/3-to-do/"/>
      <updated>2011-12-10T00:00:00-08:00</updated>
      <id>http://blog.nocorp.me/2011/12/10/3-to-do</id>
      <content type="html">&lt;h2&gt;Что если в день (месяц, год) планировать максимально всего по три, но самых важных дела?&lt;/h2&gt;

&lt;p&gt;Ко мне в голову пришла интересная мысль. Когда я занимаюсь планированием, очень трудно удержать себя от того что бы не напихать в план всего под завязку. Даже если задач в списке на месяц уже достойное количество, все равно найдется еще одна, которую неплохо было бы закончить.&lt;/p&gt;

&lt;p&gt;В конце концов не сделанные задачи, с чистым сердцем переносятся на следующий месяц, потому что &amp;quot;я и так немало сделал&amp;quot;. И порой это бывают самые важные и обязательные вещи.&lt;/p&gt;

&lt;p&gt;Кто с ходу сможет сказать, в выходные, что он делал в среду? Мне редко удается быстро справиться с ответом.&lt;/p&gt;

&lt;p&gt;При воспоминаниях мозг чаще всего цепляется за самые значительные события дня, например &amp;quot;сходил на митинг&amp;quot;, &amp;quot;стал чемпионом аэро-хоккея&amp;quot;, &amp;quot;написал статью&amp;quot;.&lt;/p&gt;

&lt;p&gt;Что если на каждый промежуток времени, выбирать три самых важных дела, и давать себе гарантию что они будут на 100% выполнены?&lt;/p&gt;

&lt;p&gt;У всех бывают жутко непродуктивные дни. С утра пришлось идти в поликлинику. Потом вас зацепил какой то неумелый водитель. И вот вы уже под вечер, клюкая носом, думаете, что уже ничего не успеете, и что завтра придется делать работу и за сегодня.&lt;/p&gt;

&lt;p&gt;Если бы в этот день вы успели бы выполнить всего три дела, какие бы это были дела?&lt;/p&gt;

&lt;p&gt;Что бы вы включили в &lt;em&gt;&amp;quot;страховку&amp;quot;&lt;/em&gt; за &lt;em&gt;&amp;quot;убитое&amp;quot;&lt;/em&gt; время?&lt;/p&gt;

&lt;p&gt;Конечно не обязательно &lt;strong&gt;каждый&lt;/strong&gt; день выполнять &lt;strong&gt;три&lt;/strong&gt; дела, иногда нужно просто сесть и передохнуть, отложив все планы. Но важно понимать что сегодняшний день никак не скажется на будущем и осознанно выбирать количество таких дней.&lt;/p&gt;

&lt;p&gt;Вот такой вот GTD.&lt;/p&gt;
</content>
    </entry>
  
    <entry>
      <title>Привет, жестокий мир!</title>
      <link href="http://blog.nocorp.me/2011/11/26/hello-cruel-world/"/>
      <updated>2011-11-26T00:00:00-08:00</updated>
      <id>http://blog.nocorp.me/2011/11/26/hello-cruel-world</id>
      <content type="html">&lt;h2&gt;Привет, жестокий мир!&lt;/h2&gt;

&lt;p&gt;Жесткой мир, привет!&lt;/p&gt;

&lt;p&gt;Эта запись опубликована с целью протестировать работу Jekyll.&lt;/p&gt;

&lt;p&gt;Между прочим даже не пытайтесь запустить Jekyll на 1.9.x. Куча неприятных впечатлений гарантировано.&lt;/p&gt;
</content>
    </entry>
  
</feed>
