<?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>The WebDevil &#187; Newbie</title>
	<atom:link href="http://dmitry.shaposhnik.name/category/newbie/feed/" rel="self" type="application/rss+xml" />
	<link>http://dmitry.shaposhnik.name</link>
	<description>Enjoy development</description>
	<lastBuildDate>Mon, 24 May 2010 01:29:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PowerDNS &#8211; master and slave</title>
		<link>http://dmitry.shaposhnik.name/2009/06/25/powerdns-master-and-slave/</link>
		<comments>http://dmitry.shaposhnik.name/2009/06/25/powerdns-master-and-slave/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 08:49:48 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Newbie]]></category>
		<category><![CDATA[PowerDNS]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/?p=285</guid>
		<description><![CDATA[В связи с переездом на новый сервер пришлось переносить и кучу сервисов, которые крутились на старом. Одним из них был DNS.
Настоятельно рекомендуется делать master и slave (primary и secondary) на разных машинах, дабы в случае отказа одного из них второй мог полноценно работать. Ну это в теории, на практике все несколько упрощается до одного сервера, [...]]]></description>
			<content:encoded><![CDATA[<p>В связи с переездом на новый сервер пришлось переносить и кучу сервисов, которые крутились на старом. Одним из них был DNS.</p>
<p>Настоятельно рекомендуется делать master и slave (primary и secondary) на разных машинах, дабы в случае отказа одного из них второй мог полноценно работать. Ну это в теории, на практике все несколько упрощается до одного сервера, который если ляжет &#8211; то DNS будет уже не столь важен.</p>
<p>Начал подымать master на OpenSuSE 11.1. Конфиг простой и незамысловатый:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#each slave should be put here (space separated) to allow zone details transfer</span><br />
allow-axfr-ips=1.1.1.2<br />
disable-axfr=no<br />
<span style="color: #007800;">daemon</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
<span style="color: #007800;">guardian</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
default-ttl=<span style="color: #000000;">3600</span><br />
soa-refresh-default=<span style="color: #000000;">3600</span><br />
lazy-recursion=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
local-address=0.0.0.0<br />
<span style="color: #007800;">master</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
<span style="color: #007800;">recursor</span>=127.0.0.1:<span style="color: #000000;">5300</span><br />
<span style="color: #007800;">launch</span>=gmysql<br />
gmysql-host=localhost<br />
gmysql-port=<span style="color: #000000;">3306</span><br />
gmysql-dbname=powerdns<br />
gmysql-user=powerdns<br />
gmysql-password=powerdns<br />
gmysql-socket=<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>run<span style="color: #000000; font-weight: bold;">/</span>mysql<span style="color: #000000; font-weight: bold;">/</span>mysql.sock</div></div>
<p>и рекурсор:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007800;">chroot</span>=<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>pdns<br />
local-address=127.0.0.1<br />
local-port=<span style="color: #000000;">5300</span><br />
<span style="color: #007800;">setgid</span>=pdns<br />
<span style="color: #007800;">setuid</span>=pdns</div></div>
<p>Базу для него создавал из <a href="http://www.opensourcery.co.za/powerdns-on-rails/">PowerDNS on Rails</a>, хотя можно ограничиться и той, <a href="http://doc.powerdns.com/configuring-db-connection.html#CONFIGURING-MYSQL">что в документации</a>.</p>
<p>И напоролся на первый занятный баг &#8211; со включенным режимом master он взлетает и долбит базу одинаковыми запросами (пытается получить все записи). На стоящей рядом ubuntu с той же версией такого не наблюдается. Долго пытался отловить что, где и почему &#8211; и решил пересобрать из сорсов. Когда обнаружилась нехватка boost я решил проверить, а нет ли готового свеженького пакета с собраным powerdns? Таки есть &#8211; надо было всего лишь добавить в списки репо вот этот:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">http://download.opensuse.org/repositories/server:/dns/openSUSE_11.1/</div></div>
<p>и была установлена версия pdns-2.9.22-1.1. Проблема с нагрузкой на БД полечилась, но появилась новая &#8211; с репликацией на slave.</p>
<p>В PowerDNS есть такое понятие как supermaster. В общем случае нужно прописывать зону на мастере и слейве. Когда слейв получит от мастера notify, он запросит у мастера записи из этой зоны. Но если сервер, от которого пришел notify, будет обнаружен в списке supermasters, и такой зоны на слейве не будет описано, она создастся автоматически. И потом в нее будут добавлены записи с мастера. Это приятно упрощает жизнь <img src='http://dmitry.shaposhnik.name/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  В табличке запись довольно простая &#8211; ip мастера, имя слейва (ns2.example.org), имя аккаунта (на работу никак не влияет &#8211; просто будет фигурировать в описании зоны; удобно для указания клиента, например).</p>
<p>В порядке эксперимента попинал слейв нотификейшенами для разных доменов. Не с первого раза, но заработало:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">pdns_control notify example.org</div></div>
<p>С первого раза не заработало потому, что в PowerDNS on Rails в имя поддомена по привычке вписал &#8220;@&#8221;, и потом получил записи вида &#8220;@.example.org&#8221; вместо &#8220;example.org&#8221; либо &#8220;@&#8221;. Прошелся простым апдейтом по базе и убрал этот баг.</p>
<p>PS: Хочу выразить благодарность Патрику Фею (<a href="http://blog.nachtarbeiter.net/about/">Patrick Fey</a>) за его <a href="http://blog.nachtarbeiter.net/2009/04/23/powerdns-on-debian-lenny-sarge-or-woody-2/">недавний пост</a>, который помог постичь смысл supermaster&#8217;ов.</p>
<p>PPS: конфиг pdns для слейва мало чем отличается от мастера:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">config-dir=<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>powerdns<br />
<span style="color: #007800;">daemon</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
disable-axfr=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
<span style="color: #007800;">guardian</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
<span style="color: #007800;">launch</span>=gmysql<br />
lazy-recursion=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
local-address=0.0.0.0<br />
local-port=<span style="color: #000000;">53</span><br />
module-dir=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>powerdns<br />
<span style="color: #007800;">setgid</span>=pdns<br />
<span style="color: #007800;">setuid</span>=pdns<br />
<span style="color: #007800;">slave</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
socket-dir=<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>run<br />
version-string=powerdns<br />
gmysql-host=localhost<br />
gmysql-port=<span style="color: #000000;">3306</span><br />
gmysql-dbname=powerdns<br />
gmysql-user=powerdns<br />
gmysql-password=powerdns</div></div>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2009/06/25/powerdns-master-and-slave/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MacOS X Leopard php extensions</title>
		<link>http://dmitry.shaposhnik.name/2009/05/29/macos-x-leopard-php-extensions/</link>
		<comments>http://dmitry.shaposhnik.name/2009/05/29/macos-x-leopard-php-extensions/#comments</comments>
		<pubDate>Fri, 29 May 2009 12:33:47 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[Newbie]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/?p=278</guid>
		<description><![CDATA[Столкнулся с необходимостью добавить к PHP в макоси несколько экстеншенов.
Апач в MacOS работает в x86_64. Да-да, там бинарник для нескольких архитектур:
file `which httpd`
Проблема  в том что по умолчанию экстеншены будут собираться под i386. И потому из php-cli они доступны и работают, в то время как в mod_php их нет, а в логах апача видно [...]]]></description>
			<content:encoded><![CDATA[<p>Столкнулся с необходимостью добавить к PHP в макоси несколько экстеншенов.<br />
Апач в MacOS работает в x86_64. Да-да, там бинарник для нескольких архитектур:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">file</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">which</span> httpd<span style="color: #000000; font-weight: bold;">`</span></div></div>
<p>Проблема  в том что по умолчанию экстеншены будут собираться под i386. И потому из php-cli они доступны и работают, в то время как в mod_php их нет, а в логах апача видно примерно такое:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">PHP Warning: &nbsp;PHP Startup: Unable to load dynamic library '/usr/lib/php/extensions/no-debug-non-zts-20060613/mcrypt.so' - (null) in Unknown on line 0</div></div>
<p>Для сборки под несколько архитектур надо собирать все зависимости также под несколько архитектур. Я решил ограничиться вариантом x86_64 и i386.</p>
<p>Итак, в /opt/local/etc/macports/macports.conf добавим требуемые архитектуры:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'universal_archs x86_64 i386'</span><span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>macports<span style="color: #000000; font-weight: bold;">/</span>macports.conf</div></div>
<p>Чудесно. Теперь на примере gettext.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> port <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #c20cb9; font-weight: bold;">gettext</span> +universal<br />
<span style="color: #c20cb9; font-weight: bold;">file</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">which</span> <span style="color: #c20cb9; font-weight: bold;">gettext</span><span style="color: #000000; font-weight: bold;">`</span></div></div>
<p>В качестве вывода мы должны получить что-то вроде</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">dm@Loki ~$ file `which gettext`<br />
/opt/local/bin/gettext: Mach-O universal binary with 2 architectures<br />
/opt/local/bin/gettext (for architecture i386): Mach-O executable i386<br />
/opt/local/bin/gettext (for architecture x86_64): &nbsp; Mach-O 64-bit executable x86_64</div></div>
<p>Далее нужны сорсы php. В сорсах есть папка ext.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> php-5.2.8<span style="color: #000000; font-weight: bold;">/</span>ext<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">gettext</span><br />
phpize<br />
<br />
<span style="color: #007800;">CFLAGS</span>=<span style="color: #ff0000;">&quot;-arch i386 -arch x86_64 -g -Os -pipe -no-cpp-precomp&quot;</span> \<br />
<span style="color: #007800;">CCFLAGS</span>=<span style="color: #ff0000;">&quot;-arch i386 -arch x86_64 -g -Os -pipe&quot;</span> \<br />
<span style="color: #007800;">CXXFLAGS</span>=<span style="color: #ff0000;">&quot;-arch i386 -arch x86_64 -g -Os -pipe&quot;</span> \<br />
<span style="color: #007800;">LDFLAGS</span>=<span style="color: #ff0000;">&quot;-arch i386 -arch x86_64 -bind_at_load&quot;</span> \<br />
.<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--with-gettext</span>=<span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span><br />
<br />
<span style="color: #c20cb9; font-weight: bold;">make</span><br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span><br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'extension=gettext.so'</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>php.ini<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> apachectl restart</div></div>
<p>Предварительно убедитесь, что у Вас есть файл /etc/php.ini. По умолчанию его нет.</p>
<p>После этого модуль должен завестись в mod_php.</p>
<p>UPD: а чобы (по возможности) все из портов собиралось с флагом universal надо сделать</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'+universal'</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>macports<span style="color: #000000; font-weight: bold;">/</span>variants.conf</div></div>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2009/05/29/macos-x-leopard-php-extensions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LVM Rocks</title>
		<link>http://dmitry.shaposhnik.name/2009/03/01/lvm-rocks/</link>
		<comments>http://dmitry.shaposhnik.name/2009/03/01/lvm-rocks/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 23:18:18 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Newbie]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[webtech]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/?p=251</guid>
		<description><![CDATA[Давно заметил что в Ubuntu (server edition) во время инсталляции начали предлагать использовать LVM. Но я все не решался поставить production на него. Затем пообщался со теми кто его использовал, почитал доку &#8211; и последний год стал его использовать, так как постиг скрытую в нем мощь  

Допустим, у нас есть простенький бюджетный сервер. Мы [...]]]></description>
			<content:encoded><![CDATA[<p>Давно заметил что в Ubuntu (server edition) во время инсталляции начали предлагать использовать LVM. Но я все не решался поставить production на него. Затем пообщался со теми кто его использовал, почитал доку &#8211; и последний год стал его использовать, так как постиг скрытую в нем мощь <img src='http://dmitry.shaposhnik.name/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span id="more-251"></span></p>
<p>Допустим, у нас есть простенький бюджетный сервер. Мы развернули новое приложение, и его база стала расти весьма стремительно. Итого &#8211; база, веб-файлы и система живут на одном физическом диске.</p>
<p>Был куплен диск WD Razor, и на него перенесли базу. Нагрузка диска (<tt>iostat -x -m 1</tt>) составила 1-2%. Решено перенести туда же и веб-файлы, однако решение это пришло лишь через пару дней. Так что получилось наглядно продемонстрировать возможности LVM.</p>
<h3>Part1. Creating&#8230;</h3>
<p>Когда поставили разор на нем создали один раздел &#8211; LVM:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># fdisk -l</span><br />
<br />
Disk <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdb: <span style="color: #000000;">74.3</span> GB, <span style="color: #000000;">74355769344</span> bytes<br />
<span style="color: #000000;">255</span> heads, <span style="color: #000000;">63</span> sectors<span style="color: #000000; font-weight: bold;">/</span>track, <span style="color: #000000;">9039</span> cylinders<br />
Units = cylinders of <span style="color: #000000;">16065</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000;">512</span> = <span style="color: #000000;">8225280</span> bytes<br />
Disk identifier: 0x00000000<br />
<br />
&nbsp; &nbsp;Device Boot &nbsp; &nbsp; &nbsp;Start &nbsp; &nbsp; &nbsp; &nbsp; End &nbsp; &nbsp; &nbsp;Blocks &nbsp; Id &nbsp;System<br />
<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdb1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000;">1</span> &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000000;">9039</span> &nbsp; &nbsp;<span style="color: #000000;">72605736</span> &nbsp; 8e &nbsp;Linux LVM</div></div>
<p>Пару слов об организации LVM.<br />
<strong>Уровень 1</strong>: volume group (vg). Это наивысший уровень абстракции, объединяющий в себе logical volumes и physical volumes.<br />
<strong>Уровень 2</strong>: physical volume (pv). Это некое блочное устройство, способное хранить данные (HDD, RAID, &#8230;)<br />
<strong>Уровень 3</strong>: logical volume (lv). Это эквивалент раздела на жестком диске.</p>
<p>Таким образом в группу добавляются физические тома (pv), и потом во всем этом пространстве свободного места создаются разделы (lv), на которых уже создается файловая система.</p>
<p>Итак, сначала создавался pv:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">pvcreate <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdb1</div></div>
<p>Затем vg:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">vgcreate sys_vg <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdb1</div></div>
<p>И затем на все свободное место указанного pv (/dev/sdb1) создали lv с именем var_lib_mysql:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">lvcreate <span style="color: #660033;">-L</span> <span style="color: #000000;">100</span><span style="color: #000000; font-weight: bold;">%</span>PVS -nvar_lib_mysql sys_vg <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdb1</div></div>
<p>Дело за малым:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mkreiserfs <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_lib_mysql<br />
<span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_lib_mysql <span style="color: #000000; font-weight: bold;">/</span>mnt<br />
<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>mysql stop<br />
<span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>mysql<span style="color: #000000; font-weight: bold;">/*</span> <span style="color: #000000; font-weight: bold;">/</span>mnt<span style="color: #000000; font-weight: bold;">/</span><br />
<span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>mysql<span style="color: #000000; font-weight: bold;">/</span>.<span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">/</span>mnt<span style="color: #000000; font-weight: bold;">/</span><br />
<span style="color: #c20cb9; font-weight: bold;">umount</span> <span style="color: #000000; font-weight: bold;">/</span>mnt<br />
<span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_lib_mysql <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>mysql<br />
<span style="color: #c20cb9; font-weight: bold;">chown</span> <span style="color: #660033;">-R</span> mysql:mysql <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>mysql<br />
<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>mysql start</div></div>
<p>Вот собственно и почти все. Последний штрих &#8211; прописать монтирование раздела в fstab, дабы это происходило при загрузке автоматом. Можно скучно сделать это через blkid, увидеть там нужный UUID (например, f6946e54-c7d6-4688-8fac-05dcb1bf9973), скопировать его, открыть /etc/fstab и вставить туда строку вида:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007800;">UUID</span>=f6946e54-c7d6-<span style="color: #000000;">4688</span>-8fac-05dcb1bf9973 &nbsp; <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>mysql reiserfs defaults <span style="color: #000000;">0</span> <span style="color: #000000;">2</span></div></div>
<p>а можно сделать так:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">printf</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>UUID=<span style="color: #780078;">`blkid | grep sys_vg-var_lib_mysql | sed -r 's/.*UUID=&quot;([^&quot;]*).*/\1/i'`</span><span style="color: #000099; font-weight: bold;">\t</span>/var/lib/mysql reiserfs defaults 0 2<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>fstab</div></div>
<p>Да, если сделать umount /var/lib/mysql &#038;&#038; mount /var/lib/mysql до ребута &#8211; то /dev/disk/by-uuid/f6946e54-c7d6-4688-8fac-05dcb1bf9973 (или какой там получится) там еще не будет. Для того чтоб появился до ребута надо перезапустить udev:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>udev restart</div></div>
<h3>Part2. Resizing&#8230;</h3>
<p>Как я говорил раньше, с опозданием пришла мысль о том, что неплохо бы вынести и статические файлы на этот же винт. И сделать это совсем просто! Для этого от того lv что был создан раньше (и именуется var_lib_mysql) откусим немного места.</p>
<p>Сначала остановим все службы (говорят, reiserfs увеличивается/уменьшается без проблем налету, но я этого пока не пробовал на себе):</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>mysql stop<br />
<span style="color: #c20cb9; font-weight: bold;">umount</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>mysql</div></div>
<p>Затем уменьшим файловую систему, а затем и lv на 20ГБ:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">resize_reiserfs <span style="color: #660033;">-s-20G</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_lib_mysql<br />
lvreduce <span style="color: #660033;">-L-20G</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_lib_mysql</div></div>
<p>На всякий случай я предпочел проверить фс на ошибки (а вдруг!):</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">reiserfsck <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_lib_mysql</div></div>
<p>Ну и возвращаем обратно MySQL:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>mysql<br />
<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>mysql start</div></div>
<p>Теперь создадим lv для веб-файлов, и так как их намного меньше 20ГБ, я решил оставить 5ГБ про запас, никому их не присвоив. Потом можно будет налету добавить туда где закончится место.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">lvcreate <span style="color: #660033;">-L</span> 15G -nvar_www sys_vg<br />
mkreiserfs <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_www</div></div>
<p>Далее &#8211; перенос файлов:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>nginx stop<br />
<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>apache2 stop<br />
<span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_www <span style="color: #000000; font-weight: bold;">/</span>mnt<br />
<span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/*</span> <span style="color: #000000; font-weight: bold;">/</span>mnt<span style="color: #000000; font-weight: bold;">/</span><br />
<span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>.<span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">/</span>mnt<span style="color: #000000; font-weight: bold;">/</span><br />
<span style="color: #c20cb9; font-weight: bold;">umount</span> <span style="color: #000000; font-weight: bold;">/</span>mnt<br />
<span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>sys_vg-var_www <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<br />
<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>apache2 start<br />
<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>nginx start</div></div>
<p>И опять не забываем про fstab:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">printf</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>UUID=<span style="color: #780078;">`blkid | grep sys_vg-var_www | sed -r 's/.*UUID=&quot;([^&quot;]*).*/\1/i'`</span><span style="color: #000099; font-weight: bold;">\t</span>/var/lib/mysql reiserfs defaults 0 2<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>fstab</div></div>
<p>По материалам:</p>
<ol>
<li><a href="http://wiki.linuxquestions.org/wiki/LVM#example">http://wiki.linuxquestions.org/wiki/LVM#example</a></li>
<li><a href="http://www.tldp.org/HOWTO/LVM-HOWTO/reducelv.html">http://www.tldp.org/HOWTO/LVM-HOWTO/reducelv.html</a></li>
</ol>
<p>PS: после изменения размера мог измениться UUID для lv var_lib_mysql, хотя я и не уверен в этом. Но проверить не помешает.<br />
PS2: если работаете удаленно &#8211; не забывайте про <a href="http://www.gnu.org/software/screen/screen.html">screen</a>.<br />
PS3: писалось по памяти, так что могут быть некоторые неточности. Тупой копипаст без вовлечения мыслительного процесса чреват боком. Я предупредил <img src='http://dmitry.shaposhnik.name/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2009/03/01/lvm-rocks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Server moving adventures</title>
		<link>http://dmitry.shaposhnik.name/2008/08/07/server-moving-adventures/</link>
		<comments>http://dmitry.shaposhnik.name/2008/08/07/server-moving-adventures/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 01:45:28 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Newbie]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[Общее]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/?p=215</guid>
		<description><![CDATA[Второй день занимаюсь переездом содержимого одного сервера на другой. Другой &#8211; VPS под FreeBSD (привет, ДЦ Воля).
В общем, это последний раз когда я до оплаты сказал что он неплох. Теперь только реальные сервера. Ну и может VDS под Linux&#8230; В общем, именно эта реализация ужасна. Меня мало интересует как и что &#8211; факт налицо.


Первая ласточка [...]]]></description>
			<content:encoded><![CDATA[<p>Второй день занимаюсь переездом содержимого одного сервера на другой. Другой &#8211; VPS под FreeBSD (привет, ДЦ Воля).</p>
<p>В общем, это последний раз когда я до оплаты сказал что он неплох. Теперь только реальные сервера. Ну и может VDS под Linux&#8230; В общем, именно эта реализация ужасна. Меня мало интересует как и что &#8211; факт налицо.<br />
<span id="more-215"></span><br />
<img src="http://dmitry.shaposhnik.name/files/2008/08/mysql-logo.png" alt="" title="mysql-logo" width="200" height="103" class="aligncenter size-medium wp-image-218" /><br />
Первая ласточка &#8211; mysql. Сообщение о нехватке памяти в логах:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">080806 13:39:10 [ERROR] /usr/local/libexec/mysqld: Out of memory (Needed 1043824 bytes)</div></div>
<p>Судя по найденому в гугле и попыткам что-либо изменить, это вылазит из-за дефолтного в i386 FreeBSD значения максимального количества памяти на процесс. И изменить его у меня не удалось. В результате куцые буфера, и веселые запросы толпятся в очереди, а MySQL уверенно пухнет. И опухает:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[root@vps ~]# ps axu | grep mysql<br />
bash: fork: Cannot allocate memory</div></div>
<p>Причем, такое поведение я уже встречал ранее. Дважды. Тогда еще и файловые дескрипторы заканчивались (привет phpbb с кучей плагинов).</p>
<p>Но все был бы ничего, однако базы в большинстве своем живут в MyISAM, но самая тяжелая &#8211; как и полагается, в InnoDB. И вот любой запрос с джоинами на ней ложил тачку. </p>
<p>Во время разборок с мускулем был применен киллер, найденый в темном переулке на форумах мускуля:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#!/usr/local/bin/php<br />
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <br />
<a href="http://www.php.net/mysql_connect"><span style="color: #990000;">mysql_connect</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'root'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'pass'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/mysql_query"><span style="color: #990000;">mysql_query</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SHOW FULL PROCESSLIST&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #339933;">=</span><a href="http://www.php.net/mysql_fetch_array"><span style="color: #990000;">mysql_fetch_array</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000088;">$process_id</span><span style="color: #339933;">=</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;Id&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;Time&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">10</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'User'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">!=</span><span style="color: #0000ff;">'root'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$sql</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;KILL <span style="color: #006699; font-weight: bold;">$process_id</span>&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/mysql_query"><span style="color: #990000;">mysql_query</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></div>
<p>Теперь появилось время на мысли. <a href="http://mtop.sourceforge.net/">mtop</a> помог отследить, что во всем виновата одна эта БД. После запора в ней более-менее тяжелые запросы в других БД тоже застряют.</p>
<p>Результатом был переезд этой большой базы на другой хост, и использование ее оттуда. Сервер с двухядреным оптероном и 4ГБ памяти не заметил появления балласта: запросы пролетали мгновенно. И это без попыток тюнинговать мускуль.</p>
<p><img src="/files/2008/08/nginx-n-apache.png" alt="" title="nginx-n-apache" width="247" height="103" class="aligncenter size-medium wp-image-219" /></p>
<p>Далее начались проблемы с милой связкой nginx+apache. Как описано у <a href="http://blog.kovyrin.net/2006/05/18/nginx-as-reverse-proxy/">Алексея</a>, все заработало. Но некоторые странички отказывались показываться &#8211; браузер ругался на невозможность понять что же ему пришло. Такой ошибки я не встречал, и как оказалось никто из моего контакт-листа тоже.</p>
<p>А получилось следующее: обожаемый ExpressionEngine (и тебе привет) пытался все отдать за-gzip-леное. Апач справедливо отдавал это как HTTP/1.1 Transfer-Encoding: chunked. Но это в ответ на запрос HTTP/1.0 от nginx! Последний нифига не понимал и результирующий фарш доставлялся браузеру. Еще бы, он не хотел это нечто отображать&#8230;</p>
<p>Выключением опции gzip-сжатия в ExpressionEngine 1.5.3 это полечилось, однако&#8230;</p>
<p><img src="/files/2008/08/store_ee.gif" alt="" title="store_ee" width="111" height="102" class="aligncenter size-medium wp-image-220" /></p>
<p>&#8230; приключения с этим белым и пушистым зверьком не закончились. В форуме при публикации сообщения символы кириллицы отсутствовали. Долго я искал помощи через гугль, пока не полез в код. А в коде методом тыка нашел, что это все <a href="http://codeigniter.com/bug_tracker/bug/1919/">виноват xss_clean в версии 1.5.3</a>.</p>
<p>Заменив строки с</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339933;">...</span><br />
<span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/preg_replace"><span style="color: #990000;">preg_replace</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'#(&amp;\#*\w+)[\x00-\x20]+;#u'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>1;&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #339933;">...</span><br />
<span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/preg_replace"><span style="color: #990000;">preg_replace</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'#(&amp;\#x*)([0-9A-F]+);*#iu'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>1<span style="color: #000099; font-weight: bold;">\\</span>2;&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #339933;">...</span></div></div>
<p>на</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/preg_replace"><span style="color: #990000;">preg_replace</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'#(&amp;\#?[0-9a-z]+)[\x00-\x20]*;?#i'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>1;&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp;<span style="color: #339933;">...</span><br />
<span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/preg_replace"><span style="color: #990000;">preg_replace</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'#(&amp;\#x?)([0-9A-F]+);?#i'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>1<span style="color: #000099; font-weight: bold;">\\</span>2;&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>проблему вылечил.</p>
<p>С нетерпением жду что обнаружится дальше&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2008/08/07/server-moving-adventures/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Migration to PowerDNS</title>
		<link>http://dmitry.shaposhnik.name/2008/07/11/migration-to-powerdns/</link>
		<comments>http://dmitry.shaposhnik.name/2008/07/11/migration-to-powerdns/#comments</comments>
		<pubDate>Thu, 10 Jul 2008 22:14:10 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Newbie]]></category>
		<category><![CDATA[PowerDNS]]></category>
		<category><![CDATA[tutorials]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/?p=183</guid>
		<description><![CDATA[Наверняка многие видели сообщение об уязвимости в DNS. Во многих дистрибах линукса весьма скоро появились секьюрити-патчи, которые эту уязвимость исправляли. Уязвимость, может, и не слишком уж страшная, но она напомнила мне о PowerDNS, который я с интересом рассматривал в начале 2008го года.
Расматривал я его в основном из-за родной интеграции с MySQL. Мне весьма понравилось как [...]]]></description>
			<content:encoded><![CDATA[<p>Наверняка многие видели <a href="http://www.opennet.ru/opennews/art.shtml?num=16872">сообщение об уязвимости в DNS</a>. Во многих дистрибах линукса весьма скоро появились секьюрити-патчи, которые эту уязвимость исправляли. Уязвимость, может, и не слишком уж страшная, но она напомнила мне о <a href="http://www.powerdns.com/">PowerDNS</a>, который я с интересом рассматривал в начале 2008го года.</p>
<p>Расматривал я его в основном из-за родной интеграции с MySQL. Мне весьма понравилось как она реализована. Однако у меня были уже рабочие конфиги BIND9, и я просто ленился испытать PowerDNS на собственной шкуре.</p>
<p>А зря боялся, как оказалось. Упомянутая уязвимость не задела PowerDNS, и этим мое внимание было вновь привлечено к нему. И переход таки состоялся.<br />
<span id="more-183"></span></p>
<h2>Что дал переход</h2>
<p>Во-первых, я получил возможность использовать найденый вчера <a href="https://www.poweradmin.org/trac/">poweradmin</a>. Штука оказалась немного неуклюжая, но порадовала меня тем, что не надо более ковыряться в конфигах.</p>
<p>Во-вторых, при изменении/добавлении/удалении записей в зоне маркер (Serial) в SOA меняется сам. Мелочь, но приятно.</p>
<p>В-третьих, теперь можно давать доступ к редактированию зон другим людям.</p>
<p>Вот то, что бросилось мне в глаза. А теперь более подробно о самом переходе.</p>
<h2>Процесс перехода</h2>
<p>PowerDNS состоит из двух компонентов &#8211; основной сервер имен и преобразователь имен. Основной сервер имен выдает информацию только о тех записях, которые в нем есть. Преобразователь имен же помогает резолвить то, чего нету непосредственно у данного сервера.</p>
<p>Итак, понадобится выполнить следующие действия:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">apt-get install pdns-server pdns-recursor pdns-backend-mysql</div></div>
<p>Желательно во время установки стопнуть bind, потому как dpkg будет ругаться из-за неудачного запуска демона.</p>
<p>После установки можно тушить pdns и стартовать bind до окончания миграции.</p>
<p>В конфиге /etc/powerdns/pdns.conf надо сделать следующие изменения:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">...<br />
#allow-recursion=127.0.0.1<br />
...<br />
launch=gmysql<br />
...<br />
local-address=_real_external_ip_here_<br />
...<br />
recursor=127.0.0.1<br />
...</div></div>
<p>Этим мы будем передавать все неизвестные запросы от основного сервера к recursor&#8217;у.<br />
У рекурсора в конфиге стоит local-address=127.0.0.1 по умолчанию, если мне не изменяет память.</p>
<p>В /etc/powerdns/pdns.d/pdns.local вписываем</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">gmysql-host=localhost<br />
gmysql-port=3306<br />
gmysql-dbname=_username_here_<br />
gmysql-user=_dbname_here_<br />
gmysql-password=_dbpass_here_<br />
gmysql-socket=/var/run/mysqld/mysqld.sock</div></div>
<p>Проверяем, есть ли нужная БД и пользователь, и может ли он подключиться к базе.</p>
<p>Пример начальной базы есть в /usr/share/doc/pdns-backend-mysql.<br />
Советую туда сразу добавить в конец</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> records <span style="color: #993333; font-weight: bold;">ADD</span> CONSTRAINT <span style="color: #ff0000;">`records_ibfk_1`</span> <span style="color: #993333; font-weight: bold;">FOREIGN</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`domain_id`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">REFERENCES</span> <span style="color: #ff0000;">`domains`</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`id`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">DELETE</span> CASCADE;</div></div>
<p>При его тестировании было замечено что работает он бытрее с таблицами InnoDB. Наверное, из-за большого кеша у этого типа таблиц. Я не стал менять таблицы на MyISAM, однако добавил при создании таблиц <tt>default collate utf8_general_ci</tt> &#8211; для надежности. </p>
<p>Потом надо втянуть записи имеющиеся у BIND. Для этого в комплекте есть утилита <a href="http://doc.powerdns.com/migration.html">zone2sql</a>. Рекомендую использовать ее с ключиком <tt>--gmysql</tt> &#8211; так она правильнее работает, создавая записи и в domains и в records.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">zone2sql --named-conf=/etc/bind/named.conf --gmysql &gt; import.sql</div></div>
<p>и вначале выкосил все до основных зон. Потом скормил это mysql&#8217;ю. Также можно во всех <a href="http://doc.powerdns.com/types.html#AEN4582">записях SOA</a> поставить Serial в 0 &#8211; так PowerDNS будет вычислять его автоматически.</p>
<p>Пробуем стопнуть bind9 и запустить pdns и pdns-recursor. Если все правильно &#8211; все взлетит, и в сислоге будут сообщения о состоянии полета.</p>
<p>Проверить можно набрав</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">nslookup - dns.yourserver.com</div></div>
<p>и попробовать ввести что-то существующее на сервере и что-то несуществующее.<br />
У меня основной сервер без recursor&#8217;а не хотел отдавать записи типа CNAME при просмотре nslookup&#8217;ом. Пришлось установит recursor и настроить их общение.</p>
<p>Ну а установка <a href="https://www.poweradmin.org/trac/">poweradmin</a> для управления сервером не должна вызвать трудностей вообще.</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2008/07/11/migration-to-powerdns/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>FAM and Gamin</title>
		<link>http://dmitry.shaposhnik.name/2008/03/13/fam-and-gamin/</link>
		<comments>http://dmitry.shaposhnik.name/2008/03/13/fam-and-gamin/#comments</comments>
		<pubDate>Thu, 13 Mar 2008 11:24:01 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Newbie]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/2008/03/13/fam-and-gamin/</guid>
		<description><![CDATA[Вчера потратил немного времени и произвел скрипт-демон для отлова изменений в указанной папке.
Но вот работает связка только с FAM. А в Linux сейчас уже используется более продвинутый Gamin. Как подружить Ruby с Gamin?

Собссно, сам демон:
#!/usr/bin/ruby

# load the fam bindings
require 'fam'

require 'logger'
require 'rubygems'
require 'daemons'

my_path = Dir.pwd
monitored_path = Dir.pwd + '/monitored/'
Daemons.daemonize 
#Daemons.daemonize :ontop =&#62; true # For [...]]]></description>
			<content:encoded><![CDATA[<p>Вчера потратил немного времени и произвел скрипт-демон для отлова изменений в указанной папке.<br />
Но вот работает связка только с FAM. А в Linux сейчас уже используется более продвинутый Gamin. Как подружить Ruby с Gamin?<br />
<span id="more-178"></span><br />
Собссно, сам демон:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;">#!/usr/bin/ruby</span><br />
<br />
<span style="color:#008000; font-style:italic;"># load the fam bindings</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'fam'</span><br />
<br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'logger'</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'daemons'</span><br />
<br />
my_path = <span style="color:#CC00FF; font-weight:bold;">Dir</span>.<span style="color:#9900CC;">pwd</span><br />
monitored_path = <span style="color:#CC00FF; font-weight:bold;">Dir</span>.<span style="color:#9900CC;">pwd</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">'/monitored/'</span><br />
Daemons.<span style="color:#9900CC;">daemonize</span> <br />
<span style="color:#008000; font-style:italic;">#Daemons.daemonize :ontop =&gt; true # For debugging purposes. Doesn't detach.</span><br />
<br />
logger = <span style="color:#CC00FF; font-weight:bold;">Logger</span>.<span style="color:#9900CC;">new</span> my_path <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">'/dirmon.log'</span><br />
logger.<span style="color:#9900CC;">level</span> = <span style="color:#CC00FF; font-weight:bold;">Logger</span>::INFO<br />
<br />
<span style="color:#9966CC; font-weight:bold;">unless</span> test ?d, monitored_path<br />
&nbsp; log_file.<span style="color:#9900CC;">write</span> <span style="color:#996600;">'ERROR: Specified directory does not exist.'</span><br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">exit</span> <span style="color:#006666;">1</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
pid = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>my_path <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">'/dirmon.pid'</span>,<span style="color:#996600;">&quot;w&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
pid.<span style="color:#9900CC;">write</span> <span style="color:#CC00FF; font-weight:bold;">Process</span>.<span style="color:#9900CC;">pid</span><br />
pid.<span style="color:#9900CC;">close</span><br />
<br />
<span style="color:#CC00FF; font-weight:bold;">Dir</span>.<span style="color:#9900CC;">chdir</span><span style="color:#006600; font-weight:bold;">&#40;</span>my_path<span style="color:#006600; font-weight:bold;">&#41;</span><br />
<br />
<span style="color:#008000; font-style:italic;"># open a connection to FAM and start monitoring specified path</span><br />
fam = <span style="color:#6666ff; font-weight:bold;">Fam::Connection</span>.<span style="color:#9900CC;">new</span><br />
fam.<span style="color:#9900CC;">monitor_dir</span> monitored_path<br />
logger.<span style="color:#9900CC;">info</span> <span style="color:#996600;">&quot;Fam connected&quot;</span><br />
<br />
<span style="color:#9966CC; font-weight:bold;">while</span> <span style="color:#0000FF; font-weight:bold;">true</span><br />
&nbsp; <span style="color:#008000; font-style:italic;"># if there are fam events pending, then process them</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">if</span> fam.<span style="color:#9900CC;">pending</span>?<br />
&nbsp; &nbsp; ev = fam.<span style="color:#9900CC;">next_event</span><br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">case</span> ev.<span style="color:#9900CC;">code</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#6666ff; font-weight:bold;">Fam::Event::CHANGED</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; logger.<span style="color:#9900CC;">info</span> <span style="color:#996600;">'File changed: '</span> <span style="color:#006600; font-weight:bold;">+</span> ev.<span style="color:#9900CC;">file</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#6666ff; font-weight:bold;">Fam::Event::DELETED</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; logger.<span style="color:#9900CC;">info</span> <span style="color:#996600;">'File deleted: '</span> <span style="color:#006600; font-weight:bold;">+</span> ev.<span style="color:#9900CC;">file</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#6666ff; font-weight:bold;">Fam::Event::CREATED</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; logger.<span style="color:#9900CC;">info</span> <span style="color:#996600;">'File created: '</span> <span style="color:#006600; font-weight:bold;">+</span> ev.<span style="color:#9900CC;">file</span><br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2008/03/13/fam-and-gamin/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>rails and bzr</title>
		<link>http://dmitry.shaposhnik.name/2008/01/16/rails-and-bzr/</link>
		<comments>http://dmitry.shaposhnik.name/2008/01/16/rails-and-bzr/#comments</comments>
		<pubDate>Wed, 16 Jan 2008 10:50:43 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Newbie]]></category>
		<category><![CDATA[RoR]]></category>
		<category><![CDATA[bzr]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/2008/01/16/rails-and-bzr/</guid>
		<description><![CDATA[Попробовал bzr и остался весьма доволен.

Что же из себя представляет Bazaar? Bzr &#8211; распределенная система контроля версий. После SVN такой термин не совсем понятен. И зачем на что-то переходить когда и SVN отлично работает?
Распределенная система контроля версий не привязана к серверу. Что случится если в процессе работы над проектом теряется свзять с svn-сервером? Система рассчитана [...]]]></description>
			<content:encoded><![CDATA[<p>Попробовал <a href="http://bazaar-vcs.org/">bzr</a> и остался весьма доволен.<br />
<span id="more-165"></span><br />
Что же из себя представляет <a href="http://bazaar-vcs.org/">Bazaar</a>? Bzr &#8211; распределенная система контроля версий. После SVN такой термин не совсем понятен. И зачем на что-то переходить когда и SVN отлично работает?<br />
Распределенная система контроля версий не привязана к серверу. Что случится если в процессе работы над проектом теряется свзять с svn-сервером? Система рассчитана на обязательное его наличие. Как результат &#8211; работаем дальше без истории изменений.<br />
А что же дает bzr?<br />
Локальные коммиты. Используя его мы можем сделать bzr commit &#8211;local, и так у нас будет история и версионность. Локально. И при появлении сервера можно вновь делать коммиты на него.<br />
Привязка-отвязка от сервера. Можно сделать чекаут, отвязать его от сервера. Например, при поездке куда-то.<br />
Наш репозитарий может служить репозитарием для других. Так, можно иметь рабочий репозитарий для проектов, и репозитарий для активной разработки. После того как development-версия оттестирована можно делать коммит в рабочий репозитарий. Такое дополнительное звено для проверки работоспособности.</p>
<p>Собственно, существуют и другие подобные системы &#8211; git, mercurial. Но bzr считается самым дружественным. Далее на примере это можно будет увидеть <img src='http://dmitry.shaposhnik.name/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Итак, создание репозитария происходит командой <tt>bzr init-repository</tt>. </p>
<blockquote><p>New branches created under the repository directory will store their revisions in the repository, not in the branch directory.</p></blockquote>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">mkdir</span> railsproject <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #7a0874; font-weight: bold;">cd</span> railsproject</div></div>
<p>Создание проекта в нем &#8211; <tt>bzr init</tt></p>
<blockquote><p>Use this to create an empty branch, or before importing an existing project.<br />
If there is a repository in a parent directory of the location, then the history of the branch will be stored in the repository.<br />
Otherwise init creates a standalone branch which carries its own history in the .bzr directory.</p></blockquote>
<p>Теперь на локальной машинке давайте создадим проект на rails:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">rails railsproject</div></div>
<p>и сделаем чекаут:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">bzr checkout bzr+<span style="color: #c20cb9; font-weight: bold;">ssh</span>:<span style="color: #000000; font-weight: bold;">//</span>my.server<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>user<span style="color: #000000; font-weight: bold;">/</span>bzr<span style="color: #000000; font-weight: bold;">/</span>railsproject<span style="color: #000000; font-weight: bold;">/</span> .</div></div>
<p>Отлично. Теперь у нас есть папка .bzr в корне проекта. Прежде чем делать добавления в проект давайте пропишем маски для исключений. Это делается легко и просто =)</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">bzr ignore <span style="color: #ff0000;">&quot;log/*.log&quot;</span><br />
bzr ignore <span style="color: #ff0000;">&quot;tmp/*&quot;</span></div></div>
<p>Мне кажется, это приятней и понятней чем в svn. Кроме того, в корне проекта появился файлик .bzrignore, в который можно дописывать маски.<br />
Если в маске встречается символ &#8220;/&#8221; то путь определяется от корня проекта. Например, вложенная где-нибудь папка log будет добавлена в репозитарий со всем содержимым. Для такого случая есть префикс &#8220;/**/logs/*.log&#8221;.<br />
Отлично, теперь в корне проекта сделаем</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">bzr add<br />
bzr commit <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;initial import&quot;</span></div></div>
<p>и наши файлы ушли в репозитарий. Все, можно работать.<br />
Чтобы не делать много мелких несущественных коммитов можно делать их локально &#8211; &#8220;bzr commit &#8211;local&#8221;.<br />
Более подробный мануал по bzr иожно <a href="http://bazaar-vcs.org/Documentation">найти на оффсайте</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2008/01/16/rails-and-bzr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux tips v.1</title>
		<link>http://dmitry.shaposhnik.name/2007/07/09/linux-tips-v1/</link>
		<comments>http://dmitry.shaposhnik.name/2007/07/09/linux-tips-v1/#comments</comments>
		<pubDate>Mon, 09 Jul 2007 16:55:55 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Newbie]]></category>
		<category><![CDATA[tutorials]]></category>

		<guid isPermaLink="false">http://0804team.kiev.ua/dm/blog/2007/07/09/linux-tips-v1/</guid>
		<description><![CDATA[Серия относится к категории &#8220;newbies&#8221;. Используемый дистрибутив &#8211; Ubuntu.
В этой части: 

как сменить разрешение экрана вручную
как сменить видеодрайвер
как восстановить загрузчик (grub) после установки Windoze
запись в NTFS


Как сменить разрешение экрана вручную + как сменить видеодрайвер
В примере используется драйвер nv и заменяется на nvidia (проприетарный, но зато с 3Д-ускорением).
Можно обойтись без бэкапа, но настоятельно рекомендую его делать.

Открываем [...]]]></description>
			<content:encoded><![CDATA[<p>Серия относится к категории &#8220;newbies&#8221;. Используемый дистрибутив &#8211; Ubuntu.</p>
<p>В этой части: </p>
<ul>
<li>как сменить разрешение экрана вручную</li>
<li>как сменить видеодрайвер</li>
<li>как восстановить загрузчик (grub) после установки Windoze</li>
<li>запись в NTFS</li>
</ul>
<p><span id="more-119"></span></p>
<h1>Как сменить разрешение экрана вручную + как сменить видеодрайвер</h1>
<p>В примере используется драйвер nv и заменяется на nvidia (проприетарный, но зато с 3Д-ускорением).<br />
Можно обойтись без бэкапа, но настоятельно рекомендую его делать.</p>
<ol>
<li>Открываем терминал
<ul>
<li>БЭКАП: cp /etc/X11/xorg.conf ~/</li>
</ul>
</li>
<li>sudo apt-get install nvidia-glx</li>
<li>gksudo gedit /etc/X11/xorg.conf</li>
<li>Далее ищем (ближе к концу) раздел, в котором указаны разрешения (Section &#8220;Screen&#8221;).</li>
<li>В нем указано кол-во бит (DefaultDepth, значение как правило 16 или 24, иногда 32).</li>
<li>Или в список для указанной битности добавляем наше разрешение в начало, или во все.</li>
<li>Еще выше (Section &#8220;Device&#8221;) ищем:
<div class="codecolorer-container ini default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Driver <span style="color: #933;">&quot;nv&quot;</span></div></div>
<p>или возможно <tt>"vesa"</tt>.<br />
	Заменяем на</p>
<div class="codecolorer-container ini default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Driver nvidia</div></div>
</li>
<li>Сохраняем (Ctrl+O). Закрываем все окна. Делаем логаут.</li>
<li>Теперь нажимаем alt+control+backspace либо ребутаемся. Это перезагрузит графическую оболочку.</li>
<li>Теперь если все ок &#8211; то все заведется, если же нет &#8211; то настало время откатиться назад.</li>
</ol>
<p>Откат (Если делали бэкап):</p>
<ol>
<li>в консоли логинимся</li>
<li>sudo cp ~/xorg.conf /etc/X11/xorg.conf</li>
<li>sudo /etc/init.d/gdm restart</li>
</ol>
<p>Если не делали бэкап: </p>
<ol>
<li>в консоли логинимся</li>
<li>sudo nano /etc/X11/xorg.conf</li>
<li>Мотаем пока не найдем Driver nvidia</li>
<li>Изменяем на Driver nv</li>
<li>Ctrl+O &#8211; сохраняем.</li>
<li>sudo /etc/init.d/gdm restart</li>
</ol>
<p>Это не самый простой метод, но для меня родной =)</p>
<h1>Оживляем загрузчик</h1>
<p><a href="http://ubuntuforums.org/archive/index.php/t-24113.html">Взято отсюда</a></p>
<ol>
<li>Загрузиться с Ubuntu LiveCD.</li>
<li>Открыть окошко терминала.</li>
<li>Набрать <tt>grub</tt></li>
<li>Набрать <tt>root (hd0,6)</tt> &#8211; номер диска и загрузочного раздела с линуксом (например, если /boot на разделе /dev/sda7, то это будет hd0,6 для grub).</li>
<li>Набрать <tt>setup (hd0)</tt>, где 0 &#8211; номер винчейстера.</li>
<li>Выйти по команде <tt>quit</tt>.</li>
<li>Reboot.</li>
</ol>
<p><i>Уточнение по п.4:</i> можно воспользоваться командой &#8220;find /boot/grub/stage1&#8243;, которая скажет номер диска и раздела.<br />
Не забывайте, что номер раздела на единичку меньше &#8211; счет ведется с 0.<br />
Как было показано &#8211; sda7 будет hd(0,6).</p>
<h1>Пишем в NTFS</h1>
<p>Надо выполнит команду (или из терминала или из апплета Run)</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">gksudo gedit <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>fstab</div></div>
<p>и прописать для раздела с виндой пирмерно следующее:</p>
<div class="codecolorer-container ini default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">/dev/hdc1 /media/hdc1 ntfs-3g defaults,locale<span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">en_US.utf8,umask=007,gid=46,force 0 0</span></div></div>
<p><tt>/dev/hdc1</tt> &#8211; раздел с виндой, можно подсмотреть в gparted<br />
<tt>/media/hdc1</tt> &#8211; где будет смонтировано (надо создать заранее &#8211; <tt>sudo mkdir /media/hdc1</tt>)<br />
<tt>defaults,locale=en_US.utf8,umask=007,gid=46,force</tt> &#8211; все обычно, форс &#8211; чтоб монтировался даже если раздел не помечен как чистый (не выполнился checkdisk) &#8211; <strong><u>у меня от этого force винда ХР умерла</u></strong> =)<br />
<tt>0 0</tt> &#8211; не дампить и не проверять.</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2007/07/09/linux-tips-v1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>NAT with IPTables</title>
		<link>http://dmitry.shaposhnik.name/2007/05/20/nat-with-iptables/</link>
		<comments>http://dmitry.shaposhnik.name/2007/05/20/nat-with-iptables/#comments</comments>
		<pubDate>Sun, 20 May 2007 20:06:39 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Newbie]]></category>
		<category><![CDATA[tutorials]]></category>

		<guid isPermaLink="false">http://0804team.kiev.ua/dm/blog/2007/05/20/nat-with-iptables/</guid>
		<description><![CDATA[Итак, специально для kislo_metal постю сюда тривиальную вещь &#8211; простейший метод для поднятия NAT.
Я назвал его iptables.sh и положил в /etc/init.d/
#!/bin/bash

INET_IFACE=&#34;eth0&#34;
IPTABLES=&#34;/sbin/iptables&#34;

echo 1 &#62; /proc/sys/net/ipv4/ip_forward
#Loading modules...
modprobe ip_tables
modprobe ipt_helper
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_gre
modprobe ip_nat_pptp
#Adding default actions
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT

#Clear all current rules
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
&#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Итак, специально для kislo_metal постю сюда тривиальную вещь &#8211; простейший метод для поднятия NAT.<br />
Я назвал его iptables.sh и положил в /etc/init.d/</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/bash</span><br />
<br />
<span style="color: #007800;">INET_IFACE</span>=<span style="color: #ff0000;">&quot;eth0&quot;</span><br />
<span style="color: #007800;">IPTABLES</span>=<span style="color: #ff0000;">&quot;/sbin/iptables&quot;</span><br />
<br />
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>net<span style="color: #000000; font-weight: bold;">/</span>ipv4<span style="color: #000000; font-weight: bold;">/</span>ip_forward<br />
<span style="color: #666666; font-style: italic;">#Loading modules...</span><br />
modprobe ip_tables<br />
modprobe ipt_helper<br />
modprobe ip_conntrack<br />
modprobe ip_conntrack_ftp<br />
modprobe ip_conntrack_irc<br />
modprobe iptable_nat<br />
modprobe ip_nat_ftp<br />
modprobe ip_nat_irc<br />
modprobe ip_gre<br />
modprobe ip_nat_pptp<br />
<span style="color: #666666; font-style: italic;">#Adding default actions</span><br />
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-P</span> INPUT ACCEPT<br />
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-P</span> OUTPUT ACCEPT<br />
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-P</span> FORWARD ACCEPT<br />
<br />
<span style="color: #666666; font-style: italic;">#Clear all current rules</span><br />
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-F</span><br />
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-X</span><br />
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> nat <span style="color: #660033;">-F</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<span style="color: #666666; font-style: italic;">##Creating NAT</span><br />
<span style="color: #666666; font-style: italic;">#for my PC: </span><br />
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> nat <span style="color: #660033;">-A</span> POSTROUTING <span style="color: #660033;">-s</span> 10.1.1.2 <span style="color: #660033;">-d</span> <span style="color: #000000;">0</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">0</span> <span style="color: #660033;">-j</span> MASQUERADE<br />
<span style="color: #666666; font-style: italic;">#for virtual machine</span><br />
<span style="color: #007800;">$IPTABLES</span> <span style="color: #660033;">-t</span> nat <span style="color: #660033;">-A</span> POSTROUTING <span style="color: #660033;">-s</span> 192.168.0.2 <span style="color: #660033;">-d</span> <span style="color: #000000;">0</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">0</span> <span style="color: #660033;">-j</span> MASQUERADE</div></div>
<p>Если скрипт не сработал &#8211; смотрим iptables-save. Если там хоть где-то есть DROP &#8211; то уже разбирайтесь сами, ибо по умолчанию политики стоят в ACCEPT на все.</p>
<p>Чтобы в Debian-based дистрибутивах скрипт подымал NAT автоматом надо сделать</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>iptables.sh <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>rc2.d<span style="color: #000000; font-weight: bold;">/</span>S99iptables.sh<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chmod</span> +x <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>iptables.sh</div></div>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2007/05/20/nat-with-iptables/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Rails: first steps</title>
		<link>http://dmitry.shaposhnik.name/2007/04/10/rails-first-steps/</link>
		<comments>http://dmitry.shaposhnik.name/2007/04/10/rails-first-steps/#comments</comments>
		<pubDate>Tue, 10 Apr 2007 06:34:46 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Newbie]]></category>
		<category><![CDATA[RoR]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://0804team.kiev.ua/dm/blog/2007/04/10/rails-first-steps/</guid>
		<description><![CDATA[Робко и нерешительно я начал делать первые шаги по рельсам. И что я могу сказать &#8211; мне нравится.

Первое с чем я пока столкнулся &#8211; с ковырянием в БД. Реализация &#8211; просто зверь!
Миграции &#8211; это нечто. Итак, для начала имеем пустую миграцию &#8211; версия 0. Далее была создана миграция (автоматом) v1. Что есть миграция? Вот что:
class [...]]]></description>
			<content:encoded><![CDATA[<p>Робко и нерешительно я начал делать первые шаги по рельсам. И что я могу сказать &#8211; мне нравится.<br />
<span id="more-105"></span><br />
Первое с чем я пока столкнулся &#8211; с ковырянием в БД. Реализация &#8211; просто зверь!<br />
Миграции &#8211; это нечто. Итак, для начала имеем пустую миграцию &#8211; версия 0. Далее была создана миграция (автоматом) v1. Что есть миграция? Вот что:</p>
<div class="codecolorer-container rails default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="rails codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">class</span> CreateNews <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Migrationdef</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">up</span><br />
create_table <span style="color:#ff3333; font-weight:bold;">:news</span>, <span style="color:#ff3333; font-weight:bold;">:force</span>=<span style="color:#006600; font-weight:bold;">&amp;</span>gt;true, &nbsp;<span style="color:#ff3333; font-weight:bold;">:options</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">&quot;ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_unicode_ci&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>t<span style="color:#006600; font-weight:bold;">|</span><br />
t.<span style="color:#9900CC;">column</span> <span style="color:#ff3333; font-weight:bold;">:title</span>, <span style="color:#ff3333; font-weight:bold;">:string</span>, <span style="color:#ff3333; font-weight:bold;">:limit</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006666;">255</span>, <span style="color:#ff3333; font-weight:bold;">:null</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">false</span><br />
t.<span style="color:#9900CC;">column</span> <span style="color:#ff3333; font-weight:bold;">:teaser</span>, <span style="color:#ff3333; font-weight:bold;">:text</span>, <span style="color:#ff3333; font-weight:bold;">:null</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">false</span> <br />
t.<span style="color:#9900CC;">column</span> <span style="color:#ff3333; font-weight:bold;">:body</span>, <span style="color:#ff3333; font-weight:bold;">:text</span>, <span style="color:#ff3333; font-weight:bold;">:null</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">false</span><br />
t.<span style="color:#9900CC;">column</span> <span style="color:#ff3333; font-weight:bold;">:created_at</span>, <span style="color:#ff3333; font-weight:bold;">:datetime</span>, <span style="color:#ff3333; font-weight:bold;">:null</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">false</span> <br />
t.<span style="color:#9900CC;">column</span> <span style="color:#ff3333; font-weight:bold;">:updated_at</span>, <span style="color:#ff3333; font-weight:bold;">:datetime</span>, <span style="color:#ff3333; font-weight:bold;">:null</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">false</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
<span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">down</span><br />
drop_table <span style="color:#ff3333; font-weight:bold;">:newsend</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>По привычке у меня установлен mysql (v5). И когда первый разописал структуру, тотекстовые данные сплошь были latin1. Потому в опциях добавил кодировку. Но после этого таблица стала не InnoDB! Оказалось, что по умолчанию рельсы создают таблицы типа InnoDB, если другое не указано в опциях. Как только добавляешь опции &#8211; требуется указать и таблицу. Ну вот и указал.</p>
<p>У многих возникает вопрос: а зачем же описывать структуру БД в коде? А для того, чтоб можно было красиво и легко переходить между изменениями, внесенными в процессе разработки. И не говорите, что БД спроектированная в начале работы над проектом не меняется никогда- не поверю, сам давно так думал, но всегда что-то но менялось.</p>
<p>И вот можно в следующей миграции описать какие поля добавить, что где поменять и т.п. &#8211; и в консоли на сервере сделать rake db:migrate VERSION=x. Разве это не удобно? Например, при откате на предыдущую версию тут же можно описать какие действия выполнять.</p>
<p>Ну и кроме миграций есть еще один плюс, который бросился мне в глаза: ведь эту же структуру не изменяя (вероятней всего, еще не пробовал) можно загнать и в PostgreSQL, и хоть в оракл.</p>
<p>И после этого &#8211; вот такой код для выбора всех новостей:</p>
<div class="codecolorer-container rails default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="rails codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">def</span> index<br />
&nbsp; <span style="color:#0066ff; font-weight:bold;">@news</span> = News.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:all</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>После написания таких кусочков задумался, а как же реализованы шаблоны и сильно порадовался &#8211; есть такая штука как layout и, собственно, view. View используется для отображения конкретного куска, а layout и есть шаблон всей страницы.</p>
<p>Layout:</p>
<div class="codecolorer-container rails default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="rails codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#006600; font-weight:bold;">&lt;</span>html<span style="color:#006600; font-weight:bold;">&gt;&lt;</span>head<span style="color:#006600; font-weight:bold;">&gt;&lt;</span>title<span style="color:#006600; font-weight:bold;">&gt;</span>FirstStep<span style="color:#006600; font-weight:bold;">&lt;/</span>title<span style="color:#006600; font-weight:bold;">&gt;</span><br />
<span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>= <span style="color:#5A0A0A; font-weight:bold;">javascript_include_tag</span> <span style="color:#996600;">'prototype'</span><span style="color:#006600; font-weight:bold;">%&gt;</span><br />
<span style="color:#006600; font-weight:bold;">&lt;/</span>head<span style="color:#006600; font-weight:bold;">&gt;&lt;</span>body<span style="color:#006600; font-weight:bold;">&gt;</span><br />
<span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>= <span style="color:#9966CC; font-weight:bold;">yield</span> <span style="color:#006600; font-weight:bold;">%&gt;&lt;/</span>body<span style="color:#006600; font-weight:bold;">&gt;</span><br />
<span style="color:#006600; font-weight:bold;">&lt;/</span>html<span style="color:#006600; font-weight:bold;">&gt;</span></div></div>
<p>View:</p>
<div class="codecolorer-container rails default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="rails codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#006600; font-weight:bold;">&lt;</span>ul<span style="color:#006600; font-weight:bold;">&gt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span> <span style="color:#0066ff; font-weight:bold;">@news</span>.<span style="color:#5A0A0A; font-weight:bold;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>sss<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#006600; font-weight:bold;">%&gt;</span><br />
<span style="color:#006600; font-weight:bold;">&lt;</span>li<span style="color:#006600; font-weight:bold;">&gt;</span><br />
<span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>= sss.<span style="color:#9900CC;">title</span> <span style="color:#006600; font-weight:bold;">%&gt;</span><br />
<br />
<span style="color:#006600; font-weight:bold;">&lt;/</span>li<span style="color:#006600; font-weight:bold;">&gt;</span><br />
<span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#006600; font-weight:bold;">%</span> <span style="color:#9966CC; font-weight:bold;">end</span> <span style="color:#006600; font-weight:bold;">%&gt;</span><br />
<span style="color:#006600; font-weight:bold;">&lt;/</span>ul<span style="color:#006600; font-weight:bold;">&gt;</span></div></div>
<p>Вот что я могу сказать о первых своих шагах &#8211; жутко нравится.</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2007/04/10/rails-first-steps/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
