<?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>Как сделать онлайн Twitter трансляцию у себя на мероприятии</title><description>&lt;p&gt;&lt;img align="left" alt="Как сделать онлайн Twitter трансляцию у себя на мероприятии" height="92" src="http://media.tumblr.com/tumblr_m27p3azh4y1qzuuwu.png" width="150"/&gt; Совсем недавно отгремела в Санкт-Петербурге &lt;a href="http://digitalconf.ru" target="_blank"&gt;конференция по инновационному маркетингу и брендингу — Digitale&lt;/a&gt;. Одним из интерактивных элементов конференции была онлайн трансляция twitter-сообщений по хеш-тегу. Сделать это на конференции выпало мне, и по началу я долго искал подходящий вариант в интернете. Такие сервисы как twihoo, twistori не хотят работать с конференциями и брендировать каналы. Именно поэтому мне пришлось написать такой скрипт самому.&lt;/p&gt;
&lt;p&gt;&lt;!-- more --&gt;&lt;/p&gt;
&lt;p&gt;Задача была проста, как только сообщение с хеш-тегом &lt;code&gt;#dconf&lt;/code&gt; попадает в Twitter оно сразу же должно быть отображено на экране. Для этого я вооружился &lt;a href="http://nodejs.org" rel="nofollow" target="_blank"&gt;Node.js&lt;/a&gt;, &lt;a href="http://dev.twitter.com/docs/streaming-api" rel="nofollow" target="_blank"&gt;Twitter Streaming API&lt;/a&gt; и &lt;a href="http://developer.mozilla.org/en/WebSockets" rel="nofollow" target="_blank"&gt;Websockets&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Самое удобное в Node.js это возможность получать данные в потоке, а так как Twitter Streaming API отдает данные именно таким способом, то это идеальный вариант. Таким образом Node.js получает сообщения от Twitter.&lt;/p&gt;
&lt;p class="gist"&gt;&lt;a href="http://gist.github.com/2342953" title="twitter.coffee"&gt;Получение потока из Twitter Streaming API&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Для отправки сообщений клиенту будем использовать Websockets, этот способ так же обеспечит максимально быстрое попадание сообщения с сервера на экран. Так как стандарт Websockets до сих пор находится в активной стадии разработки, и периодически меняется его реализация, то будем использовать &lt;a href="http://socket.io" rel="nofollow" target="_blank"&gt;socket.io&lt;/a&gt; для работы с веб-сокетами. Таким способом мы будем принимать сообщения на клиенте.&lt;/p&gt;
&lt;p class="gist"&gt;&lt;a href="http://gist.github.com/2342953" title="clients.js"&gt;Получение сообщений с сервера через websockets&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Исходники полной версии можно &lt;a href="http://github.com/meritt/twitter-conference"&gt;посмотреть на GitHub&lt;/a&gt;. Чтобы запустить сервер вам понадобится CoffeeScript и следующая комманда.&lt;/p&gt;
&lt;pre&gt;coffee twitter.coffee --name &amp;lt;имя пользователя в twitter&amp;gt; --password &amp;lt;пароль пользователя в twitter&amp;gt; --hash &amp;lt;хеш-теги по которым вы хотите вести трансляцию&amp;gt;&lt;/pre&gt;
&lt;p&gt;Так же в репозитории есть файл &lt;code&gt;example.html&lt;/code&gt; с примером реализации на клиентской части.&lt;/p&gt;
&lt;p&gt;Twitter трансляция на любых мероприятиях это очень круто, это не дает участникам скучать. Кстати, именно за счет трансляции хеш-тег &lt;code&gt;#dconf&lt;/code&gt; удалось вывести в тренды по всей России, что еще больше привлекло внимание.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Вывод в тренды хеш-тега #dconf во время конференции" height="265" src="http://media.tumblr.com/tumblr_m27peyLmKt1qzuuwu.png" width="317"/&gt;&lt;/p&gt;
&lt;p&gt;И на последок. Вы можете посмотреть &lt;a href="http://digitalconf.ru/twitter.html" target="_blank"&gt;работающий пример на сайте Digitale Conference&lt;/a&gt;. Делал я этот скрипт только для последних версий Firefox, Chrome, Safari, но вы легко сможете доработать этот скрипт до нужного вам уровня поддержки.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Twitter онлайн трансляция конференции Digitale" height="455" src="http://media.tumblr.com/tumblr_m286klHPTv1qzuuwu.png" width="500"/&gt;&lt;/p&gt;
&lt;p&gt;Пользуйтесь!&lt;/p&gt;</description><link>http://blog.simonenko.su/post/20775191979</link><guid>http://blog.simonenko.su/post/20775191979</guid><pubDate>Mon, 09 Apr 2012 16:38:00 +0400</pubDate><category>nodejs</category><category>websockets</category><category>Twitter</category><category>coffeescript</category></item><item><title>Поддержка ECMAScript 5 и ECMAScript 6 Harmony в браузерах уже сейчас</title><description>&lt;p&gt;&lt;img align="left" alt="Поддержка ECMAScript 5 и ECMAScript 6 Harmony в браузерах уже сейчас" height="150" src="http://media.tumblr.com/tumblr_m0rv849PB41qzuuwu.jpg" width="150"/&gt; Небольшое пояснение для тех кому слова ECMAScript и Harmony ни о чем не говорят. ECMAScript это спецификация языка, на основе которой развивается наш с вами JavaScript. А Harmony это следующая версия ECMAScript, работа над которой сейчас активно ведется. Теперь немного о том какие изменения произошли в этих версиях и какова текущая поддержка в браузерах.&lt;/p&gt;
&lt;p&gt;&lt;!-- more --&gt;&lt;/p&gt;
&lt;h2&gt;ECMAScript 5&lt;/h2&gt;
&lt;p&gt;Это первое большое изменение спецификации, разработка которой шла около 10 лет. И, к сожалению, только недавно браузеры начали активное внедрение нового функционала. Коротко о том, что нового пришло с ECMAScript 5.&lt;/p&gt;
&lt;h3&gt;Array extras&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;Array.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach" rel="nofollow" target="_blank"&gt;forEach&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Array.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map" rel="nofollow" target="_blank"&gt;map&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Array.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every" rel="nofollow" target="_blank"&gt;every&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Array.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter" rel="nofollow" target="_blank"&gt;filter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Array.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some" rel="nofollow" target="_blank"&gt;some&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Array.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf" rel="nofollow" target="_blank"&gt;indexOf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Array.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf" rel="nofollow" target="_blank"&gt;lastIndexOf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Array.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray" rel="nofollow" target="_blank"&gt;isArray&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;Object extras&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;Object.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create" rel="nofollow" target="_blank"&gt;create&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Object.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys" rel="nofollow" target="_blank"&gt;keys&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Object.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty" rel="nofollow" target="_blank"&gt;defineProperty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Object.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperties" rel="nofollow" target="_blank"&gt;defineProperties&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Object.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor" rel="nofollow" target="_blank"&gt;getOwnPropertyDescriptor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Object.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames" rel="nofollow" target="_blank"&gt;getOwnPropertyNames&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Object.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/preventExtensions" rel="nofollow" target="_blank"&gt;preventExtensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Object.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/isExtensible" rel="nofollow" target="_blank"&gt;isExtensible&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Object.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/seal" rel="nofollow" target="_blank"&gt;seal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Object.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/isSealed" rel="nofollow" target="_blank"&gt;isSealed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Object.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/freeze" rel="nofollow" target="_blank"&gt;freeze&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Object.&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/isFrozen" rel="nofollow" target="_blank"&gt;isFrozen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Так же добавлена поддержка &lt;a href="https://developer.mozilla.org/En/Using_native_JSON" rel="nofollow" target="_blank"&gt;native JSON&lt;/a&gt;, метода &lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind" rel="nofollow" target="_blank"&gt;&lt;code&gt;bind&lt;/code&gt; для Function&lt;/a&gt; и &lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/Strict_mode" rel="nofollow" target="_blank"&gt;strict режим&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;На данный момент, только самые современные браузеры более-менее полно поддерживают ECMAScript 5. Среди них &amp;gt;= IE9, &amp;gt;= Firefox 4, &amp;gt;= Safari 5.1, &amp;gt;= Chrome 13, &amp;gt;= Opera 12. Полную таблицу поддержки спецификации можно &lt;a href="http://kangax.github.com/es5-compat-table/" rel="nofollow" target="_blank"&gt;посмотреть здесь&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;ECMAScript 6 или Harmony&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;В данный момент спецификация не закончена.&lt;/em&gt; На мой взгляд это самое большое, структурное и синтаксическое изменение языка за все время. Спецификация довольно объемная, поэтому я остановлюсь только на самом интересном для себя.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Operators/get" rel="nofollow" target="_blank"&gt;Getters&lt;/a&gt; и &lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Operators/set" rel="nofollow" target="_blank"&gt;setters&lt;/a&gt; — позволяет определять какие параметры можно устанавливать, а какие только читать.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Statements/let" rel="nofollow" target="_blank"&gt;&lt;code&gt;let&lt;/code&gt;&lt;/a&gt; — точно так же как &lt;code&gt;var&lt;/code&gt; ограничивает видимость переменных в пределах функции, &lt;code&gt;let&lt;/code&gt; ограничивает видимость переменных в пределах блока.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Statements/const" rel="nofollow" target="_blank"&gt;&lt;code&gt;const&lt;/code&gt;&lt;/a&gt; — создание read-only констант.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Map" rel="nofollow" target="_blank"&gt;Maps&lt;/a&gt; и &lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/WeakMap" rel="nofollow" target="_blank"&gt;WeakMap&lt;/a&gt; — для работы с объектами ключ/значение.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Кстати, CoffeeScript очень помог развитию Harmony, вот изменения в спецификации напрямую перешедшие из него:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://coffeescript.org/#destructuring" rel="nofollow" target="_blank"&gt;Реструктуризующее присваивание (destructuring assignment)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Возможность указывать &lt;a href="http://coffeescript.org/#literals" rel="nofollow" target="_blank"&gt;значения параметров функции по-умолчанию&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Операторы сравнения &lt;a href="http://coffeescript.org/#operators" rel="nofollow" target="_blank"&gt;is и isnt&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Так же расширение методов &lt;code&gt;Function&lt;/code&gt;, &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;Number&lt;/code&gt;, &lt;code&gt;Object&lt;/code&gt;, &lt;code&gt;RegExp&lt;/code&gt;, &lt;code&gt;Math&lt;/code&gt; и &lt;a href="http://wiki.ecmascript.org/doku.php?id=harmony:proposals" rel="nofollow" target="_blank"&gt;другие изменения&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Поддержка в текущих браузерах достаточно слабая, однако в отдельных браузерах части спецификации уже реализованы. Полную таблицу поддержки спецификации можно &lt;a href="http://kangax.github.com/es5-compat-table/es6/" rel="nofollow" target="_blank"&gt;посмотреть здесь&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Все это здорово, но я хочу сейчас!&lt;/h2&gt;
&lt;p&gt;Специально для тех кто хочет уже сейчас писать по спецификации и не думать работает это в их браузере или нет созданы два проекта: &lt;a href="https://github.com/kriskowal/es5-shim" rel="nofollow" target="_blank"&gt;es5-shim&lt;/a&gt; и &lt;a href="https://github.com/paulmillr/es6-shim" rel="nofollow" target="_blank"&gt;es6-shim&lt;/a&gt;. Оба этих проекта реализуют функционал из спецификации недоступный текущему браузеру. Разумеется речи не идет о полной поддержки, однако большинство полезных новшеств уже работают хорошо.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/19335295543</link><guid>http://blog.simonenko.su/post/19335295543</guid><pubDate>Thu, 15 Mar 2012 09:29:41 +0300</pubDate><category>ecmascript</category><category>javascript</category><category>coffeescript</category></item><item><title>Установка PHP 5.4.0 на OS X Lion (10.7.3)</title><description>&lt;p&gt;&lt;img align="left" alt="Установка PHP 5.4.0 на OS X Lion (10.7.3)" height="113" src="http://media.tumblr.com/tumblr_m0pwfpWMRQ1qzuuwu.jpg" width="150"/&gt;&lt;a href="/post/19170471007/php54-was-released"&gt;Вчера я написал о выходе PHP 5.4&lt;/a&gt;, а сегодня хочу рассказать как его поставить на OS X Lion.&lt;/p&gt;
&lt;p&gt;Для дополнительных пакетов будем использовать homebrew. Для кого это что-то новенькое, вот &lt;a href="http://mxcl.github.com/homebrew/" rel="nofollow" target="_blank"&gt;их сайт&lt;/a&gt;, где подробно описано как его можно использоват и зачем он вообще нужен. Единственное что напомню, для того чтобы установить homebrew у вас должен быть установлен XCode. Его можно бесплатно &lt;a href="http://itunes.apple.com/app/xcode/id497799835" rel="nofollow" target="_blank"&gt;установить через Mac App Store&lt;/a&gt;. Теперь, когда у нас все готово, можно приступить к установке.&lt;/p&gt;
&lt;p&gt;&lt;!-- more --&gt;&lt;/p&gt;
&lt;p&gt;Запускаем в терминале.&lt;/p&gt;
&lt;pre&gt;/usr/bin/ruby -e "$(/usr/bin/curl -fsSL &lt;a href="https://raw.github.com/mxcl/homebrew/master/Library/Contributions/install_homebrew.rb"&gt;https://raw.github.com/mxcl/homebrew/master/Library/Contributions/install_homebrew.rb&lt;/a&gt;)"&lt;/pre&gt;
&lt;p&gt;После этого небольшие настройки и установка необходимых пакетов для работы.&lt;/p&gt;
&lt;pre&gt;sudo chown -R $USER:staff /usr/local
brew install git
brew update
brew install wget
&lt;/pre&gt;
&lt;p&gt;Переходим к связке MySQL+PHP. Первым делом установим MySQL. Возьмем последнюю версию из homebrew, это 5.5.20.&lt;/p&gt;
&lt;pre&gt;brew install mysql&lt;/pre&gt;
&lt;p&gt;Как только установка завершится нужно выполнить настройки, о которых будет написано в терминале.&lt;/p&gt;
&lt;pre&gt;unset TMPDIR
mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp

