<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>Блог о современных технологиях в интернете</description><title>Алексей Симоненко</title><generator>Tumblr (3.0; @simonenko)</generator><link>http://blog.simonenko.su/</link><item><title>Что мне дал 2011 год</title><description>&lt;p&gt;Совершенно точно этот год был очень насыщенным. Работал в этом году с такими трендами как HTML5, CSS3, JavaScript. И в отличии от прошлого года уже не в теории, а на практике. Во многом на это повлияло быстрое развитие браузеров, даже Internet Explorer, что для него это вообще дико.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2&gt;HTML5&lt;/h2&gt;
&lt;p&gt;Про большинство возможностей из спецификации я знал уже давно, но на практике получилось использовать только в этом году. Активно использовал новые возможности форм, &lt;a href="/post/734573260/use-localstorage-instead-of-cookie" target="_blank"&gt;хранение данных в localStorage/sessionStorage&lt;/a&gt;. Делал возможным, чтобы сайты работали в offline с помощью Application Cache. Активно использовал History API, чтобы сохранять состояние сайта и давать возможность возвращаться назад. Использовал Geolocation API для создания &lt;a href="/post/4715734992/google-maps-geolocation-directions" target="_blank"&gt;умных контактов&lt;/a&gt;. Web Workers для работы с тяжелыми JavaScript операциями и WebSocket для двустороннего соединения с сервером.&lt;/p&gt;
&lt;h2&gt;CSS3&lt;/h2&gt;
&lt;p&gt;Большинство браузеров в этом году очень сильно продвинулись в реализации CSS3 спецификации. Можно посмотерть что уже можно использовать с помощью сервиса &lt;a href="http://caniuse.com" rel="nofollow" target="_blank"&gt;caniuse.com&lt;/a&gt;. Однако самый большой минус этого движения был в появлении кучи одинаковых свойств с префиксами каждого браузера. Хорошо что есть такая замечательная штука как &lt;a href="http://lesscss.org" rel="nofollow" target="_blank"&gt;LESS&lt;/a&gt;, именно с ее помощью я верстал все последие сайты. Даже накидал небольшой набор функций для &lt;a href="https://github.com/meritt/my-less-framework" rel="nofollow" target="_blank"&gt;My Less Framework&lt;/a&gt;, что еще больше упростило жизнь.&lt;/p&gt;
&lt;h2&gt;JavaScript&lt;/h2&gt;
&lt;p&gt;JavaScript, я считаю, самым большим трендом этого года. Причем не только на клиентской стороне, но и на серверной.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Клиентский JavaScript&lt;/strong&gt;&lt;br/&gt; Я познакомился и стал активно использовать &lt;a href="http://documentcloud.github.com/backbone/" rel="nofollow" target="_blank"&gt;Backbone.js&lt;/a&gt; — MVC фреймворк для создания полноценных JavaScript приложений. Больше не пихаю во все места таких монстров как jQuery/Prototype/YUI/Dojo когда этого не нужно, а грамотно использую &lt;a href="/tagged/microjs" target="_blank"&gt;микро-фреймворки&lt;/a&gt;. Разобрался и полюбил &lt;a href="/post/8725324958/for-what-i-love-coffeescript" target="_blank"&gt;CoffeeScript&lt;/a&gt;, теперь на Vanilla JavaScript смотрю с изумленным глазами ;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Серверный JavaScript&lt;/strong&gt;&lt;br/&gt; Заменил PHP на NodeJS, заменил MySQL на MongoDB, заменил Apache на Nginx, заменил &lt;a href="/post/12233683977/deploy-nodejs-application-with-capistrano" target="_blank"&gt;FTP на Capistrano&lt;/a&gt;. Написал несколько npm модулей, таких как: &lt;a href="/post/8169320732/node-tumblr-my-first-nodejs-module" target="_blank"&gt;node-tumblr&lt;/a&gt;, &lt;a href="https://github.com/meritt/node-gisty" rel="nofollow" target="_blank"&gt;node-gisty&lt;/a&gt; и других, которые я пока немогу выложить в open source. Начал помогать сообществу и делать pull request в открытые проекты, например: добавил авторизацию через &lt;a href="https://github.com/bnoguchi/everyauth/pull/140" rel="nofollow" target="_blank"&gt;ВКонтакте к everyauth&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;В общем старался помогать сообществу как мог, спасибо что весь год меня читали. С новым годом вас!&lt;/p&gt;</description><link>http://blog.simonenko.su/post/15021870385</link><guid>http://blog.simonenko.su/post/15021870385</guid><pubDate>Fri, 30 Dec 2011 13:44:00 +0300</pubDate><category>html5</category><category>css3</category><category>javascript</category></item><item><title>Асинхронный скрипт подключения к Google Analytics социальных кнопок</title><description>&lt;p&gt;В корпоративном блоге Serenity я написал статью о том, что &lt;a href="http://serenity.su/blog/post/14554583196/social-interaction-analytics" target="_blank"&gt;в Google Analytics можно отслеживать нажатия на социальные кнопки&lt;/a&gt; и о том, почему я считаю это важным. Однако, по-умолчанию этот механизм работает только для кнопок +1. Для того чтобы в отчет попадали нажатия на другие социальные кнопки нам придется воспользоваться Google’вским API: &lt;a href="http://code.google.com/apis/analytics/docs/tracking/gaTrackingSocial.html" rel="nofollow" target="_blank"&gt;Social Interaction Analytics&lt;/a&gt;.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Подход, который предлагается в документации, мне не очень нравится. Я бы хотел, чтобы эти настройки и загрузка социальных кнопок была асинхронная, и не блокировала работу сайта. Поэтому я решил взять мой &lt;a href="http://blog.simonenko.su/post/12874310913/asynchronous-code-for-analytics-plusbutton-facebook-twit"&gt;асинхронный скрипт для подключения социальных сервисов&lt;/a&gt; и модернезировать его. Вот что из этого получилось:&lt;/p&gt;
&lt;p class="gist"&gt;&lt;a href="http://gist.github.com/1503296" title="social.js"&gt;Смотреть рабочий скрипт подключения социальных кнопок к Google Analytics.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Вам остается заменить &lt;code&gt;UA-XXXX-1&lt;/code&gt; на свой собственный Google Analytics ID и в &lt;code&gt;post_url&lt;/code&gt; заменить ссылку на страницу, которую будете отслеживать.&lt;/p&gt;
&lt;p&gt;Лучше всего взять &lt;a href="https://gist.github.com/1503296#file_social.min.js" target="_blank"&gt;сжатую версию скрипта&lt;/a&gt; (1,4k) и поместить перед &lt;code&gt;&lt;/head&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Кстати, из прошлой статьи я понял, что для многих не очевидно как и куда вставлять сами кнопки. Исправляюсь, вот пример кода для каждого социального сервиса, вставлять внутри &lt;body&gt;&lt;/p&gt;
&lt;p class="gist"&gt;&lt;a href="http://gist.github.com/1503296" title="snippets.html"&gt;Пример как вставлять социальные кнопки.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Пример работы такого скрипта можно посмотерть на сайте &lt;a href="http://convertcss.com"&gt;convertcss.com&lt;/a&gt; и в &lt;a href="http://serenity.su/blog/post/14554583196/social-interaction-analytics"&gt;корпоративном блоге Serenity&lt;/a&gt;.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/14554521499</link><guid>http://blog.simonenko.su/post/14554521499</guid><pubDate>Wed, 21 Dec 2011 10:29:00 +0300</pubDate><category>javascript</category><category>social</category><category>analytics</category><category>google</category><category>facebook</category><category>twitter</category><category>вконтакте</category></item><item><title>Что нового в ECMAScript 5</title><description>&lt;p&gt;Презентация о новых методах в ECMAScript 5&lt;/p&gt;
&lt;p&gt;Очень подробно, с примерами, рассказано о таких методах как:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;code&gt;Object.create&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Object.defineProperties&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Object.keys&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Object.seal&lt;/code&gt; и &lt;code&gt;Object.freeze&lt;/code&gt; и &lt;code&gt;Object.preventExtensions&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div id="__ss_10575898"&gt;&lt;iframe frameborder="0" height="426" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/10575898" width="510"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;Источник: &lt;a href="http://www.slideshare.net/ferrantes/ecmascript-5-10575898" title="ECMAScript 5" target="_blank"&gt;ECMAScript 5&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.simonenko.su/post/14209294962</link><guid>http://blog.simonenko.su/post/14209294962</guid><pubDate>Wed, 14 Dec 2011 12:11:44 +0300</pubDate><category>javascript</category><category>ecmascript</category></item><item><title>Как управлять задачами cron с помощью Capistrano для NodeJS проектов</title><description>&lt;p&gt;&lt;img align="left" alt="Как управлять задачами в Cron с помощью Capistrano для NodeJS проектов" src="http://media.tumblr.com/tumblr_lv19hywTtg1qzuuwu.jpg"/&gt; Я уже рассказывал о том &lt;a href="/post/12233683977/deploy-nodejs-application-with-capistrano"&gt;как доставлять NodeJS проект на сервер с помощью Capistrano&lt;/a&gt;, теперь я расскажу как можно управлять задачами cron с помощью все того же Capistrano.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Для начала нам понадобится &lt;a href="http://github.com/javan/whenever" target="_blank"&gt;whenever&lt;/a&gt; — это замечательная библиотека для удобной работы с задачами крона. Библиотека написана на Ruby, но так как у вас уже стоит Capistrano это не должно быть проблемой. Устанавливаем:&lt;/p&gt;
&lt;p&gt;&lt;code&gt; &lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gem install whenever
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt; &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Чтобы создать структуру для работы с whenever, вызываем в кроне вашего проекта следующую команду:&lt;/p&gt;
&lt;p&gt;&lt;code&gt; &lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wheneverize .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt; &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;В проект будет добавлен один единственный файл &lt;code&gt;config/schedule.rb&lt;/code&gt;, именно в нем будут описаны все задачи для исполения кроном. Для примера хочу показать как с помошью whenever можно запускать CoffeeScript файлы.&lt;/p&gt;
&lt;p class="gist"&gt;&lt;a href="http://gist.github.com/1384184" title="schedule.rb" target="_blank"&gt;Смотреть пример schedule.rb на GitHub Gist.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;То есть, каждые 2 часа из папки проекта будет запущен файл &lt;code&gt;import.coffee&lt;/code&gt;. Больше примеров по работе с whenever можно &lt;a href="http://github.com/javan/whenever/blob/master/README.md" target="_blank"&gt;посмотреть здесь&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Теперь нам осталось обновить &lt;code&gt;config/deploy.rb&lt;/code&gt;, который &lt;a href="/post/12233683977/deploy-nodejs-application-with-capistrano"&gt;мы разобрали в прошлый раз&lt;/a&gt;, и добавить в него два новых этапа, это &lt;code&gt;task :update_crontab&lt;/code&gt; и &lt;code&gt;task :clear_crontab&lt;/code&gt;. Результат:&lt;/p&gt;
&lt;p class="gist"&gt;&lt;a href="http://gist.github.com/1384184" title="deploy.rb" target="_blank"&gt;Смотреть пример deploy.rb на GitHub Gist.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Думаю доставка ваших приложений с whenever будет еще проще, ведь теперь вы можете удаленно управлять кроном.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/13151066924</link><guid>http://blog.simonenko.su/post/13151066924</guid><pubDate>Tue, 22 Nov 2011 10:42:00 +0300</pubDate><category>nodejs</category><category>capistrano</category><category>deploy</category><category>cron</category></item><item><title>Асинхронное подключение Google Analytics, Google +1, Facebook SDK, Twitter Widgets и Вконтакте API</title><description>&lt;p&gt;Сейчас становится популярно размещать всякие социальные сервисы у себя на сайтах, на сайтах своих клиентов, но вместе с этим мы забываем о том, что все эти сервисы замедляют работу сайтов. Многие уже умеют подключать Google Analytics асинхронно, то есть, таким образом, чтобы загрузка скрипта не останавливала загрузку сайта. Я же предлагаю идти дальше и все нужные социальные сервисы загружать асинхронно.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Вот работающий скрипт для подключения &lt;a href="http://www.google.com/analytics/" target="_blank"&gt;Google Analytics&lt;/a&gt;, &lt;a href="http://www.google.com/webmasters/+1/button/" target="_blank"&gt;Google +1 Button&lt;/a&gt;, &lt;a href="http://developers.facebook.com/docs/reference/javascript/" target="_blank"&gt;Facebook SDK&lt;/a&gt;, &lt;a href="http://twitter.com/about/resources" target="_blank"&gt;Twitter Widgets&lt;/a&gt; и &lt;a href="http://vkontakte.ru/developers.php?id=-1_27987570&amp;s=1" target="_blank"&gt;Вконтакте API&lt;/a&gt;.&lt;/p&gt;
&lt;p class="gist"&gt;&lt;a href="http://gist.github.com/1368569" title="social.js" target="_blank"&gt;Смотреть пример асинхронного подключения Google Analytics, Google +1, Facebook SDK, Twitter Widgets и Вконтакте API.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://gist.github.com/1368569#file_social.min.js" target="_blank"&gt;Сжатая версия этого скрипта&lt;/a&gt; занимает всего 584 байта. При этом вы легко можете добавить дополнительных сервисов или убрать перечисленные у меня.&lt;/p&gt;
&lt;p&gt;Большинство сервисов уже умеют работать с кодом, загруженным асинхронно, хотя не указывают это в документации. Все перечисленные мною сервисы умеют так делать. Например, чтобы на сайте появилась кнопка “мне нравится” от Вконтакте достаточно добавить всю необходимую логику в функцию &lt;code&gt;window.vkAsyncInit&lt;/code&gt;, вот так:&lt;/p&gt;
&lt;p class="gist"&gt;&lt;a href="http://gist.github.com/1266863" title="vk.js" target="_blank"&gt;Асинхронное подключение “мне нравится” от Вконтакте API.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Не забывайте, что контент сайта важнее и именно его стоит показывать в первую очередь.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/12874310913</link><guid>http://blog.simonenko.su/post/12874310913</guid><pubDate>Wed, 16 Nov 2011 10:22:00 +0300</pubDate><category>Facebook</category><category>Google</category><category>Twitter</category><category>Вконтакте</category><category>JavaScript</category></item><item><title>NodeJS для начинающих</title><description>&lt;a href="http://nodebeginner.ru"&gt;NodeJS для начинающих&lt;/a&gt;: &lt;p&gt;Хорошая книжка о NodeJS на русском языке. Подойдет для начинающих.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/12565877079</link><guid>http://blog.simonenko.su/post/12565877079</guid><pubDate>Wed, 09 Nov 2011 23:28:47 +0300</pubDate><category>nodejs</category></item><item><title>Как преобразовать ваши JavaScript файлы в CoffeeScript формат.</title><description>&lt;p&gt;&lt;a target="_blank" href="http://github.com/rstacruz/js2coffee"&gt;JS2Coffee&lt;/a&gt; — это небольшой npm модуль, который позволяет конвертировать JavaScript файлы в CoffeeScript. Для многих начинающих вникать в синтаксис CoffeeScript это должно очень помочь.&lt;/p&gt;
&lt;p&gt;Использовать js2coffee из консоли очень просто:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;js2coffee main.js &gt; main.coffee&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;А чтоб еще больше упростить работу с конвертацией из формата в формат, был запущен сайт &lt;a target="_blank" href="http://js2coffee.org"&gt;js2coffee.org&lt;/a&gt;. На нем вы сможете в онлайн режиме конвертировать свои JS файлы в CoffeeScript, и больше, вы сможете конвертировать CoffeeScript файлы в JavaScript — правда незнаю зачем это может быть нужным.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/12458933735</link><guid>http://blog.simonenko.su/post/12458933735</guid><pubDate>Mon, 07 Nov 2011 08:42:05 +0300</pubDate><category>javascript</category><category>coffeescript</category></item><item><title>Удаленная доставка NodeJS приложения с помощью Capistrano</title><description>&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lu09dyTXd61qzuuwu.png" align="left" alt="Удаленная доставка NodeJS приложения с помощью Capistrano"/&gt;Думаю, каждый разработчик сталкивался с проблемой развертывания своего сайта/приложения на живой сервер. И, думаю, каждый мечтает о такой кнопочки, нажав которую все его изменения попадали бы на сервер.&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://capify.org"&gt;Capistrano&lt;/a&gt; — это инструмент для быстрого развертывания и выполнения задача на удаленной машине. Изначально он был разработан для развертывания проектов на Ruby On Rails, но как оказалось может применяться для чего угодно. С помощью capistrano можно доставлять PHP, Python, NodeJS проекты.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;strong&gt;Что нужно чтобы Capistrano работал?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Наличие ssh-доступа к серверу.&lt;/li&gt;
&lt;li&gt;Исходники должны находится под контролем Subversion или Git (возможно что-то еще).&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Capistrano замечательно работает на Mac OS X, Linux и Windows и его установка нужна только на локальной машине, машине разработчика. То есть на сервер capistrano устанавливать не нужно.&lt;/p&gt;
&lt;p&gt;Для установки на своей машине вам нужны будут Ruby и RubyGems, после чего достаточно:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gem install capistrano&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Вот несколько команд для работы с инструментом:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;code&gt;capify .&lt;/code&gt; — создает папки и файлы с настройками capistrano по умолчанию&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cap deploy:setup&lt;/code&gt; — удаленная настройка файловой структуры для последующей доставки&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cap deploy&lt;/code&gt; — доставка новой версии на сервер&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cap deploy:rollback&lt;/code&gt; — откатывает версию на сервере до предыдущего состояния&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Теперь о том как доставлять NodeJS проекты&lt;/h2&gt;
&lt;p&gt;Сразу целиком покажу пример конфига (&lt;code&gt;config/deploy.rb&lt;/code&gt;) для развертывания приложения на сервере.&lt;/p&gt;
&lt;p class="gist"&gt;&lt;a target="_blank" href="http://gist.github.com/1332133"&gt;Смотреть пример deploy.rb на GitHub Gist.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Остановимся на некоторых настройках подробней.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set :application, "application-name.js"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Название приложения, в моем случае, это еще и папка, в которой будет лежать проект.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set :node_file, "server.coffee"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Главный файл запуска сервера.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set :host, "87.250.250.11"
set :user, "root"
set :admin_runner, "www-data"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Доступ к удаленному серверу.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set :repository, "git@github.com:meritt/application-name.js.git"
set :scm, :git
set :branch, "master"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Настройки работы с репозиторием: в данном случае используется GitHub.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set :deploy_via, :remote_cache&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Позволяет при последующих обновлениях не закачивать целиком репозиторий, а только обновлять его.&lt;/p&gt;
&lt;p&gt;Дополнительно, думаю, стоит описать этапы.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;task :start, :stop, :restart&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Запускает и останавливает приложение с помощью &lt;a target="_blank" href="https://github.com/indexzero/forever"&gt;forever&lt;/a&gt; — это NodeJS модуль, который следит чтобы node процесс был запущен, и перезапускает его если нужно.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;task :npm_install, :npm_update_symlink&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Устанавливает npm модули, необходимые для приложения, и обновляет их при необходимости.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;task :setup_for_nodejs&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Создает начальную файловую структуру для последующей доставки.&lt;/p&gt;
&lt;p&gt;Я не стал описывать настройку Apache/Nginx для того чтобы они проксировали работу приложения на 80 порт, думаю это и так понятно как делать. Единственное добавлю, что эти операции стоит добавить в этап &lt;code&gt;:setup_for_nodejs&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Вот и все, обычный процесс для вас будет выглядеть так:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;code&gt;capify .&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;создание своего конфига&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cap deploy:setup&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;А дальше многократное &lt;code&gt;cap deploy&lt;/code&gt; и может иногда &lt;code&gt;cap deploy:rollback&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Немного о возможностях&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;В этой статье я лишь описал как доставить файлы, установить npm модули и запускать сервер, однако идея развертывания на этом не заканчивается. Немного разобравшись, вы сможете:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;создавать базу, вносить в нее изменения, заполнять данными по умолчанию&lt;/li&gt;
&lt;li&gt;запускать фоновые процессы&lt;/li&gt;
&lt;li&gt;развертывать приложение на нескольких серверах сразу&lt;/li&gt;
&lt;li&gt;создавать объединенные и сжатые версии стилей и скриптов&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;и многое другое что вам придет в голову.&lt;/p&gt;
&lt;p&gt;Бесплатный совет: потратьте 10-40 минут, создайте своему приложению правила доставки и наслаждайтесь тем, что доставка вашего приложения происходит по нажатию на одну кнопку.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/12233683977</link><guid>http://blog.simonenko.su/post/12233683977</guid><pubDate>Wed, 02 Nov 2011 10:09:39 +0300</pubDate><category>nodejs</category><category>capistrano</category><category>deploy</category><category>php</category></item><item><title>Что интересного в PHP 5.4 beta 2 и как поставить на OS X Lion</title><description>&lt;p&gt;&lt;img alt="Что интересного в PHP 5.4 beta 1 и как поставить на OS X Lion" align="left" src="http://media.tumblr.com/tumblr_lta8lw5zOW1qzuuwu.png"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Обновление:&lt;/strong&gt; тем временем вышла &lt;a target="_blank" href="http://downloads.php.net/stas/php-5.4.0beta2.tar.bz2"&gt;beta 2&lt;/a&gt;, описание остается тем же.&lt;/p&gt;
&lt;p&gt;Вот и подошла следующая версия PHP к своему бета-тестированию. Для себя я отмечаю следующие улучшения и возможности:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.simonenko.su/post/4385990809/traits-in-next-php-version"&gt;Traits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.simonenko.su/post/7983413505/php-5-4-builtin-webserver"&gt;Встроенный веб-сервер&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.simonenko.su/post/928630716/new-features-in-the-upcoming-php-version"&gt;Array dereferencing support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.simonenko.su/post/928630716/new-features-in-the-upcoming-php-version"&gt;Scalar type hints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Убрали legacy настройки&lt;/li&gt;
&lt;/ul&gt;&lt;!-- more --&gt;&lt;p&gt;В целом хороший будет релиз, такой, более усовершенствованный 5.3, более быстрый. Особых проблем с совместимостью не должно быть. Уже сейчас можно тестировать свои проекты, так как скоро ожидается RC1.&lt;/p&gt;
&lt;p&gt;Полный &lt;a target="_blank" href="https://github.com/php/php-src/blob/24b075bf98c84c1245e2d1df77d4d471c565229b/NEWS"&gt;CHANGELOG&lt;/a&gt; для PHP 5.4 beta 1, а так же описание на что следует обратить внимание при тестировании кода, &lt;a target="_blank" href="https://github.com/php/php-src/blob/290461339be8e4b094f55e64cec0687556466038/UPGRADING"&gt;UPGRADING&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Теперь немного о том как установить beta-версию на OS X Lion.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Установка очень похожа на &lt;a href="http://blog.simonenko.su/post/7584677692/install-php-5-3-6-on-osx-lion"&gt;установку PHP 5.3.8 на OS X Lion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ставим Homebrew — это очень простое занятие, достаточно запустить в консоли&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/bin/ruby -e "$(curl -fsSL &lt;a href="https://raw.github.com/gist/323731"&gt;https://raw.github.com/gist/323731&lt;/a&gt;)"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;и после этого назначить права доступа&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chown -R $USER:staff /usr/local&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Для того чтобы обновлять пакеты нужно поставить git&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install git&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;После этого все обновления происходят через команду&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew update&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Теперь приступим к установки необходимых пакетов для нашего PHP, разумеется начнем с MySQL 5.5&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install mysql&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;после установки MySQL нужно будет выполнить инструкции которые подскажет Homebrew, затем ставим оставшиеся пакеты&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install libjpeg
brew install gmp
brew install mcrypt
brew install libmcrypt
brew install gettext
brew install icu4c
brew install libxml2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Остается дело за конфигурацией и установкой &lt;a target="_blank" href="http://downloads.php.net/stas/php-5.4.0beta1.tar.bz2"&gt;PHP 5.4 beta 1&lt;/a&gt;, скачиваем, распаковываем и начинаем конфигурацию&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;env EXTRA_LIBS="-lstdc++" ./configure --prefix=/usr/local/php
--with-apxs2=/usr/sbin/apxs
--with-layout=GNU
--enable-calendar
--enable-ftp
--enable-bcmath
--enable-mbstring
--enable-mbregex
--with-icu-dir=/usr/local/Cellar/icu4c/4.8.1
--enable-intl
--enable-cli
--enable-sockets
--enable-soap
--with-gettext=/usr/local/Cellar/gettext/0.18.1.1
--with-bz2
--with-zlib
--enable-zip
--with-gd
--with-jpeg-dir
--with-png-dir=/usr/X11
--with-xpm-dir
--with-freetype-dir=/usr/X11
--enable-exif
--with-gmp
--with-mcrypt
--with-mysql=mysqlnd
--with-pdo-mysql=mysqlnd
--with-mysql-sock=/tmp/mysql.sock
--with-curl
--with-openssl
--with-libxml-dir=/usr/local/Cellar/libxml2/2.7.8
--with-xsl=/usr
--with-xmlrpc
--enable-shmop
--enable-pcntl
--enable-sysvmsg
--enable-sysvsem
--enable-sysvshm&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;ну а далее как обычно&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;make
sudo make install&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Начинайте тестировать свои скрипты, и примеряться к новым возможностям, уверен они вам понравятся.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/11627029224</link><guid>http://blog.simonenko.su/post/11627029224</guid><pubDate>Wed, 19 Oct 2011 02:13:00 +0400</pubDate><category>php</category><category>nextphp</category><category>os x lion</category></item><item><title>За что я люблю CoffeeScript</title><description>&lt;p&gt;&lt;img alt="CoffeeScript" align="left" src="http://media.tumblr.com/tumblr_lpomdc1q6V1qzuuwu.png"/&gt; В последнее время я начал больше писать о JavaScript, о NodeJS, поэтому хочу немного написать о &lt;a target="_blank" href="http://jashkenas.github.com/coffee-script/"&gt;CoffeeScript&lt;/a&gt; — именно на нем я решаю большинство стоящих передо мной задач. Например &lt;a href="/post/8169320732/node-tumblr-my-first-nodejs-module"&gt;node-tumblr&lt;/a&gt;, мой первый NodeJS модуль, был написан именно на этом языке.&lt;/p&gt;
&lt;h2&gt;Пару слов о том что же это такое&lt;/h2&gt;
&lt;p&gt;CoffeeScript — это высокоуровневый язык программирования, который компилируется в JavaScript. Язык исправляет многие недостатки JavaScript. Добавляет стройности коду, убирает лишние скобки и точки-с-запятой, вправляет мозги как правильно писать нативный JS код.&lt;br/&gt;Однако не стоит забывать золотое правило языка: “&lt;strong&gt;это лишь JavaScript&lt;/strong&gt;”, поэтому не стройте иллюзий ;)&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Текущая версия &lt;a target="_blank" href="http://github.com/jashkenas/coffee-script/tarball/1.1.2"&gt;1.1.2&lt;/a&gt; и это стабильный, устоявшийся релиз. То есть можно смело использовать.&lt;/p&gt;
&lt;h2&gt;За что же я его люблю?&lt;/h2&gt;
&lt;p&gt;Сразу предупреждаю, некоторые примеры запрещены беременным женщинам и людям с нарушенной психикой.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt; Однострочные условия, как в Ruby:
&lt;pre&gt;&lt;code&gt;# CoffeeScript
options = {} unless options?

