<?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>Wed, 07 Jul 2010 17:01:43 +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>Плагин для подсчета посещаемости страниц в 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>0</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>
		<item>
		<title>Перенос настроек из SSH в PuTTY</title>
		<link>http://leonid.shevtsov.me/03-06-2010/export-ssh-config-to-putty/</link>
		<comments>http://leonid.shevtsov.me/03-06-2010/export-ssh-config-to-putty/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 14:19:08 +0000</pubDate>
		<dc:creator>Леонид Шевцов</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://leonid.shevtsov.me/?p=803</guid>
		<description><![CDATA[С тех пор, как я вернулся с линукса на винду (а я вернулся), в SSH лазил исключительно через виртуалку. Лень было конфиг переносить в PuTTY, что довольно досадно, поскольку выходить в SSH прямо через PuTTY по ряду причин удобнее &#8211; например, можно настроить внешний вид и поведения терминала для каждого хоста, или быстро запускать сессии [...]]]></description>
			<content:encoded><![CDATA[<p>С тех пор, как я вернулся с линукса на винду (а я вернулся), в SSH лазил исключительно через виртуалку. Лень было конфиг переносить в PuTTY, что довольно досадно, поскольку выходить в SSH прямо через PuTTY по ряду причин удобнее &#8211; например, можно настроить внешний вид и поведения терминала для каждого хоста, или быстро запускать сессии с помощью <a href="http://code.google.com/p/putty-launchy-plugin/" target="_blank">PuTTY-плагина к Launchy</a>.</p>
<p>В общем, терпеть надоело, и я написал скрипт, создающий, на основании конфига в формате <a href="http://www.openbsd.org/cgi-bin/man.cgi?query=ssh_config&#038;sektion=5" target="_blank">ssh-config</a>,  reg-файл, который вгружается в реестр винды и добавляет в PuTTY все недостающие сессии.</p>
<p>Процедура такая:</p>
<ol>
<li>В линуксе нужны ruby и puttygen (<code>apt-get install putty-tools</code>).</li>
<li>По умолчанию скрипт скидывает ключи для PuTTY в <code>~/putty_keys</code> &#8211; такой каталог должен существовать. Кроме этого в скрипт нужно вписать правильный путь к каталогу винды, куда ты собираешься положить ключи для PuTTY.</li>
<li>Запускаем скрипт: <code>./ssh_to_putty.rb >putty.reg</code>. Вводим пароли к ключам, если будет спрашивать.</li>
<li>Получаем пачку (или не пачку) ключей для PuTTY и файл <code>putty.reg</code>. Первые копируем в соответствующую папку в винде, второй вгружаем в реестр.</li>
</ol>
<p>Кстати, перед тем, как будешь вгружать конфиг в реестр, убедись, что в Default Settings в PuTTY сохранены подходящие настройки внешнего вида &#8211; цвета, шрифт, все такое. Иначе придется потом для каждой сессии настраивать отдельно.<br />
<span id="more-803"></span></p>
<script src="http://gist.github.com/423893.js"></script>
<img src="http://feeds.feedburner.com/~r/leonidshevtsov/~4/Mle-I8Lrpg4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://leonid.shevtsov.me/03-06-2010/export-ssh-config-to-putty/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Отладка скриптов в Internet Explorer</title>
		<link>http://leonid.shevtsov.me/27-05-2010/internet-explorer-debugging-guide/</link>
		<comments>http://leonid.shevtsov.me/27-05-2010/internet-explorer-debugging-guide/#comments</comments>
		<pubDate>Thu, 27 May 2010 13:47:37 +0000</pubDate>
		<dc:creator>Леонид Шевцов</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://leonid.shevtsov.me/?p=772</guid>
		<description><![CDATA[Отладка сайтов под IE всегда была для меня пугающим занятием. Причем проблемы с версткой хотя бы можно отслеживать по внешнему виду сайта, а вот ошибки в скриптах IE показывает весьма эзотерически. 
Во-первых, где взять нужную версию Internet Explorer? Есть два пути &#8211; использовать мутантский набор движков типа IETester или IECollection, или развернуть несколько виртуальных машин [...]]]></description>
			<content:encoded><![CDATA[<p>Отладка сайтов под IE всегда была для меня пугающим занятием. Причем проблемы с версткой хотя бы можно отслеживать по внешнему виду сайта, а вот ошибки в скриптах IE показывает весьма эзотерически. </p>
<p>Во-первых, где взять нужную версию Internet Explorer? Есть два пути &#8211; использовать мутантский набор движков типа IETester или IECollection, или развернуть несколько виртуальных машин под каждую нужную версию Internet Explorer. Первый путь мне никогда не нравился, хотя бы из-за кучи проблем с совместимостью и потенциально неверного отображения сайтов в разных версиях.</p>
<p>Потому будем настраивать виртуалки. К счастью, достаточно настроить только первую &#8211; остальные можно наклонировать.</p>
<h2>Создаем виртуальные машины</h2>
<ol>
<li>Скачиваем и устанавливаем <a href="http://virtualbox.org" target="_blank">VirtualBox</a>.</li>
<li>Создаем виртуальную машину IE6. Ей нужен будет диск размером 2G и порядка 512 мегабайт памяти. Еще ей нужны будут два сетевых адаптера &#8211; NAT и Host-Only &#8211; первый послужит для выхода в интернет, второй &#8211; для связи с хостом (и, если сервер на другой виртуальной машине, с сервером).</li>
<li><a href="http://google.com/search?q=Windows+XP+Home+Edition+with+Service+Pack+3+torrent" target="_blank">Находим</a> образ Windows XP Home SP3. Замечу, что SP3 не обновляет IE6 до IE7 самостоятельно.</li>
<li>Убираем все лишнее из установки. Если места на диске не жалко, можно обойтись и без этого шага.
<ol>
<li>Распаковываем образ каким-нибудь <a href="http://www.7-zip.org/" target="_blank">7-zip</a>.</li>
<li>Скачиваем <a href="http://www.nliteos.com/" target="_blank">nLite</a> -инструмент для пересборки образов XP.</li>
<li>Скачиваем <a href="http://gist.github.com/415802" target="_blank">мой конфиг к nLite</a> &#8211; он вырежет из образа все, кроме необходимого.</li>
<li>Прогоняем распакованный образ через nLite, получаем ISO размером порядка 200 мегабайт.</li>
</ol>
</li>
<li>Подключаем образ к виртуалке, устанавливаем Windows &#8211; тут ничего особенного.</li>
<li>Подключаем к виртуалке образ VirtualBox Guest Additions, чтоб получить разделенный с хостом буфер обмена, курсор, возможность растягивать окно-экран виртуалки и т.п. удобства.</li>
<li>Ставим Adobe Flash Player, Java Runtime, Notepad++ для просмотра исходников.</li>
<li>По желанию ставим на виртуалку какой-нибудь CCleaner, чтоб поубирать мусор.</li>
<li>Базовая виртуалка готова. Можно ее выключить, а образ диска запаковать в архив и отложить &#8211; может, пригодится когда-нибудь.</li>
<li>Клонируем образ (обычным копированием тут не обойтись):

<div class="wp_syntax"><div class="code"><pre class="bat" style="font-family:monospace;">&quot;C:\Program Files\Sun\VirtualBox\VboxManage.exe&quot; clonevdi ie6.vdi ie7.vdi</pre></div></div>

</li>
<li>Создаем новую виртуалку, IE7, с теми же настройками, подключаем к ней склонированный образ. Рекомендую указать статический IP для Host-only соединения (в виртуалке это LAN Connection 2) &#8211; естественно, на каждой виртуалке разный. Помимо этого я в <code>c:\windows\system32\drivers\etc\hosts</code> указываю домен для сервера.</li>
<li>На виртуалку для IE7 скачиваем и устанавливаем IE7.</li>
<li>Готово!</li>
</ol>
<h2>Инструментарий</h2>
<p>Для адекватной отладки яваскрипта нужно установить <a href="http://www.microsoft.com/downloads/details.aspx?familyid=2f465be0-94fd-4569-b3c4-dffdf19ccd99&#038;displaylang=en" target="_blank">Script Debugger</a> (ну и пусть говорят, что он устарел &#8211; альтернатив нет), а потом <a href="http://www.my-debugbar.com/wiki/CompanionJS/HomePage" target="_blank">CompanionJS</a>. И еще отключаем Disable JS Debugging на вкладке Advanced настроек IE (хитрая такая опция). Получаем некое подобие Firebug.</p>
<p>Можно поставить и другие инструменты, хотя бы <a href="http://www.microsoft.com/downloads/details.aspx?familyid=e59c3964-672d-4511-bb3e-2d5e1db91038&#038;displaylang=en" target="_blank">IE Developer Toolbar</a> для отладки верстки.</p>
<p>Вот и все &#8211; имеем работающий IE, независимый от базовой ОС, с возможностью удобно отлаживать скрипты.</p>
<img src="http://feeds.feedburner.com/~r/leonidshevtsov/~4/SdEMSqhCqYw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://leonid.shevtsov.me/27-05-2010/internet-explorer-debugging-guide/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Как загрузить карты украинских городов в Ovi Maps 3</title>
		<link>http://leonid.shevtsov.me/24-05-2010/kak-zagruzit-karty-ukrainskix-gorodov-v-ovi-maps-3/</link>
		<comments>http://leonid.shevtsov.me/24-05-2010/kak-zagruzit-karty-ukrainskix-gorodov-v-ovi-maps-3/#comments</comments>
		<pubDate>Mon, 24 May 2010 17:38:27 +0000</pubDate>
		<dc:creator>Леонид Шевцов</dc:creator>
				<category><![CDATA[Без рубрики]]></category>

		<guid isPermaLink="false">http://leonid.shevtsov.me/?p=767</guid>
		<description><![CDATA[Нокия тут в Украине развернула масштабную кампанию по продвижению навигационных телефонов &#8211; на биллбордах, по телевизору, все такое. Захотелось посмотреть, что ж там за карты.
(Я последнее время на своей Nokia 5800 пользуюсь Мобильными Яндекс.Картами, поскольку их кеш можно скачать через компьютер и экономить потом трафик. Увы, МЯК не умеют прокладывать маршруты, да и к тому [...]]]></description>
			<content:encoded><![CDATA[<p>Нокия тут в Украине развернула масштабную кампанию по продвижению навигационных телефонов &#8211; на биллбордах, по телевизору, все такое. Захотелось посмотреть, что ж там за карты.</p>
<p>(Я последнее время на своей Nokia 5800 пользуюсь <a href="http://mobile.yandex.ru/maps/">Мобильными Яндекс.Картами</a>, поскольку <a href="http://ymm.sytes.net">их кеш можно скачать через компьютер</a> и экономить потом трафик. Увы, МЯК не умеют прокладывать маршруты, да и к тому же являются растровыми.)</p>
<p>Итак. Ovi Maps предустанавливаются на все свежие смартфоны от Nokia. <a href="http://maps.nokia.com/ovi-services-and-apps/ovi-maps/downloads-and-services">Свежую версию можно скачать с сайта Nokia</a>. Свежие карты можно скачать с помощью Ovi Suite.</p>
<p>&#8230;Прискорбно, но на картах Украины, которые скачиваются из Ovi Suite, есть только крупные дороги, даже Киев практически не детализирован.</p>
<p>Немного погуглив, я выяснил, что можно совершенно безвозмездно загрузить и другую версию карт &#8211; с городами. С помощью Nokia Map Loader. Вот только ссылки на этот самый Map Loader с сайта Нокии нет.<br />
Нашелся <a href="http://download.cnet.com/Nokia-Map-Loader/3000-20432_4-10972353.html">Nokia Map Loader</a> на CNET &#8211; очевидно, вполне себе официальная версия.</p>
<p>Map Loader загружает 70 мегабайт карт вместо тех 7, что загружает Ovi Suite &#8211; на них оказалась, помимо всего прочего, детальная карта Днепропетровска с возможностью прокладывать маршруты, как автомобильные, так и пешие.</p>
<img src="http://feeds.feedburner.com/~r/leonidshevtsov/~4/_M6WPwrUCi8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://leonid.shevtsov.me/24-05-2010/kak-zagruzit-karty-ukrainskix-gorodov-v-ovi-maps-3/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Список украинских городов для сайта</title>
		<link>http://leonid.shevtsov.me/23-04-2010/spisok-ukrainskix-gorodov-dlya-sajta/</link>
		<comments>http://leonid.shevtsov.me/23-04-2010/spisok-ukrainskix-gorodov-dlya-sajta/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 09:57:41 +0000</pubDate>
		<dc:creator>Леонид Шевцов</dc:creator>
				<category><![CDATA[data scraping]]></category>

		<guid isPermaLink="false">http://leonid.shevtsov.me/?p=746</guid>
		<description><![CDATA[Понадобился для одного проекта список украинских городов. Да так, чтобы по областям разбит и с географическими координатами. 
Адекватного списка в компьютерно-читабельном формате я не нашел, сделал свой на основании данных из Википедии. 
Вот он &#8211; список городов Украины. Тут города, разбитые по областям, и их координаты, в легко читаемом XML. Никаких дубликатов, никакого мусора.
P.S. В [...]]]></description>
			<content:encoded><![CDATA[<p>Понадобился для одного проекта список украинских городов. Да так, чтобы по областям разбит и с географическими координатами. </p>
<p>Адекватного списка в компьютерно-читабельном формате я не нашел, сделал свой на основании данных из <a href="http://ru.wikipedia.org/wiki/Города Украины">Википедии</a>. </p>
<p>Вот он &#8211; <a href='http://leonid.shevtsov.me/uploads/cities.xml_.gz'>список городов Украины</a>. Тут города, разбитые по областям, и их координаты, в легко читаемом XML. Никаких дубликатов, никакого мусора.</p>
<p>P.S. В украинской Википедии есть чуть более полный <a href="http://uk.wikipedia.org/wiki/%D0%9C%D1%96%D1%81%D1%82%D0%B0_%D0%A3%D0%BA%D1%80%D0%B0%D1%97%D0%BD%D0%B8_(%D0%B2_%D0%B0%D0%BB%D1%84%D0%B0%D0%B2%D1%96%D1%82%D0%BD%D0%BE%D0%BC%D1%83_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D1%83)">список городов</a>. Мне нужны были русские названия, поэтому недолго думая я взял русский список.</p>
<p><strong>[UPD 2010-05-28]</strong> в списке почему-то не было Киева. Добавил.</p>
<img src="http://feeds.feedburner.com/~r/leonidshevtsov/~4/7cBcI9O6sSQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://leonid.shevtsov.me/23-04-2010/spisok-ukrainskix-gorodov-dlya-sajta/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Как Hoptoad помогает на тестовом сервере</title>
		<link>http://leonid.shevtsov.me/26-03-2010/kak-hoptoad-pomogaet-na-testovom-servere/</link>
		<comments>http://leonid.shevtsov.me/26-03-2010/kak-hoptoad-pomogaet-na-testovom-servere/#comments</comments>
		<pubDate>Fri, 26 Mar 2010 15:52:49 +0000</pubDate>
		<dc:creator>Леонид Шевцов</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://leonid.shevtsov.me/?p=729</guid>
		<description><![CDATA[Итак, Hoptoad &#8211; это такая продвинутая штука для записывания исключений в Rails-приложениях. Его использование выливается в то, что каждое новое исключение логируется, а также при желании отправляется тебе на почту. Удобно.
Но речь не об этом, а о том, что Hoptoad можно использовать на отладочном сервере (назовем его staging) для упрощения работы тестера. Для этого нужно [...]]]></description>
			<content:encoded><![CDATA[<p>Итак, <a href="http://hoptoadapp.com/">Hoptoad</a> &#8211; это такая продвинутая штука для записывания исключений в Rails-приложениях. Его использование выливается в то, что каждое <em>новое</em> исключение логируется, а также при желании отправляется тебе на почту. Удобно.</p>
<p>Но речь не об этом, а о том, что Hoptoad можно использовать на отладочном сервере (назовем его staging) для упрощения работы тестера. Для этого нужно настроить его так, чтобы он ошибку и показывал, и отправлял в Hoptoad.</p>
<p>По умолчанию Hoptoad логирует ошибки только тогда, когда не показывает (<code>consider_all_requests_local = false</code>). Самый простой способ это изменить &#8211; переопределить метод в ApplicationController:</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#consider_all_requests_local должен быть true</span>
<span style="color:#9966CC; font-weight:bold;">class</span> ApplicationController <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActionController::Base</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> rescue_action_locally<span style="color:#006600; font-weight:bold;">&#40;</span>exception<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> Rails.<span style="color:#9900CC;">env</span> == <span style="color:#996600;">&quot;staging&quot;</span> <span style="color:#008000; font-style:italic;"># or something else</span>
      <span style="color:#9966CC; font-weight:bold;">unless</span> hoptoad_ignore_user_agent?
        HoptoadNotifier.<span style="color:#9900CC;">notify_or_ignore</span><span style="color:#006600; font-weight:bold;">&#40;</span>exception, hoptoad_request_data<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
      rescue_action_locally_with_hoptoad<span style="color:#006600; font-weight:bold;">&#40;</span>exception<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;">super</span><span style="color:#006600; font-weight:bold;">&#40;</span>exception<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>Результатом этого будет то, что ошибки с staging будут сыпаться в hoptoad и можно будет вместо неудобных скриншотов передавать ссылки на hoptoad (где также видно, сколько раз встречалась ошибка, когда последний раз и т.п.)</p>
<p>Чего не хватает? Ссылки на Hoptoad прямо со страницы ошибки, конечно!</p>
<p><em>UPD:</em> Чтоб появились ссылки, нужно стянуть с гитхаба <a href="http://gist.github.com/345349">патченный файл vendor/plugins/hoptoad_notifier/lib/templates/rescue.erb</a> и подложить в проект.</p>
<p>Теперь каждое сообщение об ошибке на staging будет сопровождаться вот такой вот красной ссылкой прямо на ошибку:</p>
<div align="center">
<img src="http://leonid.shevtsov.me/uploads/hoptoad_error.png" alt=" title="hoptoad error" width="724" height="114" class="alignnone size-full wp-image-733" style="padding:10px;border:solid 1px #ccc"/>
</div>
<img src="http://feeds.feedburner.com/~r/leonidshevtsov/~4/DnCDJ7-kZsc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://leonid.shevtsov.me/26-03-2010/kak-hoptoad-pomogaet-na-testovom-servere/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Делаем комментарии Хабрахабра похожими на Reddit</title>
		<link>http://leonid.shevtsov.me/05-03-2010/delaem-kommentarii-xabraxabra-poxozhimi-na-reddit/</link>
		<comments>http://leonid.shevtsov.me/05-03-2010/delaem-kommentarii-xabraxabra-poxozhimi-na-reddit/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 16:41:59 +0000</pubDate>
		<dc:creator>Леонид Шевцов</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://leonid.shevtsov.me/?p=718</guid>
		<description><![CDATA[Я последнее время практически не бываю на Хабре, зато часто захожу на Reddit. По-моему на последнем гораздо удобнее читать комментарии, в первую очередь потому, что их можно отсортировать по рейтингу и читать только
наиболее &#171;ценные&#187;.
Так вот. Сел и написал юзерскрипт, который делает просмотр комментариев на Хабре более удобным.

Комментарии сортируются по рейтингу (в пределах одного уровня).
Ветки комментариев [...]]]></description>
			<content:encoded><![CDATA[<p>Я последнее время практически не бываю на Хабре, зато часто захожу на Reddit. По-моему на последнем гораздо удобнее читать комментарии, в первую очередь потому, что их можно отсортировать по рейтингу и читать только<br />
наиболее &laquo;ценные&raquo;.</p>
<p>Так вот. Сел и написал юзерскрипт, который делает просмотр комментариев на Хабре более удобным.</p>
<ul>
<li>Комментарии сортируются по рейтингу (в пределах одного уровня).</li>
<li>Ветки комментариев можно сворачивать и разворачивать нажатием на ссылку [-] в заголовке коммента.</li>
<li>Ник автора подсвечивается синим и отмечается буквой [S].</li>
<li>Юзерпики убираются насовсем, чтоб не мельтешили.</li>
</ul>
<p><a href="http://userscripts.org/scripts/show/70582">Скачать Habrahabr &#8216;comments like reddit&#8217; mod  с UserScripts</a>.<br />
Проверено в Firefox 3.6 + Greasemonkey и в Chrome 5.</p>
<img src="http://feeds.feedburner.com/~r/leonidshevtsov/~4/lk8VFB7y7Ig" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://leonid.shevtsov.me/05-03-2010/delaem-kommentarii-xabraxabra-poxozhimi-na-reddit/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