mysql.server start
&lt;/pre&gt;
&lt;p&gt;Дальше устанавливаем дополнительные пакеты необходимые для установки PHP 5.4.&lt;/p&gt;
&lt;pre&gt;brew install gmp
brew install libjpeg
brew install mcrypt
brew install libmcrypt
brew install gettext
brew install icu4c
brew install libxml2
&lt;/pre&gt;
&lt;p&gt;Как только все пакеты установлены, можно качать &lt;a href="http://www.php.net/downloads.php#v5" rel="nofollow" target="_blank"&gt;последнюю версию PHP&lt;/a&gt;, на данный момент это 5.4.0. Пока свежая версия качается будет полезным познакомиться с разделом &lt;a href="http://php.net/migration54" rel="nofollow" target="_blank"&gt;Migration Guide&lt;/a&gt; на официальном сайте, в нем подробно описаны все изменения с версии 5.3.&lt;/p&gt;
&lt;pre&gt;wget &lt;a href="http://ru2.php.net/get/php-5.4.0.tar.bz2/from/ru.php.net/mirror"&gt;http://ru2.php.net/get/php-5.4.0.tar.bz2/from/ru.php.net/mirror&lt;/a&gt;
mv mirror php-5.4.0.tar.bz2
bunzip2 php-5.4.0.tar.bz2 &amp;amp;&amp;amp; tar xvf php-5.4.0.tar
cd php-5.4.0
&lt;/pre&gt;
&lt;p&gt;Приступаем к конфигурации PHP и последующей установки.&lt;/p&gt;
&lt;pre&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 \
--with-icu-dir=/usr/local/Cellar/icu4c/4.8.1.1 \
--enable-intl \
--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-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-mysql-sock=/usr/local/var/mysql/mysqld.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

