<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7471373253521558224</id><updated>2024-10-04T23:56:59.479-07:00</updated><category term="javascript"/><category term="Firebird"/><category term="Ubuntu"/><category term="bash"/><category term="php"/><category term="Lazarus"/><category term="MySQL wrapper"/><category term="SQL"/><category term="TSQLQuery"/><category term="TSQLTransaction"/><category term="Ubuntu 10.04"/><category term="git"/><category term="joomla"/><category term="linux"/><category term="nginx"/><category term="php5-fpm"/><category term="pull"/><category term="push"/><category term="$"/><category term="Array"/><category term="Atber"/><category term="CSS"/><category term="DNS PTR"/><category term="Google.translate"/><category term="Java Script"/><category term="Joomfish"/><category term="Khramkov"/><category term="MVC"/><category term="Object"/><category term="PHP 5.3.1"/><category term="PHP-framework"/><category term="PHPUnit_TextUI_ResultPrinter"/><category term="ParamByName"/><category term="Params"/><category term="PhpStorm"/><category term="RIPE"/><category term="SQLdb"/><category term="TDAtasource"/><category term="TDBGrid"/><category term="TIBConnection"/><category term="Ubuntu 10.10"/><category term="Ubuntu 11.04"/><category term="Unittest"/><category term="VGA"/><category term="Victoria"/><category term="XML Saxy bug"/><category term="add"/><category term="alter"/><category term="animate"/><category term="auto increment"/><category term="callback"/><category term="checkout"/><category term="clearTimeout"/><category term="close"/><category term="closure"/><category term="commit"/><category term="create branch"/><category term="create table"/><category term="create trigger"/><category term="deferred"/><category term="done"/><category term="dump"/><category term="error"/><category term="execSQL"/><category term="fadeIn"/><category term="fadeOut"/><category term="fetch"/><category term="find"/><category term="for"/><category term="ftp"/><category term="generator"/><category term="get path"/><category term="graphviz"/><category term="guake"/><category term="hash"/><category term="heads"/><category term="id3convert"/><category term="id_rsa"/><category term="install"/><category term="install from source"/><category term="ip-port.exitlist.torproject.org"/><category term="jQuery"/><category term="kernel driver"/><category term="libid3"/><category term="location"/><category term="lspci"/><category term="mp3"/><category term="open"/><category term="origin"/><category term="passphrase"/><category term="pear"/><category term="pecl"/><category term="perl"/><category term="php 5.5"/><category term="phpunit"/><category term="placeholders"/><category term="primary key"/><category term="promise"/><category term="prototype"/><category term="rabbitVCS"/><category term="rad to degree"/><category term="refs"/><category term="register globals"/><category term="remote"/><category term="resolve"/><category term="robox"/><category term="server"/><category term="set path"/><category term="setInterval"/><category term="setTimeout"/><category term="sha1sum"/><category term="shuffle mp3"/><category term="solved"/><category term="source"/><category term="ssh"/><category term="ssh-add"/><category term="ssh-agent"/><category term="svn"/><category term="tor"/><category term="tor ip"/><category term="tortoiseSVN"/><category term="track"/><category term="trigger"/><category term="undefined"/><category term="unrar"/><category term="virtualbox"/><category term="virtuemart"/><category term="when"/><category term="xhprof"/><category term="xhprof-0.9.3"/><category term="xmldoc"/><category term="zend optimizer"/><category term="Чикуенок"/><category term="автоинкремент"/><category term="анонимная функция"/><category term="апишник с тора"/><category term="база данных"/><category term="градусы в радианы"/><category term="два монитора"/><category term="замыкание"/><category term="запрос"/><category term="кодировка"/><category term="круглые углы"/><category term="метод"/><category term="определить tor"/><category term="параметризированный запрос"/><category term="первичный ключ"/><category term="плэйсхолдеры"/><category term="проблема"/><category term="профилирование"/><category term="распаковка"/><category term="рекурсия"/><category term="случайная сортировка"/><category term="создание бранча"/><category term="создание ветки"/><category term="тор"/><category term="тор ip"/><category term="узнать"/><category term="хак"/><category term="что с тора"/><title type='text'>Atber&#39;s Blog</title><subtitle type='html'>Блог web-программиста.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-4504808379460450247</id><published>2014-10-27T17:38:00.000-07:00</published><updated>2014-10-27T18:59:31.352-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="install from source"/><category scheme="http://www.blogger.com/atom/ns#" term="nginx"/><category scheme="http://www.blogger.com/atom/ns#" term="php 5.5"/><category scheme="http://www.blogger.com/atom/ns#" term="php5-fpm"/><category scheme="http://www.blogger.com/atom/ns#" term="source"/><title type='text'>Ubuntu 12.04 Установка php 5.5 + FPM from source</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Начало&lt;/h3&gt;
&lt;div&gt;
Данная статья рассказывает, как можно установить PHP-FPM из исходников, связать с Nginx. Необходимость подобной установки вызвана в необходимости использовать несколько версий PHP с Nginx.&lt;/div&gt;
&lt;div&gt;
Описанная установка справедлива не только для версии 5.5. Версия используется для примера.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Итак. Сперва потребуется скачать архивчик, например, &lt;a href=&quot;http://ru2.php.net/downloads.php&quot; target=&quot;_blank&quot;&gt;отсюда&lt;/a&gt;, распаковать и перейти в директорию с файлами.&lt;/div&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Конфигурирование&lt;/h3&gt;
&lt;div&gt;
В процессе конфигурации следует выбрать поддерживаемые модули и включить их в скрипт конфигурации. Так же имеет смысл включить некоторые расширения. Важно, для работы PHP-FPM включить опцию&amp;nbsp;&lt;i&gt;--enable-fpm&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
Вариант конфигурации:&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;./configure --prefix=/usr/local/php-5.5 --with-xsl=/usr/include/libxslt --with-curl=/usr/bin/curl --with-mysql --enable-intl --with-tidy=shared --with-mcrypt=shared --enable-fpm --enable-gd-native-ttf --with-mysqli=shared --enable-zip --with-pdo-mysql=shared --enable-soap --enable-mbstring --with-openssl=/usr --with-libdir=/lib/x86_64-linux-gnu&lt;/i&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
Стоит отметить, что устанавливать все мы будем в директорию, указанную в опции &amp;nbsp;&lt;i&gt;--prefix. &lt;/i&gt;Везде ниже в качестве примера я буду использовать эту директорию.&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Компиляция и установка&lt;/h3&gt;
&lt;div&gt;
Если конфигурирование прошло успешно, и все зависимости удовлетворены, запускаем&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;i&gt;make,&amp;nbsp;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;[&lt;i&gt;make test&lt;/i&gt;]&lt;i&gt;&amp;nbsp; - &lt;/i&gt;если есть желание прогнать тесты&lt;/li&gt;
&lt;li&gt;[&lt;i&gt;sudo&lt;/i&gt;] &lt;i&gt;make install - &lt;/i&gt;установка. В зависимости от директории установки могут потребоваться права суперпользователя.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
После успешной установки можно задать алиас для установленных бинарников, чтобы обращение к ним было короче.&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;alias php55=&quot;/usr/local/php-5.5/bin/php&quot; &lt;/i&gt;- пример для бинарника командной строки&lt;/blockquote&gt;
&lt;div&gt;
Так же эту строчку можно добавить в&amp;nbsp;~/.bashrc, чтобы алиас действовал всегда.&lt;/div&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Настройка виртуального хоста&lt;/h3&gt;
&lt;div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;b&gt;
Конфигурирование PHP-FPM&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
Открываем &lt;i&gt;/usr/local/php-5.5/etc/php-fpm.conf . &lt;/i&gt;Если его нет, то его нужно создать из конфига по умолчанию &lt;i&gt;php-fpm.conf.default&lt;/i&gt;, расположенного в той же директории или скачать, например, &lt;a href=&quot;https://raw.githubusercontent.com/perusio/php-fpm-example-config/tcp/fpm/php5-fpm.conf&quot; target=&quot;_blank&quot;&gt;отсюда&lt;/a&gt;.&lt;/div&gt;
&lt;div&gt;
Из всевозможных опций, нам интересны следующие:&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;i&gt;listen = 127.0.0.1:9055 - &lt;/i&gt;адрес и порт, на котором будет висеть наш процесс. Адрес можно оставить без изменений для локалхоста, а порт рекомендую нумеровать так: 90&lt;php version=&quot;&quot;&gt;. Для версии 5.5 имеем порт 9055.&lt;/php&gt;&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;user = atber &lt;/i&gt;- имя unix-пользователя (ставьте ваше)&lt;/li&gt;
&lt;li&gt;&lt;i&gt;group = atber&lt;/i&gt; - группа unix-пользователя&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Пробуем запустить нашего демона:&amp;nbsp;&lt;i&gt;sudo /usr/local/php-5.5/sbin/php-fpm&lt;/i&gt;&lt;/div&gt;
&lt;div&gt;
Если ничего не произошло &amp;nbsp;- все ок. В подтверждение этого попробуйте запустить еще раз. Будет ошибка:&amp;nbsp;&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;ERROR: unable to bind listening socket for address &#39;127.0.0.1:9055&#39;: Address already in use (98),&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;
&lt;div&gt;
Что говорит о том, что наш демон запустился и занял этот адрес.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;b&gt;
Конфигурирование виртуального хоста&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
Открываем настройки интересующего нас хоста.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
Нас интересует секция&amp;nbsp;&lt;i&gt;location ~ \.(cphp|php|php3)$ {&amp;nbsp;В&lt;/i&gt;&amp;nbsp;ней важно указать настройки сервера нашего PHP-FPM. В нашем случае это будет строчка&amp;nbsp;&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;fastcgi_pass&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;localhost:9055;&lt;/i&gt;&lt;/blockquote&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/4504808379460450247/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2014/10/ubuntu-1204-php-55-fpm-from-source.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/4504808379460450247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/4504808379460450247'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2014/10/ubuntu-1204-php-55-fpm-from-source.html' title='Ubuntu 12.04 Установка php 5.5 + FPM from source'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-5165883953774344348</id><published>2013-10-17T22:25:00.000-07:00</published><updated>2013-10-17T22:30:40.900-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DNS PTR"/><category scheme="http://www.blogger.com/atom/ns#" term="ip-port.exitlist.torproject.org"/><category scheme="http://www.blogger.com/atom/ns#" term="tor"/><category scheme="http://www.blogger.com/atom/ns#" term="tor ip"/><category scheme="http://www.blogger.com/atom/ns#" term="апишник с тора"/><category scheme="http://www.blogger.com/atom/ns#" term="определить tor"/><category scheme="http://www.blogger.com/atom/ns#" term="тор"/><category scheme="http://www.blogger.com/atom/ns#" term="тор ip"/><category scheme="http://www.blogger.com/atom/ns#" term="узнать"/><category scheme="http://www.blogger.com/atom/ns#" term="что с тора"/><title type='text'>Как определить запрос из tor-сети</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Для определения ip-адреса из &lt;a href=&quot;https://www.torproject.org/&quot; target=&quot;_blank&quot;&gt;tor-сетки&lt;/a&gt; можно послать запрос для &lt;a href=&quot;http://www.wikireality.ru/wiki/A-%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C&quot; target=&quot;_blank&quot;&gt;A-записи&lt;/a&gt;, вида&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;&amp;lt;&lt;b&gt;reversed ip&lt;/b&gt;&amp;gt;.&amp;lt;&lt;b&gt;port&lt;/b&gt;&amp;gt;&lt;/i&gt;.&amp;lt;&lt;b&gt;addr&lt;/b&gt;&amp;gt;.&lt;span style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;font-family: &amp;amp;apos;&quot;&gt;ip-port.exitlist.torproject.org&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/blockquote&gt;
Где:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;b&gt;reversed ip&lt;/b&gt; - целевой ip в DNS PTR виде (перевернутый)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;port&lt;/b&gt; - порт, на который стучится запрос от целевого адреса&lt;/li&gt;
&lt;li&gt;&lt;b&gt;addr&lt;/b&gt; - ip-адрес, на который стучится целевой адрес&lt;/li&gt;
&lt;/ul&gt;
Например, если мы проверяем ip 30.1.234.50, который долбится на адрес 80.10.200.30 на порт 80, то наш конечный запрос на проверку будет выглядеть так:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;50.234.1.30.80.80.10.200.30&lt;/i&gt;.&lt;span style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;font-family: &amp;amp;apos;&quot;&gt;ip-port.exitlist.torproject.org&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
В итоге, если конечный запрос долбится с tor сетки через целевой ip на определенный порт на определенный адрес, то в указанном запросе нам вернется 127.0.0.2. В противном случае вернется nxdomain.&lt;br /&gt;
&lt;br /&gt;
На PHP эта проверка может быть следующей:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;// Целевой ip&lt;br /&gt;$ip = implode(&#39;.&#39;, array_reverse(explode(&#39;.&#39;, $_SERVER[&#39;REMOTE_ADDR&#39;])));&lt;br /&gt;// Порт&lt;br /&gt;$port = 80;&lt;br /&gt;// Адрес:)&lt;br /&gt;$addr = &#39;0.0.0.0&#39;;&lt;br /&gt;&lt;br /&gt;$ipInfo = dns_get_record(&quot;$ip.$port.$addr.ip-port.exitlist.torproject.org&quot;);&lt;br /&gt;&lt;br /&gt;if (count($ipInfo)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ip = current($ipInfo);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (isset($ip[&#39;ip&#39;]) &amp;amp;&amp;amp; $ip[&#39;ip&#39;] == &#39;127.0.0.2&#39;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Да, это tor&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/i&gt;&lt;/blockquote&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/5165883953774344348/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2013/10/tor.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/5165883953774344348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/5165883953774344348'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2013/10/tor.html' title='Как определить запрос из tor-сети'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-7483683564284943513</id><published>2013-07-30T16:22:00.000-07:00</published><updated>2013-07-30T16:26:56.508-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="graphviz"/><category scheme="http://www.blogger.com/atom/ns#" term="location"/><category scheme="http://www.blogger.com/atom/ns#" term="nginx"/><category scheme="http://www.blogger.com/atom/ns#" term="pecl"/><category scheme="http://www.blogger.com/atom/ns#" term="php5-fpm"/><category scheme="http://www.blogger.com/atom/ns#" term="server"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu 10.04"/><category scheme="http://www.blogger.com/atom/ns#" term="xhprof"/><category scheme="http://www.blogger.com/atom/ns#" term="xhprof-0.9.3"/><category scheme="http://www.blogger.com/atom/ns#" term="профилирование"/><title type='text'>Xhprof на Ubuntu 10.04</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Возникла необходимость поднять профайлинг для проекта на локальном серевере под Ubuntu 10.04&lt;br /&gt;
Выбор само собой пал на &lt;a href=&quot;http://pecl.php.net/package/xhprof&quot; target=&quot;_blank&quot;&gt;Xhprof&lt;/a&gt;. Конечной целью было получение графическое отображения графа вызовов функций.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI3zfrn4XjWnCazhmpB6XgDxbCnDehoApbFi-Bo55cHLX5KuJDTdCzDYY_7TCzFJL9JhjNCTJ2MYY6UNX8dHpnYqiGrMjNBdN3xI87JlCeMQsOH6nMaXQpt4SwZ9JwL6BLGa34sk52ZICl/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-callgraph.php.png.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI3zfrn4XjWnCazhmpB6XgDxbCnDehoApbFi-Bo55cHLX5KuJDTdCzDYY_7TCzFJL9JhjNCTJ2MYY6UNX8dHpnYqiGrMjNBdN3xI87JlCeMQsOH6nMaXQpt4SwZ9JwL6BLGa34sk52ZICl/s320/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-callgraph.php.png.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Что было сделано для этого?&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Установка xhprof&lt;/h3&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Установка ведется через pecl. На момент написания статьи версия xhprof была 0.9.3.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;pecl install xhprof-0.9.3&lt;/i&gt;&lt;/div&gt;
&lt;/blockquote&gt;
Затем, в php.ini прописываем наше расширение и путь для хранилища результатов:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;[xhprof]&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;extension=xhprof.so&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;xhprof.output_dir=/usr/local/xhprof/out &lt;/i&gt;&lt;/blockquote&gt;
Путь необходимо будет создать и навешать соотв. права.&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Пользовательский интерфейс&amp;nbsp;&lt;/h3&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Доступ к данным будем получать через web-интерфейс. Для этого настроим локальный хост. Пусть будет xhprof.lan&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Сперва скачаем &lt;a href=&quot;http://pecl.php.net/get/xhprof-0.9.3.tgz&quot; target=&quot;_blank&quot;&gt;сырцы&lt;/a&gt; и распакуем в директорию с файлами нашего хоста.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Затем опишем хост. Пример для Nginx:&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;server {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; listen 80;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; server_name xhprof.lan;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; charset utf8;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; root /var/www/xhprof.lan/xhprof-0.9.3/xhprof_html;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; index index.php;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; location ~ \.php$ {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fastcgi_pass&amp;nbsp;&amp;nbsp;&amp;nbsp; unix:/var/run/php5-fpm.sock;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fastcgi_index index.php;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; include fastcgi_params;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/i&gt;&lt;/div&gt;
&lt;/blockquote&gt;
Секция &lt;i&gt;location&lt;/i&gt; может варьироваться в зависисмости от настроек вашего php5-fpm.&lt;br /&gt;
Так же пропишем в /etc/hosts наш хост.&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Визуализация&lt;/h3&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Для визуализации нам понадобится утилита Graphviz:&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;apt-get install graphviz&lt;/i&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Пример работы&lt;/h3&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Итак, все установлено и настроено. Как теперь с этим &lt;strike&gt;жить&lt;/strike&gt; работать? Приведу пример использования.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
В начале приложения пишем что-нибудь подобное:&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;if (PROFILING_ON){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $profilingClose = function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $xhprof_data = xhprof_disable();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; include_once &quot;xhprof_lib/utils/xhprof_lib.php&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; include_once &quot;xhprof_lib/utils/xhprof_runs.php&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $xhprof_runs = new XHProfRuns_Default();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $run_id = $xhprof_runs-&amp;gt;save_run($xhprof_data, &quot;xhprof_testproject&quot;);&lt;/i&gt;&lt;i&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;}&lt;/i&gt;&lt;/div&gt;
&lt;/blockquote&gt;
И в конце приложения:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;if (PROFILING_ON){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; \call_user_func($profilingClose, array());&lt;br /&gt;}&lt;/i&gt;&lt;/blockquote&gt;
Потом запускаем наше приложение. После чего идем на новосозданный хост xhprof.lan и выбираем из списка сгенерированной статистики нужную. &lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/7483683564284943513/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2013/07/xhprof-ubuntu-1004.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/7483683564284943513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/7483683564284943513'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2013/07/xhprof-ubuntu-1004.html' title='Xhprof на Ubuntu 10.04'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI3zfrn4XjWnCazhmpB6XgDxbCnDehoApbFi-Bo55cHLX5KuJDTdCzDYY_7TCzFJL9JhjNCTJ2MYY6UNX8dHpnYqiGrMjNBdN3xI87JlCeMQsOH6nMaXQpt4SwZ9JwL6BLGa34sk52ZICl/s72-c/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-callgraph.php.png.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-611062296457341463</id><published>2013-07-02T00:14:00.000-07:00</published><updated>2013-07-07T17:26:52.579-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="lspci"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu 10.04"/><category scheme="http://www.blogger.com/atom/ns#" term="VGA"/><category scheme="http://www.blogger.com/atom/ns#" term="два монитора"/><title type='text'>Настройка двух мониторов в Ubuntu</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Попробую описать пошагово процесс настройки двух мониторов на Ubuntu на своем примере, который, возможно, пригодится и другим.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Определяем видео карту&lt;/h3&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;lspci | grep VGA&lt;/i&gt;&lt;/blockquote&gt;
Имеем&amp;nbsp; &quot;VGA compatible controller: Intel Corporation Sandy Bridge Integrated Graphics Controller (rev 09)&quot;&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Ищем и ставим драйвера&lt;/h3&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Если, конечно, такое требуется. Для Ubuntu 10.04: &lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;sudo add-apt-repository ppa:glasen/intel-driver&lt;br /&gt;sudo apt-get update&amp;nbsp;&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;sudo apt-get upgrade&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;sudo apt-get install linux-image-generic-lts-backport-natty linux-headers-generic-lts-backport-natty &lt;/i&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Перезагружаем Иксы &lt;/h3&gt;
Сделать это можно разными способами. Я делал так:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Идем в &quot;Система&quot; - &quot;Параметры&quot; - &quot;Клавиатура&quot;.&lt;/li&gt;
&lt;li&gt;Вкладка &quot;Раскладка&quot;. Жмем кнопку &quot;Параметры&quot;.&lt;/li&gt;
&lt;li&gt;Устанавливаем флажок на &quot;Комбинация клавиш для прерывания работы X-сервера&quot;&lt;/li&gt;
&lt;li&gt;Жмем эту комбинацию&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5HAH0ekS-I-LEtbrJL4IXLwrtB7rfkVeK-A-mmid5nUT3MgYHiKCduuryAHi9TlAJ7QsvJA2S3miU0XWUE9FbQUHWe-jIY30SMkKXdhAEz2EhaXgagf6TDXw0jBy52qGSswINWvcgG9dp/s974/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;172&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5HAH0ekS-I-LEtbrJL4IXLwrtB7rfkVeK-A-mmid5nUT3MgYHiKCduuryAHi9TlAJ7QsvJA2S3miU0XWUE9FbQUHWe-jIY30SMkKXdhAEz2EhaXgagf6TDXw0jBy52qGSswINWvcgG9dp/s320/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Затем, в зависимости от предыдущих конфигураций, предложат несколько действий, суть которых должна свестись в формировнаии нового конфигурационного файла.&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Итог&lt;/h3&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Перезагружаем систему. Идем в меню&amp;nbsp; &quot;Система&quot; - &quot;Параметры&quot; - &quot;Мониторы&quot;. И снимаем флажок с &quot;Одинаковое изображение на всех мониторах&quot;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl4iqbSxMNVHbRxwrqRA__4WgFy4biSFpMFr4J6vnrEnf_MZHlbOeYuLOvbx-TItAKCzKBAjMHyX3g0C136W2ZO_uhYKYRCw442N199qQQgPKl5Ml9fmMDxYQIOY2OKbmHR_ObrE9Q0P4c/s899/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B+%D0%BC%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80%D0%B0.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;123&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl4iqbSxMNVHbRxwrqRA__4WgFy4biSFpMFr4J6vnrEnf_MZHlbOeYuLOvbx-TItAKCzKBAjMHyX3g0C136W2ZO_uhYKYRCw442N199qQQgPKl5Ml9fmMDxYQIOY2OKbmHR_ObrE9Q0P4c/s320/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA-%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B+%D0%BC%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80%D0%B0.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiovPdENA5JICIhNYmeSF5RZmJjWtbDiKgLAP-sYL2w62nTYSyVcUjpk_PEVffnWJX6TBJjQHCtbJZaGDF2qtYEj0l4PU1dgRPQD2WQ6m1h7nGrVrCgtkj6T0YRaWwEnNFNnZEBd2uwdZBn/s974/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/611062296457341463/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2013/07/ubuntu.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/611062296457341463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/611062296457341463'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2013/07/ubuntu.html' title='Настройка двух мониторов в Ubuntu'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5HAH0ekS-I-LEtbrJL4IXLwrtB7rfkVeK-A-mmid5nUT3MgYHiKCduuryAHi9TlAJ7QsvJA2S3miU0XWUE9FbQUHWe-jIY30SMkKXdhAEz2EhaXgagf6TDXw0jBy52qGSswINWvcgG9dp/s72-c/%25D0%25A1%25D0%25BD%25D0%25B8%25D0%25BC%25D0%25BE%25D0%25BA.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-2600908158632730727</id><published>2013-04-01T18:25:00.000-07:00</published><updated>2013-04-01T18:32:40.244-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="add"/><category scheme="http://www.blogger.com/atom/ns#" term="close"/><category scheme="http://www.blogger.com/atom/ns#" term="commit"/><category scheme="http://www.blogger.com/atom/ns#" term="execSQL"/><category scheme="http://www.blogger.com/atom/ns#" term="Firebird"/><category scheme="http://www.blogger.com/atom/ns#" term="Lazarus"/><category scheme="http://www.blogger.com/atom/ns#" term="open"/><category scheme="http://www.blogger.com/atom/ns#" term="ParamByName"/><category scheme="http://www.blogger.com/atom/ns#" term="Params"/><category scheme="http://www.blogger.com/atom/ns#" term="placeholders"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><category scheme="http://www.blogger.com/atom/ns#" term="TSQLQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="TSQLTransaction"/><category scheme="http://www.blogger.com/atom/ns#" term="запрос"/><category scheme="http://www.blogger.com/atom/ns#" term="параметризированный запрос"/><category scheme="http://www.blogger.com/atom/ns#" term="плэйсхолдеры"/><title type='text'>Lazarus. Простой код запроса к Firebird DB для Grid</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;a href=&quot;http://khramkov.blogspot.ru/2013/03/lazarus-firebird-db.html&quot;&gt;Подключившись к базе данных&lt;/a&gt;, требуется реализовать запросы к ней.&lt;br /&gt;
&lt;br /&gt;
Опишу простой пример кода для этого.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Именование компонентов&lt;/h3&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Так как именование добавленных компонентов у каждого свое, приведу свой пример, с которым и будем работать:&lt;/div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;b&gt;TSQLQuery&lt;/b&gt; SQLQueryInstance&lt;/li&gt;
&lt;li&gt;&lt;b&gt;TSQLTRansaction&lt;/b&gt; SQLTransactionInstance&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Код по шагам&lt;/h3&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&amp;nbsp;SQLQueryInstance&lt;i&gt;.Close;&lt;br /&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;SQLQueryInstance.SQL.Clear;&lt;br /&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;SQLQueryInstance.SQL.Add(&#39;SELECT * FROM table_name&#39;);&lt;br /&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;SQLQueryInstance.ExecSQL;&lt;br /&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;SQLTransactionInstance.Commit;&lt;br /&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;SQLQueryInstance.Open;&lt;/i&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Сперва закрываем наш датасет&lt;/li&gt;
&lt;li&gt;Очищаем список SQL-запросов. На самом деле делать это не обязательно (все зависит от задачи). В данном примере, мне все равно, что за запросы были до этого - мне необходимо выполнить новый запрос и только. В целом, выполнятся все запросы из списка в свойстве SQL.&lt;/li&gt;
&lt;li&gt;Добавляем свой запрос.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Выполняем запрос без возвращения результата. В противном случае лучше использовать rawQuery.&lt;/li&gt;
&lt;li&gt;Коммитим транзакцию.&lt;/li&gt;
&lt;li&gt;Чтобы результат последней транзакции был виден grid-компоненту, открываем датасет.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Параметризация&lt;/h3&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Предположим, наш запрос предполагает работу с данными, полученными вне контекста БД.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
К примеру, запрос на получение пользователя по его логину и паролю:&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;SELECT * FROM user WHERE login=&#39;user_login&#39; AND password=&#39;user_password&#39;&lt;/i&gt;&lt;/div&gt;
&lt;/blockquote&gt;
Предположим, логин и пароль были получены где-нибудь ранее и присвоены в качестве значения переменным &lt;i&gt;login&lt;/i&gt; и &lt;i&gt;password&lt;/i&gt; соотвественно. Теперь, запрос можно поменять следующим образом:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;SQLQueryInstance.SQL.Add(&lt;/i&gt;&lt;i&gt;&lt;i&gt;&#39;SELECT * FROM user WHERE login=&#39;&#39;&#39; + login + &#39; AND password=&#39;&#39;&#39; + password&lt;/i&gt;);&lt;/i&gt;&lt;/blockquote&gt;
Очевидно, что запрос приобрел несколько нечитаемый вид, вобрав в себя синтаксис SQL и Pascal, что несколько портит картину. Более того, приходится заботиться об экранировании кавычек. &lt;br /&gt;
Хочется сохранить целостность запросов, избегая дополнительной работы по отслеживанию кавычек и прочей рутинной, но синтаксически нужно работы.&lt;br /&gt;
Тут нам поможет параметризация sql-запросов.&lt;br /&gt;
В тех местах запроса, в которых мы предполагаем использовать &quot;внешние&quot; данные, мы ставим именованный плэйсхолдер, а затем отдельно указываем данные и тип данных:&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;SQLQueryInstance.SQL.Add(&#39;SELECT * FROM user WHERE login=:login AND password=:password);&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;i&gt;SQLQueryInstance&lt;/i&gt;.Params.ParamByName(&#39;login&#39;).AsString := login;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;i&gt;SQLQueryInstance&lt;/i&gt;.Params.ParamByName(&#39;password&#39;).AsString := password;&lt;/i&gt;&lt;/blockquote&gt;
В примере мы имеем два плэйсхолдера &lt;i&gt;:login&lt;/i&gt; и &lt;i&gt;:password&lt;/i&gt;, которые затем связываются с конечными данными, которые приводятся к тому или иному типу. В примере, оба параметра приведены к строковому типу через&amp;nbsp; свойство asString&lt;br /&gt;
Что примечательно, конечная вставка данных в запрос будет производиться на стороне базы данных, которая сама уже определит синтаксические особенности при работе с ними. Т.е., к примеру, при&amp;nbsp; передачи строковых данных, не нужно заботиться о кавычках - БД поставит их сама.&lt;br /&gt;
Так же, мы можем выполнить несколько однотипных запросов, меняя лишь данные, оставляя нетронутым сам запрос. &lt;br /&gt;
Параметризация в web-программировании - это один из методов борьбы с SQL-инъекциями.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/2600908158632730727/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2013/04/lazarus-firebird-db-grid.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/2600908158632730727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/2600908158632730727'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2013/04/lazarus-firebird-db-grid.html' title='Lazarus. Простой код запроса к Firebird DB для Grid'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-4954843033731505784</id><published>2013-03-24T17:55:00.002-07:00</published><updated>2013-03-24T18:01:29.325-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Firebird"/><category scheme="http://www.blogger.com/atom/ns#" term="Lazarus"/><category scheme="http://www.blogger.com/atom/ns#" term="SQLdb"/><category scheme="http://www.blogger.com/atom/ns#" term="TDAtasource"/><category scheme="http://www.blogger.com/atom/ns#" term="TDBGrid"/><category scheme="http://www.blogger.com/atom/ns#" term="TIBConnection"/><category scheme="http://www.blogger.com/atom/ns#" term="TSQLQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="TSQLTransaction"/><category scheme="http://www.blogger.com/atom/ns#" term="база данных"/><title type='text'>Lazarus. Подключение к Firebird DB</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div&gt;
Для работы с Firebird DB в IDE Lazarus есть уже готовые компоненты. Используя их, можно успешно проводить sql-транзакции, отображать результат на стандартных визуальных компонентах.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Компоненты&lt;/h3&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
SQLdb &lt;/h4&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Для начала, нужно добавить на форму компоненты, работающие непосредственно с Firebird DB.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Для этого откроем вкладку компонент &quot;SQLdb&quot;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKbaeZTVIIpUIP0F7pqTdov2B2fMmXvI4tR24KgbtC8O3K30o90L8OlmxlWL_Ph8W0SHCsW1zvPPUd7AWIKYbSrylSiZl4US6u06hp1VMg982DWYhbA_vuMMWfjWqvKFOhyphenhyphenaIWsP9FrAda/s1600/SQLDb.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;32&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKbaeZTVIIpUIP0F7pqTdov2B2fMmXvI4tR24KgbtC8O3K30o90L8OlmxlWL_Ph8W0SHCsW1zvPPUd7AWIKYbSrylSiZl4US6u06hp1VMg982DWYhbA_vuMMWfjWqvKFOhyphenhyphenaIWsP9FrAda/s400/SQLDb.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Выберем &lt;a href=&quot;http://www.freepascal.org/docs-html/fcl/ibconnection/tibconnection.html&quot; target=&quot;_blank&quot;&gt;TIBConnection&lt;/a&gt;, &lt;a href=&quot;http://www.freepascal.org/docs-html/fcl/sqldb/tsqlquery.html&quot; target=&quot;_blank&quot;&gt;TSQLQuery&lt;/a&gt; и &lt;a href=&quot;http://www.freepascal.org/docs-html/fcl/sqldb/tsqltransaction.html&quot; target=&quot;_blank&quot;&gt;TSQLTransaction&lt;/a&gt;&lt;/div&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
Data Access &lt;/h4&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Затем, перейдем на вкладку &quot;Data Access&quot; и выберем компонент &lt;a href=&quot;http://www.freepascal.org/docs-html/fcl/db/tdatasource.html&quot; target=&quot;_blank&quot;&gt;TDatasource&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkACkp9FUpHiPX-IxdZS5q-GR_YUyJTq8QUIZOkjafBWuElCK8I-UlAaf8cO-JXx6lWTEJNR-7XzRdovsmaiwu7fhp3BCcGYV5LaMupmAZPZIPb6mBiQBeIXFYsl9pxGhc_RruCw0T5-pF/s1600/DataAccess.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;30&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkACkp9FUpHiPX-IxdZS5q-GR_YUyJTq8QUIZOkjafBWuElCK8I-UlAaf8cO-JXx6lWTEJNR-7XzRdovsmaiwu7fhp3BCcGYV5LaMupmAZPZIPb6mBiQBeIXFYsl9pxGhc_RruCw0T5-pF/s400/DataAccess.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Этот компонент поможет автоматически связывать данные, полученные из определенного датасета (в данном случае - от TSQLQuery) и визуальные компоненты, на которых эти данные нужно отобразить.&lt;/div&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
Data Controls&lt;/h4&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
В довершении, поместим на форму компонент для визуального отображения данных. Перейдем на вкладку &quot;Data Controls&quot; и выберем, например, TBGrid&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0QuxIM7ENKjbZ4j8XUCSq2br-h1vLLyBhHQoQSvqvUYVKpzdVsWW4ZtieaSm1cOBkygMwu_Q-4oyeHQQjOM2wT2vGBqW005dphv-sHX-4DyMXl5MWNbbUf-hGgwUKCdsAvw3mYhi1hsVp/s1600/DataControls.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;32&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0QuxIM7ENKjbZ4j8XUCSq2br-h1vLLyBhHQoQSvqvUYVKpzdVsWW4ZtieaSm1cOBkygMwu_Q-4oyeHQQjOM2wT2vGBqW005dphv-sHX-4DyMXl5MWNbbUf-hGgwUKCdsAvw3mYhi1hsVp/s400/DataControls.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Установка свойств компонентов&lt;/h3&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Для каждого компонента производим минимальную установку свойств, необходимую для их работоспособности.&lt;/div&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
TIBConnection&lt;/h4&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;b&gt;DatabaseName&lt;/b&gt; - путь к существующей базе данных&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Password&lt;/b&gt; - пароль к db&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Transaction&lt;/b&gt; - ссылка объект класса TSQLTransaction (указываем тот, что добавили на форму)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;UserName&lt;/b&gt; - имя пользователя db&lt;/li&gt;
&lt;li&gt;CharSet - кодировка db&lt;/li&gt;
&lt;/ul&gt;
После того, как вышеперечисленные свойства установлены, пробуем установить свойство &lt;b&gt;Connected&lt;/b&gt; в &lt;i&gt;true. &lt;/i&gt;Если все было указано верно, то ошибки не произойдет и свойство применится. В противном случае свойство останется в &lt;i&gt;false&lt;/i&gt; - в этом случае смотрите, какие ошибки выдает IDE, и пробуйте их исправить.&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
TSQLQuery&lt;/h4&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;b&gt;Database&lt;/b&gt; - ссылка на объект класса TIBConnection (указываем тот, что добавили на форму)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SQL&lt;/b&gt; - список запросов, выполняемых по умолчанию. Добавьте любой простой запрос на выборку, типа &lt;i&gt;SELECT * FROM table_name&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Transaction&lt;/b&gt; - ссылка объект класса TSQLTransaction (указываем тот, что добавили на форму)&lt;/li&gt;
&lt;/ul&gt;
После установки вышеперечисленных свойств, пробуем установить свойство &lt;b&gt;Active&lt;/b&gt; в &lt;i&gt;true. &lt;/i&gt;Если все было указано верно, то ошибки не произойдет и свойство применится. В противном случае свойство останется в &lt;i&gt;false&lt;/i&gt; - в этом случае смотрите, какие ошибки выдает IDE, и пробуйте их исправить.&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
TSQLTransaction&lt;/h4&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;b&gt;Database&lt;/b&gt; - ссылка на объект класса TIBConnection (указываем тот, что добавили на форму)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Active&lt;/b&gt; - устанавливаем в &lt;i&gt;true &lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
TDatasource&lt;/h4&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;b&gt;DataSet&lt;/b&gt; - ссылка объект класса TSQLQuery (указываем тот, что добавили на форму)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
TDBGrid&lt;/h4&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&amp;nbsp;DataSource - ссылка на объект класса TDatasource (указываем тот, что добавили на форму)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Если все сделано верно, то в компоненте TDBGrid будет отображен результат выборки, указанной по умолчанию для TSQLQuery компонента. &lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/4954843033731505784/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2013/03/lazarus-firebird-db.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/4954843033731505784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/4954843033731505784'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2013/03/lazarus-firebird-db.html' title='Lazarus. Подключение к Firebird DB'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKbaeZTVIIpUIP0F7pqTdov2B2fMmXvI4tR24KgbtC8O3K30o90L8OlmxlWL_Ph8W0SHCsW1zvPPUd7AWIKYbSrylSiZl4US6u06hp1VMg982DWYhbA_vuMMWfjWqvKFOhyphenhyphenaIWsP9FrAda/s72-c/SQLDb.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-932758873388071634</id><published>2013-03-13T20:43:00.003-07:00</published><updated>2013-03-14T00:36:08.363-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="install"/><category scheme="http://www.blogger.com/atom/ns#" term="pear"/><category scheme="http://www.blogger.com/atom/ns#" term="PhpStorm"/><category scheme="http://www.blogger.com/atom/ns#" term="phpunit"/><category scheme="http://www.blogger.com/atom/ns#" term="PHPUnit_TextUI_ResultPrinter"/><category scheme="http://www.blogger.com/atom/ns#" term="Unittest"/><title type='text'>TDD with PhpStorm. Class &#39;PHPUnit_TextUI_ResultPrinter&#39; not found</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Обновившись на новую версию PhpStorm обнаружил, что мои unittest отваливаются с ошибкой&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;color: red;&quot;&gt;PHP Fatal error:&amp;nbsp; Class &#39;PHPUnit_TextUI_ResultPrinter&#39; not found&lt;/span&gt;&lt;/blockquote&gt;
Перерыв Интернеты в поисках решения, в итоге нашел следующие команды, которые помогли:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;pear channel-discover pear.symfony.com&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;pear install pear.symfony.com/Yaml&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;pear install --alldeps pear.phpunit.de/PHPUnit&lt;/i&gt;&lt;/blockquote&gt;
Вполне возможно, достаточно последней команды:)&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/932758873388071634/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2013/03/tdd-with-phpstorm-class.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/932758873388071634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/932758873388071634'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2013/03/tdd-with-phpstorm-class.html' title='TDD with PhpStorm. Class &#39;PHPUnit_TextUI_ResultPrinter&#39; not found'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-4629370441452072890</id><published>2013-03-11T19:51:00.000-07:00</published><updated>2013-03-13T20:44:29.713-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bash"/><category scheme="http://www.blogger.com/atom/ns#" term="checkout"/><category scheme="http://www.blogger.com/atom/ns#" term="create branch"/><category scheme="http://www.blogger.com/atom/ns#" term="fetch"/><category scheme="http://www.blogger.com/atom/ns#" term="git"/><category scheme="http://www.blogger.com/atom/ns#" term="heads"/><category scheme="http://www.blogger.com/atom/ns#" term="origin"/><category scheme="http://www.blogger.com/atom/ns#" term="pull"/><category scheme="http://www.blogger.com/atom/ns#" term="push"/><category scheme="http://www.blogger.com/atom/ns#" term="refs"/><category scheme="http://www.blogger.com/atom/ns#" term="track"/><category scheme="http://www.blogger.com/atom/ns#" term="создание бранча"/><category scheme="http://www.blogger.com/atom/ns#" term="создание ветки"/><title type='text'>GIT. Создание ветки</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
В своей работе при создании очередной ветки в GIT использую простой bash-скрипт:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;if&lt;/b&gt; [ &lt;span style=&quot;color: #990000;&quot;&gt;$#&lt;/span&gt; -lt 1 ] || [ &lt;span style=&quot;color: #990000;&quot;&gt;$#&lt;/span&gt; -gt 2 ]; &lt;b&gt;then&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;b&gt;echo&lt;/b&gt; 1&amp;gt;&amp;amp;2 Usage: &lt;span style=&quot;color: #990000;&quot;&gt;$0&lt;/span&gt; [-c] branch_name&lt;br /&gt;&amp;nbsp;&lt;b&gt;exit&lt;/b&gt; 127&lt;br /&gt;&lt;b&gt;fi&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;if&lt;/b&gt; [ &lt;span style=&quot;color: #990000;&quot;&gt;$#&lt;/span&gt; -eq 2 ] &amp;amp;&amp;amp; [ &lt;span style=&quot;color: #990000;&quot;&gt;$1&lt;/span&gt; == &lt;span style=&quot;color: #cc0000;&quot;&gt;&quot;-c&quot;&lt;/span&gt; ]; &lt;b&gt;then&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;span style=&quot;color: #990000;&quot;&gt;BNAME&lt;/span&gt;=&lt;span style=&quot;color: #cc0000;&quot;&gt;&#39;HEAD&#39;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;span style=&quot;color: #990000;&quot;&gt;NAME&lt;/span&gt;=$2&lt;br /&gt;&lt;b&gt;else&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;span style=&quot;color: #990000;&quot;&gt;BNAME&lt;/span&gt;=&lt;span style=&quot;color: #cc0000;&quot;&gt;&#39;master&#39;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;span style=&quot;color: #990000;&quot;&gt;NAME&lt;/span&gt;=&lt;span style=&quot;color: #990000;&quot;&gt;$1&lt;/span&gt;&lt;br /&gt;&lt;b&gt;fi&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;git pull&lt;br /&gt;git push origin &lt;span style=&quot;color: #990000;&quot;&gt;${BNAME}&lt;/span&gt;:refs/heads/&lt;span style=&quot;color: #990000;&quot;&gt;$NAME&lt;/span&gt;&lt;br /&gt;git fetch origin&lt;br /&gt;git checkout --track -b &lt;span style=&quot;color: #990000;&quot;&gt;$NAME&lt;/span&gt; origin/&lt;span style=&quot;color: #990000;&quot;&gt;$NAME&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#Ветка от мастера&lt;/span&gt;&lt;br /&gt;sh script.sh Branch_Name&lt;br /&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#Ветка от текущей ветки&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;sh script.sh -c Branch_Name&lt;/i&gt;&lt;/blockquote&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/4629370441452072890/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2013/03/git.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/4629370441452072890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/4629370441452072890'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2013/03/git.html' title='GIT. Создание ветки'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-3945434454225955508</id><published>2013-03-10T17:27:00.000-07:00</published><updated>2013-03-10T17:30:21.662-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="alter"/><category scheme="http://www.blogger.com/atom/ns#" term="auto increment"/><category scheme="http://www.blogger.com/atom/ns#" term="create table"/><category scheme="http://www.blogger.com/atom/ns#" term="create trigger"/><category scheme="http://www.blogger.com/atom/ns#" term="Firebird"/><category scheme="http://www.blogger.com/atom/ns#" term="generator"/><category scheme="http://www.blogger.com/atom/ns#" term="primary key"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><category scheme="http://www.blogger.com/atom/ns#" term="trigger"/><category scheme="http://www.blogger.com/atom/ns#" term="автоинкремент"/><category scheme="http://www.blogger.com/atom/ns#" term="первичный ключ"/><title type='text'>Firebird DB: создание простого primary key auto increment</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Проблема&lt;/h3&gt;
В Firebird по-умолчанию невозможен автоинкремент первичных ключей, как это, например, возможно в MySQL.&lt;br /&gt;
&lt;br /&gt;
Для реализации auto increment для первичного ключа будем использовать триггеры. &lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Primary Key&lt;/h3&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Сперва опишу процесс создания первичного ключа. Первичный ключ, он же primary key или PK, можно описать непосредственно при создании новой таблицы, либо добавить к существующей.&lt;br /&gt;
&lt;/div&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
PK при создании таблицы&lt;/h4&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&amp;nbsp;&lt;i&gt;CREATE TABLE table_example&lt;br /&gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; id INTEGER NOT NULL PRIMARY KEY&lt;br /&gt;);&lt;/i&gt;&lt;/div&gt;
&lt;/blockquote&gt;
В новой таблице &lt;b&gt;table_example&lt;/b&gt; мы создаем первичный ключ &lt;b&gt;id&lt;/b&gt;. Что примечательно, он должен быть обязательно &lt;b&gt;not null&lt;/b&gt;.&lt;br /&gt;
Тут все просто. Несколько сложнее дела обстоят с добавлением первичного ключа к сущетсвующей таблице.&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
PK в уже существующей таблице&lt;/h4&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Сперва нужно добавить обычное поле в таблицу:&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;ALTER TABLE table_example ADD id INTEGER NOT NULL;&lt;/i&gt;&lt;/blockquote&gt;
Очевидно, если в уже таблице есть данные, то новому полю нужно присвоить какие-либо значения. Делаем &lt;b&gt;update&lt;/b&gt; таблицы и меняем значение поля &lt;b&gt;id&lt;/b&gt; для каждой записи таким образом, чтобы оно было уникальным.&lt;br /&gt;
Осталось сделать поле первичным ключом:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;ALTER TABLE table_example ADD CONSTRAINT constraint_name PRIMARY KEY (id)&lt;/i&gt;&lt;/blockquote&gt;
Здесь мы добавляем констреинт с именем &lt;b&gt;constraint_name&lt;/b&gt;, в котором описываем первичный ключ. Этот запрос отработает, если в таблице не было значений, либо все значения в поле &lt;b&gt;id&lt;/b&gt; были уникальными.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Auto increment&lt;/h3&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Теперь нужно добавить к нашему первичному ключу авто увеличение значения.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Для этого нужно:&lt;/div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Создать свой генератор, в котором будет храниться текущее значение PK&lt;/li&gt;
&lt;li&gt;Написать триггер для таблицы, который будет присваивать PK в новой записи уникальное значение, большее значения, хранящегося в генераторе на какой-либо число.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
Генератор&lt;/h4&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Создаем новый генератор:&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;CREATE GENERATOR generator_name;&lt;/i&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
Триггер&lt;/h4&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Добавляем триггер для нашей таблицы &lt;b&gt;table_example&lt;/b&gt;, используя созданный генератор&lt;b&gt; generator_name&lt;/b&gt;:&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;SET TERM ^ ;&lt;br /&gt;CREATE TRIGGER trigger_name FOR table_example ACTIVE&lt;br /&gt;BEFORE INSERT &lt;b&gt;POSITION 1&lt;/b&gt;&lt;br /&gt;AS &lt;br /&gt;BEGIN &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;if (new.id is null ) then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; new.id = gen_id (generator_name, 1);&lt;/b&gt;&lt;br /&gt;END^&lt;br /&gt;SET TERM ; ^ &lt;/i&gt;&lt;/div&gt;
&lt;/blockquote&gt;
В данном примере триггер будет отрабатывать до вставки новой записи в таблице, присваивая значению &lt;b&gt;id&lt;/b&gt; (если оно не указано явно) значение, на единицу большее, чем хранится на тот момент в генераторе.&lt;br /&gt;
Тут я выделил два момента:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;b&gt;POSITION 1&lt;/b&gt;. Значение позиции определяет, с какого численного значения генерировать очередное значение для PK. Для пустой таблицы, само собой, генерацию лучше производить с единицы, как и указано. Но если мы добавляли PK в существующую таблицу с имеющимися данными, то после добавления и апдейта PK у нас уже имеет некоторые значения. По-хорошему, это промежуток значений &lt;b&gt;[1, N]&lt;/b&gt;, где &lt;b&gt;N&lt;/b&gt; - количество записей. В таком случае позицию нужно указать, как &lt;b&gt;POSITION &lt;i&gt;N+1&lt;/i&gt;&lt;/b&gt;.&lt;br /&gt;
Так, если макисмальное значение PK было 3, то в значение позиции пойдет число 4. &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Логика триггера&lt;/b&gt;. Код триггера, описанный между &lt;b&gt;BEGIN&lt;/b&gt; и &lt;b&gt;END&lt;/b&gt;, собственно, и реализует логику. Здесь используется системная функция &lt;a href=&quot;http://www.codenet.ru/db/interbase/ibsql/GEN_ID.php&quot; target=&quot;_blank&quot;&gt;gen_id&lt;/a&gt;, увеличивающая значение генератора, переданного первым аргументом, на значение, переданное вторым аргументом. В данном случае мы инкрементим на единицу. &lt;/li&gt;
&lt;/ul&gt;
Следует отметить, код логики триггера имеет свой синтаксис, а, следовательно, свои разделители. В данном случае, точку с запятой. Так как точка с запятой в свою очередь разделяет запросы друг от друга, чтобы не было путаницы, для запросов делают переход от точки с запятой на &quot;крышечку&quot; до начала запроса:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;SET TERM ^ ;&lt;/i&gt;&lt;/blockquote&gt;
&amp;nbsp; И обратно - после:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;SET TERM ; ^&lt;/i&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/3945434454225955508/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2013/03/firebird-db-primary-key-auto-increment.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/3945434454225955508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/3945434454225955508'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2013/03/firebird-db-primary-key-auto-increment.html' title='Firebird DB: создание простого primary key auto increment'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-5494917289139166130</id><published>2013-03-05T21:18:00.000-08:00</published><updated>2013-03-05T21:22:17.836-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="clearTimeout"/><category scheme="http://www.blogger.com/atom/ns#" term="closure"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="setInterval"/><category scheme="http://www.blogger.com/atom/ns#" term="setTimeout"/><category scheme="http://www.blogger.com/atom/ns#" term="анонимная функция"/><category scheme="http://www.blogger.com/atom/ns#" term="замыкание"/><category scheme="http://www.blogger.com/atom/ns#" term="рекурсия"/><title type='text'>Javascript. Остановка setTimeout в рекурсивных функциях</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Задача &lt;/h3&gt;
Порой, для отслеживания каких-либо операций или событий по таймауту (например, содержимого тектового поля, которое, как известно, можно изменить в обход нативных обработчиков событий), применяют рекурсивные функции, вызываемые с помощью &lt;b&gt;setTimeout&lt;/b&gt; (&lt;b&gt;setInterval&lt;/b&gt; не подходит, так как технология использования &lt;b&gt;setTimeout&lt;/b&gt; гарантированно позволяет выполнять определенные действия через равные промежутки времени, в то время, как &lt;b&gt;setInterval&lt;/b&gt; не гарантирует равную величину временных промежутков. &lt;a href=&quot;http://learn.javascript.ru/settimeout-setinterval&quot; target=&quot;_blank&quot;&gt;Подробнее&lt;/a&gt;.)&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Пример такой функции:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;(function () {&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var test = arguments.callee;&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var t = setTimeout(function () {&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.log(Math.random());&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test()&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, 3000)&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;})();&lt;/i&gt;&lt;/blockquote&gt;
Явный недостаток такого подхода - это невозможность остановить выполнение кода. В данном примере в лог будут сыпаться рандомные числа каждые 3 секунды.&lt;br /&gt;
&lt;br /&gt;
Как все же управлять жизнью таких конструкций?&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Варианты решений.&amp;nbsp;&lt;/h3&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
1.Деанонимизация&lt;/h4&gt;
Самая простая идея - не делать рекурсивную функцию анонимной:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;// Сперва объявляем функцию&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;var test = function () {&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var t = setTimeout(function () {&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.log(Math.random());&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test();&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, 3000)&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;};&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;// Затем, запускаем &lt;/i&gt;&lt;br /&gt;
&lt;i&gt;(function () {&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test();&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;})();&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Теперь, для остановки просто удаляем нашу функцию:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;delete test;&lt;/i&gt;&lt;/blockquote&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
2. Замыкание или инкапсуляция&lt;/h4&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Основная идея состоит в том, чтобы в выполняемой функции отслеживать состояние некоторой переменной, глобальной по отношению к рекурсивной функции, доступной через замыкание, и, в зависимости от ее состояния, выполнять очередную итерацию или нет. Аналогично можно использовать свойства объекта, если рекурсивная функция является его методом.&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;var flag = true;&lt;br /&gt;(function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(flag) {&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var test = arguments.callee;&lt;/i&gt;&lt;i&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var t = setTimeout(function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.log(Math.random()); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, 3000)&lt;/i&gt;&lt;i&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;})();&lt;/i&gt;&lt;/blockquote&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
3. clearTimeout&lt;/h4&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Идея состоит в том, чтобы передавать значение, возвращаемое &lt;b&gt;setTimeout&lt;/b&gt; глобальной в отношении рекурсивной функции переменной (или свойству объекта). И в нужный момент передавать значение этой переменной в качестве аргумента &lt;b&gt;clearTimeout&lt;/b&gt;:&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;// Объявляем переменную для таймаута&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;var t;&amp;nbsp;&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;(function () {&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var test = arguments.callee;&amp;nbsp; &lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; t = setTimeout(function () {&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; console.log(Math.random());&amp;nbsp;&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; test()&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, 3000)&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;})();&lt;/i&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Останавливаем выполнение:&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;i&gt;clearTimeout(t);&lt;/i&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Итог.&lt;/h3&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Конечно, все зависит от конечной реализации, но в приведенных примерах, третий подход гарантированно завершает выполнение кода в момент вызова &lt;b&gt;clearTimeout&lt;/b&gt;, в то время, как остальные подходы допускают завершение кода, в теле &lt;b&gt;setTimeout&lt;/b&gt;.&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/5494917289139166130/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2013/03/javascript-settimeout.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/5494917289139166130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/5494917289139166130'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2013/03/javascript-settimeout.html' title='Javascript. Остановка setTimeout в рекурсивных функциях'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-8497037060616917770</id><published>2013-02-27T15:30:00.000-08:00</published><updated>2013-02-27T15:33:23.926-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bash"/><category scheme="http://www.blogger.com/atom/ns#" term="git"/><category scheme="http://www.blogger.com/atom/ns#" term="guake"/><category scheme="http://www.blogger.com/atom/ns#" term="id_rsa"/><category scheme="http://www.blogger.com/atom/ns#" term="passphrase"/><category scheme="http://www.blogger.com/atom/ns#" term="pull"/><category scheme="http://www.blogger.com/atom/ns#" term="push"/><category scheme="http://www.blogger.com/atom/ns#" term="ssh"/><category scheme="http://www.blogger.com/atom/ns#" term="ssh-add"/><category scheme="http://www.blogger.com/atom/ns#" term="ssh-agent"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>Git постоянно требует ввести passphrase?</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Так уж повелось, что при работе с git (с консоли на Ubuntu 10.04) любое мое более ли менее серьезное телодвижение (pull, push,...) начинается с ввода passphrase.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Дабы уберечь себя от постоянного оттачивания мастерства перебора клавиатурных клавиш, можно ввести в консоли следующее:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;ssh-agent bash&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;ssh-add&lt;/i&gt;&lt;/blockquote&gt;
После чего необходимость ввода&amp;nbsp; passphrase отпадет.&lt;br /&gt;
&lt;br /&gt;
Что примечательно, это работает локально одной консоли. То есть, для новой вкладки того же &lt;a href=&quot;http://guake.org/&quot; target=&quot;_blank&quot;&gt;guake&lt;/a&gt; придется проделать все заново.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/8497037060616917770/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2013/02/git-passphrase.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/8497037060616917770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/8497037060616917770'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2013/02/git-passphrase.html' title='Git постоянно требует ввести passphrase?'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-4434585993770188787</id><published>2013-02-26T16:16:00.000-08:00</published><updated>2013-02-26T16:33:31.007-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="$"/><category scheme="http://www.blogger.com/atom/ns#" term="animate"/><category scheme="http://www.blogger.com/atom/ns#" term="callback"/><category scheme="http://www.blogger.com/atom/ns#" term="deferred"/><category scheme="http://www.blogger.com/atom/ns#" term="done"/><category scheme="http://www.blogger.com/atom/ns#" term="fadeIn"/><category scheme="http://www.blogger.com/atom/ns#" term="fadeOut"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="promise"/><category scheme="http://www.blogger.com/atom/ns#" term="resolve"/><category scheme="http://www.blogger.com/atom/ns#" term="when"/><title type='text'>jQuery deferred animation</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Анимация &lt;/h3&gt;
Альтернативным и более гибким использованием колбэков для jQuery-методов анимации является deferred-технология:&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Вместо&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;$(selector).animate(..., function () {...});&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Можно использовать&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;var dfd = $(selector).animate(...);&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
И в том месте кода, где предполагается выполнить действия, следующие по завершению анимации, делаем:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;dfd.done(function () {&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp; &amp;nbsp; // place your code here &lt;/i&gt;&lt;br /&gt;
&lt;i&gt;}); &lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Более наглядно гибкость такого подхода можно отразить в примере с двумя и более анимациями:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;var dfd1 = $(selector1).animate(...);&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;var dfd2 - $(selector2).animate(...);&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;$.when(dfd1, dfd2).done(function () {&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp; &amp;nbsp; // place your code here &lt;/i&gt;&lt;br /&gt;
&lt;i&gt;}); &lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
В этом примере отложенное исполнение кода придет в действие после успешного выполнения каждой из анимаций.&lt;br /&gt;
&lt;br /&gt;
К слову, вышеописанное применимо и к другим анимационным методам, например, fadeIn, fadeOut.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Обобщение&lt;/h3&gt;
Собственно, общее использование deferred-технологии описывается в promise-объектах:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;var dfd = $.Deferred();&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;i&gt;// Некая асинхронная функция&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;(function () {&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp; &amp;nbsp; dfd.resolve(); // Указываем, что с данного момента отложенный код может быть выполнен. &lt;/i&gt;&lt;br /&gt;
&lt;i&gt;})();&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;i&gt;dfd.promise().done(function () {&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp; &amp;nbsp; // Отложенный код &lt;/i&gt;&lt;br /&gt;
&lt;i&gt;});&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Например:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;var dfd = $.Deferred();&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;$(selector).fadeOut(300, function () {&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp; &amp;nbsp; console.log(&#39;1&#39;);&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp; &amp;nbsp; dfd.resolve(); &lt;/i&gt;&lt;br /&gt;
&lt;i&gt;}); &lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;
&lt;i&gt;dfd.promise().done(function () {&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&amp;nbsp; &amp;nbsp; console.log(&#39;2&#39;); &lt;/i&gt;&lt;br /&gt;
&lt;i&gt;});&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
В консоли пример выведет:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;1&lt;br /&gt;2&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Подробнее &lt;a href=&quot;http://api.jquery.com/category/deferred-object/&quot; target=&quot;_blank&quot;&gt;http://api.jquery.com/category/deferred-object/&lt;/a&gt;. &lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/4434585993770188787/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2013/02/jquery-deferred-animation.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/4434585993770188787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/4434585993770188787'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2013/02/jquery-deferred-animation.html' title='jQuery deferred animation'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-4965674746402770299</id><published>2013-02-24T15:56:00.001-08:00</published><updated>2013-02-24T15:57:11.678-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Array"/><category scheme="http://www.blogger.com/atom/ns#" term="get path"/><category scheme="http://www.blogger.com/atom/ns#" term="hash"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="Object"/><category scheme="http://www.blogger.com/atom/ns#" term="set path"/><category scheme="http://www.blogger.com/atom/ns#" term="undefined"/><title type='text'>Javascript. Установка и чтение данных в многомерных хэшах</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;b&gt;Задача:&lt;/b&gt; имеем хэш в js. Требуется установить значение по любой цепочке вложенности, используя вызов всего одной функции. И, используя вызов одной функции, прочесть значение.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
То есть, имея хэш&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;var example = {&lt;/i&gt;&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;a: {&lt;/i&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;b: {&lt;/i&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;c: &#39;value &#39;&lt;/i&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;} &lt;/i&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;} &lt;/i&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;}&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Хотелось бы добавить еще одно значение, тем самым, получив следующий вид:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;var example = {&lt;/i&gt;&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;a: {&lt;/i&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;b: {&lt;/i&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;c: &#39;value &#39;&lt;/i&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;}, &lt;/i&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;d: {&lt;/i&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;e: &#39;value2&#39; &lt;/i&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;} &lt;/i&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;} &lt;/i&gt;&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;}&lt;/i&gt;&lt;/blockquote&gt;
И затем прочесть эти значения. При этом не заботясь о существовании промежуточных ключах.&lt;br /&gt;
&lt;br /&gt;
Для этих нужд написал 2 функции. В их реализации отталкивался от кохановского метода &lt;a href=&quot;http://kohanaframework.org/3.0/guide/api/Arr#path&quot; target=&quot;_blank&quot;&gt;Arr::path&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Функция &lt;b&gt;setPath.&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Первым аргументом принимает непосредственно хэш.&lt;/li&gt;
&lt;li&gt;Вторым - путь по ключам. Может быть задан строкой, где ключи разделены каким-либо символом (или группой симовлов). В данной функции используется точка. Так же это может быть массив, в котором перечисленны ключи в порядке их следования.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Третий аргумент - устанавливаемое значение. &lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;function setPath (o, path, value) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (path) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (typeof path === &#39;string&#39;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; path = path.split(&#39;.&#39;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var key = path.shift();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (key &amp;amp;&amp;amp; key != &#39;&#39;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (path.length) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!o[key]) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; o[key] = {};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; o[key] = setPath(o[key], path, value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; o[key] = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return o;&lt;br /&gt;}&lt;/i&gt;&lt;/blockquote&gt;
Если какой-либо ключ отсутствовал в хэше - он будет создан. Если в не указать значение, то будет установленно &lt;i&gt;undefined&lt;/i&gt; вместо него. &lt;br /&gt;
&lt;br /&gt;
Функция &lt;b&gt;getPath&lt;/b&gt;. Аргументы полностью идентичны первым двум аргументам предыдущей функции. &lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;&lt;br /&gt;function getPath (o, path) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var value = o;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (path) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (typeof path === &#39;string&#39;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; path = path.split(&#39;.&#39;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var i = 0; i &amp;lt; path.length; i ++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (value) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value = value[path[i]];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return value;&lt;br /&gt;}&lt;/i&gt; &lt;/blockquote&gt;
С приведенным выше примером функции можно использовать так:&lt;br /&gt;
&lt;br /&gt;
Добавим значение &#39;value2&#39;:&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;setPath(example, [&#39;a&#39;, &#39;d&#39;, &#39;e&#39;], &#39;value2&#39;);&lt;/i&gt; &lt;/blockquote&gt;
&amp;nbsp;Прочтем значение &#39;value2&#39;:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
getPath(example, &#39;a.d.e&#39;);&lt;/blockquote&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/4965674746402770299/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2013/02/javascript.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/4965674746402770299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/4965674746402770299'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2013/02/javascript.html' title='Javascript. Установка и чтение данных в многомерных хэшах'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-4829536062080841329</id><published>2012-12-19T15:19:00.002-08:00</published><updated>2012-12-19T15:58:12.846-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bash"/><category scheme="http://www.blogger.com/atom/ns#" term="find"/><category scheme="http://www.blogger.com/atom/ns#" term="for"/><category scheme="http://www.blogger.com/atom/ns#" term="id3convert"/><category scheme="http://www.blogger.com/atom/ns#" term="libid3"/><category scheme="http://www.blogger.com/atom/ns#" term="mp3"/><category scheme="http://www.blogger.com/atom/ns#" term="sha1sum"/><category scheme="http://www.blogger.com/atom/ns#" term="shuffle mp3"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><category scheme="http://www.blogger.com/atom/ns#" term="случайная сортировка"/><title type='text'>Псевдослучайная сортировка файлов</title><content type='html'>Иногда приходится использовать девайсы для проигрывания музыки, не способные проигрывать файлы в случайном порядке. Часто этим грешат различные FM-модуляторы.&lt;br /&gt;
Имея один такой в машине, а также имея огромное количество mp3-файлов к проигрыванию, столкнулся с очень острой необходимостью воспроизводить эти файлы чуточку в случайном порядке.&lt;br /&gt;
Как правило, модуляторы воспроизводят файлы в порядке, зависящем от названия файла. Меняем случайным образом имя файла - меняем порядок воспроизведения.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
В моем случае я просто копирую мои файлы на карту памяти попутно меняя их имя следующим образом:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
for fname in *.mp3&lt;br /&gt;
do&lt;br /&gt;
&amp;nbsp;&amp;nbsp; cp &quot;$fname&quot; /path/to/card/$(echo &quot;$fname&quot; | sha1sum | cut -f1 -d&#39; &#39;).mp3&lt;br /&gt;
done&lt;/blockquote&gt;
А если модулятор ориентируется так же на ID3-теги? Можно удалить и их.&lt;br /&gt;
Для этого на Ubuntu я использовал следующее:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Устанавливаю&amp;nbsp; libid3-3.8.3-dev:&lt;blockquote class=&quot;tr_bq&quot;&gt;
apt-get install libid3-3.8.3-dev&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;Выполняю очистку ID3-тегов:&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;
find . -type f -iname &#39;*.mp3&#39; -exec id3convert -s {} \;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/4829536062080841329/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2012/12/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/4829536062080841329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/4829536062080841329'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2012/12/blog-post.html' title='Псевдослучайная сортировка файлов'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-1171937659712475381</id><published>2012-04-26T16:23:00.000-07:00</published><updated>2013-04-02T17:33:10.102-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="prototype"/><category scheme="http://www.blogger.com/atom/ns#" term="rad to degree"/><category scheme="http://www.blogger.com/atom/ns#" term="градусы в радианы"/><category scheme="http://www.blogger.com/atom/ns#" term="метод"/><title type='text'>Javascript: конвертирование градусов в радианы &quot;на лету&quot;</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Порой, особенно при работе с canvas, возникает необходимость использовать значения, выраженные в радианах. По умолчанию, в Javascript нет метода для перевода градусов (или иных других величин) в радианы.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Этот момент можно исправить, предварительно добавив через прототип нужный метод для объекта &quot;Число&quot;:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;Number.prototype.toRad = function () { return this * Math.PI / 180; }&lt;/i&gt;&lt;/blockquote&gt;
После чего переводить градусы в радианы можно достаточно просто; например:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;i&gt;(90).toRad(); &lt;/i&gt;&lt;/blockquote&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/1171937659712475381/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2012/04/javascript.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/1171937659712475381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/1171937659712475381'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2012/04/javascript.html' title='Javascript: конвертирование градусов в радианы &quot;на лету&quot;'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>Владивосток, Приморский Край, Россия</georss:featurename><georss:point>43.1666667 131.9333333</georss:point><georss:box>43.0740172 131.7754048 43.2593162 132.09126179999998</georss:box></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-2370653280475818201</id><published>2011-09-04T16:36:00.000-07:00</published><updated>2011-09-04T22:47:36.603-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="error"/><category scheme="http://www.blogger.com/atom/ns#" term="kernel driver"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="solved"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu 11.04"/><category scheme="http://www.blogger.com/atom/ns#" term="virtualbox"/><title type='text'>VirtualBox Kernel driver not installed (rc=-1908)</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Стоит Ubuntu 11.04.
При запуске VirtualBox выдает ошибку:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Kernel driver not installed (rc=-1908)&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Please reinstall the kernel module by executing&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;/etc/init.d/vboxdrv setup

as root.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Users of Ubuntu, Fedora or Mandriva should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necessary.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Запуск из терминала &lt;i&gt;/etc/init.d/vboxdrv setup&lt;/i&gt; ни к чему хорошему не привел:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Stopping VirtualBox kernel module [ OK ]&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Recompiling VirtualBox kernel module [СБОЙ ]&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;(Look at /var/log/vbox-install.log to find out what went wrong)&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
В &lt;i&gt;var/log/vbox-install.log&lt;/i&gt; написано:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Makefile:152: *** Error: unable to find the sources of your current Linux kernel. Specify KERN_DIR=&lt;directory&gt; and run Make again.&lt;/directory&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Перечитав форумы, справился с проблемой, путем выполнения всего двух команд:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;b&gt;sudo aptitude install linux-headers-{uname -r}&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;b&gt;&amp;nbsp;/etc/init.d/vboxdrv setup &lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Если необходимо:

&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;sudo apt-get install aptitude&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;sudo apt-get install dkms&lt;/i&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/2370653280475818201/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2011/09/virtualbox-kernel-driver-not-installed.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/2370653280475818201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/2370653280475818201'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2011/09/virtualbox-kernel-driver-not-installed.html' title='VirtualBox Kernel driver not installed (rc=-1908)'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total><georss:featurename>город Владивосток, Приморский край, Россия</georss:featurename><georss:point>43.1306915 131.923828</georss:point><georss:box>42.9452845 131.607971 43.316098499999995 132.23968499999998</georss:box></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-5938352169111636270</id><published>2011-08-07T16:56:00.000-07:00</published><updated>2011-09-04T22:47:16.320-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="perl"/><category scheme="http://www.blogger.com/atom/ns#" term="rabbitVCS"/><category scheme="http://www.blogger.com/atom/ns#" term="svn"/><category scheme="http://www.blogger.com/atom/ns#" term="tortoiseSVN"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>Удаление всех .svn директорий.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Иногда, при работе с SVN-клиентами требуется удалить все директории .svn из директорий проекта.&lt;br /&gt;
Для этого можно воспользоваться следующим скриптом:&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
my $dir = shift;&lt;br /&gt;
&lt;br /&gt;
sub process&lt;br /&gt;
{&lt;br /&gt;
my $dir = shift;&lt;br /&gt;
opendir(my $dh, $dir)  or die($!);&lt;br /&gt;
my @files = readdir($dh);&lt;br /&gt;
foreach my $f (@files)&lt;br /&gt;
{&lt;br /&gt;
my $nf = &quot;$dir/$f&quot;;&lt;br /&gt;
if ($f eq &#39;.svn&#39; and -d $nf)&lt;br /&gt;
{&lt;br /&gt;
system(&quot;rm -Rf $nf&quot;);&lt;br /&gt;
}&lt;br /&gt;
elsif ($f ne &#39;.&#39; and $f ne &#39;..&#39; and -d $nf)&lt;br /&gt;
{&lt;br /&gt;
process(&quot;$nf&quot;);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
process($dir);&lt;/blockquote&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/5938352169111636270/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2011/08/svn.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/5938352169111636270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/5938352169111636270'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2011/08/svn.html' title='Удаление всех .svn директорий.'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-6519911903377990613</id><published>2011-08-04T16:27:00.000-07:00</published><updated>2011-08-07T16:57:28.123-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dump"/><category scheme="http://www.blogger.com/atom/ns#" term="MySQL wrapper"/><category scheme="http://www.blogger.com/atom/ns#" term="remote"/><title type='text'>Дамп удаленой mysql-базы данных</title><content type='html'>mysqldump --skip-opt -u {username} -p -h {host} --add-drop-table {database} &gt; {filename}</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/6519911903377990613/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2011/08/mysql.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/6519911903377990613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/6519911903377990613'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2011/08/mysql.html' title='Дамп удаленой mysql-базы данных'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-4025078509313229301</id><published>2011-07-31T19:20:00.000-07:00</published><updated>2011-07-31T19:20:54.464-07:00</updated><title type='text'>Подряд боится конкуренции</title><content type='html'>&lt;iframe width=&quot;425&quot; height=&quot;344&quot; src=&quot;http://www.youtube.com/embed/p9a03Gp8Yv4?fs=1&quot; frameborder=&quot;0&quot; allowFullScreen=&quot;&quot;&gt;&lt;/iframe&gt;</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/4025078509313229301/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2011/07/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/4025078509313229301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/4025078509313229301'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2011/07/blog-post.html' title='Подряд боится конкуренции'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/p9a03Gp8Yv4/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-8523615987772410576</id><published>2011-04-14T15:37:00.000-07:00</published><updated>2011-04-14T15:37:14.927-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu 10.10"/><category scheme="http://www.blogger.com/atom/ns#" term="unrar"/><category scheme="http://www.blogger.com/atom/ns#" term="кодировка"/><category scheme="http://www.blogger.com/atom/ns#" term="проблема"/><category scheme="http://www.blogger.com/atom/ns#" term="распаковка"/><title type='text'>Открытие архивов, созданный в Windows в Ubuntu 10.10</title><content type='html'>После установки Ubuntu 10.10 столкнулся с проблемой открытия rar-архивов. А именно, имена файлов в архиве шли кракозябрами, и при распаковке были проблемы. А еще точнее распаковать не получалось.&lt;br /&gt;
Само собой, на этот момент у меня уже стоял rar и 7zip.&lt;br /&gt;
Решение оказалось простым:&lt;br /&gt;
&lt;i&gt;sudo apt-get install unrar&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;sudo apt-get remove rar&lt;/i&gt;</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/8523615987772410576/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2011/04/windows-ubuntu-1010.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/8523615987772410576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/8523615987772410576'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2011/04/windows-ubuntu-1010.html' title='Открытие архивов, созданный в Windows в Ubuntu 10.10'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-2002617178852948100</id><published>2010-06-09T22:38:00.000-07:00</published><updated>2010-06-09T22:39:59.049-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Joomfish"/><category scheme="http://www.blogger.com/atom/ns#" term="joomla"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP 5.3.1"/><category scheme="http://www.blogger.com/atom/ns#" term="XML Saxy bug"/><category scheme="http://www.blogger.com/atom/ns#" term="xmldoc"/><title type='text'>XML Saxy и PHP 5.3.1</title><content type='html'>При использовании JoomFish в Joomla обнаружилось, что, оказывается, библиотечка XML Saxy не идет под PHP 5.3.1 Внешне это выглядит так, что после работы метода loadXML свойство documentElement становится NULL.&lt;br /&gt;
Здесь нашел решение &lt;a href=&quot;http://joomlacode.org/gf/project/joomla/tracker/?action=TrackerItemEdit&amp;tracker_item_id=18714&quot;&gt;http://joomlacode.org/gf/project/joomla/tracker/?action=TrackerItemEdit&amp;tracker_item_id=18714&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/2002617178852948100/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2010/06/xml-saxy-php-531.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/2002617178852948100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/2002617178852948100'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2010/06/xml-saxy-php-531.html' title='XML Saxy и PHP 5.3.1'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-7360391034871348201</id><published>2010-06-07T22:58:00.000-07:00</published><updated>2010-06-09T22:40:54.169-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Atber"/><category scheme="http://www.blogger.com/atom/ns#" term="Khramkov"/><category scheme="http://www.blogger.com/atom/ns#" term="MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="MySQL wrapper"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP-framework"/><category scheme="http://www.blogger.com/atom/ns#" term="Victoria"/><title type='text'>Victoria Lite Framework. 1st release</title><content type='html'>Из собственного интереса принялся разрабатывать собственный PHP-фреймворк на MVC-архитектуре. Имеется обертка для MySQL, контроллеры, шаблоны Smarty.&lt;br /&gt;
&lt;a href=&quot;http://sourceforge.net/projects/viktoria/&quot;&gt;http://sourceforge.net/projects/viktoria/&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/7360391034871348201/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2010/06/victoria-lite-framework-1st-release.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/7360391034871348201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/7360391034871348201'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2010/06/victoria-lite-framework-1st-release.html' title='Victoria Lite Framework. 1st release'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-7959529970218627180</id><published>2009-12-14T20:52:00.000-08:00</published><updated>2009-12-14T21:04:56.507-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ftp"/><category scheme="http://www.blogger.com/atom/ns#" term="joomla"/><category scheme="http://www.blogger.com/atom/ns#" term="robox"/><category scheme="http://www.blogger.com/atom/ns#" term="virtuemart"/><category scheme="http://www.blogger.com/atom/ns#" term="zend optimizer"/><title type='text'>ps_robox и FTP</title><content type='html'>При копировании по FTP всей сборки VirtueMart,на котором стоял рабочий модуль оплаты Robox, получалось, что в конечном месте работа данного модуля загибалась. Вместо того, чтобы при совершении покупки вывести все доступные способы оплаты, появлялась фактически полностью пустая страничка.&lt;br /&gt;Чтение логов привела меня к следующей ошибке:&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt; Fatal error: Unable to read X bytes in ps_robox.php on line 0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Как оказалось, в силу того, что файл зашифрован и расшифровывался за счет установленного Zend Optimizer, возникала проблема, если этот файл передавать по FTP не в бинарном режиме (я передавал в ASCII)... Переключение режима в бинарный решило проблему...&lt;br /&gt;&lt;br /&gt;© 2009, &lt;a href=&quot;http://web-vamg.com&quot; title = &quot;Создание сайтов, продвижение в Интернет&quot;&gt;web-vamg.com&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/7959529970218627180/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2009/12/psrobox-ftp.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/7959529970218627180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/7959529970218627180'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2009/12/psrobox-ftp.html' title='ps_robox и FTP'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-3549832929936430675</id><published>2009-11-26T15:47:00.000-08:00</published><updated>2009-11-26T15:57:18.836-08:00</updated><title type='text'>Закругленные уголки (продолжение)</title><content type='html'>Было рассмотрено еще одно решение с использованием библиотечки &lt;a href=&quot;http://dillerdesign.com/experiment/DD_roundies/&quot;&gt;DD_roundies&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Проверка все на тех же браузерах показала, что по внешнему виду и по удобству данное решение схоже с &lt;a href=&quot;http://www.curvycorners.net/&quot;&gt;CurvyCorners&lt;/a&gt;, но по скорости работы ничуть не уступает &lt;a href=&quot;http://code.google.com/p/rocon/&quot;&gt;Rocon&lt;/a&gt;&#39;у.&lt;br /&gt;&lt;br /&gt;Что же касаемо кроссбраузерности, то новое решение отказалось рабтать лишь в Опере.&lt;br /&gt;&lt;br /&gt;Что же, объединение двух последних методов устраняет это обидное упущение:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style:italic;&quot;&gt;&lt;br /&gt;&amp;lt;script type=&quot;text/JavaScript&quot;&amp;gt;&lt;br /&gt;        function initCorners() {&lt;br /&gt;            var settings = {&lt;br /&gt;                    tl: { radius: 10 },&lt;br /&gt;                    tr: { radius: 10 },&lt;br /&gt;                    bl: { radius: 10 },&lt;br /&gt;                    br: { radius: 10 },&lt;br /&gt;                    antiAlias: true&lt;br /&gt;            }&lt;br /&gt;   curvyCorners(settings, &quot;my_div.my_class&quot;);&lt;br /&gt;  }&lt;br /&gt;  if (navigator.userAgent.indexOf(&#39;Opera&#39;) &gt;= 0) {&lt;br /&gt;      addEvent(window, &#39;load&#39;, initCorners); //Для оперы применяем КурвиКорнерс&lt;br /&gt;  }&lt;br /&gt;  else {&lt;br /&gt;      DD_roundies.addRule(&#39;my_div.my_class&#39;, &#39;10px&#39;, true);//Для остальных - ДиДиРаундис&lt;br /&gt;  }&lt;br /&gt;    &amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/3549832929936430675/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2009/11/blog-post_9039.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/3549832929936430675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/3549832929936430675'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2009/11/blog-post_9039.html' title='Закругленные уголки (продолжение)'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7471373253521558224.post-6437833736814541082</id><published>2009-11-26T00:32:00.000-08:00</published><updated>2009-11-26T00:56:51.809-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSS"/><category scheme="http://www.blogger.com/atom/ns#" term="Java Script"/><category scheme="http://www.blogger.com/atom/ns#" term="Чикуенок"/><category scheme="http://www.blogger.com/atom/ns#" term="круглые углы"/><title type='text'>Закругление углов скриптами</title><content type='html'>Сегодня в своей работе пришлось столкнуться с задачей реализации у блоков круглых углов. Причем, как с нулевой границей, так и с существующей. Немаловажна прозрачность. И без всяких картинок. Без лишних div-ов.&lt;br /&gt;&lt;br /&gt;Подобные вещи реализуются, насколько мне известно, только скриптами.&lt;br /&gt;&lt;br /&gt;Было рассмотрено пока два (не было времени) варианта:&lt;br /&gt;&lt;br /&gt;1. Проект &lt;a href=&quot;http://chikuyonok.ru/&quot;&gt;Сергея Чикуенка&lt;/a&gt; &lt;a href=&quot;http://code.google.com/p/rocon/&quot;&gt;Rocon&lt;/a&gt;&lt;br /&gt;2. Проект &lt;a href=&quot;http://www.curvycorners.net/&quot;&gt;СurvyСorners&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Оба решения достаточно легко внедряются на страничку. Причем, вариант Сергея обладает большей лаконичность, а 2-й - большей гибкостью.&lt;br /&gt;&lt;br /&gt;Итого, плюсы и минусы:&lt;br /&gt;&lt;br /&gt;1. &lt;span style=&quot;font-weight:bold;&quot;&gt;Скорость&lt;/span&gt;. Работа Rocon незаметна. CurvyCorners заметно тормозит, так как взаимодействует с целевыми элементами после загрузки страницы. При изменении размеров окна, блоки не меняют своих размеров, так как скрипт заменяет все относительные величины на статичные (те, что были высчитаны на момент работы скрипта). Поэтому, это несколько косяк.&lt;br /&gt;2. &lt;span style=&quot;font-weight:bold;&quot;&gt;Внешний вид&lt;/span&gt;. Уголки Чикуенка,, на мой взгляд - пример для подражания, в то время, как у КурвиКорнерсов они слегка &quot;грязноваты&quot;.&lt;br /&gt;3. Кроссбраузерность. Тестировалось на последних версиях Firefox, Safari, Google Chrome, Opera и на 7-м Осле Мелкософта. Вот тут работа Чикуенка разочаровала. Десятая Опера оставляла рудиментарные острые углы наряду с уже округленными. А Осел кроме того в некоторые моменты оставлял целые куски каркаса (если блок был с границей), оставляя что-то крайне ужасное. В данном случае речь идет о div-ах с display: inline-block).&lt;br /&gt;CurvyCorners пока оправдывают свою заявленную кроссбраузерность. &lt;br /&gt;&lt;br /&gt;Собственно, пока мой выбор за СurvyСorners.&lt;br /&gt;&lt;br /&gt;© 2009, &lt;a href=&quot;http://web-vamg.com&quot; title = &quot;Создание сайтов&quot;&gt;web-vamg.com&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://khramkov.blogspot.com/feeds/6437833736814541082/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://khramkov.blogspot.com/2009/11/blog-post_26.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/6437833736814541082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7471373253521558224/posts/default/6437833736814541082'/><link rel='alternate' type='text/html' href='http://khramkov.blogspot.com/2009/11/blog-post_26.html' title='Закругление углов скриптами'/><author><name>Khramkov Ivan</name><uri>http://www.blogger.com/profile/15742154882128854863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>