<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.antage.name/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

  <title><![CDATA[Uniвсячина]]></title>
  
  <link href="http://blog.antage.name/" />
  <updated>2011-10-20T04:38:13+04:00</updated>
  <id>http://blog.antage.name/</id>
  <author>
    <name>antage</name>
    
  </author>

  
  
  
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.antage.name/antage_blog" /><feedburner:info uri="antage_blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.antage.name%2Fantage_blog" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.antage.name%2Fantage_blog" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.antage.name%2Fantage_blog" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.antage.name%2Fantage_blog" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.antage.name%2Fantage_blog" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.antage.name%2Fantage_blog" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.antage.name%2Fantage_blog" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.antage.name%2Fantage_blog" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.antage.name%2Fantage_blog" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.antage.name%2Fantage_blog" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.antage.name%2Fantage_blog" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><entry>
    <title><![CDATA[Отсылка почты в Rails через sendmail]]></title>
    <link href="http://feeds.antage.name/~r/antage_blog/~3/AzcgBZaDDSQ/sendmail-in-rails.html" />
    <updated>2011-08-24T02:36:00+04:00</updated>
    <id>http://blog.antage.name/posts/sendmail-in-rails</id>
    <content type="html">&lt;p&gt;В Rails, &lt;code&gt;ActionMailer&lt;/code&gt; предлагает нам два метода для отправки электронной почты: smtp и sendmail.
Настройка метода отправки производится в &lt;code&gt;config.action_mailer.delivery_method&lt;/code&gt;.
Как следует из названий методов, отправка письма в &lt;abbr title="Mail Transfer Agent"&gt;MTA&lt;/abbr&gt; идёт либо через протокол &lt;abbr title="Simple Mail Transfer Protocol"&gt;SMTP&lt;/abbr&gt;, либо через вызов команды &lt;code&gt;sendmail&lt;/code&gt; на сервере.&lt;/p&gt;

&lt;p&gt;Если у вас включена отправка через sendmail и вы работает с Rails 3.x, есть тонкий момент.
&lt;!--more--&gt;
actionmailer версии &amp;gt;= 3.0 работает через гем &lt;code&gt;mail&lt;/code&gt;, а гем &lt;code&gt;mail&lt;/code&gt; отсылает письмо через sendmail, 
по умолчанию формируя такую команду:&lt;/p&gt;
&lt;pre&gt;&lt;code class="bash"&gt;sendmail -i -t destination1@example.com destination2@example.com ...&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ключ &lt;code&gt;-i&lt;/code&gt; означает, что текст письма будет читаться из потока stdin, пока не дойдет до символа конца файла (&lt;abbr title="End Of File"&gt;EOF&lt;/abbr&gt;).
Ключ &lt;code&gt;-t&lt;/code&gt; говорит, что адреса на которые будет отправляться письмо нужно взять из текста письма.
Вроде бы всё в порядке и всё должно работать как надо. 
Однако, давайте посмотрим, что пишут про ключ &lt;code&gt;-t&lt;/code&gt; в таком &lt;abbr title="Mail Transfer Agent"&gt;MTA&lt;/abbr&gt;, как &lt;a href="http://exim.org/"&gt;Exim&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;When Exim is receiving a locally-generated, non-&lt;abbr title="Simple Mail Transfer Protocol"&gt;SMTP&lt;/abbr&gt;  message
on its standard input, the &lt;code&gt;-t&lt;/code&gt; option causes the recipients of
the message to be obtained from the To:, Cc:, and Bcc: header
lines  in  the message instead of from the command arguments.
The addresses are extracted before any rewriting takes  place
and the Bcc: header line, if present, is then removed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;If  the  command has any arguments, they specify addresses to
which the message is &lt;strong&gt;not&lt;/strong&gt; to be delivered. That is, the  argument
addresses are &lt;strong&gt;removed&lt;/strong&gt; from the recipients list obtained
from the headers. This is compatible  with  Smail  3  and  in
accordance  with the documented behaviour of several versions
of Sendmail, as described in man pages on a number of operating
systems  (e.g.  Solaris 8, IRIX 6.5, HP-UX 11). However,
some versions of Sendmail add  argument  addresses  to  those
obtained  from  the  headers,  and the O’Reilly Sendmail book
documents it that way. Exim  can  be  made  to  add  argument
addresses  instead  of subtracting them by setting the option
&lt;code&gt;extract_addresses_remove_arguments&lt;/code&gt; false.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Пишут тут, что любые аргументы команды трактуются, как адреса, которые будут &lt;strong&gt;удалены&lt;/strong&gt; из
списка адресов взятых в самом письме.
А так как гем &lt;code&gt;mail&lt;/code&gt; передает команде &lt;code&gt;sendmail&lt;/code&gt; те же самые адреса, что и в самом письме, мы получаем
пустой список адресов. И закономерно получаем отлуп, нижеприведенного вида:&lt;/p&gt;
&lt;pre&gt;&lt;code class="text"&gt;Subject: Mail failure - no recipient addresses

A message that you sent using the -t command line option contained no
addresses that were not also on the command line, and were therefore
suppressed. This left no recipient addresses, and so no delivery could
be attempted.&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Самое просто решение в этой ситуации — убрать ключ &lt;code&gt;-t&lt;/code&gt; из команды &lt;code&gt;sendmail&lt;/code&gt;.
Пишем в &lt;code&gt;config/environments/production.rb&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="ruby"&gt;....
  config.action_mailer.sendmail_settings = { :arguments =&amp;gt; &amp;quot;-i&amp;quot; }
