<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Лёня Шевцов</title>
	
	<link>http://leonid.shevtsov.me</link>
	<description>Ruby, Ruby on Rails, RubyGL и др. ключевые слова</description>
	<lastBuildDate>Mon, 30 Aug 2010 23:52:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/leonidshevtsov" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="leonidshevtsov" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Еще о схеме БД, миграциях и нестандартных полях в Rails</title>
		<link>http://leonid.shevtsov.me/31-08-2010/eshhe-o-sxeme-bd-migraciyax-i-nestandartnyx-polyax-v-rails/</link>
		<comments>http://leonid.shevtsov.me/31-08-2010/eshhe-o-sxeme-bd-migraciyax-i-nestandartnyx-polyax-v-rails/#comments</comments>
		<pubDate>Mon, 30 Aug 2010 23:52:41 +0000</pubDate>
		<dc:creator>Леонид Шевцов</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://leonid.shevtsov.me/?p=949</guid>
		<description><![CDATA[Совершенно случайно наткнулся на такой комментарий в db/schema.rb:

# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# [...]]]></description>
			<content:encoded><![CDATA[<p>Совершенно случайно наткнулся на такой комментарий в <code>db/schema.rb</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># Note that this schema.rb definition is the authoritative source for your</span>
<span style="color:#008000; font-style:italic;"># database schema. If you need to create the application database on another</span>
<span style="color:#008000; font-style:italic;"># system, you should be using db:schema:load, not running all the migrations</span>
<span style="color:#008000; font-style:italic;"># from scratch. The latter is a flawed and unsustainable approach (the more migrations</span>
<span style="color:#008000; font-style:italic;"># you'll amass, the slower it'll run and the greater likelihood for issues).</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Учтите, что schema.rb является авторитетным источником данных о</span>
<span style="color:#008000; font-style:italic;"># структуре базы данных. Если вам нужно воспроизвести базу на другой</span>
<span style="color:#008000; font-style:italic;"># машине, нужно выполнить db:schema:load, а не прогонять все миграции</span>
<span style="color:#008000; font-style:italic;"># с нуля - это ущербный и обреченный на провал подход (чем больше миграций</span>
<span style="color:#008000; font-style:italic;"># накопится в проекте, тем медленне они будут проходить и тем больше вероятность ошибок).</span></pre></div></div>

<p>Он говорит о двух вещах. </p>
<p>Во-первых, при развертывании проекта, особенно если он уже старый и миграций поднакопилось, нужно выполнять не <code>rake db:migrate</code>, а <code>rake db:schema:load</code>. Вторая команда выполняет фактически всего одну миграцию и не выполняет всяческих отменяющих друг друга команд (знаешь, как бывает &#8211; поле добавили, потом через неделю вынормализировали и убрали).</p>
<p>Надо заметить, что <em>если в базе есть какие-нибудь нестандартные поля, например, поля полнотекстового поиска Postgres, то соответствующая таблица в <code>schema.rb</code> попросту не попадет</em>. В таком случае у тебя есть три выхода: либо добавить файл схемы в игнор, чтоб людей не смущать, либо <a href="http://code.google.com/p/acts-as-tsearch/source/browse/trunk/vendor/plugins/acts_as_tsearch/lib/postgres_extensions.rb">патчить адаптер БД</a>, что мне желаемого результата не дало, либо использовать схему в SQL (<code lang="rails">config.active_record.schema_format = :sql</code>). Но не тут-то было: SQL-схема не обновляется автоматически после миграций и не используется в задачах типа <code>db:setup</code>. <a href="https://rails.lighthouseapp.com/projects/8994/tickets/5412-rails-schema_format-sql-should-behave-like-schema_format-ruby">Соответствующий патч</a> лежит в багтрекере Rails уже аж две недели.</p>
<p>Во-вторых, что более важно, в <em>миграциях не должно быть логики по наполнению базы</em> &#8211; хотя бы потому, что это нарушает вышеупомянутое соглашение. По соглашению, наполнение базы нужно делать в <code>db/seeds.rb</code>. </p>
<p>А вот логика по <em>изменению</em> существующих данных в миграции вполне уместна и иногда неизбежна, например, если добавление поля и наполнение его данными нужно завернуть в одну транзакцию.</p>
<img src="http://feeds.feedburner.com/~r/leonidshevtsov/~4/xv5043rINDI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://leonid.shevtsov.me/31-08-2010/eshhe-o-sxeme-bd-migraciyax-i-nestandartnyx-polyax-v-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>coLinux и VirtualBox – что удобнее?</title>
		<link>http://leonid.shevtsov.me/04-08-2010/colinux-vs-virtualbox/</link>
		<comments>http://leonid.shevtsov.me/04-08-2010/colinux-vs-virtualbox/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 10:08:15 +0000</pubDate>
		<dc:creator>Леонид Шевцов</dc:creator>
				<category><![CDATA[Без рубрики]]></category>

		<guid isPermaLink="false">http://leonid.shevtsov.me/?p=930</guid>
		<description><![CDATA[Излагаю соображения, по которым я использую VirtualBox, а не coLinux. 
Пункт ноль: VirtualBox обеспечен поддержкой со стороны Sun Oracle, а coLinux &#8211; любительская разработка.
Виртуализация и производительность
coLinux представляет собой порт ядра Linux, работающий непосредственно из-под Windows, причем в привилегированном (Ring 0) режиме. Это значит, что все, кроме периферийных устройств, доступно ему без виртуализации: с одной стороны, [...]]]></description>
			<content:encoded><![CDATA[<p>Излагаю соображения, по которым я использую VirtualBox, а не coLinux. </p>
<p>Пункт ноль: VirtualBox обеспечен поддержкой со стороны <del style="text-decoration:line-through">Sun</del> Oracle, а coLinux &#8211; любительская разработка.</p>
<h2>Виртуализация и производительность</h2>
<p><a href="http://www.colinux.org">coLinux</a> представляет собой порт ядра Linux, работающий непосредственно из-под Windows, причем в привилегированном (<a href="http://en.wikipedia.org/wiki/Ring_%28computer_security%29">Ring 0</a>) режиме. Это значит, что все, кроме периферийных устройств, доступно ему без виртуализации: с одной стороны, так быстрее, с другой &#8211; (пока) coLinux совершенно не работает под 64-битной Windows.</p>
<p><a href="http://virtualbox.org">VirtualBox</a> же, в последних своих версиях, использует <a href="http://en.wikipedia.org/wiki/Hardware-assisted_virtualization">аппаратную виртуализацию</a>, доступную в современных процессорах (<a href="http://www.intel.com/technology/virtualization/technology.htm?iid=tech_vt+tech">Intel VT-x</a>), чтобы обеспечить практически тот же эффект. </p>
<p>Тут надо понимать, что есть два вида виртуальных машин: одни эмулируют процессор, то есть обеспечивают его функции программно, а другие -перекомпилируют код под реальный процессор, либо, в случае одинаковости реального и виртуального процессоров, выполняют код &laquo;как есть&raquo;, без каких-либо изменений. </p>
<p>Мораль в том, что <em>современная виртуализация, даже в своей &laquo;потребительской&raquo; ипостаси &#8211; дико быстрая штука</em>. Потому я и не буду сравнивать производительность.</p>
<p>Еще я не буду сравнивать производительность потому, что у меня 64-битная Windows 7 и coLinux не работает, кроме того, раньше coLinux не заводился и на 32-битной Windows 7 (еще beta 7000), а когда заводился (на XP) &#8211; работал пренебрежительно хорошо.</p>
<h2>Ненавязчивость</h2>
<p>coLinux умеет запускаться как в оконном режиме, так и в режиме сервиса. VirtualBox, сам по себе, &#8211; только в оконном, но мы-то знаем о <a href="http://vu1tur.eu.org/vboxctrl">программе, позволяющей запускать VirtualBox сервисом</a>. В любом случае Linux будет работать в фоне и никак о себе не напоминать.</p>
<p>coLinux проблематично относится к засыпанию Windows и совсем никак не относится к сохранению состояния машины (при выключении компьютера, разумеется, выключается и Linux). VirtualBox позволяет в любой момент сохранить виртуалку и замечательно переносит гибернацию.</p>
<h2>GUI</h2>
<p>Если вам зачем-то (зачем же? зачееем?) надо запускать GUI-программы из-под Linux, для VirtualBox доступно точно то же самое решение, что и для coLinux/andLinux: <a href="http://www.straightrunning.com/XmingNotes/">Xming</a>. Кроме этого, VirtualBox предоставляет т.н. <a href="http://www.makeuseof.com/tag/virtualboxs-seamless-mode-combine-operating-systems-desktop/">Seamless Mode</a> &#8211; режим, в котором оконные менеджеры Windows и Linux сливаются воедино. Не буду врать, я этого не пробовал. </p>
<p align="center"><a href="http://leonid.shevtsov.me/uploads/vim_comparison.png"><img src="http://leonid.shevtsov.me/uploads/vim_comparison-300x176.png" alt="" title="vim_comparison" width="300" height="176" class="alignnone size-medium wp-image-933" /></a><br />
<br />
<em class="remark">vim в PuTTY, gVim под Windows, gVim под Xming &#8211; где какой?</em>
</p>
<h2>Сеть</h2>
<p>В плане поддержки сети возможности coLinux и VirtualBox ваще идентичны.</p>
<h2>Жесткие диски</h2>
<p>Обе программы одинаково используют образы дисков, лежащие в виде обыкновенных файлов в разделах Windows. Обе якобы имеют поддержку физических разделов, но такую кривую, что лучше её не использовать.</p>
<h2>Периферия</h2>
<p>Подключить USB-устройство к VirtualBox достаточно просто, я подключал внешний диск с разделами в ext3, причем Linux его определял и использовал как обыкновенный внешний диск.</p>
<p>Можно ли подключить USB-устройство к coLinux? Я пока не узнал&#8230;</p>
<img src="http://feeds.feedburner.com/~r/leonidshevtsov/~4/JT3pn2brRKM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://leonid.shevtsov.me/04-08-2010/colinux-vs-virtualbox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как завести Rails 3 вместе с Passenger</title>
		<link>http://leonid.shevtsov.me/03-08-2010/setting-up-rails-3-on-passenger/</link>
		<comments>http://leonid.shevtsov.me/03-08-2010/setting-up-rails-3-on-passenger/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 14:40:46 +0000</pubDate>
		<dc:creator>Леонид Шевцов</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://leonid.shevtsov.me/?p=919</guid>
		<description><![CDATA[Поставить Rails 3 на Passenger &#8211; дело нетривиальное, ибо:

Bundler из Passenger не находит гемов, установленных в домашний каталог пользователя, то есть установленных посредством bundle install.
RailsEnv, установленный в конфиге Passenger, не используется, то есть всегда используется production

UPD: как на самом деле обстоят дела 
На самом деле проблема в том, что я не вызывал bundle lock. Эта [...]]]></description>
			<content:encoded><![CDATA[<p>Поставить Rails 3 на Passenger &#8211; дело нетривиальное, ибо:</p>
<ul>
<li>Bundler из Passenger не находит гемов, установленных в домашний каталог пользователя, то есть установленных посредством <code>bundle install</code>.</li>
<li>RailsEnv, установленный в конфиге Passenger, не используется, то есть всегда используется <code>production</code></li>
</ul>
<p><strong>UPD: как на самом деле обстоят дела</strong> </p>
<p>На самом деле проблема в том, что я не вызывал <code>bundle lock</code>. Эта команда (что никак не очевидно) не только &laquo;запирает&raquo; набор зависимостей. Она также создает файл <code>Gemfile.lock</code>, в котором находится информация о том, откуда эти зависимости брать. И ошибка</p>
<pre>
git://repo/path.git (at master) is not checked out. Please run `bundle install` (Bundler::PathError)
</pre>
<p>на самом деле значит, что нужно было вызвать <code>bundle lock</code>.</p>
<p><strong>UPD 2:</strong> в Bundler 1.0 (<code>gem install bundler --pre</code>) команда <code>bundle lock</code> не используется, а точнее отрабатывает автоматически при <code>bundle install</code>. А проблема моя была в том, что у меня стояло <code>PassengerUserSwitching off</code> (пользователь-то один), ввиду этого Passenger видимо не отдавал Bundler-у путь к домашнему каталогу и Bundler пользовался только системными гемами. Мораль: какие-то третьи рельсы сильно связанные.<br /><strong>/UPD 2</strong></p>
<p>Кроме того, переназначение <code>ENV['RAILS_ENV']=ENV['RACK_ENV']</code> совершенно необязательно, достаточно всего лишь указать правильный <code>RackEnv</code> в настройках Passenger.</p>
<p>А <code>config.ru</code> можно оставить в покое.</p>
<p><strong>/UPD: все, что дальше, можно не читать</strong><br />
Помучавшись немного, я нашел источник этих проблем: <em>приложения Rails 3 являются и рассматриваются как полноценные приложения <a href="http://rack.rubyforge.org/">Rack</a>.</em></p>
<p>Из этого следует (я так понимаю), что переменные окружения в Rails не попадают, их нужно объявлять отдельно в <code>config.ru</code>, то есть в конфиге Rack. Не попадает туда <code>BUNDLER_HOME</code>. Кроме того, поскольку Passenger обрабатывает Rails-приложения как Rack-приложения, вместо директивы <code>RailsEnv</code> нужно использовать <code>RackEnv</code>, а потом в том же <code>config.ru</code> присваивать ее обратно.</p>
<p>Резюмируя, нужно в конфиг Passenger добавить <code>RackEnv development</code>, а в начало <code>config.ru</code> вписать следующие строки:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'etc'</span>
ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'RAILS_ENV'</span><span style="color:#006600; font-weight:bold;">&#93;</span> = ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'RACK_ENV'</span><span style="color:#006600; font-weight:bold;">&#93;</span>  <span style="color:#9966CC; font-weight:bold;">if</span> !ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'RAILS_ENV'</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'RACK_ENV'</span><span style="color:#006600; font-weight:bold;">&#93;</span>
ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'BUNDLER_HOME'</span><span style="color:#006600; font-weight:bold;">&#93;</span> = Etc.<span style="color:#9900CC;">getpwuid</span>.<span style="color:#9900CC;">dir</span> <span style="color:#008000; font-style:italic;"># домашний каталог пользователя</span></pre></div></div>

<img src="http://feeds.feedburner.com/~r/leonidshevtsov/~4/OlRKzUMwqkA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://leonid.shevtsov.me/03-08-2010/setting-up-rails-3-on-passenger/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Настройка Linux в окружении VirtualBox</title>
		<link>http://leonid.shevtsov.me/03-08-2010/virtuabox-ubuntu-configuration-tips/</link>
		<comments>http://leonid.shevtsov.me/03-08-2010/virtuabox-ubuntu-configuration-tips/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 10:31:03 +0000</pubDate>
		<dc:creator>Леонид Шевцов</dc:creator>
				<category><![CDATA[Без рубрики]]></category>

		<guid isPermaLink="false">http://leonid.shevtsov.me/?p=901</guid>
		<description><![CDATA[&#8230;Заканчиваю эпос в трех частях об настройке виртуального Linux-сервера под Windows.
Беспарольный sudo
Поскольку никто, кроме тебя, на виртуалку попасть не сможет, целесообразно убрать пароль с sudo. Так удобнее. Для этого в /etc/sudoers нужно дописать строку

%username% ALL=NOPASSWD: ALL

где %username%, конечно &#8211; логин твоего пользователя, %username%.
Настройка сети
Вышеупомянутые статические настройки. Возможно, придется поменять IP-адреса (я почти уверен, что не [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230;Заканчиваю эпос в трех частях об настройке виртуального Linux-сервера под Windows.</p>
<h2>Беспарольный sudo</h2>
<p>Поскольку никто, кроме тебя, на виртуалку попасть не сможет, целесообразно убрать пароль с sudo. Так удобнее. Для этого в <code>/etc/sudoers</code> нужно дописать строку</p>
<pre>
%username% ALL=NOPASSWD: ALL
</pre>
<p>где %username%, конечно &#8211; логин твоего пользователя, %username%.</p>
<h2>Настройка сети</h2>
<p>Вышеупомянутые статические настройки. Возможно, придется поменять IP-адреса (я почти уверен, что не придется) &#8211; правильные можно подсмотреть в выдаче <code>ifconfig</code>.</p>
<pre>
# /etc/network/interfaces

# Loopback - не забудь его не убрать
auto lo
iface lo inet loopback

# NAT - служит выходом в Интернет, потому и gateway.
auto eth0
iface eth0 inet static
address 10.0.2.15
gateway 10.0.2.2
netmask 255.255.255.0
network 10.0.2.0
broadcast 10.0.2.255

# Host-only адаптер
auto eth1
iface eth1 inet static
address 192.168.56.101
netmask 255.255.255.0
network 192.168.56.0
broadcast 192.168.56.255
</pre>
<p>Остается настроить статический DNS. Проблема вот в чем: виртуальная машина получает свои DNS посредством <a href="http://ru.wikipedia.org/wiki/DHCP">DHCP</a> у машины-хозяина, причем получает в момент загрузки. Предположим теперь, что я загрузил виртуалку дома, и она получила в качестве DNS мой роутер <code>192.168.1.1</code>. Потом я пошел на работу, выключив (или усыпив) ноут &#8211; виртуалка при этом сохранила свое состояние, при чем для нее <em>ничего не поменялось</em> вообще. Она по-прежнему использует в качестве DNS роутер &#8211; уже недоступный &#8211; и поэтому теряет способность разрешать доменные имена. Довольно-таки неочевидный затык.</p>
<p>Чтобы избавиться от этого, в файл <code>/etc/dhcp3/dhclient.conf</code> добавляем строчку:</p>
<pre>
# Принудительно используем сервера OpenDNS (можешь указать любые другие)
supersede domain-name-servers 208.67.222.222,208.67.220.220;
</pre>
<p>По-моему это не идеальный конфиг, по уму надо все настройки перенести в <code>dhclient.conf</code>, но пока и так работает.</p>
<h2>Настройка SSH</h2>
<p>SSH-сервер по умолчанию в Убунте не стоит:</p>
<pre>
sudo apt-get install openssh-server
</pre>
<p>Предположим, ты используешь <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">PuTTY</a>. Тогда тебе остается <a href="http://google.com/search?q=generate+public+ssh+key+putty">сгенерировать им SSH-ключ</a> &#8211; для удобства без ключевой фразы &#8211; и:</p>
<pre>
mkdir ~/.ssh
echo "public key copypasted from putty" >~/.ssh/authorized_keys
</pre>
<p>После чего используем сгенерированный ключ для беспарольного входа на виртуалку. А если средствами ярлыка или BAT-файла вызывать <code>putty -load virtualbox_session_name</code> &#8211; то даже без путтевского окна настроек.</p>
<h2>Установка VirtualBox Guest Additions</h2>
<p>Данная штука нужна обязательно хотя бы потому, что без нее на виртуалке сбивается время. Тут все просто &#8211; монтируем образ, предоставляемый VirtualBox-ом, и выполняем</p>
<pre>
sudo /media/cdrom/VBoxLinuxAdditions-x86.run
</pre>
<p>Гостевые дополнения также позволяют <a href="http://www.ubuntugeek.com/how-to-access-windows-host-shared-folders-from-ubuntu-guest-in-virtualbox.html">монтировать папки из машины-хозяина внутрь виртуалки</a>, но мне это было не нужно и я этим не занимался. Замечу, что, скажем, рельсовые проекты в такие папки класть нельзя, ибо в них не соблюдаются права файлов.</p>
<h2>Настройка Samba</h2>
<p>Опять-таки нам выгодно открыть наибольший доступ по <a href="http://ru.wikipedia.org/wiki/Samba">Samba</a>, поскольку доступна она будет только с машины-хозяина.</p>
<p>Устанавливаем самбу:</p>
<pre>
sudo apt-get install samba
</pre>
<p>и прописываем такой себе минимальный конфиг (<code>/etc/samba/smb.conf</code>):</p>
<pre>
[global]
workgroup = WORKGROUP
interfaces = lo eth1
bind interfaces only = yes

security = share
map to guest = bad user

usershare allow guests = yes
guest account = %username%

[home]
path = /home/%username%
guest ok = yes
guest only = yes
read only = no
directory mask = 0755
create mask = 0644
</pre>
<p>С таким конфигом можно заходить из Windows на <code>\\192.168.56.101\home</code> и смотреть домашнюю папку своего пользователя.</p>
<h2>Хосты</h2>
<p>Чтобы не прописывать виртуальные хосты по несколько раз (на самой виртуалке, на машине-хозяине, на других виртуалках), имеет смысл настроить легонький DNS-сервер <a href="http://www.thekelleys.org.uk/dnsmasq/doc.html">dnsmasq</a>. Я до этого пока не добрался, прописываю хосты ручками.</p>
<h2>Резюмируя</h2>
<p>Вот и все. Пожалуй, все. </p>
<p>Я понимаю, что пишу не в стиле руководства для новичков &#8211; увы, излагать в духе <em>&laquo;запустите sudo nano&#8230; кстати, nano &#8211; это такой текстовый редактор&#8230; для начала найдите на клавиатуре буковку эс&#8230; эс как доллар&raquo;</em> я терпеть не могу. Гугл с удовольствием поможет разобраться в мелких деталях.</p>
<p>Надеюсь, помогу кому-нибудь слезть с денвера или Ruby for Windows в адекватную для веб-разработки среду. Ну или бросить мытарства с гномами-кедами-компизами без всякого ущерба для работы.</p>
<p>Вопросы? Предложения?</p>
<img src="http://feeds.feedburner.com/~r/leonidshevtsov/~4/eUJqfAEBVLw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://leonid.shevtsov.me/03-08-2010/virtuabox-ubuntu-configuration-tips/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Установка удобного Linux под Windows</title>
		<link>http://leonid.shevtsov.me/02-08-2010/installing-ubuntu-linux-on-virtualbox-in-windows/</link>
		<comments>http://leonid.shevtsov.me/02-08-2010/installing-ubuntu-linux-on-virtualbox-in-windows/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 12:49:02 +0000</pubDate>
		<dc:creator>Леонид Шевцов</dc:creator>
				<category><![CDATA[Без рубрики]]></category>

		<guid isPermaLink="false">http://leonid.shevtsov.me/?p=881</guid>
		<description><![CDATA[Итак, вдохновившись идеей иметь полноценное серверное окружение под Windows, приступаем к установке.
Что нам понадобится? (Более-менее) современный процессор, Windows, VirtualBox, образ Default Linux и немного волшебного соуса.
В этой статье я опишу установку и настройку VirtualBox так, чтобы им было удобно пользоваться. В следующей дам пару полезных советов по настройке собственно Linux.
Базовая настройка
Искренне надеюсь, что у тебя [...]]]></description>
			<content:encoded><![CDATA[<p>Итак, вдохновившись <a href="http://leonid.shevtsov.me/02-08-2010/udobnyj-virtualnyj-linux-pod-windows/">идеей иметь полноценное серверное окружение под Windows</a>, приступаем к установке.</p>
<p>Что нам понадобится? (Более-менее) современный процессор, Windows, <a href="http://www.virtualbox.org/wiki/Downloads">VirtualBox</a>, образ <a href="http://www.ubuntu.com/server/get-ubuntu/download">Default Linux</a> и немного <a href="http://vu1tur.eu.org/vboxctrl">волшебного соуса</a>.</p>
<p>В этой статье я опишу установку и настройку VirtualBox так, чтобы им было удобно пользоваться. В следующей дам пару полезных советов по настройке собственно Linux.</p>
<h2>Базовая настройка</h2>
<p>Искренне надеюсь, что у тебя получится <a href="http://google.com/search?q=install+ubuntu+on+windows+virtualbox">установить Ubuntu в виртуалбокс</a>. Единственный момент, который я бы хотел уточнить, это настройка сети.</p>
<h2>Сетевые адаптеры</h2>
<p>В VirtualBox есть три вида сетевых адаптеров: bridged, NAT, и host-only. По умолчанию VirtualBox создает для виртуалки один bridged-адаптер. Этот адаптер регистрирует виртуалку как еще одну машину в сети машины-хозяина, и я нахожу это крайне неудобным. Поэтому я подключаю к виртуалке два адаптера:</p>
<p><strong>NAT-адаптер</strong> проксирует соединение от виртуалки через соединение машины-хозяина в Интернет.</p>
<p><strong>Host-only адаптер</strong> создает виртуальную сеть без выхода в мир. В этой сети регистрируются все виртуалки, имеющие host-only адаптер, что удобно использовать для отладки сайтов, как с машины-хозяина, так и с других виртуалок (<a href="http://leonid.shevtsov.me/27-05-2010/internet-explorer-debugging-guide/">IE на XP</a>, например).</p>
<p>Использование такого набора адаптеров в Linux требует особой настройки сети (например, DHCP не имеет смысла), о которой я расскажу попозже &#8211; работать будет и &laquo;из коробки&raquo;.</p>
<h2>Установка VirtualBox в виде Windows-сервиса</h2>
<p>Я никак не понимаю, почему такая важная возможность не включена в ядро VirtualBox. Так или иначе, после долгих поисков удобной утилиты я нашел <a href="http://vu1tur.eu.org/vboxctrl-ru">vboxctrl</a>. Она позволяет запускать сколько угодно (сколько в память влезет, извращенец) виртуальных машин в качестве полноценных сервисов, которые и засыпают, и просыпаются, и корректно завершают работу вместе с Windows, и уж разумеется не висят в панели задач (а первый месяц я все же мучался, попадая alt+tabом в виртуалку). При этом vboxctrl не мешает запускать обыкновенные виртуалки, например, с той же XP.</p>
<p>Настройка vboxctrl тривиальна: его нужно <a href="http://vu1tur.eu.org/vboxctrl-ru#download">скачать</a> и указать в ini-файле путь к машине. </p>
<p>Рекомендую указать <code>ShutdownCommand = savestate</code> &#8211; виртуалка будет мгновенно включаться и выключаться с полным сохранением окружения.</p>
<p>После настройки vboxctrl выполняем <code>vboxctrl -i</code> &#8211; получаем сервис. Он запускается вместе с Windows, даже без логина. Останавливают и запускают его через обыкновеную панель сервисов.</p>
<h2>SSH</h2>
<p>Раз мы остались без прямого окна в виртуальную машину, придется (не то слово) настраивать SSH. На самом деле нужно было это сделать еще до сервисализации виртуалки. Настройка SSH заключается в установке <code>openssh-server</code> на Linux, <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">PuTTY</a> на Windows и пробрасывании SSH-ключа.</p>
<p><a href="http://leonid.shevtsov.me/03-08-2010/virtuabox-ubuntu-configuration-tips/">В следующей статье &#8211; SSH, настройки сети, Samba, безопасность и другое</a>.</p>
<img src="http://feeds.feedburner.com/~r/leonidshevtsov/~4/jQlfXiAw4rA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://leonid.shevtsov.me/02-08-2010/installing-ubuntu-linux-on-virtualbox-in-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Удобный виртуальный Linux под Windows</title>
		<link>http://leonid.shevtsov.me/02-08-2010/udobnyj-virtualnyj-linux-pod-windows/</link>
		<comments>http://leonid.shevtsov.me/02-08-2010/udobnyj-virtualnyj-linux-pod-windows/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 00:02:25 +0000</pubDate>
		<dc:creator>Леонид Шевцов</dc:creator>
				<category><![CDATA[Без рубрики]]></category>

		<guid isPermaLink="false">http://leonid.shevtsov.me/?p=871</guid>
		<description><![CDATA[Windows &#8211; десктопная ОС &#171;по умолчанию&#187;. Linux &#8211; серверная ОС &#171;по умолчанию&#187;. Согласны? Тогда поехали.
Месяца четыре назад я понял, что бороться с графическим интерфейсом Убунты (то есть с Gnome) бессмысленно. Равно как и мириться. Увы, приходится только принять как факт, что крупные разработчики дектопного ПО не видят линукс в списке целевых ОС. На это натыкаешься [...]]]></description>
			<content:encoded><![CDATA[<p>Windows &#8211; десктопная ОС &laquo;по умолчанию&raquo;. Linux &#8211; серверная ОС &laquo;по умолчанию&raquo;. Согласны? Тогда поехали.</p>
<p>Месяца четыре назад я понял, что бороться с графическим интерфейсом Убунты (то есть с Gnome) бессмысленно. Равно как и мириться. Увы, приходится только принять как факт, что крупные разработчики дектопного ПО не видят линукс в списке целевых ОС. На это натыкаешься постоянно. Ладно, можно хвалиться шикарной консолью и там возможностью &laquo;все под себя настраивать&raquo; (в особо тяжелых случаях &#8211; пересобирать). Но будьте честны и положите на противоположную чашу весов тормозящий Браузер и, скажем, невозможность без бубна подключить к компьютеру банальнейшую нокию.</p>
<p>При всем при этом разрабатывать серверное ПО (скажем попроще, сайты) на Windows &#8211; это как учиться в универе: даже если все правильно сделаешь, все равно потом работать будет. Особенно если это сайты на Rails.</p>
<p>Я решил, что сильные стороны данных ОС можно совмещать, компенсируя недостатки одной преимуществами другой. Тут представьте, пожалуйста, иллюстрацию про дружащих пингвина с окном или что-нибудь такое.</p>
<p>Речь идет о виртуальном Linux-сервере под VirtualBox на Windows. Да, именно так я и живу последние четыре месяца. Поверьте, это гораздо приятнее использования Wine для запуска игрушек и перехода с Firefox на Chrome, потому что первый тормозит.</p>
<p>По поводу производительности: Ubuntu 10.04, которая крутится у меня постоянно в фоновом режиме, практически не утруждает полуторагигагерцный процессор моего CULV-ноута. Да и с чего бы ей его  утруждать &#8211; современные технологии виртуализации позволяют как память, так и процессор (да и жесткий диск) под виртуалку выделять по мере необходимости.</p>
<p>Измерений скорости я не производил, но субъективно сайты на Rails работают вполне комфортно, а это уже (очень, очень) хороший показатель.</p>
<p>Недостатки: раздельная файловая система. Приходится прокидывать Samba, либо монтировать папки внутрь виртуалки с помощью vboxfs. Невозможность работать с файлами, находящимися под Windows, средствами консоли (не считая smbfs и, некоторым образом, cygwin). Не работают IDE, считающие своим долгом поменять мне database.yml (привет, НетБинз) и вытворять прочие шалости, которые положено делать руками в консоли.</p>
<p>Преимущества: мгновенное засыпание/пробуждение виртуалки (а ваши линуксы уже уходят в hibernate?). Благополучный вход и выход из хибернейта вместе с виндой. &laquo;Чистое&raquo; серверное окружение линукса.  Возможность при переустановке ОС полностью сохранить рабочее окружение. Возможность отказаться от пароля sudo.</p>
<p><a href="http://leonid.shevtsov.me/02-08-2010/installing-ubuntu-linux-on-virtualbox-in-windows/">Меньше слов и больше дела в следующей статье</a>.</p>
<img src="http://feeds.feedburner.com/~r/leonidshevtsov/~4/V6Ivcp8QQL0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://leonid.shevtsov.me/02-08-2010/udobnyj-virtualnyj-linux-pod-windows/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Плагин для подсчета посещаемости страниц в Ruby on Rails</title>
		<link>http://leonid.shevtsov.me/07-07-2010/ruby-on-rails-page-visit-tracking-plugin/</link>
		<comments>http://leonid.shevtsov.me/07-07-2010/ruby-on-rails-page-visit-tracking-plugin/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 17:01:16 +0000</pubDate>
		<dc:creator>Леонид Шевцов</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://leonid.shevtsov.me/?p=863</guid>
		<description><![CDATA[Я написал плагин для подсчета посещаемости избранных страниц Rails-приложения. Взять его можно на http://github.com/leonid-shevtsov/page_visit_tracker, там же посмотреть пример использования и краткую инструкцию.
Можно, конечно, делать это с помощью Google Analytics и вытягивать информацию оттуда, но, по-моему, это слишком сложное решение для такой простой задачи &#8211; потому-то и был написан этот плагин.
Я решил, что посещения надо привязывать [...]]]></description>
			<content:encoded><![CDATA[<p>Я написал плагин для подсчета посещаемости избранных страниц Rails-приложения. Взять его можно на <a href="http://github.com/leonid-shevtsov/page_visit_tracker">http://github.com/leonid-shevtsov/page_visit_tracker</a>, там же посмотреть пример использования и краткую инструкцию.</p>
<p>Можно, конечно, делать это с помощью Google Analytics и вытягивать информацию оттуда, но, по-моему, это слишком сложное решение для такой простой задачи &#8211; потому-то и был написан этот плагин.</p>
<p>Я решил, что посещения надо привязывать к объектам модели. Поэтому</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> PostsController
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#5A0A0A; font-weight:bold;">show</span>
    <span style="color:#008000; font-style:italic;"># ...</span>
    track_page_view<span style="color:#006600; font-weight:bold;">&#40;</span>@post<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>При этом создается новый объект PageView с данными о посещении. Повторные посещения тем же пользователем не учитываются. Посещения ботов тоже не учитываются.</p>
<img src="http://feeds.feedburner.com/~r/leonidshevtsov/~4/W9Vb-DyvWjA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://leonid.shevtsov.me/07-07-2010/ruby-on-rails-page-visit-tracking-plugin/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Кеширование страниц с динамическими элементами средствами Ruby on Rails</title>
		<link>http://leonid.shevtsov.me/03-07-2010/page-caching-with-dynamic-elements-on-rails/</link>
		<comments>http://leonid.shevtsov.me/03-07-2010/page-caching-with-dynamic-elements-on-rails/#comments</comments>
		<pubDate>Sat, 03 Jul 2010 08:01:53 +0000</pubDate>
		<dc:creator>Леонид Шевцов</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://leonid.shevtsov.me/?p=841</guid>
		<description><![CDATA[Поговорим о кешировании страниц. Вообще я ведь вру в названии статьи &#8211; одними средствами рельс его не сделаешь, поскольку их участие наоборот нужно свести к минимуму. К тому, чтобы единожды отрисовать страницу и уйти спать, оставив обработку запросов на долю сервера.
Последний раз я занимался кешированием страниц на сайте без аутентификации. Что даже более важно &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Поговорим о кешировании страниц. Вообще я ведь вру в названии статьи &#8211; одними средствами рельс его не сделаешь, поскольку их участие наоборот нужно свести к минимуму. К тому, чтобы единожды отрисовать страницу и уйти спать, оставив обработку запросов на долю сервера.</p>
<p>Последний раз я занимался кешированием страниц на <a href="http://leonid.shevtsov.me/25-02-2010/ruby-on-rails-page-caching/">сайте без аутентификации</a>. Что даже более важно &#8211; <a href="http://rentfeed.dp.ua">сайт этот</a> для всех выглядит одинаково, поэтому проблему отдачи страниц из кеша можно было легко сгрузить на Апач. К сожалению, так легко кешируются только самые простые сайты.</p>
<p>На этот раз стратегия такая: <strong>кешируем все страницы, но только для незалогиненных пользователей</strong>. Фишка в том, что факт залогиненности можно замечательно отследить сервером на основании куков и отдача кеша будет происходить без участия Rails. Для сайтов, скажем так, несоциальных, то есть таких, где авторизация не является обязательным действием, такая стратегия очень хорошо снижает нагрузку на сервер.</p>
<p>Перед тем, как заняться ее внедрением, нужно посмотреть по сторонам и составить список динамических элементов, нужных незалогиненному пользователю.</p>
<h2>Flash, в смысле уведомления</h2>
<p>Наиболее очевидный динамический элемент страницы &#8211; флеш. Чтобы выводить флеш на закешированных страницах, Pivotal Labs когда-то делали <a href="http://github.com/pivotal/cacheable-flash">плагин CacheableFlash</a>, но он рассчитан на Prototype. Потому-то я его и портировал в плагин <a href="http://github.com/leonid-shevtsov/cacheable-flash-jquery">CacheableFlash for jQuery</a>. </p>
<p>Принцип работы плагина прост: в <code>after_filter</code> флеш заносится в куку, а в яваскрипте забирается оттуда. Надо заметить, что это не работает с <code>flash.now</code>, что, по-моему, вполне логично, поскольку <code>flash.now</code> нужен только на динамических страницах типа форм. Выводить его придется отдельно. Вообще у меня это таким хелпером делается:</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> render_flash
  messages = <span style="color:#006600; font-weight:bold;">&#123;</span>:error <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#ff3333; font-weight:bold;">:notice</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#5A0A0A; font-weight:bold;">flash</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>type, message<span style="color:#006600; font-weight:bold;">|</span>
    messages<span style="color:#006600; font-weight:bold;">&#91;</span>type<span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">||</span>= <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    messages<span style="color:#006600; font-weight:bold;">&#91;</span>type<span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> message
  <span style="color:#9966CC; font-weight:bold;">end</span>
  messages.<span style="color:#5A0A0A; font-weight:bold;">to_a</span>.<span style="color:#9900CC;">map</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>m<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#5A0A0A; font-weight:bold;">content_tag</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'div'</span>, m<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'&lt;br/&gt;'</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#ff3333; font-weight:bold;">:class</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'flash'</span>,m<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">' '</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>.<span style="color:#9900CC;">join</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Он и <code>flash.now</code> выводит, и место под динамический флеш подготавливает.</p>
<h2>Другие элементы</h2>
<p>Остальные динамические элементы &#8211; у меня на <a href="http://www.cargid.com.ua">CarGid</a> это был счетчик объявлений, отобранных пользователем &laquo;в блокнот&raquo; &#8211; выводятся таким же способом. Разумеется, нужно помнить, что объем кук не резиновый и что особо ценную информацию туда лучше не писать (хотя какая ценная информация у незалогиненного пользователя?)</p>
<p>Большие динамические элементы можно подгружать отдельным запросом. Сам понимаешь, что такое решение гораздо хуже.</p>
<h2>Обновление кеша в результате действий незалогиненных пользователей</h2>
<p>У меня незалогиненные пользователи могут оставлять комментарии. Разумеется, после добавления комментария его нужно показать пользователю &#8211; поэтому страницу с комментариями нужно убрать из кеша.</p>
<h2>Настройка кеширования в контроллерах</h2>
<p>По умолчанию рельсы кладут кеш прямо в <code>public</code>. Разумеется, это нам не подходит, потому кеш нужно перенести в <code>public/cache</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># config/environments/production.rb</span>
config.<span style="color:#9900CC;">action_controller</span>.<span style="color:#9900CC;">page_cache_directory</span> = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>RAILS_ROOT, <span style="color:#ff3333; font-weight:bold;">:public</span>, <span style="color:#ff3333; font-weight:bold;">:cache</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Чтобы кеширование происходило только без наличия залогиненного пользователя, замечательно подходит условно-стандартный метод Authlogic <code>current_user</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> MainController <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActionController::Base</span>
  caches_page <span style="color:#ff3333; font-weight:bold;">:index</span>, <span style="color:#ff3333; font-weight:bold;">:unless</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:current_user</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Остается растыкать <code>caches_page</code> по контроллерам, чтобы Rails начали складывать в кеш правильные страницы.</p>
<h2>Настройка nginx</h2>
<p><a href="http://leonid.shevtsov.me/08-06-2010/pereexali-so-slicehost-na-linode/">С недавних пор</a> я использую в качестве сервера <code>nginx</code>, поэтому буду рассказывать о нем. Ну или точнее, показывать его документированные настройки.</p>

<div class="wp_syntax"><div class="code"><pre class="nginx" style="font-family:monospace;"># убираем слеш из конца URL - его любят навешивать некоторые обозреватели
rewrite ^(.+)/$ $1 permanent;
&nbsp;
# запросы POST можно смело передавать прямо в Rails
if ($request_method !~ ^(GET|HEAD)$) {
  break;
}
&nbsp;
# эта директива запрещает прямой доступ к каталогу cache извне
location ^~ /cache {
  internal;
}
&nbsp;
# есть куки Authlogic - отключаем кеширование
if ($cookie_user_credentials) {
  break;
}
&nbsp;
# наконец, проверяем наличие страницы в кеше и отдаем ее оттуда
if (-f $document_root/cache/index.html) {
  rewrite ^/$ /cache/index.html last;
}
if (-f $document_root/cache/$request_uri) {
  rewrite .* /cache/$request_uri last;
}
if (-f $document_root/cache/$request_uri.html) {
  rewrite .* /cache/$request_uri.html last;
}</pre></div></div>

<p>Это все, что касается nginx. Наверно, надо заметить, что переместить папку с кешем из-под <code>document_root</code> не получится. Можно сделать симлинк, если очень хочется.</p>
<img src="http://feeds.feedburner.com/~r/leonidshevtsov/~4/Pe13QKOGfcc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://leonid.shevtsov.me/03-07-2010/page-caching-with-dynamic-elements-on-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Переехали со Slicehost на Linode</title>
		<link>http://leonid.shevtsov.me/08-06-2010/pereexali-so-slicehost-na-linode/</link>
		<comments>http://leonid.shevtsov.me/08-06-2010/pereexali-so-slicehost-na-linode/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 07:28:47 +0000</pubDate>
		<dc:creator>Леонид Шевцов</dc:creator>
				<category><![CDATA[Без рубрики]]></category>

		<guid isPermaLink="false">http://leonid.shevtsov.me/?p=826</guid>
		<description><![CDATA[Что ж, смену хостинга можно считать законченной, данные пересены, сервер настроен, домены уперты.
Чем плох Slicehost?
Год и десять месяцев назад я переехал с шаред-хостинга на Slicehost. Поскольку ничего толком о впсках я не знал, выбрал самых надежных и популярных. Линод был на втором месте, кстати.
Чем плох слайсхост? Slicehost прекрасен! Никаких к ним нареканий нет, ни по [...]]]></description>
			<content:encoded><![CDATA[<p>Что ж, смену хостинга можно считать законченной, данные пересены, сервер настроен, домены уперты.</p>
<h2>Чем плох Slicehost?</h2>
<p>Год и десять месяцев назад я <a href="http://leonid.shevtsov.me/17-08-2008/pereezzhaem/">переехал с шаред-хостинга на Slicehost</a>. Поскольку ничего толком о впсках я не знал, выбрал самых надежных и популярных. Линод был на втором месте, кстати.</p>
<p>Чем плох слайсхост? Slicehost прекрасен! Никаких к ним нареканий нет, ни по аптайму, ни по предоставляемым услугам. К тому же, они достаточно либеральны с оплатой, один раз даже на неделю разрешили задержаться. </p>
<p>Да вот <strong>пинг из Украины к датацентру Slicehost в Миссури составляет порядка 250 мс</strong>. Многовато.</p>
<h2>Почему Linode?</h2>
<p><a href="http://linode.com">Linode</a>, надо сказать, не менее респектабельный хостер, чем Slicehost.</p>
<p>У Linode недавно появился <strong>датацентр в Лондоне</strong>. Пинг до него около <strong>80 мс</strong> &#8211; не такой хороший, как у национальных хостеров, но вполне достаточный. Кроме этого, Линод позволяет <strong>переносить машину из одного датацентра в другой совершенно бесплатно и автоматически</strong> (чтобы сделать это на слайсхосте, нужно создавать еще одну машину в новом ДЦ и клонировать в нее старый диск).</p>
<p>У Linode <strong>процентов на 20 меньше цены</strong>.  Кроме того, Линод позволяет <strong>докупать ресурсы по отдельности</strong> &#8211; например, только память, что существенно для наших любимых рельсов.</p>
<p>У Linode очень <strong>удобный менеджер DNS</strong>. Например, создание типичной доменной записи (A + A для www и mail + 5 NS + MX) происходит автоматически. Кроме того, Линод позволяет автоматически переносить DNS-записи, но для этого исходный сервер должен поддерживать <a href="http://en.wikipedia.org/wiki/AXFR">AXFR</a>, Slicehost, например, этого сделать не дает.</p>
<p>Кстати, <a href="http://godaddy.com">GoDaddy</a> порадовали возможностью сменить NSы всем доменам сразу.</p>
<p>Еще Linode самостоятельно рисует графики загрузки процессора, диска и сети. Мелочь, а приятно.</p>
<p><strong>Резюмируя: если ты живешь в Украине и выбираешь VPS для своих проектов, если тебя не смущает отсутствие русскоязычной поддержки и ты не настаиваешь на расположении сервера в UA-IX, бери <a href="http://linode.com">Linode</a>.</strong> Будет хотя бы уверенность, что его не конфискуют вместе с соседями-порнографистами.</p>
<h2>Почему nginx?</h2>
<p>Я недавно настраивал другой VPS (кстати, на <a href="http://uh.ua">uh.ua</a>, тоже пока не расстраивают) для <a href="http://cargid.com.ua">CarGid</a>а, вот тогда и оценил, что <a href="http://nginx.org/">nginx</a> ест намного меньше памяти, чем апач. Это ну очень критично на впске. Настолько критично, что можно отказаться от привычек и лени и посмотреть в сторону этого замечательного сервера, о котором и без меня написано <a href="http://www.google.com/search?q=nginx+vs+apache">много хорошего</a>.</p>
<p>Если ты не в курсе, то <a href="http://www.modrails.com/">Passenger</a> поддерживает nginx, поэтому рельсы под ним поднимаются никак не сложнее, чем под апачем. И намного проще, чем PHP.</p>
<img src="http://feeds.feedburner.com/~r/leonidshevtsov/~4/7iFoGTbGVfA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://leonid.shevtsov.me/08-06-2010/pereexali-so-slicehost-na-linode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Time.now против Time.zone.now в Rails</title>
		<link>http://leonid.shevtsov.me/04-06-2010/time-now-vs-time-zone-now-in-rails/</link>
		<comments>http://leonid.shevtsov.me/04-06-2010/time-now-vs-time-zone-now-in-rails/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 16:20:58 +0000</pubDate>
		<dc:creator>Леонид Шевцов</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://leonid.shevtsov.me/?p=816</guid>
		<description><![CDATA[Функции Time.now и Time.zone.now в Ruby on Rails практически идентичны. Возвращают одни и те же значения, ведут себя одинаково. Из-за этого легко перепутать и использовать более короткую формулировку Time.now. А зря &#8211; по крайней мере, если ты используешь часовой пояс, отличный от UTC.
В чем же разница между этими функциями? А вот в чем:

>> Time.now.class
=> Time
>> [...]]]></description>
			<content:encoded><![CDATA[<p>Функции <code>Time.now</code> и <code>Time.zone.now</code> в Ruby on Rails практически идентичны. Возвращают одни и те же значения, ведут себя одинаково. Из-за этого легко перепутать и использовать более короткую формулировку <code>Time.now</code>. А зря &#8211; по крайней мере, если ты используешь часовой пояс, отличный от UTC.</p>
<p>В чем же разница между этими функциями? А вот в чем:</p>
<pre>
>> Time.now.class
=> Time
>> Time.now.to_s :db
=> "2010-06-04 19:00:00"
>> Time.zone.now.class
=> ActiveSupport::TimeWithZone
>> Time.zone.now.to_s :db
=> "2010-06-04 16:00:11"
</pre>
<p>Дело в том, что Rails, начиная с версии 2.1, хранят время в базе в UTC, а при сохранении и чтении переводят его из и в часовой пояс, используемый в приложении.</p>
<p>За перевод времени в UTC отвечает, как ни странно, метод <code>to_s(:db)</code>. Точнее странно то, что, хоть он и доступен у объекта типа <code>Time</code>, работает он неверно и отдает время в текущем часовом поясе. Если использовать <code>Time.now</code> в условиях запроса &#8211; они сместятся на определенное количество часов. Если записывать <code>Time.now</code> в базу &#8211; в базу запишется неправильное значение, потому что при чтении рельсы лишний раз добавят к нему смещение часового пояса.</p>
<p>Короче, наиболее простым и адекватным решением этой проблемы будет замена по всему проекту <code>Time.now</code> на <code>Time.zone.now</code>.</p>
<p>&#8230;А еще из-за это проблемы не стоит использовать в запросах функцию MySQL <code>NOW()</code> и аналогичные, поскольку они ничего не знают о настройках рельсов.</p>
<img src="http://feeds.feedburner.com/~r/leonidshevtsov/~4/5NKa4Vgyd7s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://leonid.shevtsov.me/04-06-2010/time-now-vs-time-zone-now-in-rails/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