make
sudo make install
&lt;/pre&gt;
&lt;p&gt;Для удобства создаем символьные ссылки в &lt;code&gt;/usr/local/bin&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;ln -s /usr/local/php/bin/php /usr/local/bin/php
ln -s /usr/local/php/bin/pear /usr/local/bin/pear
ln -s /usr/local/php/bin/pecl /usr/local/bin/pecl
ln -s /usr/local/php/bin/phar.phar /usr/local/bin/phar
ln -s /usr/local/php/bin/php-config /usr/local/bin/php-config
ln -s /usr/local/php/bin/phpize /usr/local/bin/phpize
&lt;/pre&gt;
&lt;p&gt;Остается обновить php.ini, кстати с версии PHP 5.4 многое в нем изменилось, поэтому предлагаю вам &lt;a href="https://gist.github.com/2015618" rel="nofollow" target="_blank"&gt;свою версию конфига&lt;/a&gt; для development окружения.&lt;/p&gt;
&lt;p&gt;Перезапускаем Apache — &lt;code&gt;sudo apachectl restart&lt;/code&gt; и смотрим на свеженький &lt;code&gt;phpinfo()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Свежая установка PHP 5.4 на OS X Lion" height="503" src="http://media.tumblr.com/tumblr_m0pwm2UQys1qzuuwu.png" width="500"/&gt;&lt;/p&gt;
&lt;p&gt;На данный момент PECL расширение APC работает исправно, версия 3.1.9. Однако Xdebug до сих пор не работает, даже в последней 2.1.3 версии, будем ждать обновление.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/19226938387</link><guid>http://blog.simonenko.su/post/19226938387</guid><pubDate>Tue, 13 Mar 2012 09:36:00 +0300</pubDate><category>php</category><category>os x lion</category><category>homebrew</category></item><item><title>Вышел PHP 5.4, что нового?</title><description>&lt;p&gt;&lt;img align="left" alt="Вышел PHP 5.4, что нового?" height="74" src="http://media.tumblr.com/tumblr_m0pvwlb27j1qzuuwu.jpg" width="150"/&gt; После долгих, мучительных выпусков релиз-кандидатов, PHP сообщество разрадилось &lt;a href="http://php.net/releases/5_4_0.php" rel="nofollow" target="_blank"&gt;следующей мажорной версией PHP&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Главным изменением я бы назвал появление &lt;a href="http://php.net/traits" rel="nofollow" target="_blank"&gt;Traits&lt;/a&gt;. Это специальная структура позволяющая множественное наследование классом. В других языках это часто называется mixins (примеси). Для маленьких проектов это совершенно ненужная вещь, однако для больших систем, с кучей повторного использования кода, traits будут очень полезными.&lt;/p&gt;
&lt;p&gt;&lt;!-- more --&gt;&lt;/p&gt;
&lt;p&gt;Простейший пример, который показывает как это работает:&lt;/p&gt;
&lt;p class="gist"&gt;&lt;a href="http://gist.github.com/2015976" title="traits.php"&gt;Пример работы Traits.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;С traits могут появится общие реализации всяких паттернов проектирования, которые не будут мешать общему наследованию классов. Например, удобно будет сделать &lt;code&gt;trait Singleton&lt;/code&gt; и использовать его там где нужно.&lt;/p&gt;
&lt;p&gt;Остальные изменения я бы не назвал глобальными, скорее это небольшие улучшения синтаксиса и увеличение производительности. Хотя, можно отдельно сказать про &lt;a href="http://php.net/manual/features.commandline.webserver.php" rel="nofollow" target="_blank"&gt;встроенный в PHP веб-сервер&lt;/a&gt;. Думаю он будет полезен исключительно в процессе разработки. Запускается из терминала достаточно просто:&lt;/p&gt;
&lt;pre&gt;php -S localhost:3000&lt;/pre&gt;
&lt;p&gt;Правда немного напрягает что нужно писать отдельный класс для роутинга статических файлов и запускать его потом таким образом:&lt;/p&gt;
&lt;pre&gt;php -S localhost:3000 router.php&lt;/pre&gt;
&lt;p&gt;Примеры как писать такой файл можно &lt;a href="http://php.net/manual/features.commandline.webserver.php" rel="nofollow" target="_blank"&gt;посмотреть в документации&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Небольшие улучшения&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;
&lt;p&gt;Короткая форма записи массивов, прямо из JavaScript приехала видимо ☺&lt;/p&gt;
&lt;pre&gt;$array = ['php', 'mysql', 'apc'];&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Вызов элемента массива возвращаемого функцией напрямую&lt;/p&gt;
&lt;pre&gt;foo()[0];&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Вызов метода класса без присвоения класса переменной&lt;/p&gt;
&lt;pre&gt;(new Foo)-&amp;gt;bar();&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Вызов &lt;code&gt;&amp;lt;?=$variable?&amp;gt;&lt;/code&gt; теперь возможен при выключенном &lt;code&gt;short_open_tag&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;E_STRICT&lt;/code&gt; теперь входит в &lt;code&gt;E_ALL&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Один момент я так и не понял, в одной из beta-версий был &lt;code&gt;scalar typehints&lt;/code&gt; я даже &lt;a href="/post/928630716/new-features-in-the-upcoming-php-version"&gt;писал о нем в том году&lt;/a&gt;, однако в changelog я так и не смог найти упоминания о нем. Если его и правда убрали, то зачем?&lt;/p&gt;
&lt;p&gt;Так же очень радует что выкинули большинство legacy функций и настроек, например &lt;code&gt;magic_quotes&lt;/code&gt;, &lt;code&gt;safe_mode&lt;/code&gt;, &lt;code&gt;register_globals&lt;/code&gt;, &lt;code&gt;y2k_compliance&lt;/code&gt; удалены из языка. Во всех расширениях использующих MySQL работа теперь идет через &lt;a href="http://docs.php.net/manual/book.mysqlnd.php" rel="nofollow" target="_blank"&gt;MySQL Native Driver&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Что ждать дальше?&lt;/h2&gt;
&lt;p&gt;В данный момент идет активная чистка багов. &lt;a href="http://svn.php.net/viewvc/php/php-src/branches/PHP_5_4/NEWS?view=markup" rel="nofollow" target="_blank"&gt;38 ошибок уже исправлено&lt;/a&gt; и так как вышел PHP 5.4.1 RC1, ожидаем скорого релиза следующей версии. Кстати, в языке с релизом PHP 5.4.1 будет поддержка Apache 2.4, выходу которого я на днях &lt;a href="https://twitter.com/#!/simonenko/status/178776753408450560" rel="nofollow" target="_blank"&gt;очень удивился в Twitter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;В то же время началась работа над следующей мажорной версией PHP 5.5 или 6.0 — толком чего ожидать пока не ясно, но можно &lt;a href="http://svn.php.net/viewvc/php/php-src/trunk/NEWS?view=markup" rel="nofollow" target="_blank"&gt;следить за развитием здесь&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Наверное я не на все моменты обратил внимания, если пропустил что-то интересное, напишите мне об этом.&lt;/p&gt;</description><link>http://blog.simonenko.su/post/19170471007</link><guid>http://blog.simonenko.su/post/19170471007</guid><pubDate>Mon, 12 Mar 2012 09:27:23 +0300</pubDate><category>php</category><category>traits</category><category>builtinwebserver</category></item><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&amp;#8217;вским 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;&amp;lt;/head&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Кстати, из прошлой статьи я понял, что для многих не очевидно как и куда вставлять сами кнопки. Исправляюсь, вот пример кода для каждого социального сервиса, вставлять внутри &amp;lt;body&amp;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;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;Большинство сервисов уже умеют работать с кодом, загруженным асинхронно, хотя не указывают это в документации. Все перечисленные мною сервисы умеют так делать. Например, чтобы на сайте появилась кнопка &amp;#8220;мне нравится&amp;#8221; от Вконтакте достаточно добавить всю необходимую логику в функцию &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;Асинхронное подключение &amp;#8220;мне нравится&amp;#8221; от Вконтакте 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 &amp;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;strong&gt;ОБНОВЛЕНИЕ:&lt;/strong&gt; &lt;a href="/post/19170471007/php54-was-released"&gt;Вышел PHP 5.4, полный обзор что нового появилось.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img align="left" alt="Что интересного в PHP 5.4 beta 1 и как поставить на OS X Lion" src="http://media.tumblr.com/tumblr_lta8lw5zOW1qzuuwu.png"/&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 href="https://github.com/php/php-src/blob/24b075bf98c84c1245e2d1df77d4d471c565229b/NEWS" target="_blank"&gt;CHANGELOG&lt;/a&gt; для PHP 5.4 beta 1, а так же описание на что следует обратить внимание при тестировании кода, &lt;a href="https://github.com/php/php-src/blob/290461339be8e4b094f55e64cec0687556466038/UPGRADING" target="_blank"&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 href="http://downloads.php.net/stas/php-5.4.0beta1.tar.bz2" target="_blank"&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;Однако не стоит забывать золотое правило языка: &amp;#8220;&lt;strong&gt;это лишь JavaScript&lt;/strong&gt;&amp;#8221;, поэтому не стройте иллюзий ;)&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;&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 -&amp;gt;
  parse = (body) -&amp;gt; JSON.parse body

  request = (url, fn = -&amp;gt;) -&amp;gt;
    xhr {url}, (error, request, body) -&amp;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) -&amp;gt;
  @debug = (text) -&amp;gt; console.log text

  @periodical = (message) -&amp;gt;
    setTimeout (=&amp;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) -&amp;gt;
  @posts = (options, fn) -&amp;gt;
    [fn, options] = [options, null] if typeof options is 'function'

    request options, fn

  alias = (self, type) -&amp;gt;
    self[type] = (options, fn) -&amp;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 &amp;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;&amp;#8220;The no-library library&amp;#8221;&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&amp;#8217;е логику обязательных полей, валидацию, авто-фокусировки и так далее. Крайне полезная вещь.&lt;/p&gt;