options.type = type if type?&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// JavaScript
var options;
if (typeof options === "undefined" || options === null) {
  options = {};
}

if (typeof type !== "undefined" &amp;&amp; type !== null) {
  options.type = type;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt; Работа с объектами:
&lt;pre&gt;&lt;code&gt;# CoffeeScript
options = {url}

options =
  url:  'link'
  text: 'description'
  show: false&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// JavaScript
var options = {
  url: url
};

var options = {
  url: 'link',
  text: 'description',
  show: false
};&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt; Работа с функциями (замыкания, однострочные функции, параметры по-умолчанию, возвращаемые значение):
&lt;pre&gt;&lt;code&gt;# CoffeeScript
do -&gt;
  parse = (body) -&gt; JSON.parse body

  request = (url, fn = -&gt;) -&gt;
    xhr {url}, (error, request, body) -&gt; fn.call @, parse body&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// JavaScript
(function() {
  var parse, request;

  parse = function(body) {
    return JSON.parse(body);
  };

  request = function(url, fn) {
    if (fn == null) {
      fn = function() {};
    }

    return xhr({
      url: url
    }, function(error, request, body) {
      return fn.call(this, parse(body));
    });
  };
})();&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt; Работа с this (сохранение текущего контекста):
&lt;pre&gt;&lt;code&gt;# CoffeeScript
do (tumblr) -&gt;
  @debug = (text) -&gt; console.log text

  @periodical = (message) -&gt;
    setTimeout (=&gt; @debug message), 1000&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// JavaScript
var __bind = function(fn, me) { return function() { return fn.apply(me, arguments); }; };

(function(tumblr) {
  this.debug = function(text) {
    return console.log(text);
  };

  this.periodical = function(message) {
    return setTimeout(__bind(function() {
      return this.debug(message);
    }, this), 1000);
  };
})(tumblr);&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt; И напоследок, совсем страшное:
&lt;pre&gt;&lt;code&gt;# CoffeeScript
do (tumblr) -&gt;
  @posts = (options, fn) -&gt;
    [fn, options] = [options, null] if typeof options is 'function'

    request options, fn

  alias = (self, type) -&gt;
    self[type] = (options, fn) -&gt; @posts options, fn

  alias tumblr, type for type in ['text', 'quote', 'link', 'answer', 'video', 'audio', 'photo']&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;// JavaScript
(function(tumblr) {
  var alias, type, _i, _len, _ref, _results;

  this.posts = function(options, fn) {
    var _ref;

    if (typeof options === 'function') {
      _ref    = [options, null],
      fn      = _ref[0],
      options = _ref[1];
    }

    return request(options, fn);
  };

  alias = function(self, type) {
    return self[type] = function(options, fn) {
      return this.posts(options, fn);
    };
  };

  _ref = ['text', 'quote', 'link', 'answer', 'video', 'audio', 'photo'];

  _results = [];
  for (_i = 0, _len = _ref.length; _i &lt; _len; _i++) {
    type = _ref[_i];

    _results.push(alias(tumblr, type));
  }

  return _results;
})(tumblr);&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Как видите язык почерпнул много хорошего из Ruby, Python, Haskell и других похожих языков.&lt;/p&gt;
&lt;p&gt;Я лишь привел в качестве примеров то, что сам уже использую и могу показать, однако это небольшая часть синтаксических конструкций с которыми можно работать в CoffeeScript. Много дополнительной информации вы &lt;a target="_blank" href="http://jashkenas.github.com/coffee-script/#literals"&gt;сможете найти в документации&lt;/a&gt;, там хорошие и понятные примеры.&lt;/p&gt;
&lt;p&gt;Так же вы можете познакомится с &lt;a target="_blank" href="http://github.com/meritt/node-tumblr/blob/master/src/tumblr.coffee"&gt;исходным кодом node-tumblr, написанном на CoffeeScript&lt;/a&gt; и посмотреть результат &lt;a target="_blank" href="http://github.com/meritt/node-tumblr/blob/master/lib/tumblr.js"&gt;компиляции его в JavaScript код&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;В ближайшее время я расскажу о небольшой хитрости, она поможет начинающим разработчикам на CoffeeScript.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Лирика&lt;/h2&gt;
&lt;p&gt;Я на полном серьезе думаю о том, чтобы комитету отвечающему за ECMAScript стоит рассмотреть CoffeeScript как эволюцию JavaScript, и в последствии реализовать этот язык на уровне браузеров.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/8725324958</link><guid>http://blog.simonenko.su/post/8725324958</guid><pubDate>Wed, 10 Aug 2011 10:30:00 +0400</pubDate><category>javascript</category><category>nodejs</category><category>coffeescript</category></item><item><title>Как навести порядок в зоопарке микро-фреймворков?</title><description>&lt;p&gt;Я написал уже несколько обзоров о том, какие микро-фреймворки бывают, и собираюсь делать это и дальше. Однако в какой-то момент управлять этим зоопарком становится сложно. На помощь приходит библиотека &lt;a href="http://ender.no.de" target="_blank"&gt;Ender&lt;/a&gt;. Хотя постойте, это вовсе не библиотека, по крайней мере в том смысле, к которому вы привыкли. Это скорее инструмент для создания собственного фреймворка из других библиотек.&lt;/p&gt;
&lt;p&gt;Авторы, Dustin Diaz (ded) и Jacob Thornton (fat) гордо именуют свое творчество как &lt;strong&gt;“The no-library library”&lt;/strong&gt;, и что-то в этом названии есть.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Чтобы начать работать с Ender, его нужно установить через &lt;a href="http://npmjs.org" target="_blank"&gt;npm&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install ender -g&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Теперь у нас появляется возможность работать с Ender через командную строку, вкратце его API:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;add&lt;/li&gt;
&lt;li&gt;remove&lt;/li&gt;
&lt;li&gt;build&lt;/li&gt;
&lt;li&gt;compile&lt;/li&gt;
&lt;li&gt;refresh&lt;/li&gt;
&lt;li&gt;search&lt;/li&gt;
&lt;li&gt;info&lt;/li&gt;
&lt;li&gt;help&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Подробное описание каждого метода &lt;a href="http://ender.no.de/#docs" target="_blank"&gt;можно почитать на сайте&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Например, чтобы сделать свою собственную сборку из &lt;a href="/post/8121263723/javascript-micro-frameworks-part-2"&gt;Undescore.js&lt;/a&gt;, &lt;a href="/post/8121263723/javascript-micro-frameworks-part-2"&gt;Qwery&lt;/a&gt; и &lt;a href="/post/7800191207/javascript-micro-frameworks-part-1"&gt;Reqwest&lt;/a&gt; нужно будет выполнить &lt;code&gt;build&lt;/code&gt; команду:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ender build underscore,qwery,reqwest&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Мы получаем собранную версию &lt;code&gt;ender.js&lt;/code&gt;, сжатую версию &lt;code&gt;ender.min.js&lt;/code&gt; и директорию &lt;code&gt;node_modules&lt;/code&gt; (если она еще не создана) со всеми нужными npm модулями.&lt;/p&gt;
&lt;p&gt;Самое приятное, что теперь можно не думать в какой последовательности подключать микро-фреймворки, не думать о зависимостях, можно забыть об обновлениях каждой библиотеки, легко добавлять и удалять отдельные микро-фреймворки.&lt;/p&gt;
&lt;h2&gt;Это все хорошо, но что мы получаем на клиентской стороне?&lt;/h2&gt;
&lt;p&gt;Если бы мы просто объединили все микро-фреймворки в один файл, Ender бы ничем не отличался от других компановщиков. Однако, Ender, и здесь пошел дальше — он пытается все методы микро-фреймворков завернуть через себя и использовать напрямую у элементов. То есть, по сути, синтаксис jQuery:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Описываем дополнительный метод
$.ender({
  rand: function() {
    return this[Math.floor(Math.random() * this.length)];
  }
}, true);

// Применяем его
$('p').rand();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Определенно вам понравится работать с Ender, он небольшой по размеру и несет в себе хороший функционал для упрощения работы с микро-фреймворками.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/8505677113</link><guid>http://blog.simonenko.su/post/8505677113</guid><pubDate>Fri, 05 Aug 2011 10:30:00 +0400</pubDate><category>javascript</category><category>microjs</category></item><item><title>JavaScript микро-фреймворки. Часть 3.</title><description>&lt;p&gt;&lt;img align="left" alt="JavaScript микро-фреймворки. Часть 3." src="http://media.tumblr.com/tumblr_loymhur8Vj1qzuuwu.jpg"/&gt; Сегодня у нас в выпуске очень интересные микро-фреймворки. Каждый из них позволяет использовать возможности HTML5 не думая об обратной совместимости со старыми браузерами.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Небольшое отвлечение: вы наверное думаете, как же с таким большим количеством микро-фреймворков справится, следить за всем, подключать кучу файлов, у каждого к тому же свое API — для этого есть отличное решение, о нем я напишу завтра ;)&lt;/em&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;a href="http://github.com/ryanseddon/H5F" target="_blank"&gt;&lt;strong&gt;H5F&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Автор, Ryan Seddon, описывает свое творение:&lt;/p&gt;
&lt;blockquote&gt;H5F добавляет поддержку HTML5 форм для браузеров без таких возможностей. Это новые поля, новые атрибуты, часть нового API для работы с формами.&lt;/blockquote&gt;
&lt;p&gt;Вам нравятся новые возможности форм, добавленные в HTML5? Если вы хотите активно их использовать, то этот микро-фреймворк обеспечит вам обратную совместимость со старыми браузерами. Вам больше не придется отдельно описывать на JavaScript’е логику обязательных полей, валидацию, авто-фокусировки и так далее. Крайне полезная вещь.&lt;/p&gt;
&lt;p&gt;Используя новые возможности, код форм может выглядеть следующим образом:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;form id="signup"&gt;
  &lt;label&gt;Электронный адрес *&lt;/label&gt;
  &lt;input type="email" name="email" placeholder="mail@serenity.su" required&gt;

  &lt;label&gt;Телефон&lt;/label&gt;
  &lt;input type="tel" name="phone" pattern="\d{10}"&gt;

  &lt;label&gt;Индекс *&lt;/label&gt;
  &lt;input type="number" name="postcode" min="1001" max="8000" required&gt;

  &lt;input type="submit"&gt;
&lt;/form&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://github.com/marcuswestin/store.js" target="_blank"&gt;&lt;strong&gt;store.js&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Автор Marcus Westin&lt;/p&gt;
&lt;blockquote&gt;localStorage для всех браузеров (в том числе старых) без использования cookie или flash.&lt;/blockquote&gt;
&lt;p&gt;О плюсах &lt;a href="/post/734573260/use-localstorage-instead-of-cookie"&gt;работы с localStorage я уже рассказывал&lt;/a&gt;. В данном случае лишь скажу что этот микро-фреймворк исправляет совместимость с браузерами в которых нет localStorage. И работает надо сказать очень хорошо.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://buzz.jaysalvat.com" target="_blank"&gt;&lt;strong&gt;Buzz&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Автор Jay Salvat&lt;/p&gt;
&lt;blockquote&gt;Мощный микро-фреймворк для работы с HTML5 Audio. Так же добавляет обратную совместимость в старых браузерах.&lt;/blockquote&gt;
&lt;p&gt;Первое что приходит на ум, а причем здесь Google Buzz — немного разобравшись понимаешь что абсолютно не причем ;) Отличная работа Джея, теперь можно не думать о Flash-проигрывателях и смело использовать новые возможности HTML 5 Audio. Так же мы получаем богатое API для управления проигрывателем.&lt;/p&gt;
&lt;p&gt;Пример работы с Audio API:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var audio = new buzz.sound( "/files/myfile", {
  formats: ["ogg", "mp3", "acc"]
});

