<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Токарчук Андрей</title>
	
	<link>http://tokarchuk.ru</link>
	<description>Zend Framework, Doctrine, PHP, Ubuntu и другие интересные штуки. Блог Zend Framework разработчика. Программирование на PHP, вопросы использование memcached, mysql, nosql баз данных, jquery, apache, nginx,mongodb, php и т.д.</description>
	<lastBuildDate>Wed, 16 May 2012 10:15:29 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=453</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/tokarchuk" /><feedburner:info uri="tokarchuk" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Doctrine 2 и предзагрузка моделей по связи</title>
		<link>http://feedproxy.google.com/~r/tokarchuk/~3/hHZUdBLl9lY/</link>
		<comments>http://tokarchuk.ru/2012/05/doctrine-2-lazy-loading-related/#comments</comments>
		<pubDate>Mon, 14 May 2012 14:54:53 +0000</pubDate>
		<dc:creator>Андрей Токарчук</dc:creator>
				<category><![CDATA[Doctrine 2]]></category>

		<guid isPermaLink="false">http://tokarchuk.ru/?p=3659</guid>
		<description><![CDATA[В этом посте я расскажу о том, почему могут не грузиться значения свойств модели, полученной через связь в Doctrine 2. Друг тут пожаловался, что при получении модели по связи один-к-одному у него не грузяся значения свойств. Например, такой код возвращал NULL. $release = $em-&#62;getRepository('Model\SomeModel')-&#62;find(1); $user = $release-&#62;getCreateUserLink(); var_dump($user-&#62;nick); Свойство описывалось вот так: /** * @OneToOne(targetEntity="User") [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F05%2Fdoctrine-2-lazy-loading-related%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F05%2Fdoctrine-2-lazy-loading-related%2F&amp;source=netandreus&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>В этом посте я расскажу о том, почему могут не грузиться значения свойств модели, полученной через связь в Doctrine 2.<span id="more-3659"></span></p>
<p>Друг тут пожаловался, что при получении модели по связи один-к-одному у него не грузяся значения свойств. Например, такой код возвращал NULL.</p>
<pre class="brush: php">$release = $em-&gt;getRepository('Model\SomeModel')-&gt;find(1);
$user = $release-&gt;getCreateUserLink();
var_dump($user-&gt;nick);</pre>
<p>Свойство описывалось вот так:</p>
<pre class="brush: php">/**
* @OneToOne(targetEntity="User")
* @JoinColumn(name="create_user", referencedColumnName="user_id")
*/
private $createUserLink;</pre>
<p>Дальше оказалось ещё интересней. При вызове метода toArray() из <a href="tokarchuk.ru/2012/02/doctrine-2-properties/">моего расширения для Doctrine</a>, все свойства возвращались успешно. Начал копать и нашел в мануале такую информацию:</p>
<p>Defines that the annotated instance variable holds a reference that describes a many-to-one relationship between two entities.</p>
<p>Required attributes:</p>
<ul>
<li><strong>targetEntity</strong>: FQCN of the referenced target entity. Can be the unqualified class name if both classes are in the same namespace. <em>IMPORTANT:</em> No leading backslash!</li>
</ul>
<p>Optional attributes:</p>
<ul>
<li><strong>cascade</strong>: Cascade Option</li>
<li><strong>fetch</strong>: One of LAZY or EAGER</li>
<li>inversedBy &#8212; The inversedBy attribute designates the field in the entity that is the inverse side of the relationship</li>
</ul>
<p>См. <a rel="nofollow" href="http://tokarchuk.ru/goto/http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/annotations-reference.html#onetoone" >пруфлинк</a> Получается, если тип загрузки (fetch) не указан, выполняется ленивая загрузка. Осталось узнать, что её инициирует. Это делает функций __load() из прокси-класса модели.</p>
<pre class="brush: php">/** @private */
public function __load()
{
if (!$this-&gt;__isInitialized__ &amp;&amp; $this-&gt;_entityPersister) {
$this-&gt;__isInitialized__ = true;

if (method_exists($this, "__wakeup")) {
// call this after __isInitialized__to avoid infinite recursion
// but before loading to emulate what ClassMetadata::newInstance()
// provides.
$this-&gt;__wakeup();
}

if ($this-&gt;_entityPersister-&gt;load($this-&gt;_identifier, $this) === null) {
throw new \Doctrine\ORM\EntityNotFoundException();
}
unset($this-&gt;_entityPersister, $this-&gt;_identifier);
}
}</pre>
<p>И ведь верно, до загрузки модели из бд в памяти висит модель-пустышка, у которой значения всех свойств (кроме PK) равны NULL.</p>
<h3>Солюшен.</h3>
<p>Если вы хотите загрузить модель, то либо указываете в описании связи предзагрузку (что не рекомендуется делать по сообрежениям производительности), либо вызывайте после получения модели функцию __load().</p>
<pre class="brush: php">$release = $em-&gt;getRepository('Model\SomeModel')-&gt;find(1);
$user = $release-&gt;getCreateUserLink();
$user-&gt;__load();
var_dump($user-&gt;nick);</pre>
<img src="http://feeds.feedburner.com/~r/tokarchuk/~4/hHZUdBLl9lY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tokarchuk.ru/2012/05/doctrine-2-lazy-loading-related/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://tokarchuk.ru/2012/05/doctrine-2-lazy-loading-related/</feedburner:origLink></item>
		<item>
		<title>Zend Cloud + WebDav + Яндекс.Диск</title>
		<link>http://feedproxy.google.com/~r/tokarchuk/~3/TJWO0_zcVXU/</link>
		<comments>http://tokarchuk.ru/2012/05/zend-cloud-webdav-yandex-disk/#comments</comments>
		<pubDate>Thu, 10 May 2012 10:34:01 +0000</pubDate>
		<dc:creator>Андрей Токарчук</dc:creator>
				<category><![CDATA[Highload]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Облачные вычисления]]></category>

		<guid isPermaLink="false">http://tokarchuk.ru/?p=3508</guid>
		<description><![CDATA[В нашем проекте встала задача выделения отдельного сервера под хранение и отдачу статических данных (картинок, музыки и видео). В этом посте я расскажу о том, как я писал свой адаптер хранения на Zend SimpleCloud API. Основаня фишка в том, что он стандартизирован и при желании его можно будет поменять на Amazon S3 не переписывая код. [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F05%2Fzend-cloud-webdav-yandex-disk%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F05%2Fzend-cloud-webdav-yandex-disk%2F&amp;source=netandreus&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/Webdav-icon.png" ><img class="alignleft size-full wp-image-3516" style="margin: 10px;" title="Webdav-icon" src="http://tokarchuk.ru/wp-content/uploads/2012/04/Webdav-icon.png" alt="" width="48" height="48" /></a>В нашем проекте встала задача выделения отдельного сервера под хранение и отдачу статических данных (картинок, музыки и видео). В этом посте я расскажу о том, как я писал свой адаптер хранения на Zend SimpleCloud API. Основаня фишка в том, что он стандартизирован и при желании его можно будет поменять на Amazon S3 не переписывая код. Также данный клиент поддерживает работу с новым сервисом от Яндекса &#8212; Яндекс.Диск.<span id="more-3508"></span></p>
<h3>Задача</h3>
<p>Итак, проблема состояла в том, что наше веб-сервер занимался всем что угодно. И генерировал странички пользователям, и отдавал статику (включая видео, музыку и картинки), и ресайзил изображения. Было принято решения сделать наконец из веб-сервера веб-сервер, а именно вынести все эти операции на job-сервер, а сам статичный контент на сервер статики.</p>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/webdav.png" ><img class="size-full wp-image-3517 aligncenter" title="webdav" src="http://tokarchuk.ru/wp-content/uploads/2012/04/webdav.png" alt="" width="553" height="317" /></a></p>
<h3>Архитектура</h3>
<p>Сервера статики располагются отдельно, клиенты коннектятся к ним по HTTP протоколу и забирают картинки как обычно. Заливку картинок осуществляет либо само веб-приложение по протоколу WebDav либо демон, который выполняет задачи из очереди. В качестве протокола общения с серверами статики будем использовать WebDav, в качестве сервера очередей &#8212; Gearman.</p>
<h3>Конфигурируем nginx</h3>
<p>Nginx из deb-пакетов (который есть в репозитариях) нам не подойдёт, т.к. надо установить его вместе с модулем http_dav_module. Скачиваем, компилируем и устанавливаем сервер с требуемым модулем:</p>
<pre class="brush: bash;">wget nginx.org/download/nginx-1.1.1.tar.gz
tar -xvf nginx-1.1.1.tar.gz
cd nginx-1.1.1
git clone https://github.com/arut/nginx-dav-ext-module.git ./dav-ext
./configure --sbin-path=/usr/sbin --conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/lib/nginx/body \
--http-proxy-temp-path=/var/lib/nginx/proxy \
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_dav_module --add-module=./dav-ext</pre>
<p>Обращаем внимание на строчки:<br />
adding module in ./dav-ext<br />
+ ngx_http_dav_ext_module was configured</p>
<pre class="brush: bash;">make</pre>
<p>Дальше по идее надо бы использовать make install, но мы не будем этого делать, чтобы <a rel="nofollow" href="http://tokarchuk.ru/goto/http://habrahabr.ru/post/130868/" >не замусоривать систему</a>. Надо убедиться, что у нас удалён старый nginx И поставить утилиту checkinstall, которая сделает нам deb-пакет и поставит его.</p>
<pre class="brush: bash;">sudo apt-get remove nginx
sudo apt-get install checkinstall
sudo checkinstall</pre>
<p>Дальше надо сконфигурировать nginx, я просто приведу свой конфиг.</p>
<pre class="brush: bash;">server {
# Порт, принимаемые HOST и путь к сайту
listen 80;
server_name www.tok tok webdav.thankyou.ru;
set $root_path "/home/netandreus/web";

# Запрос статики с сервера статики
location / {

root $root_path;
index index.htm index.html index.php;
client_max_body_size 20m;
# client_body_temp_path /usr/local/nginx/html/;
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS;
create_full_put_path on; #при отсутствии вложенных папок, при включенной директиве, nginx автоматически создаст иерархию
dav_access user:rw group:r all:r; #права на файлы
autoindex on;
if ($request_method ~* GET) {
error_page 404 = @main_frontend;
}
limit_except GET {
allow all;
}
}

# Основной сервер
location @main_frontend {
proxy_pass http://site.ru;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
resolver 8.8.8.8;
}
}</pre>
<p>Отлично, теперь можем побаловаться с ним. Единственный момент, nginx не поддерживает запрос OPTIONS+PROPFIND, поэтому подключить обычный WebDav клиент к нему не получитсяб но если вы скомпили его с nginx-dav-ext-module, то можете подконнектиться к нему любым клиентом. Например я проверял в Ubuntu с помощью Nautilus.</p>
<p>Чтобы работать с ним из PHP я разработал специальный адаптер ZendExtra_Cloud_SimpleStorage_Adapter_WebDav. Самое интересное, что его можно подключить к Zend_Cloud и потом при необходимости перейти на другое хранилище (например Amazon S3 без переписывания кода). Стандарты рулят! <img src='http://tokarchuk.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Итак вот список реализованных команд WebDav: PUT DELETE MKCOL COPY MOVE</p>
<p>А вот списко реализованный функций со стороны Zend: fetchItem(), storeItem(), deleteItem(), copyItem(), moveItem(), renameItem(), listItems() + дополнение в виде createFolder()</p>
<p><strong>ZendExtra_Cloud_SimpleStorage_Adapter_WebDav.php</strong></p>
<pre class="brush: php;">&lt;?php
require_once 'Zend/Cloud/StorageService/Adapter.php';
require_once 'Zend/Cloud/StorageService/Exception.php';

/**
 * WebDav adapter for unstructured cloud storage.
 *
 * @category   ZendExtra
 * @package    ZendExtra_Cloud
 * @subpackage StorageService
 * @copyright  Copyright (c) 2012 Tokarchuk Andrey. (http://tokarchuk.ru)
 *
 * Examples:
 * =========
 * // Init storage
 * / ** @var ZendExtra_Cloud_StorageService_Adapter_WebDav $storage ** /
 * $storage = Zend_Cloud_StorageService_Factory::getAdapter(array(
 *    Zend_Cloud_StorageService_Factory::STORAGE_ADAPTER_KEY =&gt; 'ZendExtra_Cloud_StorageService_Adapter_WebDav',
 *   ZendExtra_Cloud_StorageService_Adapter_WebDav::SERVERS_KEY   =&gt; array(
 *       'static1.site.ru' =&gt; array('host' =&gt; '1.2.3.4', 'port' =&gt; '80')
 *   ),
 *    ZendExtra_Cloud_StorageService_Adapter_WebDav::DEFAULT_SERVER_KEY =&gt; 'static1.site.ru'
 * ));
 * // Fetch item
 * $storage-&gt;fetchItem('/upload/news/c3500cc0c4892f3eda2ef3876af567dd.png');
 * // Store Item
 * $data = file_get_contents(ROOT_PATH. '/utils/upload_test.txt');
 * $storage-&gt;storeItem('/upload/upload_test.txt', $data);
 * // Delete item
 * $storage-&gt;deleteItem('/upload/upload_test.txt');
 * // Copy item (first - without loading item toi client, second - with it)
 * $storage-&gt;copyItem('/upload/upload_test.txt', '/upload/upload_test2.txt');
 * $storage-&gt;copyItem('/upload/upload_test.txt', '/upload/upload_test2.txt', array('native' =&gt; false));
 * // Move item (first - without loading item toi client, second - with it)
 * $storage-&gt;moveItem('/upload/upload_test.txt', '/upload/upload_test3.txt');
 * $storage-&gt;moveItem('/upload/upload_test3.txt', '/upload/upload_test.txt', array('native' =&gt; false));
 * // Rename item (first - without loading item toi client, second - with it)
 * $storage-&gt;renameItem('/upload/upload_test.txt', 'upload_test2.txt');
 * $storage-&gt;renameItem('/upload/upload_test2.txt', 'upload_test.txt', array('native' =&gt; false));
 * // Directory listing (if in nginx allow)
 * var_dump($storage-&gt;listItems('/upload/'));
 *
 * Yandex.disk exapmle:
 * ====================
 * $storage = Zend_Cloud_StorageService_Factory::getAdapter(array(
 *    Zend_Cloud_StorageService_Factory::STORAGE_ADAPTER_KEY =&gt; 'ZendExtra_Cloud_StorageService_Adapter_WebDav',
 *   ZendExtra_Cloud_StorageService_Adapter_WebDav::SERVERS_KEY   =&gt; array(
 *       'static1.site.ru' =&gt; array('host' =&gt; 'webdav.yandex.ru', 'port' =&gt; '80', 'protocol' =&gt; 'https')
 *   ),
 *    ZendExtra_Cloud_StorageService_Adapter_WebDav::DEFAULT_SERVER_KEY =&gt; 'static1.site.ru'
 * ));
 * $files = $storage-&gt;listItems('/upload');
 */
class ZendExtra_Cloud_StorageService_Adapter_WebDav
    implements Zend_Cloud_StorageService_Adapter
{

    /*
    * Options array keys for the WebDav adapter.
    */
    const SERVERS_KEY        = 'servers';
    const DEFAULT_SERVER_KEY = 'defaultServerKey';

    /**
     * WebDav service instance.
     * @var Zend_Http_Client
     */
    protected $_client = NULL;
    protected $_servers = array();
    protected $_defaultServerKey = NULL;
    protected $_options = array();

    /**
     * WebDav commands
     * @var array
     */
    protected $_webDavCommands = array('GET', 'POST', 'PUT', 'DELETE', 'MKCOL', 'COPY', 'MOVE', 'PROPFIND', 'PROPPATCH', 'LOCK', 'UNLOCK', 'OPTIONS');

    /*
     * Constructor
     *
     * @param  array|Zend_Config $options
     * @return void
     */
    public function __construct($options = array())
    {
        if ($options instanceof Zend_Config) {
            $options = $options-&gt;toArray();
        }

        if (!is_array($options)) {
            throw new Zend_Cloud_StorageService_Exception('Invalid options provided');
        }
        if (isset($options[self::DEFAULT_SERVER_KEY])) {
            $this-&gt;_defaultServerKey = $options[self::DEFAULT_SERVER_KEY];
        }
        if (isset($options[self::SERVERS_KEY])) {
            $this-&gt;_servers = $options[self::SERVERS_KEY];
        }
        $this-&gt;_options = $options;
    }

    /**
     * Execute WebDav command on server and returns
     * responce object
     * @param $path
     * @param $command
     * @param array $options
     * @return Zend_Http_Response
     */
    public function command($path, $command, $options = array())
    {
        if(!in_array($command, $this-&gt;_webDavCommands))
            throw new Zend_Cloud_Exception('Unknown webdav command', 500);
        $path = $this-&gt;_getFullPath($path, array());
        $client = $this-&gt;getClient()-&gt;setUri($path);
        if($options['auth'] &amp;&amp; count($options == 3) &amp;&amp; $options['auth']['username'] &amp;&amp; $options['auth']['password'] &amp;&amp; $options['auth']['type'])
            $client-&gt;setAuth($options['auth']['username'], $options['auth']['password'], $options['auth']['type']);
        if($options['data'] &amp;&amp; $options['mimeType'])
            $client-&gt;setRawData($options['data'], $options['mimeType']);
        if($options['headers'])
            $client-&gt;setHeaders($options['headers']);
        $responce = $client-&gt;request($command);
        return $responce;
    }

    /*
     * Get an item from the storage service.
     *
     * @param  string $path
     * @param  array $options
     * @return string
     */
    public function fetchItem($path, $options = array())
    {
        // Simple mode (not a webdav-command)
        if($options['simple'] == true) {
            $path = $this-&gt;_getFullPath($path, array());
            $item = file_get_contents($path);
            return $item;
        }

        // True webdav mode
        $response = $this-&gt;command($path, 'GET');
        $headers = $response-&gt;getHeaders();
        $item = $response-&gt;getBody();
        return $item;
    }

    /**
     * Store an item in the storage service.
     *
     * WARNING: This operation overwrites any item that is located at
     * $destinationPath.
     *
     * @TODO Support streams
     *
     * @param string $destinationPath
     * @param string|resource $data
     * @param  array $options
     * @return void
     */
    public function storeItem($destinationPath, $data, $options = array())
    {
        // Detect a mime-type
        if(!array_key_exists('mimeType', $options)) {
            $tmp = explode("/", $destinationPath);
            $filename = $tmp[count($tmp)-1];
            $options['filename'] = $filename;
            $tmp = explode(".", $filename);
            $extension = $tmp[count($tmp)-1];
            $options['mimeType'] = self::getMimeType($extension);
        }
        if(empty($options['mimeType']))
            throw new Zend_Cloud_StorageService_Exception('Can not store file without mime-type provided. Autodetermination of mime type failed.');
        if(!array_key_exists('filename', $options)) {
            $tmp = explode("/", $destinationPath);
            $options['filename'] = $tmp[count($tmp)-1];
        }
        $this-&gt;command($destinationPath, 'PUT', array('data' =&gt; $data, 'mimeType' =&gt; $options['mimeType']));
        /*
        $path = $this-&gt;_getFullPath($destinationPath);
        $client = $this-&gt;getClient()-&gt;setUri($path);
        $client-&gt;setRawData($data, $options['mimeType']);
        $client-&gt;request('PUT');
        */
    }

    /**
     * Delete an item in the storage service.
     *
     * @param  string $path
     * @param  array $options
     * @return void
     */
    public function deleteItem($path, $options = array())
    {
        if(empty($path))
            return false;
        try {
            $this-&gt;command($path, 'DELETE');
            /*
            $path = $this-&gt;_getFullPath($path);
            $client = $this-&gt;getClient()-&gt;resetParameters()-&gt;setUri($path);
            $client-&gt;request('DELETE');
            */
        } catch (Exception  $e) {
            throw new Zend_Cloud_StorageService_Exception('Error on delete: '.$e-&gt;getMessage(), $e-&gt;getCode(), $e);
        }
    }

    /*
     * Copy an item in the storage service to a given path.
     *
     * WARNING: This operation is *very* expensive for services that do not
     * support copying an item natively.
     *
     * @TODO Support streams for those services that don't support natively
     *
     * @param  string $sourcePath
     * @param  string $destination path
     * @param  array $options
     * @params bool $native Use or not WebDav COPY
     * @return void
     */
    public function copyItem($sourcePath, $destinationPath, $options = array())
    {
        if(!array_key_exists('native', $options))
            $options['native'] = true;
        $path = $this-&gt;_getFullPath($sourcePath);

        if($options['native']) {
            $this-&gt;command($sourcePath, 'COPY', array('headers' =&gt; array('Destination'=&gt;$destinationPath)));
            /*
            $client = $this-&gt;getClient()-&gt;setUri($path)-&gt;setHeaders(array('Destination'=&gt;$destinationPath));
            $client-&gt;request('COPY');
            */
        } else {
            $data = $this-&gt;fetchItem($sourcePath);
            $this-&gt;storeItem($destinationPath, $data);
        }
    }

    /*
     * Move an item in the storage service to a given path.
     *
     * @TODO Support streams for those services that don't support natively
     *
     * @param  string $sourcePath
     * @param  string $destination path
     * @param  array $options
     * @return void
     */
    public function moveItem($sourcePath, $destinationPath, $options = array())
    {
        if(!array_key_exists('native', $options))
            $options['native'] = true;

        if($options['native']) {
            $this-&gt;command($sourcePath, 'MOVE', array('headers' =&gt; array('Destination'=&gt;$destinationPath)));
            /*
            $path = $this-&gt;_getFullPath($sourcePath);
            $client = $this-&gt;getClient()-&gt;setUri($path)-&gt;setHeaders(array('Destination'=&gt;$destinationPath));
            $client-&gt;request('MOVE');
            */
        } else {
            $data = $this-&gt;fetchItem($sourcePath);
            $this-&gt;storeItem($destinationPath, $data);
            $this-&gt;deleteItem($sourcePath);
        }
    }

    /**
     * Rename an item in the storage service to a given name.
     *
     *
     * @param  string $path
     * @param  string $name
     * @param  array $options
     * @return void
     */
    public function renameItem($path, $name, $options = array())
    {
        if(!array_key_exists('native', $options))
            $options['native'] = true;
        $tmp = explode("/", $path);
        $oldName = $tmp[count($tmp)-1];
        $destinationPath = str_replace($oldName, $name, $path);
        $this-&gt;moveItem($path, $destinationPath, $options);
    }

    /*
     * Creates a folder by WebDav
     * @param $path
     */
    public function createFolder($destinationPath) {
        $lastCharacter = $destinationPath[strlen($destinationPath)-1];
        if($lastCharacter != "/")
            $destinationPath .= "/";
        $path = $this-&gt;_getFullPath($destinationPath);
        $client = $this-&gt;getClient()-&gt;setUri($path);
        $client-&gt;request('MKCOL');
    }

    /**
     * List items in the given directory in the storage service
     *
     * The $path must be a directory
     * Supports nginx with directory listing enable
     *
     * @param  string $path Must be a directory
     * @param  array $options
     * @return array A list of item names
     */
    public function listItems($path, $options = null)
    {
        if($options['mode'] == "get") {
            $content = $this-&gt;_listByGet($path, $options);
        } else {
            $content = $this-&gt;_listByPropfind($path, $options);
        }
        return $content;
    }

    protected function _listByGet($path, $options = null)
    {
        try {
            $path = $this-&gt;_getFullPath($path);
            $html = file_get_contents($path);
            $dom = new Zend_Dom_Query($html);
            $result = $dom-&gt;query('html body pre a');
            $content = array();
            foreach($result as $element) {
                $text = $element-&gt;firstChild-&gt;wholeText; // $element-&gt;getAttribute('href')
                if($text != "../")
                    $content[] = str_replace("/", "", $text);
            }
            return $content;
        } catch (Exception $e) {
            throw new Zend_Cloud_StorageService_Exception('Directory listing fails.');
        }
    }

    /**
     * Listing directory using PROPFIND command.
     * @param $path
     * @param array $options
     * @return array
     * @throws Zend_Cloud_Exception
     */
    protected function _listByPropfind($path, $options = array())
    {
        $xml = '&lt;?xml version="1.0" encoding="utf-8" ?&gt;&lt;D:propfind xmlns:D="DAV:"&gt;&lt;D:allprop/&gt;&lt;/D:propfind&gt;';
        $response = $this-&gt;command($path, 'PROPFIND', array(
            'data' =&gt; $xml,
            'mimeType' =&gt; 'text/xml',
            'headers' =&gt; array(
                'Content-Type' =&gt; 'text/xml; charset="utf-8"',
                'Depth' =&gt; 1,
                'Content-Length' =&gt; strlen($xml)
            )
        ));

        if(empty($response))
            throw new Zend_Cloud_Exception('Empty response on propfind command', 500);
        $xml = $response-&gt;getBody();
        $dom = new Zend_Dom_Query($xml);
        $result = $dom-&gt;query('d:multistatus d:response d:href');
        $content = array();
        foreach($result as $element) {
            $text = $element-&gt;firstChild-&gt;wholeText; // $element-&gt;getAttribute('href')
            if($text != "../" &amp;&amp; $text != $path &amp;&amp; $text != $path.'/')
                $content[] = str_replace("/", "", $text);
        }
        return $content;
    }

    /**
     * Get a key/value array of metadata for the given path.
     *
     * @param  string $path
     * @param  array $options
     * @return array
     */
    public function fetchMetadata($path, $options = array())
    {
        require_once 'Zend/Cloud/OperationNotAvailableException.php';
        throw new Zend_Cloud_OperationNotAvailableException('Fetching metadata not implemented');
    }

    /**
     * Tests if file exists in storage
     * @param $path
     * @return bool
     */
    public function isItemExists($path)
    {
        $xml = '<!--?xml version="1.0" encoding="utf-8" ?-->';
        $response = $this-&gt;command($path, 'PROPFIND', array(
            'data' =&gt; $xml,
            'mimeType' =&gt; 'text/xml',
            'headers' =&gt; array(
                'Content-Type' =&gt; 'text/xml; charset="utf-8"',
                'Depth' =&gt; 1,
                'Content-Length' =&gt; strlen($xml)
            )
        ));
        $xml = $response-&gt;getBody();
        $dom = new Zend_Dom_Query($xml);
        $result = $dom-&gt;query('D:status');
        foreach($result as $element) {
            $text = $element-&gt;firstChild-&gt;wholeText;
        }
        return (strpos($text, ' 200 OK') !== FALSE)? true : false;
    }

    /*
     * Store a key/value array of metadata at the given path.
     * WARNING: This operation overwrites any metadata that is located at
     * $destinationPath.
     *
     * @param  string $destinationPath
     * @param  array $options
     * @return void
     */
    public function storeMetadata($destinationPath, $metadata, $options = array())
    {
        require_once 'Zend/Cloud/OperationNotAvailableException.php';
        throw new Zend_Cloud_OperationNotAvailableException('Storing metadata not implemented');
    }

    /*
     * Delete a key/value array of metadata at the given path.
     *
     * @param  string $path
     * @param  array $options
     * @return void
     */
    public function deleteMetadata($path)
    {
        require_once 'Zend/Cloud/OperationNotAvailableException.php';
        throw new Zend_Cloud_OperationNotAvailableException('Deleting metadata not implemented');
    }

    /**
     * Get full path, including bucket, for an object
     *
     * @param  string $path
     * @param  array $options
     * @return void
     */
    protected function _getFullPath($path, $options = array())
    {
        $server = $this-&gt;_getServer();
        $protocol = ($server['protocol'])? $server['protocol'] : 'http';
        $path = (!array_key_exists('port', $server) OR $server['port'] == 80)? $protocol.'://'.$server['host'].$path : $protocol.'://'.$server['host'].':'.$server['port'].$path;
        return $path;
    }

    /*
     * Return config of server
     * @return mixed
     * @throws Zend_Cloud_StorageService_Exception
     */
    protected function _getServer($key = NULL)
    {
        if(count($this-&gt;_servers) == 0)
            throw new Zend_Cloud_StorageService_Exception('No WebDav servers registered.');
        if(!empty($key) AND array_key_exists($key, $this-&gt;_servers))
            return $this-&gt;_servers[$key];
        if(!empty($this-&gt;_defaultServerKey)) {
            return $this-&gt;_servers[$this-&gt;_defaultServerKey];
        }
        return array_pop($this-&gt;_servers);
    }

    /*
     * Get the concrete client.
     * @return Zend_Http_Client
     */
    public function getClient($getNewInstance = false)
    {
        if($getNewInstance)
            $this-&gt;_client = NULL;
        if(empty($this-&gt;_client)) {
            $this-&gt;_client = new Zend_Http_Client();
            $this-&gt;_client-&gt;setConfig(array(
                    'maxredirects' =&gt; 0,
                    'timeout'      =&gt; 30)
            );
        }
        return $this-&gt;_client;
    }

    /*
     * Get mime type by extension
     */
    public static function getMimeType($extension) {
        $mimeTypes = self::mimetypeMapping();
        $key = $mimeTypes['extensions'][$extension];
        return $mimeTypes['mimetypes'][$key];
    }

    public static function mimetypeMapping() {
        return array(
            'mimetypes' =&gt; array(
                0 =&gt; 'application/andrew-inset',
                1 =&gt; 'application/atom',
                2 =&gt; 'application/atomcat+xml',
                3 =&gt; 'application/atomserv+xml',
                4 =&gt; 'application/cap',
                5 =&gt; 'application/cu-seeme',
                6 =&gt; 'application/dsptype',
                7 =&gt; 'application/hta',
                8 =&gt; 'application/java-archive',
                9 =&gt; 'application/java-serialized-object',
                10 =&gt; 'application/java-vm',
                11 =&gt; 'application/mac-binhex40',
                12 =&gt; 'application/mathematica',
                13 =&gt; 'application/msaccess',
                14 =&gt; 'application/msword',
                15 =&gt; 'application/octet-stream',
                16 =&gt; 'application/oda',
                17 =&gt; 'application/ogg',
                18 =&gt; 'application/pdf',
                19 =&gt; 'application/pgp-keys',
                20 =&gt; 'application/pgp-signature',
                21 =&gt; 'application/pics-rules',
                22 =&gt; 'application/postscript',
                23 =&gt; 'application/rar',
                24 =&gt; 'application/rdf+xml',
                25 =&gt; 'application/rss+xml',
                26 =&gt; 'application/rtf',
                27 =&gt; 'application/smil',
                28 =&gt; 'application/vnd.cinderella',
                29 =&gt; 'application/vnd.google-earth.kml+xml',
                30 =&gt; 'application/vnd.google-earth.kmz',
                31 =&gt; 'application/vnd.mozilla.xul+xml',
                32 =&gt; 'application/vnd.ms-excel',
                33 =&gt; 'application/vnd.ms-excel.addin.macroEnabled.12',
                34 =&gt; 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
                35 =&gt; 'application/vnd.ms-excel.sheet.macroEnabled.12',
                36 =&gt; 'application/vnd.ms-excel.template.macroEnabled.12',
                37 =&gt; 'application/vnd.ms-pki.seccat',
                38 =&gt; 'application/vnd.ms-pki.stl',
                39 =&gt; 'application/vnd.ms-powerpoint',
                40 =&gt; 'application/vnd.ms-powerpoint.addin.macroEnabled.12',
                41 =&gt; 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
                42 =&gt; 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',
                43 =&gt; 'application/vnd.ms-powerpoint.template.macroEnabled.12',
                44 =&gt; 'application/vnd.ms-word.document.macroEnabled.12',
                45 =&gt; 'application/vnd.ms-word.template.macroEnabled.12',
                46 =&gt; 'application/vnd.ms-xpsdocument',
                47 =&gt; 'application/vnd.oasis.opendocument.chart',
                48 =&gt; 'application/vnd.oasis.opendocument.database',
                49 =&gt; 'application/vnd.oasis.opendocument.formula',
                50 =&gt; 'application/vnd.oasis.opendocument.graphics',
                51 =&gt; 'application/vnd.oasis.opendocument.graphics-template',
                52 =&gt; 'application/vnd.oasis.opendocument.image',
                53 =&gt; 'application/vnd.oasis.opendocument.presentation',
                54 =&gt; 'application/vnd.oasis.opendocument.presentation-template',
                55 =&gt; 'application/vnd.oasis.opendocument.spreadsheet',
                56 =&gt; 'application/vnd.oasis.opendocument.spreadsheet-template',
                57 =&gt; 'application/vnd.oasis.opendocument.text',
                58 =&gt; 'application/vnd.oasis.opendocument.text-master',
                59 =&gt; 'application/vnd.oasis.opendocument.text-template',
                60 =&gt; 'application/vnd.oasis.opendocument.text-web',
                61 =&gt; 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
                62 =&gt; 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
                63 =&gt; 'application/vnd.openxmlformats-officedocument.presentationml.template',
                64 =&gt; 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
                65 =&gt; 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
                66 =&gt; 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
                67 =&gt; 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
                68 =&gt; 'application/vnd.rim.cod',
                69 =&gt; 'application/vnd.smaf',
                70 =&gt; 'application/vnd.stardivision.calc',
                71 =&gt; 'application/vnd.stardivision.chart',
                72 =&gt; 'application/vnd.stardivision.draw',
                73 =&gt; 'application/vnd.stardivision.impress',
                74 =&gt; 'application/vnd.stardivision.math',
                75 =&gt; 'application/vnd.stardivision.writer',
                76 =&gt; 'application/vnd.stardivision.writer-global',
                77 =&gt; 'application/vnd.sun.xml.calc',
                78 =&gt; 'application/vnd.sun.xml.calc.template',
                79 =&gt; 'application/vnd.sun.xml.draw',
                80 =&gt; 'application/vnd.sun.xml.draw.template',
                81 =&gt; 'application/vnd.sun.xml.impress',
                82 =&gt; 'application/vnd.sun.xml.impress.template',
                83 =&gt; 'application/vnd.sun.xml.math',
                84 =&gt; 'application/vnd.sun.xml.writer',
                85 =&gt; 'application/vnd.sun.xml.writer.global',
                86 =&gt; 'application/vnd.sun.xml.writer.template',
                87 =&gt; 'application/vnd.symbian.install',
                88 =&gt; 'application/vnd.visio',
                89 =&gt; 'application/vnd.wap.wbxml',
                90 =&gt; 'application/vnd.wap.wmlc',
                91 =&gt; 'application/vnd.wap.wmlscriptc',
                92 =&gt; 'application/wordperfect',
                93 =&gt; 'application/wordperfect5.1',
                94 =&gt; 'application/x-123',
                95 =&gt; 'application/x-7z-compressed',
                96 =&gt; 'application/x-abiword',
                97 =&gt; 'application/x-apple-diskimage',
                98 =&gt; 'application/x-bcpio',
                99 =&gt; 'application/x-bittorrent',
                100 =&gt; 'application/x-cab',
                101 =&gt; 'application/x-cbr',
                102 =&gt; 'application/x-cbz',
                103 =&gt; 'application/x-cdf',
                104 =&gt; 'application/x-cdlink',
                105 =&gt; 'application/x-chess-pgn',
                106 =&gt; 'application/x-cpio',
                107 =&gt; 'application/x-debian-package',
                108 =&gt; 'application/x-director',
                109 =&gt; 'application/x-dms',
                110 =&gt; 'application/x-doom',
                111 =&gt; 'application/x-dvi',
                112 =&gt; 'application/x-flac',
                113 =&gt; 'application/x-font',
                114 =&gt; 'application/x-freemind',
                115 =&gt; 'application/x-futuresplash',
                116 =&gt; 'application/x-gnumeric',
                117 =&gt; 'application/x-go-sgf',
                118 =&gt; 'application/x-graphing-calculator',
                119 =&gt; 'application/x-gtar',
                120 =&gt; 'application/x-hdf',
                121 =&gt; 'application/x-httpd-eruby',
                122 =&gt; 'application/x-httpd-php',
                123 =&gt; 'application/x-httpd-php-source',
                124 =&gt; 'application/x-httpd-php3',
                125 =&gt; 'application/x-httpd-php3-preprocessed',
                126 =&gt; 'application/x-httpd-php4',
                127 =&gt; 'application/x-ica',
                128 =&gt; 'application/x-internet-signup',
                129 =&gt; 'application/x-iphone',
                130 =&gt; 'application/x-iso9660-image',
                131 =&gt; 'application/x-java-jnlp-file',
                132 =&gt; 'application/x-javascript',
                133 =&gt; 'application/x-jmol',
                134 =&gt; 'application/x-kchart',
                135 =&gt; 'application/x-killustrator',
                136 =&gt; 'application/x-koan',
                137 =&gt; 'application/x-kpresenter',
                138 =&gt; 'application/x-kspread',
                139 =&gt; 'application/x-kword',
                140 =&gt; 'application/x-latex',
                141 =&gt; 'application/x-lha',
                142 =&gt; 'application/x-lyx',
                143 =&gt; 'application/x-lzh',
                144 =&gt; 'application/x-lzx',
                145 =&gt; 'application/x-maker',
                146 =&gt; 'application/x-mif',
                147 =&gt; 'application/x-ms-wmd',
                148 =&gt; 'application/x-ms-wmz',
                149 =&gt; 'application/x-msdos-program',
                150 =&gt; 'application/x-msi',
                151 =&gt; 'application/x-netcdf',
                152 =&gt; 'application/x-ns-proxy-autoconfig',
                153 =&gt; 'application/x-nwc',
                154 =&gt; 'application/x-object',
                155 =&gt; 'application/x-oz-application',
                156 =&gt; 'application/x-pkcs7-certreqresp',
                157 =&gt; 'application/x-pkcs7-crl',
                158 =&gt; 'application/x-python-code',
                159 =&gt; 'application/x-quicktimeplayer',
                160 =&gt; 'application/x-redhat-package-manager',
                161 =&gt; 'application/x-shar',
                162 =&gt; 'application/x-shockwave-flash',
                163 =&gt; 'application/x-stuffit',
                164 =&gt; 'application/x-sv4cpio',
                165 =&gt; 'application/x-sv4crc',
                166 =&gt; 'application/x-tar',
                167 =&gt; 'application/x-tcl',
                168 =&gt; 'application/x-tex-gf',
                169 =&gt; 'application/x-tex-pk',
                170 =&gt; 'application/x-texinfo',
                171 =&gt; 'application/x-trash',
                172 =&gt; 'application/x-troff',
                173 =&gt; 'application/x-troff-man',
                174 =&gt; 'application/x-troff-me',
                175 =&gt; 'application/x-troff-ms',
                176 =&gt; 'application/x-ustar',
                177 =&gt; 'application/x-wais-source',
                178 =&gt; 'application/x-wingz',
                179 =&gt; 'application/x-x509-ca-cert',
                180 =&gt; 'application/x-xcf',
                181 =&gt; 'application/x-xfig',
                182 =&gt; 'application/x-xpinstall',
                183 =&gt; 'application/xhtml+xml',
                184 =&gt; 'application/xml',
                185 =&gt; 'application/zip',
                186 =&gt; 'audio/basic',
                187 =&gt; 'audio/midi',
                346 =&gt; 'audio/mp4',
                188 =&gt; 'audio/mpeg',
                189 =&gt; 'audio/ogg',
                190 =&gt; 'audio/prs.sid',
                191 =&gt; 'audio/x-aiff',
                192 =&gt; 'audio/x-gsm',
                193 =&gt; 'audio/x-mpegurl',
                194 =&gt; 'audio/x-ms-wax',
                195 =&gt; 'audio/x-ms-wma',
                196 =&gt; 'audio/x-pn-realaudio',
                197 =&gt; 'audio/x-realaudio',
                198 =&gt; 'audio/x-scpls',
                199 =&gt; 'audio/x-sd2',
                200 =&gt; 'audio/x-wav',
                201 =&gt; 'chemical/x-alchemy',
                202 =&gt; 'chemical/x-cache',
                203 =&gt; 'chemical/x-cache-csf',
                204 =&gt; 'chemical/x-cactvs-binary',
                205 =&gt; 'chemical/x-cdx',
                206 =&gt; 'chemical/x-cerius',
                207 =&gt; 'chemical/x-chem3d',
                208 =&gt; 'chemical/x-chemdraw',
                209 =&gt; 'chemical/x-cif',
                210 =&gt; 'chemical/x-cmdf',
                211 =&gt; 'chemical/x-cml',
                212 =&gt; 'chemical/x-compass',
                213 =&gt; 'chemical/x-crossfire',
                214 =&gt; 'chemical/x-csml',
                215 =&gt; 'chemical/x-ctx',
                216 =&gt; 'chemical/x-cxf',
                217 =&gt; 'chemical/x-embl-dl-nucleotide',
                218 =&gt; 'chemical/x-galactic-spc',
                219 =&gt; 'chemical/x-gamess-input',
                220 =&gt; 'chemical/x-gaussian-checkpoint',
                221 =&gt; 'chemical/x-gaussian-cube',
                222 =&gt; 'chemical/x-gaussian-input',
                223 =&gt; 'chemical/x-gaussian-log',
                224 =&gt; 'chemical/x-gcg8-sequence',
                225 =&gt; 'chemical/x-genbank',
                226 =&gt; 'chemical/x-hin',
                227 =&gt; 'chemical/x-isostar',
                228 =&gt; 'chemical/x-jcamp-dx',
                229 =&gt; 'chemical/x-kinemage',
                230 =&gt; 'chemical/x-macmolecule',
                231 =&gt; 'chemical/x-macromodel-input',
                232 =&gt; 'chemical/x-mdl-molfile',
                233 =&gt; 'chemical/x-mdl-rdfile',
                234 =&gt; 'chemical/x-mdl-rxnfile',
                235 =&gt; 'chemical/x-mdl-sdfile',
                236 =&gt; 'chemical/x-mdl-tgf',
                237 =&gt; 'chemical/x-mmcif',
                238 =&gt; 'chemical/x-mol2',
                239 =&gt; 'chemical/x-molconn-Z',
                240 =&gt; 'chemical/x-mopac-graph',
                241 =&gt; 'chemical/x-mopac-input',
                242 =&gt; 'chemical/x-mopac-out',
                243 =&gt; 'chemical/x-mopac-vib',
                244 =&gt; 'chemical/x-ncbi-asn1-ascii',
                245 =&gt; 'chemical/x-ncbi-asn1-binary',
                246 =&gt; 'chemical/x-ncbi-asn1-spec',
                247 =&gt; 'chemical/x-pdb',
                248 =&gt; 'chemical/x-rosdal',
                249 =&gt; 'chemical/x-swissprot',
                250 =&gt; 'chemical/x-vamas-iso14976',
                251 =&gt; 'chemical/x-vmd',
                252 =&gt; 'chemical/x-xtel',
                253 =&gt; 'chemical/x-xyz',
                254 =&gt; 'image/gif',
                255 =&gt; 'image/ief',
                256 =&gt; 'image/jpeg',
                257 =&gt; 'image/pcx',
                258 =&gt; 'image/png',
                259 =&gt; 'image/svg+xml',
                260 =&gt; 'image/tiff',
                261 =&gt; 'image/vnd.djvu',
                262 =&gt; 'image/vnd.microsoft.icon',
                263 =&gt; 'image/vnd.wap.wbmp',
                264 =&gt; 'image/x-cmu-raster',
                265 =&gt; 'image/x-coreldraw',
                266 =&gt; 'image/x-coreldrawpattern',
                267 =&gt; 'image/x-coreldrawtemplate',
                268 =&gt; 'image/x-corelphotopaint',
                269 =&gt; 'image/x-jg',
                270 =&gt; 'image/x-jng',
                271 =&gt; 'image/x-ms-bmp',
                272 =&gt; 'image/x-photoshop',
                273 =&gt; 'image/x-portable-anymap',
                274 =&gt; 'image/x-portable-bitmap',
                275 =&gt; 'image/x-portable-graymap',
                276 =&gt; 'image/x-portable-pixmap',
                277 =&gt; 'image/x-rgb',
                278 =&gt; 'image/x-xbitmap',
                279 =&gt; 'image/x-xpixmap',
                280 =&gt; 'image/x-xwindowdump',
                281 =&gt; 'message/rfc822',
                282 =&gt; 'model/iges',
                283 =&gt; 'model/mesh',
                284 =&gt; 'model/vrml',
                285 =&gt; 'text/calendar',
                286 =&gt; 'text/css',
                287 =&gt; 'text/csv',
                288 =&gt; 'text/h323',
                289 =&gt; 'text/html',
                290 =&gt; 'text/iuls',
                291 =&gt; 'text/mathml',
                292 =&gt; 'text/plain',
                293 =&gt; 'text/richtext',
                294 =&gt; 'text/scriptlet',
                295 =&gt; 'text/tab-separated-values',
                296 =&gt; 'text/texmacs',
                297 =&gt; 'text/vnd.sun.j2me.app-descriptor',
                298 =&gt; 'text/vnd.wap.wml',
                299 =&gt; 'text/vnd.wap.wmlscript',
                300 =&gt; 'text/x-bibtex',
                301 =&gt; 'text/x-boo',
                302 =&gt; 'text/x-c++hdr',
                303 =&gt; 'text/x-c++src',
                304 =&gt; 'text/x-chdr',
                305 =&gt; 'text/x-component',
                306 =&gt; 'text/x-csh',
                307 =&gt; 'text/x-csrc',
                308 =&gt; 'text/x-diff',
                309 =&gt; 'text/x-dsrc',
                310 =&gt; 'text/x-haskell',
                311 =&gt; 'text/x-java',
                312 =&gt; 'text/x-literate-haskell',
                313 =&gt; 'text/x-moc',
                314 =&gt; 'text/x-pascal',
                315 =&gt; 'text/x-pcs-gcd',
                316 =&gt; 'text/x-perl',
                317 =&gt; 'text/x-python',
                318 =&gt; 'text/x-setext',
                319 =&gt; 'text/x-sh',
                320 =&gt; 'text/x-tcl',
                321 =&gt; 'text/x-tex',
                322 =&gt; 'text/x-vcalendar',
                323 =&gt; 'text/x-vcard',
                324 =&gt; 'video/3gpp',
                325 =&gt; 'video/dl',
                326 =&gt; 'video/dv',
                327 =&gt; 'video/fli',
                328 =&gt; 'video/gl',
                329 =&gt; 'video/mp4',
                330 =&gt; 'video/mpeg',
                331 =&gt; 'video/ogg',
                332 =&gt; 'video/quicktime',
                333 =&gt; 'video/vnd.mpegurl',
                347 =&gt; 'video/x-flv',
                334 =&gt; 'video/x-la-asf',
                348 =&gt; 'video/x-m4v',
                335 =&gt; 'video/x-mng',
                336 =&gt; 'video/x-ms-asf',
                337 =&gt; 'video/x-ms-wm',
                338 =&gt; 'video/x-ms-wmv',
                339 =&gt; 'video/x-ms-wmx',
                340 =&gt; 'video/x-ms-wvx',
                341 =&gt; 'video/x-msvideo',
                342 =&gt; 'video/x-sgi-movie',
                343 =&gt; 'x-conference/x-cooltalk',
                344 =&gt; 'x-epoc/x-sisx-app',
                345 =&gt; 'x-world/x-vrml',
            ),
            // Extensions added to this list MUST be lower-case.
            'extensions' =&gt; array(
                'ez' =&gt; 0,
                'atom' =&gt; 1,
                'atomcat' =&gt; 2,
                'atomsrv' =&gt; 3,
                'cap' =&gt; 4,
                'pcap' =&gt; 4,
                'cu' =&gt; 5,
                'tsp' =&gt; 6,
                'hta' =&gt; 7,
                'jar' =&gt; 8,
                'ser' =&gt; 9,
                'class' =&gt; 10,
                'hqx' =&gt; 11,
                'nb' =&gt; 12,
                'mdb' =&gt; 13,
                'dot' =&gt; 14,
                'doc' =&gt; 14,
                'bin' =&gt; 15,
                'oda' =&gt; 16,
                'ogx' =&gt; 17,
                'pdf' =&gt; 18,
                'key' =&gt; 19,
                'pgp' =&gt; 20,
                'prf' =&gt; 21,
                'eps' =&gt; 22,
                'ai' =&gt; 22,
                'ps' =&gt; 22,
                'rar' =&gt; 23,
                'rdf' =&gt; 24,
                'rss' =&gt; 25,
                'rtf' =&gt; 26,
                'smi' =&gt; 27,
                'smil' =&gt; 27,
                'cdy' =&gt; 28,
                'kml' =&gt; 29,
                'kmz' =&gt; 30,
                'xul' =&gt; 31,
                'xlb' =&gt; 32,
                'xlt' =&gt; 32,
                'xls' =&gt; 32,
                'xlam' =&gt; 33,
                'xlsb' =&gt; 34,
                'xlsm' =&gt; 35,
                'xltm' =&gt; 36,
                'cat' =&gt; 37,
                'stl' =&gt; 38,
                'pps' =&gt; 39,
                'ppt' =&gt; 39,
                'ppam' =&gt; 40,
                'pptm' =&gt; 41,
                'ppsm' =&gt; 42,
                'potm' =&gt; 43,
                'docm' =&gt; 44,
                'dotm' =&gt; 45,
                'xps' =&gt; 46,
                'odc' =&gt; 47,
                'odb' =&gt; 48,
                'odf' =&gt; 49,
                'odg' =&gt; 50,
                'otg' =&gt; 51,
                'odi' =&gt; 52,
                'odp' =&gt; 53,
                'otp' =&gt; 54,
                'ods' =&gt; 55,
                'ots' =&gt; 56,
                'odt' =&gt; 57,
                'odm' =&gt; 58,
                'ott' =&gt; 59,
                'oth' =&gt; 60,
                'pptx' =&gt; 61,
                'ppsx' =&gt; 62,
                'potx' =&gt; 63,
                'xlsx' =&gt; 64,
                'xltx' =&gt; 65,
                'docx' =&gt; 66,
                'dotx' =&gt; 67,
                'cod' =&gt; 68,
                'mmf' =&gt; 69,
                'sdc' =&gt; 70,
                'sds' =&gt; 71,
                'sda' =&gt; 72,
                'sdd' =&gt; 73,
                'sdw' =&gt; 75,
                'sgl' =&gt; 76,
                'sxc' =&gt; 77,
                'stc' =&gt; 78,
                'sxd' =&gt; 79,
                'std' =&gt; 80,
                'sxi' =&gt; 81,
                'sti' =&gt; 82,
                'sxm' =&gt; 83,
                'sxw' =&gt; 84,
                'sxg' =&gt; 85,
                'stw' =&gt; 86,
                'sis' =&gt; 87,
                'vsd' =&gt; 88,
                'wbxml' =&gt; 89,
                'wmlc' =&gt; 90,
                'wmlsc' =&gt; 91,
                'wpd' =&gt; 92,
                'wp5' =&gt; 93,
                'wk' =&gt; 94,
                '7z' =&gt; 95,
                'abw' =&gt; 96,
                'dmg' =&gt; 97,
                'bcpio' =&gt; 98,
                'torrent' =&gt; 99,
                'cab' =&gt; 100,
                'cbr' =&gt; 101,
                'cbz' =&gt; 102,
                'cdf' =&gt; 103,
                'vcd' =&gt; 104,
                'pgn' =&gt; 105,
                'cpio' =&gt; 106,
                'udeb' =&gt; 107,
                'deb' =&gt; 107,
                'dir' =&gt; 108,
                'dxr' =&gt; 108,
                'dcr' =&gt; 108,
                'dms' =&gt; 109,
                'wad' =&gt; 110,
                'dvi' =&gt; 111,
                'flac' =&gt; 112,
                'pfa' =&gt; 113,
                'pfb' =&gt; 113,
                'pcf' =&gt; 113,
                'gsf' =&gt; 113,
                'pcf.z' =&gt; 113,
                'mm' =&gt; 114,
                'spl' =&gt; 115,
                'gnumeric' =&gt; 116,
                'sgf' =&gt; 117,
                'gcf' =&gt; 118,
                'taz' =&gt; 119,
                'gtar' =&gt; 119,
                'tgz' =&gt; 119,
                'hdf' =&gt; 120,
                'rhtml' =&gt; 121,
                'phtml' =&gt; 122,
                'pht' =&gt; 122,
                'php' =&gt; 122,
                'phps' =&gt; 123,
                'php3' =&gt; 124,
                'php3p' =&gt; 125,
                'php4' =&gt; 126,
                'ica' =&gt; 127,
                'ins' =&gt; 128,
                'isp' =&gt; 128,
                'iii' =&gt; 129,
                'iso' =&gt; 130,
                'jnlp' =&gt; 131,
                'js' =&gt; 132,
                'jmz' =&gt; 133,
                'chrt' =&gt; 134,
                'kil' =&gt; 135,
                'skp' =&gt; 136,
                'skd' =&gt; 136,
                'skm' =&gt; 136,
                'skt' =&gt; 136,
                'kpr' =&gt; 137,
                'kpt' =&gt; 137,
                'ksp' =&gt; 138,
                'kwd' =&gt; 139,
                'kwt' =&gt; 139,
                'latex' =&gt; 140,
                'lha' =&gt; 141,
                'lyx' =&gt; 142,
                'lzh' =&gt; 143,
                'lzx' =&gt; 144,
                'maker' =&gt; 145,
                'frm' =&gt; 145,
                'frame' =&gt; 145,
                'fm' =&gt; 145,
                'book' =&gt; 145,
                'fb' =&gt; 145,
                'fbdoc' =&gt; 145,
                'mif' =&gt; 146,
                'wmd' =&gt; 147,
                'wmz' =&gt; 148,
                'dll' =&gt; 149,
                'bat' =&gt; 149,
                'exe' =&gt; 149,
                'com' =&gt; 149,
                'msi' =&gt; 150,
                'nc' =&gt; 151,
                'pac' =&gt; 152,
                'nwc' =&gt; 153,
                'o' =&gt; 154,
                'oza' =&gt; 155,
                'p7r' =&gt; 156,
                'crl' =&gt; 157,
                'pyo' =&gt; 158,
                'pyc' =&gt; 158,
                'qtl' =&gt; 159,
                'rpm' =&gt; 160,
                'shar' =&gt; 161,
                'swf' =&gt; 162,
                'swfl' =&gt; 162,
                'sitx' =&gt; 163,
                'sit' =&gt; 163,
                'sv4cpio' =&gt; 164,
                'sv4crc' =&gt; 165,
                'tar' =&gt; 166,
                'gf' =&gt; 168,
                'pk' =&gt; 169,
                'texi' =&gt; 170,
                'texinfo' =&gt; 170,
                'sik' =&gt; 171,
                '~' =&gt; 171,
                'bak' =&gt; 171,
                '%' =&gt; 171,
                'old' =&gt; 171,
                't' =&gt; 172,
                'roff' =&gt; 172,
                'tr' =&gt; 172,
                'man' =&gt; 173,
                'me' =&gt; 174,
                'ms' =&gt; 175,
                'ustar' =&gt; 176,
                'src' =&gt; 177,
                'wz' =&gt; 178,
                'crt' =&gt; 179,
                'xcf' =&gt; 180,
                'fig' =&gt; 181,
                'xpi' =&gt; 182,
                'xht' =&gt; 183,
                'xhtml' =&gt; 183,
                'xml' =&gt; 184,
                'xsl' =&gt; 184,
                'zip' =&gt; 185,
                'au' =&gt; 186,
                'snd' =&gt; 186,
                'mid' =&gt; 187,
                'midi' =&gt; 187,
                'kar' =&gt; 187,
                'mpega' =&gt; 188,
                'mpga' =&gt; 188,
                'm4a' =&gt; 188,
                'mp3' =&gt; 188,
                'mp2' =&gt; 188,
                'ogg' =&gt; 189,
                'oga' =&gt; 189,
                'spx' =&gt; 189,
                'sid' =&gt; 190,
                'aif' =&gt; 191,
                'aiff' =&gt; 191,
                'aifc' =&gt; 191,
                'gsm' =&gt; 192,
                'm3u' =&gt; 193,
                'wax' =&gt; 194,
                'wma' =&gt; 195,
                'rm' =&gt; 196,
                'ram' =&gt; 196,
                'ra' =&gt; 197,
                'pls' =&gt; 198,
                'sd2' =&gt; 199,
                'wav' =&gt; 200,
                'alc' =&gt; 201,
                'cac' =&gt; 202,
                'cache' =&gt; 202,
                'csf' =&gt; 203,
                'cascii' =&gt; 204,
                'cbin' =&gt; 204,
                'ctab' =&gt; 204,
                'cdx' =&gt; 205,
                'cer' =&gt; 206,
                'c3d' =&gt; 207,
                'chm' =&gt; 208,
                'cif' =&gt; 209,
                'cmdf' =&gt; 210,
                'cml' =&gt; 211,
                'cpa' =&gt; 212,
                'bsd' =&gt; 213,
                'csml' =&gt; 214,
                'csm' =&gt; 214,
                'ctx' =&gt; 215,
                'cxf' =&gt; 216,
                'cef' =&gt; 216,
                'emb' =&gt; 217,
                'embl' =&gt; 217,
                'spc' =&gt; 218,
                'gam' =&gt; 219,
                'inp' =&gt; 219,
                'gamin' =&gt; 219,
                'fchk' =&gt; 220,
                'fch' =&gt; 220,
                'cub' =&gt; 221,
                'gau' =&gt; 222,
                'gjf' =&gt; 222,
                'gjc' =&gt; 222,
                'gal' =&gt; 223,
                'gcg' =&gt; 224,
                'gen' =&gt; 225,
                'hin' =&gt; 226,
                'istr' =&gt; 227,
                'ist' =&gt; 227,
                'dx' =&gt; 228,
                'jdx' =&gt; 228,
                'kin' =&gt; 229,
                'mcm' =&gt; 230,
                'mmd' =&gt; 231,
                'mmod' =&gt; 231,
                'mol' =&gt; 232,
                'rd' =&gt; 233,
                'rxn' =&gt; 234,
                'sdf' =&gt; 235,
                'sd' =&gt; 235,
                'tgf' =&gt; 236,
                'mcif' =&gt; 237,
                'mol2' =&gt; 238,
                'b' =&gt; 239,
                'gpt' =&gt; 240,
                'mopcrt' =&gt; 241,
                'zmt' =&gt; 241,
                'mpc' =&gt; 241,
                'dat' =&gt; 241,
                'mop' =&gt; 241,
                'moo' =&gt; 242,
                'mvb' =&gt; 243,
                'prt' =&gt; 244,
                'aso' =&gt; 245,
                'val' =&gt; 245,
                'asn' =&gt; 246,
                'ent' =&gt; 247,
                'pdb' =&gt; 247,
                'ros' =&gt; 248,
                'sw' =&gt; 249,
                'vms' =&gt; 250,
                'vmd' =&gt; 251,
                'xtel' =&gt; 252,
                'xyz' =&gt; 253,
                'gif' =&gt; 254,
                'ief' =&gt; 255,
                'jpeg' =&gt; 256,
                'jpe' =&gt; 256,
                'jpg' =&gt; 256,
                'pcx' =&gt; 257,
                'png' =&gt; 258,
                'svgz' =&gt; 259,
                'svg' =&gt; 259,
                'tif' =&gt; 260,
                'tiff' =&gt; 260,
                'djvu' =&gt; 261,
                'djv' =&gt; 261,
                'ico' =&gt; 262,
                'wbmp' =&gt; 263,
                'ras' =&gt; 264,
                'cdr' =&gt; 265,
                'pat' =&gt; 266,
                'cdt' =&gt; 267,
                'cpt' =&gt; 268,
                'art' =&gt; 269,
                'jng' =&gt; 270,
                'bmp' =&gt; 271,
                'psd' =&gt; 272,
                'pnm' =&gt; 273,
                'pbm' =&gt; 274,
                'pgm' =&gt; 275,
                'ppm' =&gt; 276,
                'rgb' =&gt; 277,
                'xbm' =&gt; 278,
                'xpm' =&gt; 279,
                'xwd' =&gt; 280,
                'eml' =&gt; 281,
                'igs' =&gt; 282,
                'iges' =&gt; 282,
                'silo' =&gt; 283,
                'msh' =&gt; 283,
                'mesh' =&gt; 283,
                'icz' =&gt; 285,
                'ics' =&gt; 285,
                'css' =&gt; 286,
                'csv' =&gt; 287,
                '323' =&gt; 288,
                'html' =&gt; 289,
                'htm' =&gt; 289,
                'shtml' =&gt; 289,
                'uls' =&gt; 290,
                'mml' =&gt; 291,
                'txt' =&gt; 292,
                'pot' =&gt; 292,
                'text' =&gt; 292,
                'asc' =&gt; 292,
                'rtx' =&gt; 293,
                'wsc' =&gt; 294,
                'sct' =&gt; 294,
                'tsv' =&gt; 295,
                'ts' =&gt; 296,
                'tm' =&gt; 296,
                'jad' =&gt; 297,
                'wml' =&gt; 298,
                'wmls' =&gt; 299,
                'bib' =&gt; 300,
                'boo' =&gt; 301,
                'hpp' =&gt; 302,
                'hh' =&gt; 302,
                'h++' =&gt; 302,
                'hxx' =&gt; 302,
                'cxx' =&gt; 303,
                'cc' =&gt; 303,
                'cpp' =&gt; 303,
                'c++' =&gt; 303,
                'h' =&gt; 304,
                'htc' =&gt; 305,
                'csh' =&gt; 306,
                'c' =&gt; 307,
                'patch' =&gt; 308,
                'diff' =&gt; 308,
                'd' =&gt; 309,
                'hs' =&gt; 310,
                'java' =&gt; 311,
                'lhs' =&gt; 312,
                'moc' =&gt; 313,
                'pas' =&gt; 314,
                'p' =&gt; 314,
                'gcd' =&gt; 315,
                'pm' =&gt; 316,
                'pl' =&gt; 316,
                'py' =&gt; 317,
                'etx' =&gt; 318,
                'sh' =&gt; 319,
                'tk' =&gt; 320,
                'tcl' =&gt; 320,
                'cls' =&gt; 321,
                'ltx' =&gt; 321,
                'sty' =&gt; 321,
                'tex' =&gt; 321,
                'vcs' =&gt; 322,
                'vcf' =&gt; 323,
                '3gp' =&gt; 324,
                'dl' =&gt; 325,
                'dif' =&gt; 326,
                'dv' =&gt; 326,
                'fli' =&gt; 327,
                'gl' =&gt; 328,
                'mp4' =&gt; 329,
                'f4v' =&gt; 329,
                'f4p' =&gt; 329,
                'mpe' =&gt; 330,
                'mpeg' =&gt; 330,
                'mpg' =&gt; 330,
                'ogv' =&gt; 331,
                'qt' =&gt; 332,
                'mov' =&gt; 332,
                'mxu' =&gt; 333,
                'lsf' =&gt; 334,
                'lsx' =&gt; 334,
                'mng' =&gt; 335,
                'asx' =&gt; 336,
                'asf' =&gt; 336,
                'wm' =&gt; 337,
                'wmv' =&gt; 338,
                'wmx' =&gt; 339,
                'wvx' =&gt; 340,
                'avi' =&gt; 341,
                'movie' =&gt; 342,
                'ice' =&gt; 343,
                'sisx' =&gt; 344,
                'wrl' =&gt; 345,
                'vrm' =&gt; 345,
                'vrml' =&gt; 345,
                'f4a' =&gt; 346,
                'f4b' =&gt; 346,
                'flv' =&gt; 347,
                'm4v' =&gt; 348,
            ),
        );
    }
}</pre>
<p>А вот пример работы с ним:</p>
<p><strong>Example.php</strong></p>
<pre class="brush: php">&lt;?php
// Init storage
/ ** @var ZendExtra_Cloud_StorageService_Adapter_WebDav $storage ** /
$storage = Zend_Cloud_StorageService_Factory::getAdapter(array(
Zend_Cloud_StorageService_Factory::STORAGE_ADAPTER_KEY =&gt; 'ZendExtra_Cloud_StorageService_Adapter_WebDav',
ZendExtra_Cloud_StorageService_Adapter_WebDav::SERVERS_KEY   =&gt; array(
'static1.site.ru' =&gt; array('host' =&gt; '1.2.3.4', 'port' =&gt; '80')
),
ZendExtra_Cloud_StorageService_Adapter_WebDav::DEFAULT_SERVER_KEY =&gt; 'static1.site.ru'
));
// Fetch item
$storage-&gt;fetchItem('/upload/news/c3500cc0c4892f3eda2ef3876af567dd.png');
// Store Item
$data = file_get_contents(ROOT_PATH. '/utils/upload_test.txt');
$storage-&gt;storeItem('/upload/upload_test.txt', $data);
// Delete item
$storage-&gt;deleteItem('/upload/upload_test.txt');
// Copy item (first - without loading item toi client, second - with it)
$storage-&gt;copyItem('/upload/upload_test.txt', '/upload/upload_test2.txt');
$storage-&gt;copyItem('/upload/upload_test.txt', '/upload/upload_test2.txt', array('native' =&gt; false));
// Move item (first - without loading item toi client, second - with it)
$storage-&gt;moveItem('/upload/upload_test.txt', '/upload/upload_test3.txt');
$storage-&gt;moveItem('/upload/upload_test3.txt', '/upload/upload_test.txt', array('native' =&gt; false));
// Rename item (first - without loading item toi client, second - with it)
$storage-&gt;renameItem('/upload/upload_test.txt', 'upload_test2.txt');
$storage-&gt;renameItem('/upload/upload_test2.txt', 'upload_test.txt', array('native' =&gt; false));
// Directory listing (if in nginx allow)
var_dump($storage-&gt;listItems('/upload/'));</pre>
<h3>Фишки</h3>
<ul>
<li>Листинг директорий сделан двумя видами. Если вы скомпилили nginx с модулем <a rel="nofollow" href="http://tokarchuk.ru/goto/https://github.com/arut/nginx-dav-ext-module" >nginx-dav-ext-module</a> и он поддерживает методы PROPFIND и OPTIONS то юзайте обычный синтаксис. Это подходит и для сторонних служб, типа Яндекс-Диска. Если же модуля нет, то в массиве options передавайте параметр &#171;mode&#187; =&gt; &#8216;get&#8217; и адаптер будет парсить ответ от nginx, полученный по get запросу. Отсюда зависимость от Zend_Dom</li>
<li>По-умолчанию такие операции, как копирование, перемещение и переименование осуществляются прямо на сервере (без загрузки файлов клиенту). Это быстро и удобно. Однако может возникнуть ситуация, когда команды MOVE и COPY выключены в nginx. Тогда используйте параметр native =&gt; true, В массиве options функций moveItem(), renameItem(), copyItem().</li>
<li>Пока не уверен где писать логику выбора сервера в случае наличия кластера из статических серверов. На данный момент она будет в адаптере но я раздумываю о том, чтобы вынести её. В этом случае адаптер будет работать с одним сервером, а не с многими, как сейчас.</li>
</ul>
<h3>Исходники</h3>
<p>Исходникик доступны на GitHub:</p>
<p><a rel="nofollow" href="http://tokarchuk.ru/goto/https://github.com/netandreus/exlibris/tree/master/application/lib/ZendExtra/Cloud/StorageService/Adapter" >https://github.com/netandreus/exlibris/tree/master/application/lib/ZendExtra/Cloud/StorageService/Adapter</a></p>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/yandex_disk.jpg" ><img class="aligncenter size-full wp-image-3552" title="yandex_disk" src="http://tokarchuk.ru/wp-content/uploads/2012/04/yandex_disk.jpg" alt="" width="304" height="208" /></a></p>
<h3>Яндекс-Диск клиент для Zend Framework</h3>
<p>В клиенте реализована поддержка Яндекс-Диска (да в принципе и любого другого сервиса с авторизацией). Вот небольшой примерчик работы с ним.</p>
<p><strong>yandexDiskExample.php</strong></p>
<p>&lt;?php</p>
<p>// Init storage / ** @var ZendExtra_Cloud_StorageService_Adapter_WebDav $storage ** / $storage = Zend_Cloud_StorageService_Factory::getAdapter(array( Zend_Cloud_StorageService_Factory::STORAGE_ADAPTER_KEY =&gt; &#8216;ZendExtra_Cloud_StorageService_Adapter_WebDav&#8217;, ZendExtra_Cloud_StorageService_Adapter_WebDav::SERVERS_KEY   =&gt; array( &#8216;static1.site.ru&#8217; =&gt; array(&#8216;host&#8217; =&gt; &#8216;webdav.yandex.ru&#8217;, &#8216;protocol&#8217; =&gt; &#8216;https&#8217;, &#8216;port&#8217; =&gt; &#8217;80&#8242;) ), ZendExtra_Cloud_StorageService_Adapter_WebDav::DEFAULT_SERVER_KEY =&gt; &#8216;static1.site.ru&#8217; ));</p>
<p>// Отображает список файлов в каталоге<br />
$files = $storage-&gt;listItems(&#8216;/testfolder/&#8217;);</p>
<p>&nbsp;</p>
<h3>Ссылки</h3>
<p><a rel="nofollow" href="http://tokarchuk.ru/goto/http://habrahabr.ru/post/127232/" >WebDav и Nginx</a></p>
<p><a rel="nofollow" href="http://tokarchuk.ru/goto/http://habrahabr.ru/post/130868/" >Хочется взять и расстрелять, или ликбез о том, почему не стоит использовать make install</a></p>
<p><a rel="nofollow" href="http://tokarchuk.ru/goto/http://zfconf.org.ua/conf-2010/topics/static-and-zend_file-starlook-experience/" >Хранение, обработка и отдача статики с использованием \Zend\File. Опыт социальной сети starlook.ru</a><br />
<a rel="nofollow" href="http://tokarchuk.ru/goto/http://framework.zend.com/manual/ru/zend.cloud.storageservice.html" >Zend_SimpleCloud</a><br />
<a rel="nofollow" href="http://tokarchuk.ru/goto/http://framework.zend.com/manual/en/zend.dom.query.html" >Zend_Dom_Query</a></p>
<p><span class="content"><span class="block" style="margin-left: 0px ! important;"><code class="plain">create_full_put_path on;</code></span></span></p>
<pre class="brush: bash;">PUT DELETE MKCOL COPY MOVE</pre>
<img src="http://feeds.feedburner.com/~r/tokarchuk/~4/TJWO0_zcVXU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tokarchuk.ru/2012/05/zend-cloud-webdav-yandex-disk/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://tokarchuk.ru/2012/05/zend-cloud-webdav-yandex-disk/</feedburner:origLink></item>
		<item>
		<title>Генерация PDF без PHP</title>
		<link>http://feedproxy.google.com/~r/tokarchuk/~3/NB867bxZDlI/</link>
		<comments>http://tokarchuk.ru/2012/05/generate-pdf-without-php/#comments</comments>
		<pubDate>Fri, 04 May 2012 11:29:33 +0000</pubDate>
		<dc:creator>Андрей Токарчук</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>

		<guid isPermaLink="false">http://tokarchuk.ru/?p=3625</guid>
		<description><![CDATA[В этом посте я расскажу, как быстро сгенерировать pdf файлы на основе данных из БД. При этом мы не будем использовать zf, php и другие технологии веб-разреботки. Мы даже не напишем ни строчки кода. &#160; Задача Имеется произвольная БД, в таблицах которой хранятся нужные нам данные. На основе этих данных нужно сгенерировать множество PDF-файлов. Есть [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F05%2Fgenerate-pdf-without-php%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F05%2Fgenerate-pdf-without-php%2F&amp;source=netandreus&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/05/pdf_logo.png" ><img class="alignleft  wp-image-3630" style="margin: 10px;" title="pdf_logo" src="http://tokarchuk.ru/wp-content/uploads/2012/05/pdf_logo-150x150.png" alt="" width="54" height="54" /></a>В этом посте я расскажу, как быстро сгенерировать pdf файлы на основе данных из БД. При этом мы не будем использовать zf, php и другие технологии веб-разреботки. Мы даже не напишем ни строчки кода.<span id="more-3625"></span></p>
<h3></h3>
<p>&nbsp;</p>
<h3>Задача</h3>
<p>Имеется произвольная БД, в таблицах которой хранятся нужные нам данные. На основе этих данных нужно сгенерировать множество PDF-файлов. Есть два пути. Первый путь &#8212; это подгружать данные в php, создавать объект pdf через одну из библиотек и генерировать их практически в ручном режиме.</p>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/05/pdf-split.png" ><img class="aligncenter size-full wp-image-3631" title="pdf-split" src="http://tokarchuk.ru/wp-content/uploads/2012/05/pdf-split.png" alt="" width="255" height="188" /></a></p>
<h3>Решение</h3>
<p>Я уже думал так и сделать, когда придумал второй способ. Схематично он выглядит так:</p>
<blockquote><p>MySQL -&gt; csv -&gt; xls &#8212;(слияние doc-шаблона с xls)&#8212;&gt; печать -&gt; doPdf -&gt; несколько pdf -&gt; слияние pdf в одну -&gt; расшепление pdf на по страницам -&gt; множество pdf-файлов</p></blockquote>
<p>По шагам это будет выглядеть так:</p>
<p>1. Экспортируем нашу таблицу с помощью PhpMyAdmin в csv формат</p>
<p>2. В Excel открываем csv и сохраняем его в xls. Первая строка = название колонок.</p>
<p>3. Ставим программку doPdf, которая позволит &#171;печатать&#187; из Word в Pdf файлы.</p>
<p>4. В Word создаём шаблон нашей будущей pdf-ки. Рисуем обрамление, фон и т.д.</p>
<p>5. С помошью мастера слияние (Сервис-&gt;Письма и рассылки-&gt;Слияние) подключаем наш xls файл как источник данных (т.н. список), фильтруем записи по полям, и готовим документ.</p>
<p>6. Сервис-&gt;Письма и рассылки-&gt;Показать панель инструментов слияния</p>
<p>7. На панели кликаем на иконку &#171;Слияние при печати&#187; и печатаем документы на принтере doPdf по частям (не более 100 страниц), а то если больше 100, то он генерит невалидную pdf. Если у вас меньше сотни, можете пропустить следующий шаг.</p>
<p>8. Генеримpdf для второй и n-ой сотни страниц (аналогично п.7.).</p>
<p>9. Делаем слияние получившихся pdf с помщью программы <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.fileguru.com/apps/pdf_splitter_and_merger_vertex_systems/freeware" >Vertex PDF Splitter and Merger 4.0</a> в один файл.</p>
<p>10. Делаем расшепление получившийся pdf с помощью программы <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.coolutils.com/ru/PDFSplitter" >CoolUtils PdfSplitte</a>r.</p>
<p>11. Всё готово.</p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/tokarchuk/~4/NB867bxZDlI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tokarchuk.ru/2012/05/generate-pdf-without-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://tokarchuk.ru/2012/05/generate-pdf-without-php/</feedburner:origLink></item>
		<item>
		<title>ATI Rage XL (rev 27) on Ubuntu 11.10</title>
		<link>http://feedproxy.google.com/~r/tokarchuk/~3/v4We-4MGzI0/</link>
		<comments>http://tokarchuk.ru/2012/05/ati-rage-xl-rev-27-on-ubuntu-11-10/#comments</comments>
		<pubDate>Wed, 02 May 2012 11:09:30 +0000</pubDate>
		<dc:creator>Андрей Токарчук</dc:creator>
				<category><![CDATA[Аппаратное обеспечение]]></category>

		<guid isPermaLink="false">http://tokarchuk.ru/?p=3446</guid>
		<description><![CDATA[В этом посте я расскажу об одной баге, связанной с установкой Ubuntu 11.10 на сервер. Решил проблемку с работой графики на ATI Rage XL, консольным режимом и настройкой сети. Проблема Итак, есть у меня сервер на базе Gygabyte GA-8IKXR и стоит в нём замечательно видео от ATI, а именно ATI Rage XL (rev 27). Раньше [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F05%2Fati-rage-xl-rev-27-on-ubuntu-11-10%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F05%2Fati-rage-xl-rev-27-on-ubuntu-11-10%2F&amp;source=netandreus&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>В этом посте я расскажу об одной баге, связанной с установкой Ubuntu 11.10 на сервер. Решил проблемку с работой графики на ATI Rage XL, консольным режимом и настройкой сети.</p>
<p><span id="more-3446"></span></p>
<h3>Проблема</h3>
<p>Итак, есть у меня сервер на базе Gygabyte GA-8IKXR и стоит в нём замечательно видео от ATI, а именно ATI Rage XL (rev 27). Раньше там стояла старая версия Ubuntu Server и решил я её обновить. Сервер у меня стоял а дата-центре и за несколько лет у него села батарейка на материнской плате. После замены батарейки, форматирования финтов я приступил к установке ОС. В качестве таковой я выбрал Ubuntu Server 11.10. После установки меня ожидал неприятный сюрприз &#8212; черный экран с надписью &#171;Out of range&#187;. Это печально, залесть в однопользовательский режим у меня не получилось, даже заставка выбора ядра не показывалась. Пришлось шаманить и искать рабочий вариант.</p>
<p>Я попробоал desktop-версию Ubuntu 11.10 и она установилась нормально. Отключил GUI dвот по <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.techienote.com/2012/01/disable-gui-boot-in-ubuntu-11-10.html" >этому руководству</a>, перезагрузился в консольный режим и ситуация повторилась &#8212; Out of rage. Хорошо, что к тому моменту я уже настроил ssh И смог подконнектиться к страдальцу.  Погуглив по сети я всё-таки нашел решение.</p>
<h3>Решение</h3>
<p>В файле <span style="font-family: 'Courier New';">/etc/initramfs-tools/modules </span>добавляем строку</p>
<div>
<pre dir="ltr">radeonfb</pre>
</div>
<p>В файле <span style="font-family: 'Courier New';">/etc/grub.d/00_header </span>aдобавляем строку</p>
<div>
<pre dir="ltr">set gfxpayload=keep</pre>
</div>
<p>сразу после:</p>
<div>
<pre dir="ltr">set gfxmode=${GRUB_GFXMODE}</pre>
</div>
<p>В файле <span style="font-family: 'Courier New';">/etc/default/grub </span>, устанавливаем переменную:</p>
<div>
<pre dir="ltr">GRUB_GFXMODE=1024x768x24</pre>
</div>
<p>Обновляем конфиги и перезугружаемся:</p>
<div>
<pre dir="ltr">sudo update-initramfs -u &amp;&amp; sudo update-grub &amp;&amp; sudo reboot</pre>
</div>
<p>После этого шаманства всё заработало <img src='http://tokarchuk.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h3>Выключаем NetworkManager</h3>
<pre>sudo mcedit /etc/NetworkManager/NetworkManager.conf</pre>
<p>Ставим там параметр managed в секуии [ifupdown] в положение true</p>
<p>Прописываем в файл</p>
<pre>sudo mcedit /etc/network/interfaces

параметры интерфейса</pre>
<pre>auto eth0
iface eth0 inet static
    address 192.168.0.104
    netmask 255.255.255.0
    broadcast 192.168.0.255
    gateway 192.168.0.1</pre>
<p>Перезагружаемся.</p>
<h3>Выключаем GUI на Ubuntu 11.10 desktop</h3>
<p>sudo apt-get update<br />
sudo apt-get install lightdm</p>
<p>Открываем /etc/default/grub и заменяем</p>
<pre>GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"</pre>
<p>на</p>
<pre>GRUB_CMDLINE_LINUX_DEFAULT="text"</pre>
<p>И комментируем там строчку</p>
<pre>#GRUB_HIDDEN_TIMEOUT=0</pre>
<p>Применяем изменения:</p>
<pre>sudo update-grub
sudo update-rc.d -f lightdm remove
sudo shutdown -r now</pre>
<h3>Ссылки</h3>
<p><a rel="nofollow" href="http://tokarchuk.ru/goto/http://ubuntuforums.org/showthread.php?t=1539055" >http://ubuntuforums.org/showthread.php?t=1539055</a></p>
<p><a rel="nofollow" href="http://tokarchuk.ru/goto/http://ubuntuforums.org/showthread.php?t=1430887" >http://ubuntuforums.org/showthread.php?t=1430887</a></p>
<p><a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.techienote.com/2012/01/disable-gui-boot-in-ubuntu-11-10.html" >http://www.techienote.com/2012/01/disable-gui-boot-in-ubuntu-11-10.html</a></p>
<img src="http://feeds.feedburner.com/~r/tokarchuk/~4/v4We-4MGzI0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tokarchuk.ru/2012/05/ati-rage-xl-rev-27-on-ubuntu-11-10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://tokarchuk.ru/2012/05/ati-rage-xl-rev-27-on-ubuntu-11-10/</feedburner:origLink></item>
		<item>
		<title>ZFConf 2012. Фотоотчёт.</title>
		<link>http://feedproxy.google.com/~r/tokarchuk/~3/AprKdGLp33g/</link>
		<comments>http://tokarchuk.ru/2012/04/zfconf-2012/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 06:12:09 +0000</pubDate>
		<dc:creator>Андрей Токарчук</dc:creator>
				<category><![CDATA[IT конференции]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://tokarchuk.ru/?p=3563</guid>
		<description><![CDATA[ZFConf. Уже в третий раз я побывал на конференции, посвящённой моему любимому фреймворку. География постоянно расширяется, Киев, Питер, теперь вот и Москва. Сейчас я понимаю, что конференция явно удалась. Мои впечатления &#8212; как всегда под катом.    Программа была интересной. В этот раз нас ожидал гость из Италии &#8212; Enrico Zimuel. Zend Framework 2, a [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F04%2Fzfconf-2012%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F04%2Fzfconf-2012%2F&amp;source=netandreus&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2011/05/zfconf2011.jpg" title="zfconf 2012" ><img class="alignleft  wp-image-1827" style="margin: 10px;" title="zfconf-2012" src="http://tokarchuk.ru/wp-content/uploads/2011/05/zfconf2011.jpg" alt="" width="69" height="50" /></a>ZFConf. Уже в третий раз я побывал на конференции, посвящённой моему любимому фреймворку. География постоянно расширяется, Киев, Питер, теперь вот и Москва. Сейчас я понимаю, что конференция явно удалась. Мои впечатления &#8212; как всегда под катом.<span id="more-3563"></span><br />
<br/><br />
<a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3021.jpg" ><img class="wp-image-3575 alignnone" title="IMG_3021" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3021.jpg" alt="" width="467" height="311" /></a></p>
<p style="text-align: left;"><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3022.jpg" ><img class="size-thumbnail wp-image-3576 alignnone" title="IMG_3022" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3022-150x150.jpg" alt="" width="150" height="150" /></a> <a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3026.jpg" ><img class="alignnone size-thumbnail wp-image-3577" title="IMG_3026" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3026-150x150.jpg" alt="" width="150" height="150" /></a> <a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3027.jpg" ><img class="alignnone size-thumbnail wp-image-3578" title="IMG_3027" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3027-150x150.jpg" alt="" width="150" height="150" /></a></p>
<p>Программа была интересной. В этот раз нас ожидал гость из Италии &#8212; Enrico Zimuel.</p>
<h3>Zend Framework 2, a quick start // Enrico Zimuel (ZF Core Team).</h3>
<p><strong style="display: block; margin: 12px 0 4px;"><object id="__sse12640779" width="425" height="355" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=enricozamuel-120422115649-phpapp01&amp;stripped_title=enrico-zamuel&amp;userName=netandreus" /><param name="allowscriptaccess" value="always" /><param name="allowfullscreen" value="true" /><embed id="__sse12640779" width="425" height="355" type="application/x-shockwave-flash" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=enricozamuel-120422115649-phpapp01&amp;stripped_title=enrico-zamuel&amp;userName=netandreus" allowFullScreen="true" allowScriptAccess="always" wmode="transparent" allowscriptaccess="always" allowfullscreen="true" /></object></strong></p>
<p>Энрико с 2008 года работает в Zend Technologies на должности Senior PHP Engeneer. В 2011 году он присоединился к Команде ZF Core Team. Занимается профессиональной разработкой с1996 года. Основаня сфера его интересов &#8212; веб-приложения, безопасность программ и криптография. Он является автором двух книг и множества статей в области безопасности, а также постоянным  докладчиком на конференциях. На ZFConf-2012 Энрико выступал с докладом про работу над новым ZF.</p>
<p>В докладе Энрике рассказал о том, что планируется в zf, что делается сейчас. Из зала было много вопросов:</p>
<p><strong><span style="color: #000000;">- Почему так долго продвигается работа над ZF2?</span></strong></p>
<p>- Мы не зависим от цикла релиза, как другие фреймворки. Мы хотим сделать по настоящему качественный код. Поверьте создать современный веб-фреймворк &#8212; задача не из простых.</p>
<p><strong><span style="color: #000000;">- Сколько всего человек работает над ZF?</span></strong></p>
<p>- Ну если считать официальных сотрудников, то их трое: я, Метью и Ральф.</p>
<p><strong><span style="color: #000000;">- А когда он будет готов?</span></strong></p>
<p>- Мы планируем сделать бекпорт <strong>Zend/Event/Manager в zf 1.12 к концу апреля, начале мая</strong>, а сам zf2 будет готов ориентировочно к концу лета. // Надеюсь он имел в виду лето 2012 <img src='http://tokarchuk.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Вообще в zf2 основная идея &#8212; переход к событийно-ориентированной архитектуре. События, коллбеки &#8212; именно так будет построен роутинг в новом zf.</p>
<h3>Code Generation и Scaffolding в Zend Framework 2 // Виктор Фараздаги</h3>
<p>&nbsp;</p>
<div id="__ss_12640867" style="width: 425px;"><object id="__sse12640867" width="425" height="355" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=viktorfarazdagi-120422120712-phpapp01&amp;stripped_title=viktor-farazdagi&amp;userName=netandreus" /><param name="allowscriptaccess" value="always" /><param name="allowfullscreen" value="true" /><embed id="__sse12640867" width="425" height="355" type="application/x-shockwave-flash" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=viktorfarazdagi-120422120712-phpapp01&amp;stripped_title=viktor-farazdagi&amp;userName=netandreus" allowFullScreen="true" allowScriptAccess="always" wmode="transparent" allowscriptaccess="always" allowfullscreen="true" /></object></div>
<p>Виктор Фараздаги является разработчиком компании Simple Square, а также мейнтейнером и контрибьютором компонентов ZF2. Он разработал такой проект, как Phing. Кроме того, он является автором небезызвестного подкаста zftalk.dev</p>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3073.jpg" ><img class="alignnone size-thumbnail wp-image-3581" title="IMG_3073" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3073-150x150.jpg" alt="" width="150" height="150" /></a>  <a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3093.jpg" ><img class="alignnone size-thumbnail wp-image-3583" title="IMG_3093" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3093-150x150.jpg" alt="" width="150" height="150" /></a><br />
Вообще тема кодогенерации и метапрограммирования &#8212; довольно актуальная. Основная идея в том, что наша работа большей частью представляет собой скучную рутину, написать очередной экшен для контроллера чего-нибудь, проверить данные, записать в модель. Но ведь всё это можно автоматизировать? Написать программу, которая сгенерит эти экшены за нас? Эдакая кнлпка &#171;работать&#187;, нажимаешь &#8212; и всё работает. На самом деле идея неплоха, и у неё есть свои сферы применения. Я бы выделил прежде всего скаффолдинг и создание прототипов приложений. Иногда бывает так, что нам важно быстро сделать рабочий прототип, а потом уже допиливать его. На фоне стартап-мании это становится основной мотивацией для использования кодогенераторов. Вот и в том же Rails есть генераторы ruby кода. Короче как всегда, если есть подходящаа задача -юзаем. У разработчиков даже была идея генерить код не только на PHP, но и на других языках, например на Java. Но use-case для этого они придумать так и не смогли <img src='http://tokarchuk.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h3>Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL // Александр Веремьев</h3>
<div id="__ss_12641050" style="width: 425px;"><object id="__sse12641050" width="425" height="355" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=alexanderveremiev-120422122955-phpapp02&amp;stripped_title=alexander-veremiev&amp;userName=netandreus" /><param name="allowscriptaccess" value="always" /><param name="allowfullscreen" value="true" /><embed id="__sse12641050" width="425" height="355" type="application/x-shockwave-flash" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=alexanderveremiev-120422122955-phpapp02&amp;stripped_title=alexander-veremiev&amp;userName=netandreus" allowFullScreen="true" allowScriptAccess="always" wmode="transparent" allowscriptaccess="always" allowfullscreen="true" /></object></div>
<p>Александр Веремьев является отдим из самых активных контрибьюторов в ZF1/2 и автором таких компонентов, как Zend_Pdf и Zend_Search_Lucene. Доклад был довольно спорный. Идея Embedded SQL в том, что язык SQL встаивается в целевой язык программирования, например PHP, что выглядит примерно так:</p>
<pre class="brush: php">&lt;?php
$d = 1;
EXEC SQL
SELECT a,b,c INTO :vara, :varb, :varc FROM table WHERE d = :d;
printf ("Found vara = %s, varb = %s, varc = %s", $vara, $varb, $varc");

// another example with a cursor:
EXEC SQL
DECLARE mycursor FOR SELECT a,b,c FROM table WHERE d IS NULL;
...
EXEC SQL OPEN mycursor;
EXEC SQL FETCH mycursor INTO :vara, :varb, :varc;

if ($vara == "foo") {
more php code
}</pre>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3113.jpg" ><img class="alignnone size-thumbnail wp-image-3584" title="IMG_3113" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3113-150x150.jpg" alt="" width="150" height="150" /></a> <a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3120.jpg" ><img class="alignnone size-thumbnail wp-image-3585" title="IMG_3120" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3120-150x150.jpg" alt="" width="150" height="150" /></a> <a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3138.jpg" ><img class="alignnone size-thumbnail wp-image-3586" title="IMG_3138" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3138-150x150.jpg" alt="" width="150" height="150" /></a></p>
<p>По мне так весьма спорный подход. Ведь раньше SQL выполняли запросы вручную, формируя их как строки, потом стали использовать Query Builder&#8217;ы подобным Zend_Db, ну а после выяснилось, что очень удобно пользоваться ORM системами. Тут же предлагается вспомнить былые времена.</p>
<p>Не исключаю, что на каких-то задачах такой подход может быть эффективным, особенно учитывая прекомпиляцию, но это однозначно не мой выбор.</p>
<h3>Проектирование архитектуры, внедрение и организация процесса разработки на примере собственного проекта на основе ZF // Антон Великанов</h3>
<div id="__ss_12640950" style="width: 425px;"><object id="__sse12640950" width="425" height="355" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=antonvelikanov-120422121804-phpapp01&amp;stripped_title=anton-velikanov&amp;userName=netandreus" /><param name="allowscriptaccess" value="always" /><param name="allowfullscreen" value="true" /><embed id="__sse12640950" width="425" height="355" type="application/x-shockwave-flash" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=antonvelikanov-120422121804-phpapp01&amp;stripped_title=anton-velikanov&amp;userName=netandreus" allowFullScreen="true" allowScriptAccess="always" wmode="transparent" allowscriptaccess="always" allowfullscreen="true" /></object></div>
<p>Следующий интересный доклад был от Антона Великанова. Антон является автором таких проектов, как SandSign.com, PropHop.com и МыЕдем. Этот доклад был скорее в форме презентации стартапа, даже стартапов. И для разнообразия это было не плохо. Антон рассказал нам о том, что привело его к созданию своих проектов, и как ему кодилось в Коста-Рике. Идея создать сервис, удалённого фотографирования надписей на песке (с их заказом) действительно новая. Были очень рады послушать такого позитивного человека и пожеали ему всяческих успехов. Это лишний раз доказывает, что в наше время можно найти свою нишу&#8230; или создать её! <img src='http://tokarchuk.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3162.jpg" ><img class="alignnone size-medium wp-image-3587" title="IMG_3162" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3162-300x199.jpg" alt="" width="300" height="199" /></a></p>
<h3>Capistano Для деплоймента PHP-приложений // Роман Лапин</h3>
<p><object id="__sse12640882" width="425" height="355" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=romanlapin-120422120948-phpapp02&amp;stripped_title=roman-lapin&amp;userName=netandreus" /><param name="allowscriptaccess" value="always" /><param name="allowfullscreen" value="true" /><embed id="__sse12640882" width="425" height="355" type="application/x-shockwave-flash" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=romanlapin-120422120948-phpapp02&amp;stripped_title=roman-lapin&amp;userName=netandreus" allowFullScreen="true" allowScriptAccess="always" wmode="transparent" allowscriptaccess="always" allowfullscreen="true" /></object></p>
<p>Проблема деплоя приложений стоит всегда. Но одно дело, когда деплоить надо на один сервер, другое дело, когда их тысячи. Тут уже волей-неволей приходится задумываться о том, как сделать всё быстро и чётко. В докладе рассматривалось средство деплоя, которое пришло к нам из мира Ruby &#8212; Capystano. Особенно порадовала команда для деплой &#171;cap deploy&#187;, в стиле &#171;Кэп, ну задеплой давай!&#187;. При деплое также нельзя забывать, что на время деплоя надо переключить сайт в режим &#171;на профилактике&#187;, об этом автор также рассказал в докладе. Впечатления &#8212; исключительно положительные. Ранее я использовал TeamCity, скоро, думаю, тоже встанет пробелма выбора средства развертывания. Буду смотреть в сторону Capistano.</p>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3165.jpg" ><img class="alignnone size-thumbnail wp-image-3588" title="IMG_3165" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3165-150x150.jpg" alt="" width="150" height="150" /></a> <a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3189.jpg" ><img class="alignnone size-thumbnail wp-image-3589" title="IMG_3189" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3189-150x150.jpg" alt="" width="150" height="150" /></a> <a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3191.jpg" ><img class="alignnone size-thumbnail wp-image-3590" title="IMG_3191" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3191-150x150.jpg" alt="" width="150" height="150" /></a></p>
<h3>Распределённые сетевые приложения с Zend Framework 2 И ZeroMQ // Алексей Качаев</h3>
<div id="__ss_12640993" style="width: 425px;"><object id="__sse12640993" width="425" height="355" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=alexeykachaev-120422122454-phpapp02&amp;stripped_title=alexey-kachaev&amp;userName=netandreus" /><param name="allowscriptaccess" value="always" /><param name="allowfullscreen" value="true" /><embed id="__sse12640993" width="425" height="355" type="application/x-shockwave-flash" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=alexeykachaev-120422122454-phpapp02&amp;stripped_title=alexey-kachaev&amp;userName=netandreus" allowFullScreen="true" allowScriptAccess="always" wmode="transparent" allowscriptaccess="always" allowfullscreen="true" /></object></div>
<p>Этот доклад был безусловно гвоздём программы. Со времени оглашения списка докладов именно Алексея мне хотелось послушать больше всего. Распределённые приложения довольно интересная тема. Но для построения распределённой системы всегда надо выбирать платформу. Когда обычное веб-приложение не справляется, то мы ставим Gearman. Когда не справляется Gearman &#8212; ставим RabbitMQ, а уж когда падает и он &#8212; на передний план выходит ZeroMQ. Алексей подробно рассказал про паттерны распределённых приложений, ви о практическом их применении с использованием ZeroMQ. Доклад интересный, как появится видео &#8212; всем советую посмотреть. А пока вот вам <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.cs.wustl.edu/~schmidt/patterns-ace.html" >ссылочка</a> по мат.части. Особенно мне понравилась концепция &#171;device&#187; (составлено устройство, которая обслуживает &gt; 1 сокета ZeroMQ. Вообще накачал себе уже pdf&#8217;ок по теме, буду читать на досуге.</p>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3202.jpg" ><img class="alignnone size-thumbnail wp-image-3591" title="IMG_3202" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3202-150x150.jpg" alt="" width="150" height="150" /></a>  <a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3217.jpg" ><img class="alignnone size-thumbnail wp-image-3592" title="IMG_3217" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3217-150x150.jpg" alt="" width="150" height="150" /></a>  <a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3220.jpg" ><img class="alignnone size-thumbnail wp-image-3593" title="IMG_3220" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3220-150x150.jpg" alt="" width="150" height="150" /></a></p>
<p>Для управления куей воркеров, их запуска, массового рестарта и т.д. Алексец рекомендует использовать <a rel="nofollow" href="http://tokarchuk.ru/goto/http://supervisord.org/" >Supervisor</a>.</p>
<h3>Dependency Management в PHP и Zend Framework 2 // Кирилл Чебунин</h3>
<div id="__ss_12640905" style="width: 425px;"><object id="__sse12640905" width="425" height="355" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=kirillchebunin-120422121252-phpapp01&amp;stripped_title=kirill-chebunin&amp;userName=netandreus" /><param name="allowscriptaccess" value="always" /><param name="allowfullscreen" value="true" /><embed id="__sse12640905" width="425" height="355" type="application/x-shockwave-flash" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=kirillchebunin-120422121252-phpapp01&amp;stripped_title=kirill-chebunin&amp;userName=netandreus" allowFullScreen="true" allowScriptAccess="always" wmode="transparent" allowscriptaccess="always" allowfullscreen="true" /></object></div>
<p>ЧеБа рассказал о поиске пакетного менеджера для zf приложений, Composer и его использование. Надеюсь, что пройдёт время и у нас появится свой нормальный пакетный менеджер с единым репозитарием, из которого можно будет поставить что угодно. Да, это я ностальгирую по gem&#8217;ам из Ruby. Конечно есть PEAR и PECL, но там не всё так радужно.</p>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3298.jpg" ><img class="alignnone size-thumbnail wp-image-3595" title="IMG_3298" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3298-150x150.jpg" alt="" width="150" height="150" /></a>  <a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3297.jpg" ><img class="alignnone size-thumbnail wp-image-3596" title="IMG_3297" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3297-150x150.jpg" alt="" width="150" height="150" /></a></p>
<h3>Кэш без промахов средствами Zend Framework 2 // Евгений Шпилевский</h3>
<div id="__ss_12640919" style="width: 425px;"><object id="__sse12640919" width="425" height="355" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=evgeniychilevskiy-120422121451-phpapp02&amp;stripped_title=evgeniy-chilevskiy&amp;userName=netandreus" /><param name="allowscriptaccess" value="always" /><param name="allowfullscreen" value="true" /><embed id="__sse12640919" width="425" height="355" type="application/x-shockwave-flash" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=evgeniychilevskiy-120422121451-phpapp02&amp;stripped_title=evgeniy-chilevskiy&amp;userName=netandreus" allowFullScreen="true" allowScriptAccess="always" wmode="transparent" allowscriptaccess="always" allowfullscreen="true" /></object></div>
<p>Закрывал конференцию доклад про систему кэширования. Один из автором рассказывал, как организован кэш в ZF2.0 и в чём отличия от старой версии. Я в этот момент неожиданно увлёкся решением задачки с кэшированием и ресайзом картинок аватар пользователей, так что к сожалению прослушал половину. Кстати, нашел решение. А то наш админ жалуется, что в ФС у нас много одинаковых картинок с разныш хэшем. Но это тема уже другого поста&#8230;</p>
<h3>AfterParty</h3>
<p>Даже не знаю, что приятнее &#8212; сама кконференция или её отмечание, гордо именуемой нашими заокеанскими коллегами, как afterparty. Просто выложу фотки. Организаторам &#8212; спасибо, конференция однозначно удалась!</p>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3347.jpg" ><img class="alignnone  wp-image-3597" title="IMG_3347" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3347-1024x682.jpg" alt="" width="717" height="477" /></a></p>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3335.jpg" ><img class="alignnone size-thumbnail wp-image-3598" title="IMG_3335" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3335-150x150.jpg" alt="" width="150" height="150" /></a>  <a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3336.jpg" ><img class="alignnone size-thumbnail wp-image-3599" title="IMG_3336" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3336-150x150.jpg" alt="" width="150" height="150" /></a> <a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3337.jpg" ><img class="alignnone size-thumbnail wp-image-3600" title="IMG_3337" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3337-150x150.jpg" alt="" width="150" height="150" /></a> <a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3338.jpg" ><img class="alignnone size-thumbnail wp-image-3601" title="IMG_3338" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3338-150x150.jpg" alt="" width="150" height="150" /></a></p>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3339.jpg" ><img class="alignnone size-thumbnail wp-image-3602" title="IMG_3339" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3339-150x150.jpg" alt="" width="150" height="150" /></a>  <a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3340.jpg" ><img class="alignnone size-thumbnail wp-image-3603" title="IMG_3340" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3340-150x150.jpg" alt="" width="150" height="150" /></a>  <a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3342.jpg" ><img class="alignnone size-thumbnail wp-image-3604" title="IMG_3342" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3342-150x150.jpg" alt="" width="150" height="150" /></a>  <a href="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3346.jpg" ><img class="alignnone size-thumbnail wp-image-3605" title="IMG_3346" src="http://tokarchuk.ru/wp-content/uploads/2012/04/IMG_3346-150x150.jpg" alt="" width="150" height="150" /></a></p>
<img src="http://feeds.feedburner.com/~r/tokarchuk/~4/AprKdGLp33g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tokarchuk.ru/2012/04/zfconf-2012/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://tokarchuk.ru/2012/04/zfconf-2012/</feedburner:origLink></item>
		<item>
		<title>Высший замысел или моделезависимый реализм Стивена Хокинга</title>
		<link>http://feedproxy.google.com/~r/tokarchuk/~3/ZeujzDOu4ck/</link>
		<comments>http://tokarchuk.ru/2012/04/the-grand-design/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 04:13:22 +0000</pubDate>
		<dc:creator>Андрей Токарчук</dc:creator>
				<category><![CDATA[Мысли]]></category>

		<guid isPermaLink="false">http://tokarchuk.ru/?p=3493</guid>
		<description><![CDATA[Иногда я беру чашку чая, выхожу на балкон и думаю&#8230; Думаю неосознанно, а просто множества мыслей крутятся у меня в подсознании. События сегодняшнего дня, и прошлого, просмотренные фильмы, разговоры, прочитанные книги&#8230; &#160; На выходных случайно зайдя в магазин я увидел книгу Стивена Хокинга &#171;Высший замысел&#187;. Безусловно она привлекла меня именем автора, ну и красивой абстрактной [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F04%2Fthe-grand-design%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F04%2Fthe-grand-design%2F&amp;source=netandreus&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/eye.jpg" ><img class="alignleft  wp-image-3498" style="margin: 10px;" title="eye of the world" src="http://tokarchuk.ru/wp-content/uploads/2012/04/eye-150x150.jpg" alt="" width="54" height="54" /></a>Иногда я беру чашку чая, выхожу на балкон и думаю&#8230; Думаю неосознанно, а просто множества мыслей крутятся у меня в подсознании. События сегодняшнего дня, и прошлого, просмотренные фильмы, разговоры, прочитанные книги&#8230;</p>
<p>&nbsp;</p>
<p><span id="more-3493"></span><a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.ozon.ru/context/detail/id/8152975/?partner=tokarchuk" ><img class="alignleft size-full wp-image-3494" style="margin: 10px;" title="the_grand_design" src="http://tokarchuk.ru/wp-content/uploads/2012/04/the_grand_design.jpg" alt="" width="200" height="318" /></a></p>
<p>На выходных случайно зайдя в магазин я увидел книгу <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.ozon.ru/context/detail/id/8152975/?partner=tokarchuk" >Стивена Хокинга &#171;Высший замысел&#187;</a>. Безусловно она привлекла меня именем автора, ну и красивой абстрактной картинкой на обложке. Стивен Хокинг &#8212; учёный, физик-теоретик с мировым именем. Уже долгие годы парализован, из всего тела у него работает только одна лицевая мышца, и он написал книгу. Даже на знаю как. Ну да ладно, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://ru.wikipedia.org/wiki/%D0%A5%D0%BE%D0%BA%D0%B8%D0%BD%D0%B3,_%D0%A1%D1%82%D0%B8%D0%B2%D0%B5%D0%BD_%D0%A3%D0%B8%D0%BB%D1%8C%D1%8F%D0%BC" >биографию его</a> вы и так сможете прочитать если захотите.</p>
<p>В книге автор рассказывает нам о своей теории моделезависимого реализма. Коротко её можно обрисовать так. Реальности не существует. По той причине, что нельзя её полностью почувствовать. Человеческий мозг строит эмпирическую модель реальности, основанной на своих чувствах (зрение, обоняние и т.д.) и приспособлениях, конвертирующих неосязаемые воздействия (радиоволны) в осязаемые (звук). Так строится наша модель реальности.</p>
<p>Теория моделезависимого реализма проиллюстрирована на примере <a rel="nofollow" href="http://tokarchuk.ru/goto/http://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D1%8B%D1%82_%D0%AE%D0%BD%D0%B3%D0%B0" >опыта с двумя щелями</a>, аналогичный опыту Юнга, но с бакиболами (молекулы, похожие на микроскопические футбольные мячи, состоящие из атомов углерода). В эксперименте бакиболы пролетают сквозь две щели, а за ними стоит перегородка, на которой проявляется интерференционная картина. Самое интересное, что когда открывается вторая щель, то на определённых участках количество молекул увеличивается, а на некоторых <strong>уменьшается</strong>. Фактически были точки, куда бакиболы вообще не попадали, когда были открыты обе щели, но они попадали туда, если открытой оставалась лишь одна из них. Причиной этому была интерференция потока молекул. Участки, куда молекулы не попадали, соответствуют областям, в которых волны, исходящие из двух щелей, приходили в противофазе и создавали деструктивную интерференцию; участки же, куда попадало много молекул, соответствовали областям, которых волны достигали в одинаковой фазе и создавали конструктивную интерференцию.</p>
<p>Согласно квантовой физике, независимо от того, сколько информации мы получаем или сколь велики наши вычислительные способности, результаты физических процессов не могут быть предсказаны однозначно, потому что они не имеют однозначной <strong>определённости</strong>. Наоборот, учитывая данное начальное состояние системы, Природа определяет своё будущее состояние посредством процесса, который существенно неоднозначен. Иными словами, Природа не диктует результат какого-либо процесса или эксперимента даже в простейших ситуациях. Скорее, она предоставляет много различных возможностей, каждая из которых может реализоваться с той или иной степенью вероятности.</p>
<p>Согласно Ньютоновской физике (и согласно тому, как выглядел бы эксперимент, выполненный с футбольными мячами вместо молекул), каждая частица следует от источника к экрану по единственному, строго определённому маршруту. Эта картина лишена &#171;объезда&#187;, при котором частица на пути к цели могла бы посетить окрестности каждой из целей. Согласно же квантовой модели, частица считается не имеющей определённого положения в течении времени, пока она находится между начальной и кончной точками. Фейнман понял, что не нужно интерпретировать это так, будто частицы не имеют маршрута при своём перемещении от источника до экрана. Напротив, это может означать, что частицы следуют по <strong>всем</strong> возможным траекториям, соединяющим эти точки. Состояние обеих щелеё имеет значение, потому, что частицы летят не по единственной определённой траектории, а по всем возможным траекториям и делают это <strong>одновременно</strong>. Фейнман сформулировал математическое выражение (фейнмановскую сумму по историям), отражающее эту идею и воспроизводящее все законы квантовой механики.</p>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/hoking_device.png" ><img class="aligncenter size-full wp-image-3502" title="hoking_device" src="http://tokarchuk.ru/wp-content/uploads/2012/04/hoking_device.png" alt="" width="557" height="337" /></a></p>
<p>Применительно к двухщелевому эксперименту идеи Фейнмана означают, что частицы движутся по траекториям, проходящим только через левую щель, или только через правую; что частицы пролетевшие сквозь левую щель, возвращаются туда через правую, а потом снова пролетают через левую; что по пути домой они посещают ресторан, где подают замечательный шашлык с пивом, а потом делают несколько оборотов вокруг Марса; что все траектории частиц могут даже пролегать туда и обратно через всю Вселенную. По мнению Фейнмана, это объясняет, как частица получает информацию о том, которая из щелей открыта, &#8212; если щель открыта, частица проходит через неё.</p>
<p>Но это не всё. Дальше на страницах книги Хокинг говорит о том, что наблюдение влияет на сам эксперимент. Если направить свет на щели так, чтобы мы знали промежуточную точку, точку С &#8212; через которую прошла частица (информация &#171;который путь&#187;), то интерференционная картина на экране изменится. Поскольку Фейнман объяснил интерференционную картину тем, что траектории, проходящие через одну щель накладываются на траектории, проходящие, через другую щель, то если вы включите свет, чтобы определить, через какую щель проходят частицы, тем самым лишая их другой возможности, вы получите исчезновение интерференционной картины. И действительно, когда проводили эксперимент, включение света изменяло результаты. Т.е. результат зависиот от наблюдения.</p>
<p>Уилер лаже рассмотрел космическую версию этого эксперимента, в которой частицами являются фотоны, испускаемые мощными квазарами, находящимися на расстоянии в миллиарды световых лет. Такой свет мог бы разделиться на две траектории и снова сфокусироваться в нвправленной к Земле так называемым гравитационным линзированием с помощью промежуточной галактики. Хотя подобный эксперимент находится за пределами возможностей нынешних технологий, если бы мы смогли собрать достаточно фотонов от такого света, они должны были бы сложиться в интерференционный узор. Однако если мы установим измеряющее устройство для получения информации &#171;который путь&#187; неподалеку от экрана, интерференционная картина не возникнет. Выбор &#8212; двигаться по одной или двум траекториям &#8212; в этом случае был бы сделан миллиарды лет назад, ещё до того как образовалась Земля, а возможно, даже и само Солнце. И все же наши наблюдения в лаборатории окажут влияние на этот выбор.</p>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/hoking_device2.png" ><img class="aligncenter size-full wp-image-3501" title="hoking_device2" src="http://tokarchuk.ru/wp-content/uploads/2012/04/hoking_device2.png" alt="" width="603" height="426" /></a></p>
<p>Квантовая физика говорит нам, что независимо от того, насколько полно наше наблюдение за настоящим, ненаблюдаемое прошлое,  как и будущее, выглядит неопределённо и существует только как спектр возможностей. Согласно квантовой физике, Вселенная не имеет единственного прошлого, или единственной истории.</p>
<p>В моделезависимом реализме мы как раз таки осуществляем наблюдение, и строя модель влияем на &#171;реальность&#187;. Проведём параллель с психологией.  Так например, реализма (реалистического мировоззрения) с точки зрения квантовой механики вообще не может существовать, человек воспринимает не реальность, а модель реальности, соответственно понятие реализма &#8212; это абсурд. Оптимизм есть не что иное, как моделезависимый реализм с положительным подкреплением, а пессимизм &#8212; соответственно с отрицательным.</p>
<p>Один мой хороший друг, очень увлекается восточной культурой и тем, что называется <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.zelands.ru/" >трансерфинг реальности</a>. Есть много вариаций этой теории, но основная идея в ней как раз моделезависимые реализм с положительным подкреплением. Воспринимая (интерпретируя) реальность так как мы того хотим, мы меняем её. Меняем не только в своей системе координат (модель в мозгу), а меняем её &#171;реально&#187;. Мой друг склонен к оптимизму, и раньше я считал его необоснованным, т.к. он не имеет под собой &#171;реальных&#187; причин. Даже в неприятных ситуациях он не терял самообладания и искренне радовался жизни. Теперь, после прочтения книги Хокинга, я стал понимать его чуть-чуть лучше&#8230;</p>
<h3>Ссылки</h3>
<p><a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.ozon.ru/context/detail/id/8152975/?partner=tokarchuk" >Книга &#171;Высший замысел&#187; Стивена Хокинга</a><br />
<a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.ozon.ru/context/detail/id/8381539/?partner=tokarchuk" >Книга &#171;Трансерфинг реальности&#187; Вадима Зеланда</a><br />
<a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.zelands.ru/" >Сайт по трансерфингу реальности</a><br />
<a rel="nofollow" href="http://tokarchuk.ru/goto/http://depeople.ru/" >Сайт &#171;Управление собственной реальностью&#187;</a></p>
<img src="http://feeds.feedburner.com/~r/tokarchuk/~4/ZeujzDOu4ck" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tokarchuk.ru/2012/04/the-grand-design/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://tokarchuk.ru/2012/04/the-grand-design/</feedburner:origLink></item>
		<item>
		<title>ZFConf-2012. Конференция Zend Framework разработчиков.</title>
		<link>http://feedproxy.google.com/~r/tokarchuk/~3/M4TRUF9bjBo/</link>
		<comments>http://tokarchuk.ru/2012/04/zfconf-2012-announce/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 10:48:47 +0000</pubDate>
		<dc:creator>Андрей Токарчук</dc:creator>
				<category><![CDATA[IT конференции]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://tokarchuk.ru/?p=3539</guid>
		<description><![CDATA[Сейчас community веб-разработчиков выходит в реал. Общение из форумов и блогов потихоньку перетекает в кафешки бизнес-центров и залы конференций. В этом году пройдёт конференция Zend Framework разработчиков ZFConf-2012. Что же на ней будет? Читайте в анонсе. С тех пор, как я всерьез увлёкся Zend Framework&#8217;ом прошло довольно много времени. Я был свидетелем того, как он [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F04%2Fzfconf-2012-announce%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F04%2Fzfconf-2012-announce%2F&amp;source=netandreus&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.zfconf.ru/"  target="_blank"><img class="alignleft" style="margin: 10px;" src="http://www.zfconf.ru/images/logos/zfconf/logo_habr_friends_20120329.jpg" alt="" width="69" height="50" /></a>Сейчас community веб-разработчиков выходит в реал. Общение из форумов и блогов потихоньку перетекает в кафешки бизнес-центров и залы конференций. В этом году пройдёт конференция Zend Framework разработчиков ZFConf-2012. Что же на ней будет? Читайте в анонсе.</p>
<p><span id="more-3539"></span></p>
<p>С тех пор, как я всерьез увлёкся Zend Framework&#8217;ом прошло довольно много времени. Я был свидетелем того, как он развивался, рос и &#171;мужал&#187; на глазах. Всё начиналось с нобора классов, которых было тысячи на phpclasses, но благодаря чёткой идеологии и сообществу разработчиков, zf превратился в то, что есть сейчас. Не буду говорить о недостатках zf (а они есть) или разводить полемику, а что же лучше ZF или Symfony. Авторы и того и другого прекрасно знают ответ, лучшее &#8212; в синергетики. Так что смотрите на коммиты и делайте выводы сами. А я всегда буду следовать принципу <a href="http://tokarchuk.ru/2012/03/re-the-microphp-manifesto/" >инструмент под задачу</a>.</p>
<p>Всегда интересно узнавать новое, можно гуглить интернет, читать профильные блоги, но настоящего, всеобъемлющего исследование найти там вряд ли удасться. Сразу сделаю оговорку, что речь идёт о новых исследованиях. Конференция &#8212; это то место, где появляются новые знания. Вернее даже не появляются, а выносятся на суд общественности.  Именно это и побуждает меня ходить на конференции. Уже потом будут треды на форумах, флуд в комментах и книги.</p>
<h1><iframe src="http://www.youtube.com/embed/35RuvtFuOWw" frameborder="0" width="420" height="315"></iframe></h1>
<p>&nbsp;</p>
<p>Итак, на офсайте zfconf уже опубликован <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.zfconf.ru/2012/talks/"  target="_blank">список докладов</a> конференции а также открыта <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.zfconf.ru/2012/registration/"  target="_blank">финальная регистрация</a>. В этом году с докладом выступит гость из Италии — Enrico Zimuel из Zend Framework Core Team. А также Виктор Фараздаги, Александр Веремьев, Алексей Качаев и многие другие специалисты. С удовольствием послушаю их доклады, и узнаю, с какими задачами они столкнулись за последний год. Далее собственно список докладов.</p>
<h3><strong>Доклады ZFConf 2012</strong></h3>
<p>&nbsp;</p>
<p><strong><a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.zfconf.ru/2012/talks/zend-framework-2-a-quick-start/"  target="_blank">Zend Framework 2, a quick start</a><br />
</strong>Enrico Zimuel (<a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.zend.com/"  target="_blank">Zend Technologies</a>, Zend Framework Core Team)<br />
<strong><br />
<a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.zfconf.ru/2012/talks/code-generation-and-scaffolding-in-zend-framework-2/"  target="_blank">Code Generation и Scaffolding в Zend Framework 2</a><br />
</strong>Виктор Фараздаги (Simple Square, Senior Developer)<br />
<strong><br />
<a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.zfconf.ru/2012/talks/ibm-db2-embedded-sql-for-php-implementation/"  target="_blank">Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL</a><br />
</strong>Александр Веремьев (Zend Framework contributor)<br />
<strong><br />
<a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.zfconf.ru/2012/talks/distributed-network-applications-with-zend-framework-2-and-zeromq/"  target="_blank">Распределенные сетевые приложения c Zend Framework 2 и ZeroMQ</a><br />
</strong>Алексей Качаев (<a rel="nofollow" href="http://tokarchuk.ru/goto/http://cogniance.com/"  target="_blank">Сogniance</a>, Senior Software Engineer)<br />
<strong><br />
<a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.zfconf.ru/2012/talks/dependency-management-in-php-and-zend-framework-2/"  target="_blank">Dependency Management в PHP и Zend Framework 2</a><br />
</strong>Кирилл Чебунин (<a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.creara.ru/"  target="_blank">Creara</a>, Senior PHP Developer)<br />
<strong><br />
<a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.zfconf.ru/2012/talks/caching-without-misses-with-zend-framework-2/"  target="_blank">Кеш без промахов средствами Zend Framework 2</a><br />
</strong>Никита Грибалев (<a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.nival.com/"  target="_blank">Nival</a>, Lead PHP Developer)<br />
<strong><br />
<a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.zfconf.ru/2012/talks/architecture-design-implementation-and-organization-of-the-development-process-on-the-example-of-own-zend-framework-project/"  target="_blank">Проектирование архитектуры, внедрение и организация процесса разработки на примере собственного проекта на основе ZF</a><br />
</strong>Антон Великанов (<a rel="nofollow" href="http://tokarchuk.ru/goto/http://sandsign.ru/"  target="_blank">Sand Sign</a>, Founder&amp;CEO)<br />
<strong><br />
<a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.zfconf.ru/2012/talks/capistrano-for-deployment-php-applications/"  target="_blank">Capistrano для деплоймента PHP-приложений</a></strong><br />
Роман Лапин (<a rel="nofollow" href="http://tokarchuk.ru/goto/http://evercodelab.com/"  target="_blank">Evercode Lab</a>, Senior Developer)</p>
<p>К участию также приглашаются <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.zfconf.ru/2012/sponsors/"  target="_blank">спонсоры</a> и инфопартнеры. По всем предложениям и вопросам пишите, пожалуйста, через <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.zfconf.ru/contacts/"  target="_blank">форму обратной связи</a>.</p>
<p><strong>Следите за последними новостями:</strong></p>
<ul>
<li><strong>Хабраблог:</strong> <a rel="nofollow" href="http://tokarchuk.ru/goto/http://habr.ru/company/wizartech/blog/"  target="_blank">habr.ru/company/wizartech/blog/</a></li>
<li><strong>Facebook:</strong> <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.facebook.com/groups/143714275748061/"  target="_blank">facebook.com/groups/143714275748061/</a></li>
<li><strong>ВКонтакте:</strong> <a rel="nofollow" href="http://tokarchuk.ru/goto/http://vk.com/zfconf"  target="_blank">vk.com/zfconf</a></li>
<li><strong>RSS:</strong> <a rel="nofollow" href="http://tokarchuk.ru/goto/http://feeds.feedburner.com/zfconf"  target="_blank">feeds.feedburner.com/zfconf</a></li>
<li><strong>Twitter:</strong> <a rel="nofollow" href="http://tokarchuk.ru/goto/http://twitter.com/zfconf"  target="_blank">twitter.com/zfconf</a></li>
</ul>
<p><strong>Организатор:</strong> <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.wizartech.ru/"  target="_blank">компания Wizartech</a><br />
<strong>Партнеры:</strong> <a rel="nofollow" href="http://tokarchuk.ru/goto/http://zendframework.ru/"  target="_blank">сообщество Zend Framework</a> и <a rel="nofollow" href="http://tokarchuk.ru/goto/http://frameworksdays.com/"  target="_blank">конференция Frameworks Days</a></p>
<img src="http://feeds.feedburner.com/~r/tokarchuk/~4/M4TRUF9bjBo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tokarchuk.ru/2012/04/zfconf-2012-announce/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://tokarchuk.ru/2012/04/zfconf-2012-announce/</feedburner:origLink></item>
		<item>
		<title>DevConf 2012. Москва, Измайлово. Доклады от авторов PHP, MySQL, MongoDB.</title>
		<link>http://feedproxy.google.com/~r/tokarchuk/~3/GeRVDFj6tXY/</link>
		<comments>http://tokarchuk.ru/2012/04/devconf-2012-announce/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 07:17:03 +0000</pubDate>
		<dc:creator>Андрей Токарчук</dc:creator>
				<category><![CDATA[IT конференции]]></category>
		<category><![CDATA[devconf]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://tokarchuk.ru/?p=3464</guid>
		<description><![CDATA[Пожалуй одна из самых интересных конференций для разработчиков стартует в июне в Москве. Соберутся такие известные личности, как Дерик Ретанс (разработчик MongoDB),  David Soria Parra (разработчик php и git), Сергей Рыжиков (1С-Битрикс), Алексей Рыбак (Badoo.com), Андрей Аксенов (Sphinx) и многие другие. Интро Уже 2 года, как я являюсь постоянным участником этого мероприятия. Когда приходишь на [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F04%2Fdevconf-2012-announce%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F04%2Fdevconf-2012-announce%2F&amp;source=netandreus&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2011/06/devconf_small.gif" ><img class="alignleft size-full wp-image-2264" style="margin: 10px;" title="devconf_small" src="http://tokarchuk.ru/wp-content/uploads/2011/06/devconf_small.gif" alt="" width="48" height="48" /></a>Пожалуй одна из самых интересных конференций для разработчиков стартует в июне в Москве. Соберутся такие известные личности, как Дерик Ретанс (разработчик MongoDB),  David Soria Parra (разработчик php и git), Сергей Рыжиков (1С-Битрикс), Алексей Рыбак (Badoo.com), Андрей Аксенов (Sphinx) и многие другие.<span id="more-3464"></span></p>
<h3>Интро</h3>
<p>Уже 2 года, как я являюсь постоянным участником этого мероприятия. Когда приходишь на devconf, то первое, что бросается в глаза это зашкаливающая концентрация IQ <img src='http://tokarchuk.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Много умных и интересных людей в одном месте. Темы докладов, которые своей актуальностью обязаны нашей ежедневной работе. Не буду скрывать, что devconf в основном, &#8212; это конференция веб-разработчиков. В прошлом году я писал о <a href="http://tokarchuk.ru/2011/06/devconf-2011/"  title="Devconf 2011">DevConf-2011</a>, и думаю в этом также напишу свой отчёт о посещении.</p>
<p>Итак, что же нас ждёт на конференции. Это 7 секций: common, php, js, ruby, python, asp.net, perl в первый день и секция мастер-классов во второй. В прошлом году придумали интересную фишку, каждый мог взять значок любимого языка программирования, и при встрече с коллегой можно было сразу понять, чем он занимается. Думаю в этом году надо продолжить традицию (если конечно организаторы не припасли ещё каких-нибудь сюрпризов). Зайдя как-то в секцию Perl я обнаружил там полное униние, что, как мне кажется отражает ситуацию в языке. Для веб-разработки он уже практически не используется, для системного программирования на серверах админы больше используют python или ruby. Мой опыт perl также был далеко в прошлом. Зато очень сильно развивается ruby, и это радует. Конечно язык переживает сейчас болезни роста (кривые гемы и несовместимость версий), но многие видят в нём большой потенциал.</p>
<p style="text-align: center;"><a href="http://tokarchuk.ru/wp-content/uploads/2011/06/devconf.jpg" ><img class="wp-image-2265 alignnone" style="margin: 10px;" title="devconf" src="http://tokarchuk.ru/wp-content/uploads/2011/06/devconf.jpg" alt="" width="298" height="68" /></a></p>
<h3>Список потенциальных докладов</h3>
<p>В общем конференция обещает быть интересной. Взять хотя бы список заявок на доклады. Вот что может нас ждать на DevConf 2012.</p>
<h3>Common</h3>
<ul>
<li>Практический опыт использования различных open source решений виртуализации в веб-инфраструктурах</li>
<li>Реализация элементов логики приложения в MySQL: триггеры, хранимые процедуры, кэширование.</li>
<li>Еще немного о репликации в MySQL. Проблемы и решения. Опыт использования Galera.</li>
<li>Путь самурая через код: Просто, сложно, нудно</li>
<li>Про качественный поиск</li>
<li>Как мы разрабатываем Сфинкс</li>
<li>Параллельная разработка альтернатив как третий способ спасения горящего проекта</li>
<li>Распределённый офис разработки проектов – пути создания</li>
<li>Решардинг Redis без даунтайма</li>
<li>MariaDB 5.3 – ветка MySQL с эволюционными и революционными изменениями</li>
<li>Как выстроить разработку сервиса под несколько мобильных платформ</li>
<li>Успешный Kanban в небольшой команде</li>
<li>OpenStack &#8212; open source cloud платформа</li>
</ul>
<h3>PHP</h3>
<div>PHPCONF – это одна из старейших (проводится с 2003 года) it-конференций, посвященная разработке web-приложений с использованием PHP.</div>
<div></div>
<div>PHPCONF проводится активистами <a rel="nofollow" href="http://tokarchuk.ru/goto/http://phpclub.ru/"  target="_blank">PHPCLUB</a>’а, сообщества русскоговорящих php-разработчиков, объединяющего на сегодня более 14 000 профессионалов.</div>
<div></div>
<div>За годы проведения конференции докладчиками <strong>PHPCONF</strong> стали непосредственные авторы:</div>
<ul>
<li><strong>PHP</strong>: Расмус Лердорф, Змиевский Андрей, Ретанс Дерик, Borger Marcus, Стогов Дмитрий, Довгаль Антон;</li>
<li><strong>MySQL</strong>: Осипов Константин, Резниченко Виктория, Смирнова Светлана;</li>
<li><strong>PostgreSQL</strong>: Борзов Алексей;</li>
<li><strong>Nginx</strong>: Игорь Сысоев;</li>
<li><strong>Sphinx</strong>: Аксенов Андрей;</li>
<li><strong>Microsoft</strong>: Дрю Роббинс, Магдануров Гайдар;</li>
<li><strong>1С-Битрикс</strong>: Рыжиков Сергей;</li>
<li>Рыбак Алексей, Нигматулин Андрей (все и так знают, что они сделали <img src='http://tokarchuk.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</li>
</ul>
<div>Конференция традиционно поддерживается лидерами индустрии высоких технологий: <a rel="nofollow" href="http://tokarchuk.ru/goto/http://microsoft.ru/"  target="_blank">Microsoft</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.rbc.ru/company.shtml"  target="_blank">РосБизнесКонсалтинг</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://rambler.ru/"  target="_blank">Rambler</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://begun.ru/"  target="_blank">Begun</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://masterhost.ru/"  target="_blank">MasterHost</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.luxoft-training.ru/" >Luxoft</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.1c-bitrix.ru/"  target="_blank">1C-Bitrix</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://netcat.ru/"  target="_blank">NetCat</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.umi-cms.ru/"  target="_blank">UMI.CMS</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.rbsgroup.ru/"  target="_blank">Корпорация РБС</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://webprofy.ru/"  target="_blank">Webprofy</a>,  <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.pilsnerurquell.com/"  target="_blank">Pilsner Urquell</a>.</div>
<div></div>
<div></div>
<div>Неизменным оставался высокий уровень профессионализма докладчиков и интерес со стороны it-специалистов.</div>
<ul>
<li>PHP 5.4 &#8212; особености перехода (от непосредственного автора)</li>
<li>Рефакторинг и второе рождение проекта на примере Zend Framework 2.0</li>
<li>Применение DDD методологии в PHP</li>
<li>Yii, его разработка и Yii2</li>
<li>Проектирование ERP, CRM систем с нуля</li>
<li>Визуализация данных</li>
<li>Кругом обман или использование стандартных протоколов для нестандартных вещей</li>
<li>Архитектура и запуск облачного сервиса.</li>
<li>Грабли при масштабировании веб-приложения, на которые очень легко наступить.</li>
<li>Рефакторинг сайта. Практические примеры XP (экстремального программирования) на работающих проектах</li>
</ul>
<h3>JavaScript</h3>
<div>
<div>JS cекция, проводится активистами <strong>MoscowJS</strong> и посвящена языку программирования <strong>JavaScript.</strong>  <wbr> <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.facebook.com/groups/261688937189348/"  target="_blank">MoscowJS</a> – это сообщество разработчиков, которые регулярно проводят встречи и практические семинары. </wbr></div>
<div><img src="http://devconf.ru/data/2012/MoscowJS-small.png" alt="" width="200" height="46" /></div>
<div>Наша цель &#8212; обмен опытом разработки на суперактуальном языке программирования JavaScript, ввиду повсеместной адаптации HTML5 для браузерных, мобильных и десктопных приложений, а также успехов в битве за server-side.</div>
</div>
<ul>
<li>Cloud9 IDE и Node.JS</li>
<li>Формирование HTML на клиенте.</li>
<li>Эксперимент по созданию фреймворка в стиле All-in-JS на базе jQuery.</li>
<li>Разработка социальной блог-платформы на NodeJS/NoSQL — Tactoom.com</li>
<li>Оптимизация процесса создания сайта на этапе верстки</li>
<li>Создание приложений для Windows 8 с помощью HTML5 и JavaScript</li>
</ul>
<h3>Ruby</h3>
<p>Cекция, посвященная языку программирования <strong>Ruby</strong> и фреймворку <strong>Ruby on Rails</strong>. Организаторы <a rel="nofollow" href="http://tokarchuk.ru/goto/http://railsclub.ru/"  target="_blank">RailsClub.ru</a> – это сообщество разработчиков на языке ruby и фреймворке ruby on rails. Наша цель &#8212; популяризация языка программирования и фреймворка &#8212; как идеальной среды для разработки интернет проектов.</p>
<ul>
<li>OpenSource стартап на Ruby</li>
<li>Sprockets under the hood</li>
<li>Опыт эксплуатации большого Ruby проекта</li>
</ul>
<h3>Python</h3>
<p>Python-секция конференции DevConf планирует собрать профессионалов в области разработки веб-приложений с использованием всего разнообразия инструментов, предоставляемых в экосистеме языка Python.</p>
<p>Широкий спектр доступных и популярных решений, а также наличие различных направлений разработки предполагают интересные доклады, мастер-классы и дискуссии во время конференции.</p>
<p>Сообщество питонистов с каждым днем набирает всё большее число представителей. Для тех, кто только делает первые шаги в мире Python, эта секция конференции позволит ближе познакомиться как с общеприменимыми технологиями, так и людьми вокруг них.</p>
<ul>
<li>Тёмные углы фреймворка Джанго</li>
<li>Как делать проекты на Джанго проще и зачем надо понижать культуру производства</li>
<li>Высоконагруженные системы на примере 2056.ru</li>
</ul>
<h3>ASP.NET</h3>
<div>
<div>
<p>Поток конференции, посвященный технологиям веб-разработки, основанным на платформе Microsoft .NET.</p>
<p>Докладчики потока &#8212; разработчики из команды <a rel="nofollow" href="http://tokarchuk.ru/goto/http://asp.net/"  target="_blank">ASP.NET</a>.</p>
<p>Организаторы потока &#8212; профессиональные программисты на <a rel="nofollow" href="http://tokarchuk.ru/goto/http://asp.net/"  target="_blank">ASP.NET</a>, участники многих индустриальных конференций.</p>
</div>
</div>
<ul>
<li>ASP.NET 4.5: работа с данными</li>
<li>Нагрузочные тесты на платформе Microsoft и .NET</li>
</ul>
<h3>Perl</h3>
<p>Поток конференции, посвященный языку программирования <strong>Perl</strong>. Организаторы <a rel="nofollow" href="http://tokarchuk.ru/goto/http://devconf.ru/perl/" >DevConf::Perl()</a> — люди, на чьих плечах лежит 16 полноценных мероприятий о Perl, проведенные на территории семи стран: России, Украины, Белоруссии, Казахстана, Узбекистана, Болгарии и Латвии под общим названием <a rel="nofollow" href="http://tokarchuk.ru/goto/http://yapcrussia.org/" title="YAPC::Russia" >YAPC::Russia</a>.</p>
<ul>
<li>Plosurin &#8212; единая система шаблонизации для front-end и back-end сторон</li>
</ul>
<h3>Мастер-классы (10 июня)</h3>
<ul>
<li>Секреты MongoDB &#8212; масштабируемость и производительность</li>
<li>[HighLoad] Основы построения масштабируемых высоконагруженных веб-проектов</li>
<li>Sphinx 101</li>
<li>Почему MySQL тормозит или отладка проблем производительности MySQL приложений.</li>
<li>Формирование команды веб-разработчиков или создание «Dreamteam – команды мечты»</li>
</ul>
<p>Ближе к конференции начнётся голосование, так что участвуйте, мы же community!</p>
<h3>Организаторы</h3>
<p>&nbsp;</p>
<div><a rel="nofollow" href="http://tokarchuk.ru/goto/http://phpclub.ru/"  target="_blank">PHPClub</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://railsclub.ru/"  target="_blank">RailsClub.ru</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://python.ru/"  target="_blank">Python.ru</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://yapcrussia.org/"  target="_blank">YAPC::Russia</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.facebook.com/groups/261688937189348/"  target="_blank">MoscowJS</a>.</div>
<div></div>
<h3>Информационные партнеры</h3>
<p>&nbsp;</p>
<p><a rel="nofollow" href="http://tokarchuk.ru/goto/http://rubyjobs.ru/" title="Работа для разработчиков, использующих Ruby" >RubyJobs.ru</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://rubyflow.ru/" title="Коллективный блог сообщества разработчиков, использующих Ruby" >RubyFlow.ru</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.devweb-magazine.com/" title="Журнал DevWeb magazine вышел в свет осенью 2011 года и адресован профессионалам рынка web-разработки"  target="_blank">DevWeb magazine</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://umi-cms.ru/" title="UMI CMS - сердце вашего сайта"  target="_blank">UMI.CMS</a> <a rel="nofollow" href="http://tokarchuk.ru/goto/http://php.ru/" title="PHP.ru" >PHP.ru</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://php.su/" title="PHP.su" >PHP.su</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://bugtraq.ru/" title="BugTraq.Ru:информационная безопасность без паники и всерьез" >BugTraq.Ru</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://opennet.ru/" title="Opennet.ru" >OpenNet.ru</a>, <a rel="nofollow" href="http://tokarchuk.ru/goto/http://phpclub.ru/" title="Популярный ресурс о PHP, обьединяющий свыше 10000 WEB-разработчиков"  target="_blank">PHPClub.ru</a>.</p>
<img src="http://feeds.feedburner.com/~r/tokarchuk/~4/GeRVDFj6tXY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tokarchuk.ru/2012/04/devconf-2012-announce/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://tokarchuk.ru/2012/04/devconf-2012-announce/</feedburner:origLink></item>
		<item>
		<title>CodeLobster PHP IDE</title>
		<link>http://feedproxy.google.com/~r/tokarchuk/~3/dcX0uCqASVU/</link>
		<comments>http://tokarchuk.ru/2012/04/codelobster-php-ide/#comments</comments>
		<pubDate>Mon, 09 Apr 2012 11:22:24 +0000</pubDate>
		<dc:creator>Андрей Токарчук</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Веб-разработка]]></category>

		<guid isPermaLink="false">http://tokarchuk.ru/?p=3470</guid>
		<description><![CDATA[В этом посте я расскажу об одном из инструментов разработки на PHP &#8212; CodeLobster. Сейчас на рынке IDE присутствуют такие гиганты, как Eclipse, Zend Studio, NetBeans, PhpStorm. Чем же так примечательна эта IDE? PHP IDE можно разделить на две большие категории. Первые &#8212; это монстры, вроде Eclipse. В них есть огромное количество инструментов, куча функций [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F04%2Fcodelobster-php-ide%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F04%2Fcodelobster-php-ide%2F&amp;source=netandreus&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/codelobster-icon.png" ><img class="alignleft  wp-image-3471" style="margin: 10px;" title="codelobster-icon" src="http://tokarchuk.ru/wp-content/uploads/2012/04/codelobster-icon.png" alt="" width="48" height="48" /></a>В этом посте я расскажу об одном из инструментов разработки на PHP &#8212; CodeLobster. Сейчас на рынке IDE присутствуют такие гиганты, как Eclipse, Zend Studio, NetBeans, PhpStorm. Чем же так примечательна эта IDE?<span id="more-3470"></span><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/codelobster_php_edition_3_6_0.jpg" ><img class="aligncenter size-full wp-image-3475" title="codelobster_php_edition_3_6_0" src="http://tokarchuk.ru/wp-content/uploads/2012/04/codelobster_php_edition_3_6_0.jpg" alt="" width="508" height="287" /></a></p>
<p>PHP IDE можно разделить на две большие категории. Первые &#8212; это монстры, вроде Eclipse. В них есть огромное количество инструментов, куча функций и возможностей, множество плагинов. А ещё они написаны на Java и иногда могут тормозить так сильно, что вы успеете заварить себе чай, и даже выпить его. Например мой любимый phpStorm иногда может задуматься при подборе файлов на коммит (хотя это и странно), да так, что приходится его перезагружать. А NetBeans любил периодически устраивать переиндексирование дерева.Конечно в больших проектах (а у нас в основном дереве лежат Zend Framework и Doctrine) редактору действительно есть над чем подумать <img src='http://tokarchuk.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  От этого может спасти разве что большое количество оперативки, SSD и Core i7.</p>
<p>Другая категория IDE это PHP-редакторы. Именно так, хотя чаще всего они называются IDE, но их отличает несколько особенностей. Во-первых они написаны не на Java. Возможно из текста складывается впечатление, что я не люблю Java, Но это не так. Просто IDE это то, с чем я работаю каждый день, практически мой кабинет. И я хочу чтобы он был удобный. Так вот, раньше был такой замечательный редактор &#8212; Allaire HomeSite. Я кодил в нём и был несказано рад. Потом Macromedia купила Allaire, Adobe &#8212; Macromedia и HomeSite в результате исчез, незаметно влившись в DreamWeaver.</p>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/04/CodeLObster-Dark.png" ><img class="aligncenter  wp-image-3476" title="CodeLObster-Dark" src="http://tokarchuk.ru/wp-content/uploads/2012/04/CodeLObster-Dark-1024x576.png" alt="" width="677" height="381" /></a></p>
<p>CodeLobster во-многом напоминает мне HomeSite. Не перегружен, удобный и легкий. Понравилась функций работы в Portable версии. Это здорово, что можно засунуть редактор на флешку и потом использовать его в любое время. Также разработчики сделали несколько плагинов для популярных CMS/CMF.</p>
<p>CMS: Drupal, Joomla<br />
PHP фреймворки: CakePHP, CodeIgniter, Symfony, Yii<br />
JavaScript библиотеки: JQuery<br />
WordPress, шаблонизатор Smarty</p>
<p>А вот и краткий feature-list:</p>
<p>- HTML: подсветка кода, автозаполнение тегов и атрибутов текущего тега, подсветка парных тегов, быстрое выделение парных тегов, атрибутов и их значений, динамическая помощь по синтаксису тегов.<br />
— РНР: полноценный отладчик, подсветка кода, подсказки к функциям, контекстная и динамическая помощь по ним, автозаполение не только функций, но и методов и переменных классов.<br />
— CMS Drupal: автоматическая установка, помощники, облегчающие работу, автозаполение, подсказки по внутренним функциям, быстрая навигация по ним.<br />
— CMS Joomla: автозаполение, подсказки и помощь.<br />
— CMS Smarty: подсветка, автозаполение, подсказки и помощь по синтаксису.<br />
— CMS WordPress: автозаполение, подсказки и помощь по функциям.<br />
— jQuery: автозаполнение, контекстная и динамическая помощь.<br />
— CodeIgniter: автозаполнение, контекстная и динамическая помощь.<br />
— CakePhp: автозаполнение, контекстная и динамическая помощь.<br />
— MySQL: автозаполнение, контекстная и динамическая помощь.<br />
— Symfony: автозаполнение, контекстная и динамическая помощь.<br />
— Yii: автозаполнение, контекстная и динамическая помощь.</p>
<p>Что огорчило &#8212; это отсутствие поддержки Zend Framework и версии под Linux, но думаю со временем разработчики пофиксят это.</p>
<h3>Ссылки</h3>
<p><a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.codelobster.com/" >Официальный сайт</a><br />
<a rel="nofollow" href="http://tokarchuk.ru/goto/http://ru.wikipedia.org/wiki/Codelobster" >Статья в WIkipedia</a></p>
<img src="http://feeds.feedburner.com/~r/tokarchuk/~4/dcX0uCqASVU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tokarchuk.ru/2012/04/codelobster-php-ide/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://tokarchuk.ru/2012/04/codelobster-php-ide/</feedburner:origLink></item>
		<item>
		<title>Ускорение парсинга INI-файлов для Zend Framework веб-приложений (в 4-5 раз)</title>
		<link>http://feedproxy.google.com/~r/tokarchuk/~3/YrHUTMN_oH8/</link>
		<comments>http://tokarchuk.ru/2012/03/speed-up-ini-parsing/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 06:03:24 +0000</pubDate>
		<dc:creator>Андрей Токарчук</dc:creator>
				<category><![CDATA[Yaf]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[yaf]]></category>

		<guid isPermaLink="false">http://tokarchuk.ru/?p=3292</guid>
		<description><![CDATA[В этой статье я расскажу, как можно увеличить скорость обработки запросов в вашем проекте на ZF с помощью уменьшения времени, необходимого на парсинг INI-файлов конфигурации. Не секрет, что при создании большого приложения на Zend Framework большинство разработчиков используют для хранения настроек конфигурационные файлы. Некоторые любят XML-формат, другие модный YAML, я же возможно из-за своего админского [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F03%2Fspeed-up-ini-parsing%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Ftokarchuk.ru%2F2012%2F03%2Fspeed-up-ini-parsing%2F&amp;source=netandreus&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://tokarchuk.ru/wp-content/uploads/2012/02/speed-up-web.png" ><img class="alignleft  wp-image-3297" style="margin: 10px;" title="speed-up-web" src="http://tokarchuk.ru/wp-content/uploads/2012/02/speed-up-web.png" alt="" width="46" height="46" /></a>В этой статье я расскажу, как можно увеличить скорость обработки запросов в вашем проекте на ZF с помощью уменьшения времени, необходимого на парсинг INI-файлов конфигурации.<span id="more-3292"></span></p>
<p>Не секрет, что при создании большого приложения на Zend Framework большинство разработчиков используют для хранения настроек конфигурационные файлы. Некоторые любят XML-формат, другие модный YAML, я же возможно из-за своего админского прошлого предпочитаю INI-формат.</p>
<p>В Zend_Framework для парсинга INI файлов используется компонент Zend_Config_Ini. Но парсинг сам по себе вещь довольно накладная.</p>
<div class="wp-caption alignnone" style="width: 710px"><img title="Zend_Config_Ini profiling" src="http://litemvc.org/wp-content/uploads/2010/06/profiler_ini.png" alt="" width="700" height="478" /><p class="wp-caption-text">Скрин от фреймфорка LiteMVC иллюстрирующий обращения к парсеру при каждом запросе</p></div>
<p>Как его ускорить? Можно использовать кэшер, и кэшировать результат парсинга. Но иногда такой возможности нет, т.к. в самом конфиге хранятся настройки системы кэширования. Какой есть ещё вариант?</p>
<h3>Yaf Framework</h3>
<p>Этот китайский проект очень заинтересовал меня в последнее время. Создатели <a rel="nofollow" href="http://tokarchuk.ru/goto/http://www.php.net/manual/en/book.yaf.php" >Yaf</a>  (Yet Another Framework) поставили своей целью написать ZF на C. Устанавливается он просто:</p>
<pre class="brush: bash;">pecl install yaf</pre>
<p>Потом вам надо будет включить расширение, добавив строчку:</p>
<pre class="brush: bash;">extension=yaf.so</pre>
<p>в ваш php.ini (или отдельный yaf.ini файл). И перезапустить интерпретатор php(fpm или mod_php вместе с apache). Этот фреймворк содержит следующие классы:</p>
<ul>
<li>Yaf_Application</li>
<li>Yaf_Dispatcher</li>
<li>Yaf_Bootstrap_Abstract</li>
<li>Yaf_Plugin_Abstract</li>
<li>Yaf_Router</li>
<li>Yaf_Route_Static</li>
<li>Yaf_Route_Simple</li>
<li>Yaf_Route_Supervar</li>
<li>Yaf_Route_Rewrite</li>
<li>Yaf_Route_Regex</li>
<li>Yaf_Route_Map</li>
<li>Yaf_Config_Ini</li>
<li>Yaf_Config_Simple</li>
<li>Yaf_Controller_Abstract</li>
<li>Yaf_Action_Abstract</li>
<li>Yaf_Request_Http</li>
<li>Yaf_Request_Simple</li>
<li>Yaf_Exception</li>
<li>Yaf_Exception</li>
<li>Yaf_View_Simple</li>
<li>Yaf_Response_Abstract</li>
<li>Yaf_Response_Simple</li>
<li>Yaf_Response_Http</li>
</ul>
<p>Как вы можете видеть, классы аналогичны ZF классам. В этой статье я рассмотрю использование Yaf_Config и его бенчмарки по сравнению с Zend_Config.</p>
<h3>Zend_Config_Ini vs Yaf_Config_Ini</h3>
<p>Для проведения тестовых испытаний возмём вот такой конфиг:<br />
<strong>/cfg/application.config.ini</strong></p>
<pre class="brush: php">; Общие настройки для всех типов окружений

[bootstrap]
module_paths[] = APPLICATION_PATH'/module'
module_paths[] = ROOT_PATH'/vendor'
modules[] = 'Application'

module_listener_options.config_cache_enabled = false
module_listener_options.cache_dir = APPLICATION_PATH . '/data/cache'
module_listener_options.application_environment = APPLICATION_ENV

; Настройки для авторизации из социальных сетей
social.facebook.app_id = "456247645747"
social.facebook.api_key = "trfyrthfghfghfgh"
social.facebook.app_secret = "fghfghsytyty"
social.vkontakte.app_id = "4564646"
social.vkontakte.secret_key = "hfghdhgfd"
social.main_url = "site.ru"
social.twitter.app_id = "456456456"
social.twitter.api_key = "fghfghfghrtyy"
social.twitter.app_secret = "retertergfdhgfhfhgfhfg"

resources.frontController.throwExceptions = false; Для перехватчика исключений и ErrorController'а = false
; Настройки проекта в окружении development
[development : bootstrap]
server.data_root = '/home/www/site.ru/data'

; Настройки подключения к базам данных для Doctrine
resources.doctrine.connections.default.dsn = "mysqli://user:pass@localhost/db"
resources.doctrine.connections.default.profiler = true
resources.cachemanager.backend.memcached.servers.default.host = 127.0.0.1

; Настройка php
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
phpSettings.error_reporting = E_ALL &amp; ~E_NOTICE
phpSettings.html_errors = 1

; Настройки проекта в окружении stage
[production: bootstrap]
server.data_root = '/home/www/site.ru/data'

; Настройки подключения к базам данных для Doctrine
resources.doctrine.connections.default.dsn = "mysqli://user:pass@localhost/db"
resources.doctrine.connections.default.profiler = false
resources.cachemanager.backend.memcached.servers.default.host = 127.0.0.1

; Настройка php
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
phpSettings.error_reporting = 0</pre>
<p>В ./lib/Zend сохраним копию ZendFramework, Yaf у нас уже установлен. Поэтому напишем простенький тест:</p>
<p><strong>zf.php</strong></p>
<pre class="brush: php">&lt;?php
define('ROOT_PATH', '/home/andrey/sandbox/yaf.new/html/');
error_reporting(E_ALL);
ini_set("display_errors", 1);
ini_set("html_errors", 1);

set_include_path(get_include_path() .
PATH_SEPARATOR . ROOT_PATH . DIRECTORY_SEPARATOR . "lib"
);
require_once ('Zend/Config/Ini.php');
require_once ('Zend/Registry.php');

// Загружаем ZF
$localConfigPath = '/cfg/local.config.ini';
$config = new Zend_Config_Ini(ROOT_PATH . '/cfg/application.config.ini');
$appConfig = $config-&gt;toArray();
Zend_Registry::set('appconfig', $appConfig);
print 'Ok';</pre>
<p><strong>yaf.php</strong></p>
<pre class="brush: php">&lt;?php
define('ROOT_PATH', '/home/andrey/sandbox/yaf.ru/html/');
error_reporting(E_ALL);
ini_set("display_errors", 1);
ini_set("html_errors", 1);

$config = new Yaf_Config_Ini(ROOT_PATH . '/cfg/application.config.ini');
$appConfig = $config-&gt;toArray();
Yaf_Registry::set('appConfig', 'appConfig');
print('ok');</pre>
<h3>Результаты тестирования</h3>
<p>Ну что-же, теперь время сухих бенчмарков.</p>
<p><strong>zf.php</strong></p>
<pre class="brush: bash">andrey@z11:~/sandbox/yaf.new/html$ clear; ab -c 10 -n 1000 http://yaf.new/zf.php

Server Software: nginx/0.7.67

Server Hostname: yaf.ru
Server Port: 80

Document Path: /engine.php
Document Length: 2 bytes

Concurrency Level: 10
Time taken for tests: 1.187 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 160000 bytes
HTML transferred: 2000 bytes
Requests per second: 842.64 [#/sec] (mean)
Time per request: 11.867 [ms] (mean)
Time per request: 1.187 [ms] (mean, across all concurrent requests)
Transfer rate: 131.66 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 0
Processing: 4 12 7.3 9 50
Waiting: 4 12 7.3 9 50
Total: 4 12 7.3 9 50

Percentage of the requests served within a certain time (ms)
50% 9
66% 12
75% 14
80% 16
90% 21
95% 27
98% 34
99% 40
100% 50 (longest request)</pre>
<p><strong>yaf.php</strong></p>
<pre class="brush: php">andrey@z11:~/sandbox/yaf.new/html$ clear; ab -c 10 -n 1000 http://yaf.new/yaf.php

Server Software: nginx/0.7.67

Server Hostname: yaf.new
Server Port: 80

Document Path: /index.php
Document Length: 2 bytes

Concurrency Level: 10
Time taken for tests: 0.245 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 160000 bytes
HTML transferred: 2000 bytes
Requests per second: 4076.21 [#/sec] (mean)
Time per request: 2.453 [ms] (mean)
Time per request: 0.245 [ms] (mean, across all concurrent requests)
Transfer rate: 636.91 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 0
Processing: 1 2 1.1 2 11
Waiting: 1 2 1.1 2 11
Total: 1 2 1.1 2 11

Percentage of the requests served within a certain time (ms)
50% 2
66% 2
75% 3
80% 3
90% 4
95% 5
98% 6
99% 7
100% 11 (longest request)</pre>
<h3>Выводы</h3>
<p>Скорость парсинга ZF 1.10.3: <strong>842.64</strong> запросов в секунду.<br />
Скорость парсинга Yaf: <strong>4076.21</strong> запросов в секунду.<br />
Ускорение: <strong>почти в 5 раз</strong> (4.83)!</p>
<p>К сожалению в Yaf не так много компонентов как в ZF, с поддержкой и сообществом там совсем туго, однако некоторые простые и часто-используемые компоненты (например Zend_Config_Ini и Zend_View) вполне можно заменить на их аналоги из Yaf, или сделать обертку.</p>
<p>&nbsp;</p>
<h3>Ссылки</h3>
<p><a rel="nofollow" href="http://tokarchuk.ru/goto/http://litemvc.org/2010/06/04/optimising-ini-parsing/" >http://litemvc.org/2010/06/04/optimising-ini-parsing/</a></p>
<img src="http://feeds.feedburner.com/~r/tokarchuk/~4/YrHUTMN_oH8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://tokarchuk.ru/2012/03/speed-up-ini-parsing/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://tokarchuk.ru/2012/03/speed-up-ini-parsing/</feedburner:origLink></item>
	</channel>
</rss><!-- This Quick Cache file was built for (  tokarchuk.ru/feed/ ) in 4.77600 seconds, on May 17th, 2012 at 11:45 pm UTC. --><!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on May 18th, 2012 at 1:45 am UTC --><!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --><!-- Quick Cache Is Fully Functional :-) ... A Quick Cache file was just served for (  tokarchuk.ru/feed/ ) in 0.00000 seconds, on May 18th, 2012 at 1:19 am UTC. -->

