<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>fxposter&#039;s wave &#187; fxposter</title>
	<atom:link href="http://blog.fxposter.org/author/admin/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fxposter.org</link>
	<description>Stories about Ruby, JavaScript, Objective-C and other cool tools</description>
	<lastBuildDate>Sun, 25 Jul 2010 08:46:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>New plans on Linode</title>
		<link>http://blog.fxposter.org/2010/07/13/new-plans-on-linode/</link>
		<comments>http://blog.fxposter.org/2010/07/13/new-plans-on-linode/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 22:48:30 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[linode]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=821</guid>
		<description><![CDATA[Вот такую картину я увидел сегодня у себя в админке на Linode. Что-то в ней мне показалось странным. Через пару секунд я понял, что именно - надпись &#8220;Linode 512&#8243;, хотя я точно помнил, что у меня до этого было 360 мегабайт оперативки. Законнектился на сервак, проверил - действительно 360 мегабайт доступно. Зашел на страницу тарифных [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.fxposter.org/wp-content/uploads/2010/07/linode.png"><a href="http://blog.fxposter.org/wp-content/uploads/2010/07/linode.png"><img class="alignnone size-medium wp-image-822" title="My Linode Server" src="http://blog.fxposter.org/wp-content/uploads/2010/07/linode-300x54.png" alt="" width="300" height="54" /></a></a></p>
<p>Вот такую картину я увидел сегодня у себя в админке на <a href="http://www.linode.com/">Linode</a>. Что-то в ней мне показалось странным. Через пару секунд я понял, что именно - надпись &#8220;Linode 512&#8243;, хотя я точно помнил, что у меня до этого было 360 мегабайт оперативки. Законнектился на сервак, проверил - действительно 360 мегабайт доступно. Зашел на страницу тарифных планов - действительно 360 поменялось на 512, да и остальные планы явно получили побольше оперативки. Как оказалось - увеличение оперативки произошло еще <a href="http://blog.linode.com/2010/06/16/linode-turns-7-big-ram-increase/">месяц назад</a>, а я его не заметил, т.к. ни разу не перезагружал сервак с того момента, как он <a href="http://blog.fxposter.org/2010/07/11/performance-optimization/">прекратил зависать</a>, а для того, чтобы получить заветный прирост ресурсов - нужна перезагрузка.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2010/07/13/new-plans-on-linode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Небольшая оптимизация производительности этого блога</title>
		<link>http://blog.fxposter.org/2010/07/11/performance-optimization/</link>
		<comments>http://blog.fxposter.org/2010/07/11/performance-optimization/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 16:20:01 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[habrahabr]]></category>
		<category><![CDATA[mod_deflate]]></category>
		<category><![CDATA[mod_expires]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=812</guid>
		<description><![CDATA[Некоторые свои посты я дополняю постами-линками на Хабрахабре. Последний подобный пост - &#8220;Особенности работы jQuery.live()&#8220;. Он так и не попал на главную, но в данном случае это не очень важно, т.к. свой &#8220;хабраэффект&#8221; я поймал. До этого у меня случались странности на сервере - он начинал есть все 400% процессора и наглухо зависал - к [...]]]></description>
			<content:encoded><![CDATA[<p>Некоторые свои посты я дополняю постами-линками на <a href="http://habrahabr.ru/">Хабрахабре</a>. Последний подобный пост - &#8220;<a title="Permanent Link to Особенности работы  jQuery.live()" rel="bookmark" href="http://blog.fxposter.org/2010/06/16/jquery-live-method/">Особенности работы jQuery.live()</a>&#8220;. Он так и не попал на главную, но в данном случае это не очень важно, т.к. свой &#8220;хабраэффект&#8221; я поймал.</p>
<p>До этого у меня случались странности на сервере - он начинал есть все 400% процессора и наглухо зависал - к нему было невозможно подключиться и единственным вариантом восстановления был шатдаун инстанса в админке <a href="http://www.linode.com/">Linode</a>. Это случалось нечасто и не особо меня парило. Но когда на мой сайт стали постоянно заходить люди с хабра - такое поведение сервера стало постоянным. Он начинал есть весь процессор. После перезагрузки он пару минут держался, а потом опять начинал свой бравое дело. Стало ясно - что-то явно не так в настройках.</p>
<p>После довольно недолгих разбирательств стало ясно, что виноват <a href="http://httpd.apache.org/">Apache</a> (у меня стоит Apache + mod_prefork + php + ruby via passenger). Параметры prefork-а:</p>
<pre><code>&lt;IfModule mpm_prefork_module&gt;
StartServers          5
MinSpareServers       5
MaxSpareServers      10
MaxClients          150
MaxRequestsPerChild   0
&lt;/IfModule&gt;</code></pre>
<p>Теперь мне стало очевидно всё, кроме одной вещи - почему же все-таки был загружен процессор&#8230; А причина зависаний сервера была проста - параметр MaxClients отвечает за то, сколько процессов апач может запустить для обработки пользователей (в prefork-е каждый запрос обрабатывается отдельным процессом, который либо запускается, либо вытаскивается из пула свободных запущенных процессов). Процессы апача ну очень недешевые в плане ресурсов - честно говоря, я до сих пор не знаю, как можно посмотреть, сколько <strong>реально</strong> кушает процесс апача - по текущей нагрузке на сервак при создании новых процессов апач кушает лишние 10-20мб памяти. 150 процессов * 10 мегабайт&#8230; Ну вы поняли. У меня сейчас обычныя VPS-ка на 360Мб. В общем, причина зависаний была в том, что апач создавал кучу процессов и уходит в своп по самое нехочу. А вот вернуться оттуда он уже сам не мог - ему нужна была помощь.</p>
<p>Выход - снижать количество максимально процессов апача. Методом научного тыка была выбрана цифра в 20 процессов. Собственно, сейчас эта цифра вполне себе хорошо работает. После уменьшения MaxClients и перезапуска сервера он падать перестал. Но появилась новая проблема - из-за хабраэффекта сервак хоть и не падал, но  отдавал ответы очень долго. Эту проблему я решил не решать, т.к. в тот момент был на работе. Сейчас вот появилось немного времени и я решил протестировать свой блог на отзывчивость.</p>
<pre><code>ab -c 1 -n 100 http://blog.fxposter.org/</code></pre>
<p>Эмм&#8230; Результата я не дождался.</p>
<p>Для тех, кто не работал с ab и не знает, что это такое - <a href="http://httpd.apache.org/docs/2.0/programs/ab.html">Apache Benchmark</a>.</p>
<pre><code>ab -c 1 -n 10 http://blog.fxposter.org/</code></pre>
<p>Результат меня неприятно удивил. Результаты, к сожалению, не сохранились, но могу сказать точно, что время генерации страницы было около 1.5 секунды (судя по тому, что сейчас показывает генерация страницы, если её нет в кеше).</p>
<p>Собственно, стало понятно, как бороть &#8220;хабраэффект&#8221; - нужно сильно ускорить отдачу странички. Как? Да очень просто - кешированием. Слава богу, что это <a href="http://wordpress.org/">WordPress</a> и тут есть такие плагины, как <a href="http://wordpress.org/extend/plugins/wp-cache/">wp-cache</a> - прикручивается за несколько минут и пока что отлично работает. Если бы такого плагина не было, то, наверное, у меня бы была сейчас статья о том, что такое <a href="http://en.wikipedia.org/wiki/Reverse_proxy">Reverse Proxy</a> и как его использовать для кеширования. :) А так - поставил, включил. Результаты:</p>
<ul>
<li><a href="http://blog.fxposter.org/wp-content/uploads/2010/07/ab2.txt"> пустой кеш, concurrency = 1</a></li>
<li><a href="http://blog.fxposter.org/wp-content/uploads/2010/07/ab1.txt"> заполненный кеш, concurrency = 100</a></li>
</ul>
<p>Заодно решил немного пооптимизировать клиентскую часть - добавить <a href="http://httpd.apache.org/docs/2.2/mod/mod_expires.html">expires</a> и сжатие контента (использовался модуль апача <a href="http://httpd.apache.org/docs/2.2/mod/mod_deflate.html">deflate</a>).</p>
<p>Приведу конечные файлы:</p>
<pre><code># /etc/apache2/mods-available/expires.conf
&lt;IfModule mod_expires.c&gt;

ExpiresActive On

ExpiresByType image/gif "access plus 1 weeks"
ExpiresByType image/png "access plus 1 weeks"
ExpiresByType image/jpeg "access plus 1 weeks"

ExpiresByType text/css "access plus 1 weeks"
ExpiresByType application/javascript "access plus 1 weeks"
&lt;/IfModule&gt;</code></pre>
<pre><code># cat /etc/apache2/mods-available/deflate.conf
&lt;IfModule mod_deflate.c&gt;
 # AddOutputFilterByType DEFLATE text/html text/plain text/xml

 DeflateCompressionLevel 9

 # Insert filter
 SetOutputFilter DEFLATE

 # Netscape 4.x has some problems...
 BrowserMatch ^Mozilla/4 gzip-only-text/html

 # Netscape 4.06-4.08 have some more problems
 BrowserMatch ^Mozilla/4\.0[678] no-gzip

 # MSIE masquerades as Netscape, but it is fine
 # BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

 # NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
 # the above regex won't work. You can use the following
 # workaround to get the desired effect:
 BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

 # Don't compress images
 SetEnvIfNoCase Request_URI \
 \.(?:gif|jpe?g|png)$ no-gzip dont-vary

 &lt;IfModule mod_headers.c&gt;
 # Make sure proxies don't deliver the wrong content
 Header append Vary User-Agent env=!dont-vary
 &lt;/IfModule&gt;
&lt;/IfModule&gt;</code></pre>
<p>Если вас интересует, почему эти файлы выглядят именно так - читайте документацию к модулям апача.</p>
<p>На другой ОС (у меня Ubuntu 9.04) эти файлы, наверняка, должны будут находиться в других местах. У себя я их разместил так, потому что эти конфиги автоматически подключаются вместе с подключением соответствующих модов апача (при использовании команды a2enmod).</p>
<p>По идее теперь сайт должен получше откликаться и, думаю, все-таки теперь он выдержит хабраэффект. :)</p>
<p><em><strong>PS</strong>. С точки зрения клиентской оптимизации - css-ки и js-ки лучше бы собрать в один файл, а кучу запросов к изображениям заменить спрайтами. Заниматься первым особо не вижу смысла, т.к. и стилей и скриптов на блоге немного, а изображениями заниматься лень, т.к. все равно собираюсь переезжать на &#8220;<a href="http://2010dev.wordpress.com/">Twenty Ten</a>&#8220;.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2010/07/11/performance-optimization/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Установка gem-ов в пользовательскую директорию</title>
		<link>http://blog.fxposter.org/2010/07/07/install-gems-to-user-directory/</link>
		<comments>http://blog.fxposter.org/2010/07/07/install-gems-to-user-directory/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 20:15:19 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=808</guid>
		<description><![CDATA[Есть такая фича в Rubygems, как установка гем-ов в директорию пользователя ~/.gem, если gem install запускается без sudo и, соответственно, у пользователя нет разрешения установить что-либо в дефолтную директорию. В Rubygems до версии 1.3.6 это решалось просто - автоматически. Т.е. если вы вместо sudo gem install пишете gem install - вам выдается warning, но гем [...]]]></description>
			<content:encoded><![CDATA[<p>Есть такая фича в <a href="http://rubyforge.org/projects/rubygems/">Rubygems</a>, как установка гем-ов в директорию пользователя ~/.gem, если <code>gem install</code> запускается без sudo и, соответственно, у пользователя нет разрешения установить что-либо в дефолтную директорию.</p>
<p>В Rubygems до версии 1.3.6 это решалось просто - автоматически. Т.е. если вы вместо <code>sudo gem install</code> пишете <code>gem install</code> - вам выдается warning, но гем успешно устанавливается:</p>
<pre><code>[fxposter@kitty ~]$ gem install haml
WARNING:  Installing to ~/.gem since /usr/lib/ruby/gems/1.8 and
/usr/bin aren't both writable.
Successfully installed haml-3.0.13
1 gem installed
Installing ri documentation for haml-3.0.13...
Installing RDoc documentation for haml-3.0.13...</code></pre>
<p>Вроде бы всё замечательно. Но с версии 1.3.6 это дефолтное поведение изменилось, и при обновлении с помощью <code>gem update --system</code> об этом честно пишется:</p>
<blockquote><p>&#8211;user-install is no longer the default.  If you really liked it, see Gem::ConfigFile to learn how to set it by default.  (This change was made in 1.3.6)</p></blockquote>
<p>Но кто реально читают все эти тексты? Да и не все обновляют Rubygems таким образом. В нашем случае произошла смена сервера. Причем на старом сервере стояла старая версия <a href="http://www.rubyenterpriseedition.com/">Ruby Enterprise Edition</a> и дефолтные Rubygems 1.3.5. На новом же серваке наши бравые админы опять всё &#8220;покомпилили&#8221; и вместе с REE у нас там обновился и Rubygems - теперь там стояла версия 1.3.7. И&#8230; сначала отвалился деплой, т.к. по умолчанию rake gems:install у нас там не включен. Запустили rake gems:install - не работает. Запустили gem install - не работает. Всё просто замечательно.</p>
<p>Разбирались долго. Сначала думали на админов, которые в рельсах плохо шарят и думали, что они там &#8220;понастраивали&#8221;. Кстати, понастраивали они действительно знатно - скомпилированный REE почему-то стоит поверх стандартного Ruby 1.8.5 (у нас там CentOS 5, в ближайшем времени переезжаем на <a href="http://aws.amazon.com/ec2/">Amazon EC2</a> на Ubuntu). Но это неважно. После долгого разговора с админом и ковыряния серваков я чисто случайно обратил внимание на разные версии Rubygems. Заподозрил неладное. Обновил их на старом серваке на 1.3.7 и&#8230; получил сообщение, написанное выше. Отлично. Теперь осталось восстановить поведение старых Rubygems.</p>
<p>В итоге всё оказалось довольно просто. В файл ~/.gemrc нужно дописать следующую строку: <code>"install: --user-install"</code>. После чего мой .gemrc стал выглядеть так:</p>
<pre><code>[waysgo@web-waysgo ~]$ cat .gemrc
---
:benchmark: false
:update_sources: true
:sources:
- http://rubygems.org/
- http://gems.github.com/
:bulk_threshold: 1000
:verbose: true
:backtrace: false
install: --user-install</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2010/07/07/install-gems-to-user-directory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Прощай универ</title>
		<link>http://blog.fxposter.org/2010/06/19/goodbye-university/</link>
		<comments>http://blog.fxposter.org/2010/06/19/goodbye-university/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 22:46:23 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Универ]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=799</guid>
		<description><![CDATA[Ну что ж, 5 лет учебы в университете закончились. Сегодня, а точнее уже вчера, прошла последняя защита - защита магистерских работ. Прошла она для всей нашей группы, в принципе, успешно - все защитились на пятерки, что не может не радовать. Я же получил свои скромные 98 баллов из 100 и остался этим вполне доволен. До [...]]]></description>
			<content:encoded><![CDATA[<p>Ну что ж, 5 лет учебы в университете закончились. Сегодня, а точнее уже вчера, прошла последняя защита - защита магистерских работ. Прошла она для всей нашей группы, в принципе, успешно - все защитились на пятерки, что не может не радовать. Я же получил свои скромные 98 баллов из 100 и остался этим вполне доволен.</p>
<p>До получения диплома осталось всего ничего - одни формальности - заполнить обходной лист, принести справку с места работы, может еще что-нибудь, ну и получить диплом, естественно. Но самое главное, что мне наконец-то не нужно думать о том, что я должен что-то кому-то делать и сдавать. Теперь можно наконец-то уйти с головой в работу (или в отдых :)) и заняться своими проектами!</p>
<p>Осталось только пожелать всем моим одногрупникам и одногрупницам, ну и себе заодно, удачи в будущих начинаниях. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2010/06/19/goodbye-university/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Особенности работы jQuery.live()</title>
		<link>http://blog.fxposter.org/2010/06/16/jquery-live-method/</link>
		<comments>http://blog.fxposter.org/2010/06/16/jquery-live-method/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 23:21:26 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[event bubbling]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[live]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=787</guid>
		<description><![CDATA[На работе столкнулись с &#8220;особенностью&#8221; работы jQuery.live(), на которую хотелось бы обратить внимание, потому как, судя по всему, отнюдь не все о ней знают (и в результате чего пишут неработающий код). Итак, простой пример - навешивание двух событий на один и тот же элемент: &#60;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&#62; &#60;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>На <a href="http://waysgo.com/">работе</a> столкнулись с &#8220;особенностью&#8221; работы <a href="http://api.jquery.com/live/">jQuery.live()</a>, на которую хотелось бы обратить внимание, потому как, судя по всему, отнюдь не все о ней знают (и в результате чего пишут неработающий код).</p>
<p>Итак, простой пример - навешивание двух событий на один и тот же элемент:</p>
<pre><code class="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"&gt;
&lt;head&gt;
  &lt;meta http-equiv="Content-type" content="text/html; charset=UTF-8" /&gt;
  &lt;title&gt;jQuery.live() test page&lt;/title&gt;
  &lt;script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"&gt;&lt;/script&gt;
  &lt;script type="text/javascript"&gt;
  jQuery(function() {
    $("a").bind("click", function(e) {
      alert("a");
      return false;
    });
    $("a").bind("click", function(e) {
      alert("b");
      return false;
    });
  });
  &lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;a href="http://blog.fxposter.org/"&gt;Блог FX-а&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>Пример можно посмотреть <a href="http://blog.fxposter.org/wp-content/uploads/2010/06/test.html">здесь</a>. В результате клика на ссылку - получаем 2 alert-а, всё хорошо, ожидаемо и предсказуемо.</p>
<p>Переписываем код для работы с jQuery.live(). Для тех, кто в танке - live() вешает событие не на сам элемент, а на document. В результате <a href="http://www.quirksmode.org/js/events_order.html">bubbling-а</a> событие, которое произошло над каким-либо элементом поднимается вверх по <a href="http://ru.wikipedia.org/wiki/Document_Object_Model">DOM-дереву</a> и соответственно вызывает обработчики всех элементов, которые оно встретит. Если вы и этого не знали - то вам не нужно читать мой блог, а пора идти и покупать книгу по JavaScript-у (мне, кстати, тоже давно пора, но всё никак не соберусь). Итак, в конце концов событие доходит до document-а и обработчики вызываются у него. Обработчик, который устанавливает jQuery.live() проверяет - соответствует ли event.target (а именно здесь хранится обьект DOM-дерева, с которым произошло событие) соответствующему селектору (в данном случае - это селектор &#8220;a&#8221;) и если соответствует - то выполняет обработчик.</p>
<p>Преимущества и недостатки - это тема отдельной статьи. Если не уклонятся в сторону оптимизации, то основным преимуществом, на мой взгляд, является тот факт, что обработчики, навешенные live()-ом будут запускаться даже для элементов, которые были динамически добавлены на страницу, в отличии от <a href="http://api.jquery.com/bind/">bind()</a>-обработчиков, которые на эти элементы нужно будет навешивать вручную (если непонятно, почему это работает именно так - читаем предыдущий абзац, если все равно непонятно - идем покупать всё ту же книгу).</p>
<p>Далее - зачем нужен &#8220;return false&#8221; в конце обработчика? Он предотвращает от того, чтобы вызывалось действие по умолчанию (в данном случае - переход по ссылке и событие не поднималось выше). Чаще всего JS-разработчики вообще не думают о bubbling-е и под &#8220;return false&#8221; понимают только &#8220;отмену действия по умолчанию&#8221;, ну или они вообще не знают, что именно происходит и пишут &#8220;return false&#8221;, потому что так работает.</p>
<p>Такое отношение jQuery частенько прощает. Но не в случае с live()-методом. Попробуем запустить следующий <a href="http://blog.fxposter.org/wp-content/uploads/2010/06/test2.html">пример</a>:</p>
<pre><code class="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"&gt;
&lt;head&gt;
  &lt;meta http-equiv="Content-type" content="text/html; charset=UTF-8" /&gt;
  &lt;title&gt;jQuery.live() test page&lt;/title&gt;
  &lt;script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"&gt;&lt;/script&gt;
  &lt;script type="text/javascript"&gt;
  jQuery(function() {
    $("a").live("click", function(e) {
      alert("a");
      return false;
    });
    $("a").live("click", function(e) {
      alert("b");
      return false;
    });
  });
  &lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;a href="http://blog.fxposter.org/"&gt;Блог FX-а&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>В результате клика теперь выскакивает только один alert. Пора обратится к <a href="http://api.jquery.com/live/">документации</a>:</p>
<blockquote><p># To stop further handlers from executing after one bound using .live(), the handler must return false. Calling .stopPropagation()  will not accomplish this.</p></blockquote>
<p>Хаха. В данном случае jQuery интерпретирует false &#8220;несколько иначе&#8221;. :)</p>
<p>Для того, чтобы &#8220;пофиксить&#8221; подобный баг нужно обратится все к тому же bubbling-у и обработке событий и сделать именно то, что предполагается разработчиком - &#8220;отменить действие по умолчанию&#8221;. Это делается с помощью метода <a href="https://developer.mozilla.org/en/DOM/event.preventDefault">event.preventDefault()</a> (<a href="http://blog.fxposter.org/wp-content/uploads/2010/06/test3.html">пример</a>):</p>
<pre><code class="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"&gt;
&lt;head&gt;
  &lt;meta http-equiv="Content-type" content="text/html; charset=UTF-8" /&gt;
  &lt;title&gt;jQuery.live() test page&lt;/title&gt;
  &lt;script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"&gt;&lt;/script&gt;
  &lt;script type="text/javascript"&gt;
  jQuery(function() {
    $("a").live("click", function(e) {
      alert("a");
      e.preventDefault();
    });
    $("a").live("click", function(e) {
      alert("b");
      e.preventDefault();
    });
  });
  &lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;a href="http://blog.fxposter.org/"&gt;Блог FX-а&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p>И самое главное (барабанная дробь!) - при использовании bind() для навешивания обработчиков preventDefault() тоже можно использовать!</p>
<p>Наткнулись мы на эту &#8220;фичу&#8221;, когда у нас почему-то перестали вызываться <strong>некоторые</strong> обработчики</p>
<p>Напоследок, замечу еще одно - элемент, на который навешено хотя бы один обработчик события через bind() с &#8220;правильно работающим return false&#8221;, никогда не будет вызывать никакие live()-события. ;)</p>
<p>Так что будьте бдительны и не забывайте об особенностях обработки событий в JS. Удачи.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2010/06/16/jquery-live-method/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>MongoDB и MongoMapper &#8211; небольшой отчет об использовании</title>
		<link>http://blog.fxposter.org/2010/05/10/mongodb-and-mongomapper-small-usage-report/</link>
		<comments>http://blog.fxposter.org/2010/05/10/mongodb-and-mongomapper-small-usage-report/#comments</comments>
		<pubDate>Mon, 10 May 2010 20:19:20 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[MongoMapper]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby-On-Rails]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=775</guid>
		<description><![CDATA[Недавно писал проект на Rails 2.3 + MongoDB + MongoMapper. Не могу сказать, что все было хорошо - для того, чтобы существующие плагины для рельсов заработали с MongoMapper-ом пришлось немного повозиться, но в итоге все закончилось хорошо. :) А мой сегодняшний рассказ пойдет о некоторых особенностях MongoDB и MongoMapper-а, с которыми вы, скорее всего столкнетесь, [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно писал проект на <a href="http://rubyonrails.org/">Rails 2.3</a> + <a href="http://www.mongodb.org/">MongoDB</a> + <a href="http://github.com/jnunemaker/mongomapper">MongoMapper</a>. Не могу сказать, что все было хорошо - для того, чтобы существующие плагины для рельсов заработали с MongoMapper-ом пришлось немного повозиться, но в итоге все закончилось хорошо. :)</p>
<p>А мой сегодняшний рассказ пойдет о некоторых особенностях MongoDB и MongoMapper-а, с которыми вы, скорее всего столкнетесь, если будете использовать эти библиотеки.</p>
<p>Для начала поговорим немного о MongoDB. Что это такое?</p>
<blockquote cite="http://ru.wikipedia.org/wiki/MongoDB"><p>MongoDB — документо-ориентированная система управления базами данных (СУБД) с открытым исходным кодом, не требующая описания схемы таблиц. Написана на языке C++. СУБД управляет наборами JSON-подобных документов, хранимых в двоичном виде в формате BSON.</p></blockquote>
<p>Если попробовать вкратце охарактеризовать эту базу данных, то получится что-то вроде этого: аналог реляционной СУБД без join-ов и транзакций, зато с поддержкой структур данных (массивов, хешей).</p>
<p>MongoMapper - это &#8220;<a href="http://ru.wikipedia.org/wiki/ORM">ORM</a>&#8221; для MongoDB, написанный на руби. &#8220;ORM&#8221; в кавычках потому что сложно себе представить ORM для нереляционной базы данных. Я бы скорее назвал это высокоуровневой оберткой над API, которое предоставляет MongoDB, с поддержкой ассоциаций между записями и много чем еще.</p>
<p>Теперь, собственно, о &#8220;особенностях&#8221; MongoDB и MongoMapper-а.</p>
<h3>Вложенные документы</h3>
<p>Вложенные документы в понятии MongoMapper-а - это когда одни обьекты хранят внутри себя другие. Для примера, возьмем следующую модель:</p>
<pre><code class="ruby">class User
  include MongoMapper::Document

  key :login
  key :password
  key :salt

  many :posts
  many :addresses
end

class Post
  include MongoMapper::Document
  key :title, String
  key :body, String
  timestamps!
end

class Address
  include MongoMapper::EmbeddedDocument
  key :type, String
  key :country_id, ObjectId
  key :city_id, ObjectId
  key :city_address, String
end</code></pre>
<p>Чтобы понимать, что тут происходит нужно, во-первых знать <a href="http://www.ruby-lang.org/">Ruby</a> :) и во вторых - прочесть <a href="http://railstips.org/blog/archives/2009/06/27/mongomapper-the-rad-mongo-wrapper/">пост</a> John Nunemaker (даже не знаю, как правильно перевести :)) о MongoMapper-е. Вот <a href="http://railstips.org/2009/12/18/why-i-think-mongo-is-to-databases-what-rails-was-to-frameworks/">еще один</a>, кстати, тоже интересный.</p>
<p>Таким образом имеем модель пользователя, которая хранить набор постов, написанных этим пользователем и набор адресов пользователя (домашний, рабочий, etc).</p>
<p>Особенности работы со встроенными документами легче показать на примере:</p>
<pre><code class="ruby">user = User.first
user.posts</code></pre>
<p>Последняя комманда вернет &#8220;scope&#8221;/&#8221;relation&#8221;, а не просто массив элементов (люди, знакомые с named_scope в ActiveRecord версии &lt; 3 поймут).<br />
Соответственно, можно дродолжить эту комманду, например, так:</p>
<pre><code class="ruby">user.posts.all(:conditions =&gt; { :created_at =&gt; { "$gt" =&gt; (Date.today - 10.days) } })</code></pre>
<p>В то время как</p>
<pre><code class="ruby">user.addresses</code></pre>
<p>вернет массив и всю дополнительную фильтрацию прийдется производить с помощью Ruby.</p>
<h3>Манипуляции со вложенными документами</h3>
<p>У EmbeddedDocument нет понятия &#8220;id&#8221;, т.е. отличать обьекты Address один от другого можно только по их индексу в массиве user.addresses либо вводя &#8220;свои&#8221; идентификаторы. Но даже в этом случае выбирать соответствующий обьект прийдется &#8220;вручную&#8221;:</p>
<pre><code class="ruby">user.addresses.detect { |address| address.identifier == params[:address_identifier] }</code></pre>
<p class="offtopic">PS. Для тех, кто в танке: detect - это аналог select { |address| &#8230; }.first.</p>
<p>Соответственно - вложенные обьекты легко добавлять, выбирать всю связь полностью, но с ними становится &#8220;сложно&#8221; работать, как с отдельными обьектами. В частности - неудобно обновлять из-за проблем с выборкой отдельного элемента и неудобно удалять.</p>
<p>С удалением вообще интересная история. Удалить обьект имея только ссылку на него - нельзя, нужна еще и ссылка на массив, в котором он хранится:</p>
<pre><code class="ruby">user.addresses.first.delete/destroy</code></pre>
<p>не работает, т.к. таких методов у вложенных обьектов нет. Нужно делать так:</p>
<pre><code class="ruby">user.addresses.delete_at(address_index)</code></pre>
<p>если вы знаете индекс в массиве адресов, либо</p>
<pre><code class="ruby">user.addresses.delete_if { |address| address.identifier == address_identifier }</code></pre>
<p>если знаете идентификатор или удаляете по какому-либо другому полю.</p>
<p>Несложно, но проблемы на первых порах с этим бывают.</p>
<h3>&#8220;идентификаторы&#8221; обьектов MongoDB</h3>
<p>Каждому обьекту в бд MongoDB присваивает свой идентификатор. Как он по умолчанию строится можно посмотреть <a href="http://www.mongodb.org/display/DOCS/Object+IDs">здесь</a>. Обычно эти идентификаторы совсем не мешают, но иногда хочется просто засунуть вместо них какие-нибудь данные.</p>
<p>Например, вместо такой модели:</p>
<pre><code class="ruby">class Tag
  include MongoMapper::Document
  key :name, String
end</code></pre>
<p>иметь такую</p>
<pre><code class="ruby">class Tag
  include MongoMapper::Document
  # id-шник явно никогда не прописывается
end</code></pre>
<p>И создавать обьект так:</p>
<pre><code class="ruby">Tag.create(:_id =&gt; "ruby on rails")</code></pre>
<p>MongoDB это позволяет делать. Более того - драйвер Ruby для MongoDB это тоже может делать. Проблема в том, что это не умеет делать MongoMapper. Совершенно. Как обойти эту проблему я на данный момент не знаю (я в итоге сделал модель первого типа и забил), есди кто знает решение - напишите, будет интересно.</p>
<p>И напоследок поговорим о</p>
<h3>Has And Belongs To Many в MongoDB</h3>
<p>&#8230; или <a href="http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#M001836">habtm</a>, знакомый многим по ActiveRecord.</p>
<p>Приведу пример из моего проекта: есть домены, есть их модераторы, связть many-to-many. Для каждого домена хочется видеть список модераторов и для каждого модератора хочется видеть список доменов, которые он модерирует.</p>
<p>Честно говоря, задача поставила меня в тупик. Т.е. как все мы решаем эти задачи с помощью RDBMS? Правильно - связующей таблицей. Так же можно было поступить и здесь, но&#8230; Как-то это было некрасиво, на мой взгляд, использовать этот подход вв документоориентированной базе данных.</p>
<p>Первое решение, которое мне пришло в голову - хранить массив id-шников доменов для каждого пользователя и хранить массив id-шников пользователей для каждого домена и синхронизировать их.</p>
<p>Последние два слова очень смущали - синхронизация вносила излишнюю сложность. Т.е. реализовать-то её можно, но очень не хотелось.</p>
<p>Собственно, обратился за помощью к знакомым и вышел на одного человека (ник - Necromant, сайта его я не знаю :) ), который помог решить мне эту проблему.</p>
<p>Итак, решение - хранить только один список id-шников (или в юзерах или в доменах) и сделать по нему индекс, соответственно, вывод как доменов по юзеру так и юзеров по домену будет достаточно быстрый.</p>
<p>Я хранил массив юзеров для домена, т.к. если бы я сделал иначе, то при удалении домена пришлось бы пройтись по всем юзерам и удалить все связи на домен, а в выбранном варианте этого делать не нужно (а удаление юзеров - это пока что вообще не существующее событие для моего проекта):</p>
<pre><code class="ruby">class Domain
  include MongoMapper::Document
  # ...
  key :moderator_ids, Array, :index =&gt; true
  def moderators
    User.find moderator_ids
  end
end

class User
  include MongoMapper::Document
  # ...
  def moderator_of?(domain)
    domain.moderator_ids.include? id.to_s
  end

  def moderated_domains
    Domain.all :moderator_ids =&gt; id.to_s
  end
end</code></pre>
<p>Еще хочу рассказать о том, как подружить MongoMapper и <a href="http://github.com/thoughtbot/clearance">Clearance</a>, но пост вроде и так не маленький получился, так что ждите еще один пост о MongoMapper-е в ближайшие дни.</p>
<p><em><strong>PS</strong>. Совсем писать разучился&#8230; :(</em></p>
<p><em><strong>PPS</strong>. Если вам понравился этот пост, <a href="http://habrahabr.ru/blogs/ruby/93212/">проголосуйте</a> за него на Habrahabr-е. :)<br />
</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2010/05/10/mongodb-and-mongomapper-small-usage-report/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Ressurection</title>
		<link>http://blog.fxposter.org/2010/05/02/ressurection/</link>
		<comments>http://blog.fxposter.org/2010/05/02/ressurection/#comments</comments>
		<pubDate>Sun, 02 May 2010 00:04:15 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[macbook]]></category>
		<category><![CDATA[macosx]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=766</guid>
		<description><![CDATA[Настало время возродить этот блог. За более чем полугодие на нем не появилось ни одной статьи и я наконец-то намерен прекратить этот &#8220;застой&#8221;. Да, по сравнению с временами, которые были раньше у меня стало существенно меньше времени, чтобы писать что-то большое и серьезное - работа, университет (если быть точнее - то написание диплома) и еще [...]]]></description>
			<content:encoded><![CDATA[<p>Настало время возродить этот блог. За более чем полугодие на нем не появилось ни одной статьи и я наконец-то намерен прекратить этот &#8220;застой&#8221;. Да, по сравнению с временами, которые были раньше у меня стало существенно меньше времени, чтобы писать что-то большое и серьезное - работа, университет (если быть точнее - то написание диплома) и еще один &#8220;секретный сайд проект&#8221; о котором, возможно, я когда-нибудь всем расскажу.</p>
<p>Начну с глобальных изменений, которые произошли за последнее время в моей жизни и которые однозначно коснутся этого блога.</p>
<p>Ну, во-первых, я теперь не пишу на PHP. Вообще не пишу. И не очень сильно слежу за последними веяниями моды, связанными с этим языком. Да, я все равно иногда появляюсь в группе симфонистов (кому нужен доступ туда - пишите, там новичков любят и на многие нубские вопросы отвечают :) ). Да, я иногда посматриваю на фреймворки, которые сейчас являются популярными в сфере PHP - всякие Yii, ZF, etc. Посматриваю исключительно для того, чтобы быть в курсе происходящего. Учить их и писать на них в общем-то не очень хочется.</p>
<p>На что я променял PHP? Естественно на <a href="http://www.ruby-lang.org/">Ruby</a>. Я не восхищаюсь этим языком, не превозношу его над остальными, просто на работе я пишу на нем (кстати, я работаю над стартапом для бизнесов - <a href="http://waysgo.com/">WaysGo</a>, запуск будет, я надеюсь, очень скоро) и ни на чем другом желания писать особо не возникает - с точки зрения веб-разработки Ruby меня полностью устраивает. Этот язык удобен и достаточно экспрессивен. А <a href="http://rubyonrails.org/">Ruby On Rails</a> - отличное средство для тех, кто хочет писать веб-приложения. Ну, в общем, вы меня поняли. ;)</p>
<p>Кстати говоря, я немного соврал насчет того, что я пишу на Ruby на работе. С начала этой недели я пишу iPhone-приложение на <a href="http://ru.wikipedia.org/wiki/Objective-C">Objective-C</a> и, в связи с этим, шустренько осваиваю Mac, Xcode, сам Objective-C и всякую прочую фигню, которая нужна для разработки под iPhone. Определенного мнения по поводу мака я пока сказать не могу, а вот Objective-C с первого подхода отличается похожестью на руби с точки зрения вызовов методов у объектов и открытых классов, но в то же время отличается несколько некрасивым синтаксисом (квадратные скобки, рррррр). С другой стороны, к синтаксису Ruby у меня тоже изначально было плохое отношение. Это отношение, кстати, не изменилось - я по прежнему считаю, что Ruby - непонятный язык для новичка, и если код на, например, Python можно просто читать, то для того, чтобы почитать код на Ruby придется сначала посмотреть туториалы, или что-то в этом роде, потому что синтаксис кроме выразительности отличается еще и неочевидностью. После пары дней работы с Ruby проблемы отпадают сами собой, так что этот аспект меня уже не очень беспокоит. Собственно, я надеюсь, что рано или поздно я перестану замечать синтаксис Objective-C и буду просто писать код, который делает что мне нужно.</p>
<p>Вот, собственно, и все на сегодня. Вроде ничего не забыл. До скорого! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2010/05/02/ressurection/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Изменяем язык ввода в окне загрузки Windows (часть 2)</title>
		<link>http://blog.fxposter.org/2009/10/22/how-to-change-language-at-windows-login-screen-part-2/</link>
		<comments>http://blog.fxposter.org/2009/10/22/how-to-change-language-at-windows-login-screen-part-2/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 20:06:22 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows 7]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=753</guid>
		<description><![CDATA[Вдогонку к первой части. В комментариях Дима заметил, что где-то когда-то достичь желаемого результата можно было и без копания в регистре Windows. Что ж - я решил поискать повнимательнее и нашел то, что нужно. Решение №2 Все, что написано далее подходит к операционной системе Windows 7, есть ли что-то подобное в предыдущих версиях этой ОС [...]]]></description>
			<content:encoded><![CDATA[<p>Вдогонку к первой части.</p>
<p>В комментариях Дима заметил, что где-то когда-то достичь желаемого результата можно было и без копания в регистре Windows. Что ж - я решил поискать повнимательнее и нашел то, что нужно.</p>
<h4>Решение №2</h4>
<p class="note">Все, что написано далее подходит к операционной системе Windows 7, есть ли что-то подобное в предыдущих версиях этой ОС я сказать затрудняюсь.</p>
<p class="note">Итак, заходим в то же самое меню, которое упоминалось в прошлом посте: “Control Panel” -&gt; “Clock, Language, and Region” -&gt; “Change keyboards or other input methods”. После чего переходим на вкладку &#8220;Administrative&#8221; и нажимаем на кнопку &#8220;Copy settings..&#8221;:</p>
<p class="note"><a href="http://blog.fxposter.org/wp-content/uploads/2009/10/region_and_language.png"><img class="alignnone size-medium wp-image-756" title="region_and_language" src="http://blog.fxposter.org/wp-content/uploads/2009/10/region_and_language-260x300.png" alt="region_and_language" width="260" height="300" /></a></p>
<p class="note">После чего видим следующее окошко:</p>
<p class="note"><a href="http://blog.fxposter.org/wp-content/uploads/2009/10/region_and_language_2.png"><img class="alignnone size-medium wp-image-757" title="region_and_language_2" src="http://blog.fxposter.org/wp-content/uploads/2009/10/region_and_language_2-236x300.png" alt="region_and_language_2" width="236" height="300" /></a></p>
<p class="note">Желтым выделены те настройки, которые сейчас выбраны в вашей учетной записи. Розовым я выделил те настройки, которые используются в окне загрузки (т.е. те настройки, которые мы хотим поменять). У меня эти настройки уже изменены на правильные, а тем, кто только хочет их изменить достаточно поставить галочку в выделенной красным цветом части окна и нажать &#8220;OK&#8221;.</p>
<p class="note">Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2009/10/22/how-to-change-language-at-windows-login-screen-part-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>World of Goo за 1 цент</title>
		<link>http://blog.fxposter.org/2009/10/22/world-of-goo-for-1-cent/</link>
		<comments>http://blog.fxposter.org/2009/10/22/world-of-goo-for-1-cent/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 01:19:42 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[Games]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=749</guid>
		<description><![CDATA[До 25-го октября (т.е. еще 3 дня) можно купить замечательную игрушку под названием World Of Goo всего лишь за один цент. Спешите, времени осталось не так уж много. PS. Я купил за доллар. Отдал бы больше, но на карточке закончились деньги. :( А игра того, несомненно, стоит.]]></description>
			<content:encoded><![CDATA[<p>До 25-го октября (т.е. еще 3 дня) можно <a href="http://2dboy.com/games.php">купить</a> замечательную игрушку под названием <a href="http://www.worldofgoo.com/">World Of Goo</a> всего лишь за один цент. Спешите, времени осталось не так уж много.</p>
<p><em><strong>PS</strong>. Я купил за доллар. Отдал бы больше, но на карточке закончились деньги. :( А игра того, несомненно, стоит.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2009/10/22/world-of-goo-for-1-cent/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Изменяем язык ввода в окне загрузки Windows</title>
		<link>http://blog.fxposter.org/2009/10/22/how-to-change-language-at-windows-login-screen/</link>
		<comments>http://blog.fxposter.org/2009/10/22/how-to-change-language-at-windows-login-screen/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 01:15:37 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=745</guid>
		<description><![CDATA[Так как уже не в первый раз сталкиваюсь с данным неудобством - решил написать статью, чтобы каждый раз заново не искать, что и как делать. Проблема При загрузке Windows, в окне, когда вам предлагается выбрать пользователя и ввести его пароль, язык ввода по умолчанию не английский. У меня это русский язык, т.к. при установке Windows [...]]]></description>
			<content:encoded><![CDATA[<p>Так как уже не в первый раз сталкиваюсь с данным неудобством - решил написать статью, чтобы каждый раз заново не искать, что и как делать.</p>
<h4>Проблема</h4>
<p>При загрузке Windows, в окне, когда вам предлагается выбрать пользователя и ввести его пароль, язык ввода по умолчанию <strong>не английский</strong>. У меня это русский язык, т.к. при установке Windows я всегда выбираю русскую раскладку, которая потом ставится по умолчанию во всех программах и, главное, в окне загрузки.</p>
<h4>Решение</h4>
<p>Поставить английский языком ввода по умолчанию довольно легко - входим в &#8220;Control Panel&#8221; -&gt; &#8220;Clock, Language, and Region&#8221; -&gt; &#8220;Change keyboards or other input methods&#8221; (названия взяты из Windows 7, у вас они могут быть другими), кликаем на кнопку &#8220;Change keyboards&#8230;&#8221; и выставляем английский как &#8220;Default input language&#8221;.</p>
<p>Радуемся.</p>
<p>Радуемся.</p>
<p>Радуемся.</p>
<p>Перезагружаемся.</p>
<p>Пытаемся ввести пароль (у меня пароли всегда англоязычные).</p>
<p>Перестаем радоваться&#8230; Т.к. в окне загрузки язык ввода по умолчанию остался русским.</p>
<p>Чтобы разобраться с этим неудобством - идем в <a href="http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B5%D1%81%D1%82%D1%80_Windows">regedit</a>. Находим ветку &#8220;HKEY_USERS\.DEFAULT\Keyboard Layout\Preload&#8221; и видим нечто подобное:</p>
<p><a href="http://blog.fxposter.org/wp-content/uploads/2009/10/regedit.png"><img class="alignnone size-medium wp-image-746" title="Regedit" src="http://blog.fxposter.org/wp-content/uploads/2009/10/regedit-300x241.png" alt="Regedit" width="300" height="241" /></a></p>
<p>На самом деле все просто. &#8220;00000419&#8243; - это идентификатор русского языка, а &#8220;00000409&#8243; - английского. Собственно, дальше все просто - меняем местами значения (т.е. ключу &#8220;1&#8243; ставим значение &#8220;00000409&#8243;, а ключу &#8220;2&#8243; - &#8220;00000419&#8243;), перегружаемся и убеждаемся, что все теперь работает замечательно.</p>
<p>Profit!</p>
<p><strong>Updated</strong>: найдено <a href="http://blog.fxposter.org/2009/10/22/how-to-change-language-at-windows-login-screen-part-2/">более простое решение</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2009/10/22/how-to-change-language-at-windows-login-screen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