....&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Делаем для себя вывод: либо используем ключ &lt;code&gt;-t&lt;/code&gt;, либо передаем список адресов, как аргументы команде &lt;code&gt;sendmail&lt;/code&gt;, но ни в коем случае не делаем это одновременно.&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/antage_blog/~4/AzcgBZaDDSQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.antage.name/posts/sendmail-in-rails.html</feedburner:origLink></entry>
  
  
  
  
  <entry>
    <title><![CDATA[Кэш-заглушка для ActiveSupport]]></title>
    <link href="http://feeds.antage.name/~r/antage_blog/~3/xGr0nByx9So/dummy-cache.html" />
    <updated>2011-08-19T13:04:00+04:00</updated>
    <id>http://blog.antage.name/posts/dummy-cache</id>
    <content type="html">&lt;p&gt;Я уже &lt;a href="http://blog.antage.name/posts/как-отключить-кэш-при-тестировании-rails-п.html"&gt;писал&lt;/a&gt; как-то, что при тестировании rails-приложений, нужно очень внимательно следить за кэшем.
Опция &lt;code&gt;config.perform_caching = false&lt;/code&gt; работает только для &lt;code&gt;caches_action&lt;/code&gt; в контроллерах и &lt;code&gt;cache&lt;/code&gt; в шаблонах. 
Любые обращения к &lt;code&gt;Rails.cache&lt;/code&gt; продолжают работать, потому что по умолчанию там живет &lt;code&gt;AS::C::MemoryStore&lt;/code&gt;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;Конечно мы можем в &lt;code&gt;#setup&lt;/code&gt; (TestUnit) или в &lt;code&gt;#before(:each)&lt;/code&gt; (RSpec) каждый раз вызывать &lt;code&gt;Rails.cache.clear&lt;/code&gt;.
Но согласитесь, далеко не в каждом тесте это нужно, а гадать, где используется кэш, а где нет — это неудобно.&lt;/p&gt;

&lt;p&gt;Похожая проблема возникает не только в тестах, но и в режиме разработки. Вы изменяете код, но в кэш уже записаны данные старым кодом и нужно производить разные нетривиальные действия, чтобы кэш сбросить.&lt;/p&gt;

&lt;!--more--&gt;

&lt;p&gt;Специально, чтобы можно было легко отключать кэш в окружениях development и test, я сделал гем &lt;a href="https://github.com/antage/dummy-cache"&gt;dummy-cache&lt;/a&gt;.
Работает только для &lt;em&gt;rails&lt;/em&gt; &amp;gt;= 3.0 (если точнее, то для &lt;em&gt;activesupport&lt;/em&gt; &amp;gt;= 3.0).&lt;/p&gt;

&lt;p&gt;Добавляем гем в &lt;code&gt;Gemfile&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code class="ruby"&gt;gem &amp;quot;dummy-cache&amp;quot;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;И прописываем в &lt;code&gt;config/environments/development.rb&lt;/code&gt; или &lt;code&gt;config/environments/test.rb&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code class="ruby"&gt;...
config.cache_store = :dummy_store
...&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;И можете быть уверенны, что &lt;code&gt;Rails.cache&lt;/code&gt; больше ничего кэшировать не будет.&lt;/p&gt;

&lt;div class="footnotes"&gt;
  &lt;ol&gt;
    &lt;li id="fn:1"&gt;
      &lt;p&gt;ActiveSupport::Cache::MemoryStore&lt;a href="#fnref:1" rev="footnote"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/antage_blog/~4/xGr0nByx9So" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.antage.name/posts/dummy-cache.html</feedburner:origLink></entry>
  
  
  
  
  <entry>
    <title><![CDATA[Wordpress &rarr; Octopress]]></title>
    <link href="http://feeds.antage.name/~r/antage_blog/~3/0dcQ9BU_MAc/wordpress-to-octopress.html" />
    <updated>2011-08-17T22:34:00+04:00</updated>
    <id>http://blog.antage.name/posts/wordpress-to-octopress</id>
    <content type="html">&lt;p&gt;Решил переехать с &lt;a href="http://wordpress.org"&gt;Wordpress&lt;/a&gt; на &lt;a href="http://octopress.org"&gt;Octopress&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Причины подобного шага вполне понятны:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Я хочу редактировать посты в нормальном редакторе, а не в убогом web-интерфейсе.&lt;/li&gt;
  &lt;li&gt;Мне надоело каждый раз обновлять сам Wordpress и десяток его плагинов каждую неделю.&lt;/li&gt;
  &lt;li&gt;Мне очень понравилась тема оформления Octopress: она минималистична, но функциональна и легко расширяема.
А ещё блог теперь можно читать на смартфонах. Попробуйте прямо сейчас сузить ваш браузер до 300-400 пикселей в ширину.&lt;/li&gt;
  &lt;li&gt;В Octopress есть красивая подсветка синтаксиса кода из коробки (через &lt;a href="http://pygments.org/"&gt;pygments&lt;/a&gt;).&lt;/li&gt;
  &lt;li&gt;Octopress/&lt;a href="http://jekyllrb.com/"&gt;Jekyll&lt;/a&gt; написан на ruby, а значит легко и приятно хакается.&lt;/li&gt;
  &lt;li&gt;Мне не надо держать больше на сервере PHP/MySQL/Apache 2!!!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Минус платформы Octopress/Jekyll только один — отсутствие динамического контента.
Однако, современный уровень развития javascript легко компенсирует этот недостаток.
Например, комментарии у меня теперь будут реализованы с помощью &lt;a href="http://disqus.com"&gt;Disqus&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/antage_blog/~4/0dcQ9BU_MAc" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.antage.name/posts/wordpress-to-octopress.html</feedburner:origLink></entry>
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
</feed>