audio.play()
     .fadeIn()
     .loop()
     .bind("timeupdate", function() {
       var timer = buzz.toTimer(this.getTime());
       document.getElementById("timer").innerHTML = timer;
     });
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;u&gt;JavaScript микро-фреймворки&lt;/u&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="/post/7800191207/javascript-micro-frameworks-part-1"&gt;1 часть (Zepto.js, emile.js, Reqwest)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/post/8121263723/javascript-micro-frameworks-part-2"&gt;2 часть (Underscore.js, Qwery, mustache)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>http://blog.simonenko.su/post/8464611613</link><guid>http://blog.simonenko.su/post/8464611613</guid><pubDate>Thu, 04 Aug 2011 11:30:00 +0400</pubDate><category>javascript</category><category>microjs</category></item><item><title>Как запретить "резиновую прокрутку" в Safari 5.1</title><description>&lt;p&gt;Safari 5.1 — это версия по-умолчанию в OS X Lion. Вместе с ней мы получили “резиновую прокрутку”, как на устройствах iOS. Однако на некоторых веб-сервисах, где нужно использовать прокрутку одного из элементов дизайна, то есть не всего сайта, такая прокрутка очень мешает. Это сервисы как &lt;a href="http://google.com/reader"&gt;Google Reader&lt;/a&gt;, &lt;a href="http://twitter.com"&gt;Twitter&lt;/a&gt;, наша внутренняя система и другие.&lt;/p&gt;
&lt;p&gt;Исправить этот недочет можно следующим образом:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;html, body {
  height: 100%;
  overflow: hidden;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Конечно, такой метод убьет любую прокрутку на сайте, поэтому нужно не забывать добавить “&lt;code&gt;overflow: auto"&lt;/code&gt; для необходимых элементов.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/8339471828</link><guid>http://blog.simonenko.su/post/8339471828</guid><pubDate>Mon, 01 Aug 2011 17:38:18 +0400</pubDate><category>css</category><category>html</category><category>os x lion</category><category>safari</category></item><item><title>Tumblr — мой первый NodeJS модуль</title><description>&lt;p&gt;Давно уже полюбил NodeJS, нравится он мне своей быстротой, синтаксисом и возможностью не делить скрипты на серверной и клиентской части. Но этот пост немного не об этом ;)&lt;/p&gt;
&lt;p&gt;Решил написать свой первый публичный модуль для реализации новой версии API блого-хостинговой платформы Tumblr. Изначально все было написано на CoffeeScript, но есть build-скрипт для создания JavaScript версии. Мне очень хотелось бы услышать критику сообщества, буду хоть понимать на каком я уровне все это делаю :)&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;a target="_blank" href="http://github.com/meritt/node-tumblr"&gt;Исходники находятся на GitHub&lt;/a&gt;, там есть &lt;a target="_blank" href="http://github.com/meritt/node-tumblr/blob/master/src/tumblr.coffee"&gt;версия на CoffeeScript&lt;/a&gt; и &lt;a target="_blank" href="http://github.com/meritt/node-tumblr/blob/master/lib/tumblr.js"&gt;версия на JavaScript&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Как использовать?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Все достаточно просто, сразу покажу примеры:&lt;/p&gt;
&lt;p class="gist"&gt;&lt;a title="tumblr.coffee" target="_blank" href="http://gist.github.com/1111422"&gt;Пример кода на CoffeeScript.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;И для тех кто не любит CoffeeScript пример на JavaScript:&lt;/p&gt;
&lt;p class="gist"&gt;&lt;a title="tumblr.js" target="_blank" href="http://gist.github.com/1111422"&gt;Пример кода на JavaScript.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;На данный момент работает только часть API, доступная для чтения, то есть OAuth авторизацию я еще не прикрутил, но это добавлю в ближайшем будущем. Сейчас можно получить информацию о блоге и список всех постов. Список постов можно получать по каждому типу, и при этом есть еще куча настроек для фильтрации поиска, они все описаны &lt;a target="_blank" href="http://www.tumblr.com/docs/en/api/v2"&gt;в документации Tumblr API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Чтобы начать работу вам понадобится названия блога, например blog.tumblr.com (свои доменные имена тоже работают), и OAuth Consumer Key.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Как получить OAuth Consumer Key?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Для этого вам нужно &lt;a target="_blank" href="http://www.tumblr.com/oauth/apps"&gt;зарегистрировать свое приложение здесь&lt;/a&gt;. После этого на странице своих приложений вы найдете OAuth Consumer Key.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lp1lxqWcJA1qzuuwu.png"/&gt;&lt;/p&gt;
&lt;p&gt;Все что остается — это поставить node-tumblr к себе, можно через NPM:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install node-tumblr
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;или &lt;a target="_blank" href="http://github.com/meritt/node-tumblr"&gt;из исходников&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Очень надеюсь на вашу критику, так как NodeJS мне очень нравится. И я хочу расти как специалист в этой области, а конструктивная критика, ваша оценка и мнения очень помогают ;) Спасибо.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/8169320732</link><guid>http://blog.simonenko.su/post/8169320732</guid><pubDate>Thu, 28 Jul 2011 16:30:00 +0400</pubDate><category>javascript</category><category>nodejs</category><category>tumblr</category><category>coffeescript</category></item><item><title>JavaScript микро-фреймворки. Часть 2.</title><description>&lt;p&gt;&lt;img align="left" alt="JavaScript микро-фреймворки. Часть 2." src="http://media.tumblr.com/tumblr_loymhur8Vj1qzuuwu.jpg"/&gt; Продолжаем наш обзор JavaScript микро-фреймворков. Надеюсь они уже начали приносить вам радость. Возможно уже скоро вы и сами захотите написать что-то свое? :)&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;a href="http://documentcloud.github.com/underscore/" target="_blank"&gt;&lt;strong&gt;Underscore.js&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Автором является компания DocumentCloud&lt;/p&gt;
&lt;blockquote&gt;Underscore это вся мощь Prototype.js (или Ruby) при работе с массивами и объектами, но без расширения встроенных в JavaScript объектов.&lt;/blockquote&gt;
&lt;p&gt;Крайне полезный микро-фреймворк, добавляет около 60 функций для работы с массивами, хешами, объектами и функциями. Такие функции как forEach, map, reduce, filter, every, some и indexOf сильно упрощают жизнь JS-разработчику.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dustindiaz.com/qwery" target="_blank"&gt;&lt;strong&gt;Qwery&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dustin Diaz (ded), пишет:&lt;/p&gt;
&lt;blockquote&gt;Qwery это небольшой, но невероятно быстрый движок поиска элементов, работает с правилами CSS1, CSS2, CSS3&lt;/blockquote&gt;
&lt;p&gt;Искать DOM элементы приходится постоянно, и поисковые движки появились уже давно. Данный движок отличает размер, всего лишь 1Кб, и при этом он позволяет использовать все современные правила поиска.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mustache.github.com" target="_blank"&gt;&lt;strong&gt;{{ mustache }}&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Честно говоря, затрудняюсь сказать кто был первым автором, но скорее всего это Chris Wanstrath (defunkt)&lt;/p&gt;
&lt;blockquote&gt;Logic-less templates&lt;/blockquote&gt;
&lt;p&gt;В этот раз я не стал переводить описание, очень сложно передать на русском суть этой фразы ;)&lt;/p&gt;
&lt;p&gt;mustache это замечательный шаблонный движок, лишенный всякой ерунды. Когда ваш JS-проект вырастает во что-то более серьезное mustache очень спасает, позволяет разделить логику и вывод. И это при том что сам фреймворк занимает всего лишь 1,5Кб.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;JavaScript микро-фреймворки&lt;/u&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="/post/7800191207/javascript-micro-frameworks-part-1"&gt;1 часть (Zepto.js, emile.js, Reqwest)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>http://blog.simonenko.su/post/8121263723</link><guid>http://blog.simonenko.su/post/8121263723</guid><pubDate>Wed, 27 Jul 2011 11:11:00 +0400</pubDate><category>javascript</category><category>microjs</category></item><item><title>Встроенный веб-сервер в PHP 5.4</title><description>&lt;p&gt;Давно не писал что нового появилось в PHP 5.4, было совсем не до этого. А тем временем добавили очень интересную вещь — встроенный веб-сервер. Само предложение как обычно &lt;a target="_blank" href="https://wiki.php.net/rfc/builtinwebserver"&gt;появилось в Wiki&lt;/a&gt; и обсуждалось там совсем немного.&lt;/p&gt;
&lt;p&gt;Зачем оно вообще нужно?&lt;/p&gt;
&lt;p&gt;А очень просто, мы наконец-то можем забить на установку всяких Apache/Lighttpd и прочих на машину разработчика, так как все что нужно будет здесь. Очень удобно получить проект, ввести что-то типа:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;php -S localhost:8000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;и все, можно работать, разрабатывать/тестировать.&lt;/p&gt;
&lt;p&gt;На официальном сайте уже &lt;a target="_blank" href="http://php.net/manual/en/features.commandline.webserver.php"&gt;доступна документация&lt;/a&gt;, пока только на английском языке.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/7983413505</link><guid>http://blog.simonenko.su/post/7983413505</guid><pubDate>Sun, 24 Jul 2011 01:26:10 +0400</pubDate><category>php</category><category>builtinwebserver</category></item><item><title>JavaScript микро-фреймворки. Часть 1.</title><description>&lt;p&gt;&lt;img align="left" alt="JavaScript микро-фреймворки. Часть 1." src="http://media.tumblr.com/tumblr_lokxj0gfLE1qzuuwu.png"/&gt;&lt;strong&gt;Небольшое вступление.&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;Уже очень продолжительное время наблюдаю совершенно дурацкое явление — использование огромных JS фреймворков в проектах, где они не нужны. Например, когда используют небольшую анимацию на сайте и при этом используют или JQuery, или YUI, или Dojo, или что-то похожее, да еще и добавляют несколько плагинов, которые добавляют особенный эффект анимации. Для меня это чересчур. 90% возможностей фреймворка просто не используется.&lt;/p&gt;
&lt;p&gt;Поэтому решил периодически делать краткий обзор о микро-фрейморках — фрейморки, которые направлены на решения узкой задачи. В большинстве случаев это крайне удобно.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Итак, приступим.&lt;/strong&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;a href="http://zeptojs.com" target="_blank"&gt;&lt;strong&gt;Zepto.js&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Вот что пишет сам автор проекта Thomas Fuchs:&lt;/p&gt;
&lt;blockquote&gt;Zepto.js это микро-фреймворк для мобильных браузеров основанных на движке WebKit, синтаксис совместим с jQuery.&lt;/blockquote&gt;
&lt;p&gt;Данный фреймворк удобно использовать на сайтах предназначенных для мобильных устройств. Собираются добавить поддержку мобильной версии Firefox, тем самым этот фреймворк будет покрывать 90-95% мобильных браузеров.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://github.com/madrobby/emile" target="_blank"&gt;&lt;strong&gt;emile.js&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Опять же автор проекта Thomas Fuchs:&lt;/p&gt;
&lt;blockquote&gt;emile.js это анимационный микро-фреймворк без херни, названный так по имени аниматора Émile Cohl&lt;/blockquote&gt;
&lt;p&gt;Кстати, я уже как-то писал об этой замечательной &lt;a href="/post/934145800/getting-started-with-emile"&gt;библиотеки для создания анимации с помощью изменения CSS&lt;/a&gt;. Данный микро-фреймворк будет полезен на сайтах, где нужна анимация. Использование очень простое. Единственным минусом на данный момент является то, что библиотека не использует анимацию доступную в современных браузерах через CSS3 Transitions, Transforms и Animation.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://github.com/ded/reqwest" target="_blank"&gt;&lt;strong&gt;Reqwest&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Автор проекта Dustin Diaz, вот что он говорит:&lt;/p&gt;
&lt;blockquote&gt;Reqwest это легкий микро-фреймворк для работы с асинхронными запросами&lt;/blockquote&gt;
&lt;p&gt;Если нужно работать с AJAX запросами на сайте, то этот микро-фреймворк подойдет как нельзя лучше. Он занимает менее 4Кб, но при этом решает все проблемы со старыми браузерами и добавляет удобное в использовании API.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/7800191207</link><guid>http://blog.simonenko.su/post/7800191207</guid><pubDate>Tue, 19 Jul 2011 16:08:00 +0400</pubDate><category>javascript</category><category>microjs</category></item><item><title>Установка PHP 5.3.6 на OS X Lion</title><description>&lt;p&gt;После установки OS X Lion (10.7) столкнулся с неприятной проблемой, &lt;a href="http://blog.simonenko.su/post/4220319832/install-php-5-3-6-on-snow-leopard"&gt;установка связки PHP+MySQL как я делал это раньше&lt;/a&gt; не работает. И как оказалось, проблема в MySQL, исходники которого еще не готовы к новой ОС от Apple.&lt;/p&gt;
&lt;p&gt;После некоторых размышлений и прочтений похожих проблем в интернете, я нашел для себя следующее решение.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Ставим Homebrew — это очень простое занятие, достаточно запустить в консоли&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ruby -e "$(curl -fsSLk &lt;a href="https://gist.github.com/raw/323731/install_homebrew.rb"&gt;https://gist.github.com/raw/323731/install_homebrew.rb&lt;/a&gt;)"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;и после этого назначить права доступа&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chown -R $USER:staff /usr/local&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Для того чтобы обновлять пакеты нужно поставить git&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install git&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;После этого все обновления происходят через команду&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew update&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Теперь же начинается все самое интересное, потому что ставить MySQL мы не будем из исходников, мы возьмем бинарную версию &lt;a target="_blank" href="http://dev.mysql.com/downloads/mysql/5.5.html"&gt;Mac OS X 10.6 (x86, 64-bit), DMG&lt;/a&gt; установим ее и немного настроим:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
ln -s /usr/local/mysql/bin/mysqld_safe /usr/local/bin/mysqld_safe
ln -s /usr/local/mysql/bin/mysqld /usr/local/bin/mysqld
ln -s /usr/local/mysql/bin/mysqldump /usr/local/bin/mysqldump