&lt;p&gt;Используя новые возможности, код форм может выглядеть следующим образом:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;form id="signup"&amp;gt;
  &amp;lt;label&amp;gt;Электронный адрес *&amp;lt;/label&amp;gt;
  &amp;lt;input type="email" name="email" placeholder="mail@serenity.su" required&amp;gt;

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

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

  &amp;lt;input type="submit"&amp;gt;
&amp;lt;/form&amp;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. Вместе с ней мы получили &amp;#8220;резиновую прокрутку&amp;#8221;, как на устройствах 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;Конечно, такой метод убьет любую прокрутку на сайте, поэтому нужно не забывать добавить &amp;#8220;&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;&lt;strong&gt;ОБНОВЛЕНИЕ:&lt;/strong&gt; &lt;a href="/post/19170471007/php54-was-released"&gt;Вышел PHP 5.4, полный обзор что нового появилось.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Давно не писал что нового появилось в PHP 5.4, было совсем не до этого. А тем временем добавили очень интересную вещь — встроенный веб-сервер. Само предложение как обычно &lt;a href="https://wiki.php.net/rfc/builtinwebserver" target="_blank"&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 href="http://php.net/manual/en/features.commandline.webserver.php" target="_blank"&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:00 +0400</pubDate><category>php</category><category>builtinwebserver</category></item></channel></rss>