ln -s /usr/local/mysql/scripts/mysql_install_db /usr/local/bin/mysql_install_db
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Лучше всего сделать симлинки для всех бинарников MySQL, но разумеется это не обязательно. Что ж, запускаем&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mysql_install_db
sudo mysqld_safe
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Теперь можно продолжить установку по старой схеме, ставим оставшиеся пакеты&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install libjpeg
brew install gmp
brew install mcrypt
brew install libmcrypt
brew install gettext
brew install icu4c
brew install libxml2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Остается дело за конфигурацией и установкой PHP, берем последнюю версию с сайта, на момент написания статьи была версия &lt;a target="_blank" href="http://php.net/downloads.php#v5"&gt;5.3.6&lt;/a&gt;, распаковываем и начинаем конфигурацию&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;env EXTRA_LIBS="-lstdc++" ./configure --prefix=/usr/local/php
--with-apxs2=/usr/sbin/apxs
--with-layout=GNU
--enable-calendar
--enable-ftp
--enable-bcmath
--enable-mbstring
--enable-mbregex
--with-icu-dir=/usr/local/Cellar/icu4c/4.4.1
--enable-intl
--enable-cli
--enable-sockets
--enable-soap
--with-gettext=/usr/local/Cellar/gettext/0.18.1.1
--with-bz2
--with-zlib
--enable-zip
--with-gd
--with-jpeg-dir
--with-png-dir=/usr/X11
--with-xpm-dir
--with-freetype-dir=/usr/X11
--enable-exif
--with-gmp
--with-mcrypt
--with-mysql=mysqlnd
--with-pdo-mysql=mysqlnd
--with-mysql-sock=/tmp/mysql.sock
--with-curl
--with-openssl
--with-libxml-dir=/usr/local/Cellar/libxml2/2.7.8
--with-xsl=/usr
--with-xmlrpc
--enable-sqlite-utf8
--enable-shmop
--enable-pcntl
--enable-sysvmsg
--enable-sysvsem
--enable-sysvshm&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;ну а далее как обычно&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;make
sudo make install&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;А теперь начинаем наслаждаться свеже-установленной системой ;)&lt;/p&gt;</description><link>http://blog.simonenko.su/post/7584677692</link><guid>http://blog.simonenko.su/post/7584677692</guid><pubDate>Thu, 14 Jul 2011 00:31:00 +0400</pubDate><category>php</category><category>mac os x</category><category>homebrew</category><category>os x lion</category></item><item><title>ZF Conf 2011 в Санкт-Петербурге</title><description>&lt;p&gt;&lt;img class="inline" alt="ZF Conf 2011 в Санкт-Петербурге" src="http://media.tumblr.com/tumblr_lkpwa8m9eS1qzuuwu.jpg" align="left"/&gt; Основные подготовительные работы по конференции закончены. Доклады сформированы. Среди спикеров представители KnpLabs, Magento, JetBrains, Sphinx и других известных компаний.&lt;/p&gt;
&lt;p&gt;Открыта &lt;a target="_blank" href="http://www.zfconf.ru/registration/"&gt;&lt;strong&gt;финальная регистрация&lt;/strong&gt;&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Если Вы проходили предварительную регистрацию&lt;/strong&gt;, то для прохождения финальной регистрации Вам нужно перейти по специальной ссылке, отправленной на e-mail. Введенную ранее информацию нужно будет только подтвердить. Если ссылка не приходила Вам, ее можно запросить через &lt;a target="_blank" href="http://www.zfconf.ru/get-registration-path/"&gt;специальную форму&lt;/a&gt;.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;strong&gt;Cписок докладов:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a target="_blank" href="http://www.zfconf.ru/2011/topics/flexible-architecture-using-dependency-injection/"&gt;Гибкая архитектура Zend Framework приложений с использованием Dependency Injection.&lt;/a&gt;&lt;br/&gt;Алексей Качаев (Сogniance, Senior PHP Developer)&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://www.zfconf.ru/2011/topics/performance-increasing-with-phpdaemon-varnish-esi/"&gt;Воюем за ресурсы: Повышение производительности Zend Framework приложения с помощью phpDaemon, Varnish и ESI.&lt;/a&gt;&lt;br/&gt;Алексей Качаев (Сogniance, Senior PHP Developer)&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://www.zfconf.ru/2011/topics/behavior-driven-development/"&gt;Behavior Driven Development в PHP и Zend Framework.&lt;/a&gt;&lt;br/&gt;Константин Кудряшов (KnpLabs, Senior Web Developer)&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://www.zfconf.ru/2011/topics/multitasking-distributed-system-with-job-queue/"&gt;Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue.&lt;/a&gt;&lt;br/&gt;Александр Готгельф (Magento, PHP-разработчик)&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://www.zfconf.ru/2011/topics/how-can-help-development-environment/"&gt;Как может помочь среда разработки при написании приложения на Zend Framework?&lt;/a&gt;&lt;br/&gt;Николай Матвеев (JetBrains, разработчик)&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://www.zfconf.ru/2011/topics/creating-rest-api-for-third-party-developers-and-mobile-devices-with-oauth/"&gt;Создание REST-API для сторонних разработчиков и мобильных устройств с авторизацией по протоколу OAuth 1.0.&lt;/a&gt;&lt;br/&gt;Дмитрий Чижевский (Дзен-мани, разработчик)&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://www.zfconf.ru/2011/topics/fat-model-through-orm-development-history/"&gt;Толстая модель: История разработки собственного ORM.&lt;/a&gt;&lt;br/&gt;Михаил Шамин (Геометрия, ведущий разработчик)&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://www.zfconf.ru/2011/topics/what-is-sphinx-and-how-use-it-with-php/"&gt;Что такое Sphinx, зачем он вообще нужен и как его использовать с PHP (от простого индекса до поискового кластера).&lt;/a&gt;&lt;br/&gt;Владимир Федорков (Sphinx, Director of Professional Services)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Коротко о конференции:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Место проведения: Санкт-Петербург, ЛГТЦ (Московский пр., 143, ст. м. «Электросила»)&lt;/li&gt;
&lt;li&gt;Время: 15 мая 2011 г.&lt;/li&gt;
&lt;li&gt;Длительность: 1 полный день&lt;/li&gt;
&lt;li&gt;Формат: доклады (в один поток) и обсуждения на флипчартах (в перерывах)&lt;/li&gt;
&lt;li&gt;Стоимость участия: 1500 рублей (кофе-брейки, пакет материалов участника и доступ к профессиональным видеозаписям докладов), количество мест ограничено&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Как и в прошлый раз, собираюсь там быть. Будет интересно послушать что нового придумали за этот год.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/5215327336</link><guid>http://blog.simonenko.su/post/5215327336</guid><pubDate>Thu, 05 May 2011 14:27:00 +0400</pubDate><category>zf</category><category>zf conf</category></item><item><title>Google Maps + Geolocation + Маршруты</title><description>&lt;p&gt;Недавно мы добавили в раздел “&lt;a target="_blank" href="http://serenity.su/contacts/"&gt;Контакты&lt;/a&gt;” к нашей карте возможность прокладывать маршрут от того места, где сейчас находится пользователь, к нам в офис. Я бы хотел немного подробнее рассказать как это делается.&lt;/p&gt;
&lt;p&gt;Думаю с картами Google Maps уже все знакомы, и как их подключать объяснять не буду. Для инициализации всего этого дела нам понадобится пару объектов:&lt;/p&gt;
&lt;p class="gist"&gt;&lt;a title="init.js" href="http://gist.github.com/925111"&gt;Пример кода.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Следующим шагом будет определение работает ли Geolocation API в браузере, и если работает, получаем позиции текущего местоположения:&lt;/p&gt;
&lt;p class="gist"&gt;&lt;a title="geolocation.js" href="http://gist.github.com/925111"&gt;Пример кода.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Теперь остается заключительная часть — получение маршрута и нанесение маркеров по всему пути на карту, все это описываем в функции showRouteService:&lt;/p&gt;
&lt;p class="gist"&gt;&lt;a title="route.js" href="http://gist.github.com/925111"&gt;Пример кода.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Работающий пример можно &lt;a target="_blank" href="http://serenity.su/contacts/"&gt;посмотреть здесь&lt;/a&gt;.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/4715734992</link><guid>http://blog.simonenko.su/post/4715734992</guid><pubDate>Mon, 18 Apr 2011 14:51:13 +0400</pubDate><category>javascript</category><category>webdev</category><category>google</category></item></channel></rss>

