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

<channel>
	<title>по стопам webkill&#039;а &#187; ruby &amp; ruby on rails</title>
	<atom:link href="http://blog.lukmus.ru/category/ruby-on-rails/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.lukmus.ru</link>
	<description>это наш химический дом для печальных жителей Земли</description>
	<lastBuildDate>Sat, 21 Oct 2023 19:10:13 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>backup с PGP шифрованием</title>
		<link>http://blog.lukmus.ru/2021/03/23/gpg-backup/</link>
		<comments>http://blog.lukmus.ru/2021/03/23/gpg-backup/#comments</comments>
		<pubDate>Tue, 23 Mar 2021 18:12:03 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[настройка и установка]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[gpg]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=2685</guid>
		<description><![CDATA[В продолжение постов про GPG и о геме Backup собираю все в одну статью и дополняю настройкой для автоматического шифрования резервных копий. утилита GPG Установка, естественно, от пользователя с root-правами. На RedHat&#8217;ах: yum install pgp На Debian&#8217;ах: apt-get install pgp Для создания ключей все та же команда, выполнять которую можно от рядового пользователя. gpg --gen-key [...]]]></description>
			<content:encoded><![CDATA[<p>В продолжение постов <a href="https://blog.lukmus.ru/2010/10/29/gnupg-v-linux/">про GPG</a> и <a href="https://blog.lukmus.ru/2014/01/10/backup-na-yandeks-disk/">о геме Backup</a> собираю все в одну статью и дополняю настройкой для автоматического шифрования резервных копий.<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2021/03/huge-encryption-517.png" alt="" /><span id="more-2685"></span></p>
<h2>утилита GPG</h2>
<p>Установка, естественно, от пользователя с root-правами.<br />
На RedHat&#8217;ах:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">yum install</span> pgp</pre></td></tr></table></div>

<p>На Debian&#8217;ах:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">apt-get install</span> pgp</pre></td></tr></table></div>

<p>Для создания ключей все та же команда, выполнять которую можно от рядового пользователя.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--gen-key</span></pre></td></tr></table></div>

<p>Далее понадобится экспорт ключей в текстовый файл. В командах ниже <code>username@email</code>, разумеется, надо заменить на почту указанную при генерации.</p>
<p>Экспорт публичного ключа:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--output</span> public.pgp <span style="color: #660033;">--armor</span> <span style="color: #660033;">--export</span> username<span style="color: #000000; font-weight: bold;">@</span>email</pre></td></tr></table></div>

<p>Экспорт закрытого (приватного) ключа:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--output</span> private.pgp <span style="color: #660033;">--armor</span> <span style="color: #660033;">--export-secret-key</span> username<span style="color: #000000; font-weight: bold;">@</span>email</pre></td></tr></table></div>

<p>Если требуется, после экспорта ключей их можно удалить. Сначала удаляется закрытый ключ:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--delete-secret-keys</span> username<span style="color: #000000; font-weight: bold;">@</span>email</pre></td></tr></table></div>

<p>Затем открытый:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--delete-keys</span> username<span style="color: #000000; font-weight: bold;">@</span>email</pre></td></tr></table></div>

<p>Вывести список всех импортированных ключей:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--list-keys</span></pre></td></tr></table></div>

<h2>gem backup и PGP-ключ</h2>
<p>Установка гема:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">gem <span style="color: #c20cb9; font-weight: bold;">install</span> backup</pre></td></tr></table></div>

<p>Cоздание модели (в данном примере модель называется <code>ekzample</code>) для бекапа:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">backup generate:model <span style="color: #660033;">--trigger</span> ekzample
Generated model file: <span style="color: #ff0000;">'~/Backup/models/ekzample.rb'</span>.</pre></td></tr></table></div>

<p>Далее, для настройки нужного бекапа, следует отредактировать <code>~/Backup/models/ekzample.rb</code>.</p>
<p>В примере ниже показан конфиг для резервного копирования базы MySQL с последующим сжатием в tar и шифрованием архива PGP-ключом, после чего зашифрованный файл отправляется по SFTP на бекап-сервер.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># encoding: utf-8</span>
&nbsp;
<span style="color:#008000; font-style:italic;">##</span>
<span style="color:#008000; font-style:italic;"># Backup Generated: ekzample</span>
<span style="color:#008000; font-style:italic;"># Once configured, you can run the backup with the following command:</span>
<span style="color:#008000; font-style:italic;">#</span>
<span style="color:#008000; font-style:italic;"># $ backup perform -t ekzample [-c &lt;path_to_configuration_file&gt;]</span>
<span style="color:#008000; font-style:italic;">#</span>
<span style="color:#008000; font-style:italic;"># For more information about Backup's components, see the documentation at:</span>
<span style="color:#008000; font-style:italic;"># http://backup.github.io/backup</span>
<span style="color:#008000; font-style:italic;">#</span>
Model.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:ekzample</span>, <span style="color:#996600;">'Description for ekzample'</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
&nbsp;
  split_into_chunks_of <span style="color:#006666;">500</span>
&nbsp;
  <span style="color:#6666ff; font-weight:bold;">Encryptor::GPG</span>.<span style="color:#9900CC;">defaults</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>encryption<span style="color:#006600; font-weight:bold;">|</span>
    encryption.<span style="color:#9900CC;">keys</span> = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
    encryption.<span style="color:#9900CC;">keys</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'username@email'</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#006600; font-weight:bold;">&lt;&lt;-</span>KEY
      <span style="color:#006600; font-weight:bold;">-----</span><span style="color:#9966CC; font-weight:bold;">BEGIN</span> PGP PUBLIC KEY BLOCK<span style="color:#006600; font-weight:bold;">-----</span>
      ...<span style="color:#9900CC;">it</span> is place <span style="color:#9966CC; font-weight:bold;">for</span> PUBLIC KEY...
      <span style="color:#006600; font-weight:bold;">-----</span><span style="color:#9966CC; font-weight:bold;">END</span> PGP PUBLIC KEY BLOCK<span style="color:#006600; font-weight:bold;">----</span>
    KEY
    encryption.<span style="color:#9900CC;">recipients</span> = <span style="color:#996600;">'username@email'</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  database MySQL <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>db<span style="color:#006600; font-weight:bold;">|</span>
    db.<span style="color:#9900CC;">name</span>  = <span style="color:#996600;">'exampledb'</span>
    db.<span style="color:#9900CC;">username</span> = <span style="color:#996600;">'exampleuser'</span>
    db.<span style="color:#9900CC;">password</span> = <span style="color:#996600;">'examplepass'</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  compress_with Gzip
  encrypt_with GPG
&nbsp;
  store_with SFTP <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>server<span style="color:#006600; font-weight:bold;">|</span>
    server.<span style="color:#9900CC;">username</span> = <span style="color:#996600;">'backupuser'</span>
    server.<span style="color:#9900CC;">password</span> = <span style="color:#996600;">'backuppass'</span>
    server.<span style="color:#9900CC;">ip</span>       = <span style="color:#996600;">'111.111.111.111'</span>
    server.<span style="color:#9900CC;">port</span>     = <span style="color:#006666;">22</span>
    server.<span style="color:#9900CC;">path</span>     = <span style="color:#996600;">'~/'</span>
    <span style="color:#008000; font-style:italic;"># Use a number or a Time object to specify how many backups to keep.</span>
    server.<span style="color:#9900CC;">keep</span>     = <span style="color:#006666;">150</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># Additional options for the SSH connection.</span>
    <span style="color:#008000; font-style:italic;"># server.ssh_options = {}</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Не стоит забывать вставить между <code><<-KEY</code> и <code>KEY</code> созданный ранее ПУБЛИЧНЫЙ (открытый) ключ.</p>
<p>Для более тонкой настройки PGP-ключей, например, разные ключи для разных баз, следует воспользоваться <a href="https://backup.github.io/backup/v4/encryptor-gpg/" target="_blank" rel='nofollow'>официальной документацией</a>.</p>
<p>Запускается создание бекапа командой:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">backup perform <span style="color: #660033;">-t</span> ekzample</pre></td></tr></table></div>

<h2>извлечение бекапа</h2>
<p>Если в системе нет ключей, используемых данным бекапом, следует их импортировать:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">--import</span> private.pgp
gpg <span style="color: #660033;">--import</span> public.gpg</pre></td></tr></table></div>

<p>Далее чтобы расшифровать резервную копию понадобится команда:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">gpg <span style="color: #660033;">-o</span> ekzample.tar <span style="color: #660033;">-d</span> ekzample.tar.gpg</pre></td></tr></table></div>

<p>Для распаковки тарбола подойдет команда:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xvf</span> ekzample.tar</pre></td></tr></table></div>

<p><meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2021/03/huge-encryption-517.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2021/03/23/gpg-backup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mechanize через SOCKS5 или парсим Tor</title>
		<link>http://blog.lukmus.ru/2016/03/05/mechanize-socks/</link>
		<comments>http://blog.lukmus.ru/2016/03/05/mechanize-socks/#comments</comments>
		<pubDate>Sat, 05 Mar 2016 17:54:48 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[mechanize]]></category>
		<category><![CDATA[socks5]]></category>
		<category><![CDATA[tor]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=2400</guid>
		<description><![CDATA[Незаменимый для парсинга гем Mechanize, эмулирующий браузер, по умолчанию поддерживает только обычные прокси. Широкой общественности известен факт, что для подключения к Tor-сайтам используется SOCKS5, который организуется через Privoxy. Этот пост повествует как заставить Mechanize подключиться к Tor-сайтам. Обычный запрос Mechanize&#8217;а через прокси имеет вид что-то типа: 1 2 3 browser = Mechanize.new browser.agent.set_proxy&#40;host,port&#41; page=browser.get 'http://lukmus.ru' [...]]]></description>
			<content:encoded><![CDATA[<p>Незаменимый для парсинга гем <a href="https://github.com/sparklemotion/mechanize" rel="nofollow" target="_blank">Mechanize</a>, эмулирующий браузер, по умолчанию поддерживает только обычные прокси. Широкой общественности известен факт, что для подключения к Tor-сайтам используется SOCKS5, который организуется через <a href="http://blog.lukmus.ru/2013/03/16/ustanovka-torprivoxy-na-centos-6/">Privoxy</a>. Этот пост повествует как заставить Mechanize подключиться к Tor-сайтам.<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2016/03/m1000x1000.jpg" alt="" /><span id="more-2400"></span><br />
Обычный запрос Mechanize&#8217;а через прокси имеет вид что-то типа:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">browser = Mechanize.<span style="color:#9900CC;">new</span>
browser.<span style="color:#9900CC;">agent</span>.<span style="color:#9900CC;">set_proxy</span><span style="color:#006600; font-weight:bold;">&#40;</span>host,port<span style="color:#006600; font-weight:bold;">&#41;</span>
page=browser.<span style="color:#9900CC;">get</span> <span style="color:#996600;">'http://lukmus.ru'</span></pre></td></tr></table></div>

<p>Жизнь была бы проще если бы мы могли заменить метод <code>set_proxy</code> класса <code>Mechanize::HTTP::Agent</code> на аналогичный <code>set_socks</code>, но такого метода в этом классе нет. Однако его можно дописать самому, например вот так:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;socksify&quot;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'socksify/http'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#6666ff; font-weight:bold;">Faraday::Adapter::NetHttp</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> net_http_class<span style="color:#006600; font-weight:bold;">&#40;</span>env<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> proxy = env<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:request</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:proxy</span><span style="color:#006600; font-weight:bold;">&#93;</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> proxy<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:uri</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">scheme</span> == <span style="color:#996600;">'socks'</span>
        <span style="color:#6666ff; font-weight:bold;">Net::HTTP::SOCKSProxy</span><span style="color:#006600; font-weight:bold;">&#40;</span>proxy<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:uri</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">host</span>, proxy<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:uri</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">port</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        <span style="color:#6666ff; font-weight:bold;">Net::HTTP::Proxy</span><span style="color:#006600; font-weight:bold;">&#40;</span>proxy<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:uri</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">host</span>, proxy<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:uri</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">port</span>, proxy<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:user</span><span style="color:#006600; font-weight:bold;">&#93;</span>, proxy<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:password</span><span style="color:#006600; font-weight:bold;">&#93;</span><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;">else</span>
      <span style="color:#6666ff; font-weight:bold;">Net::HTTP</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#6666ff; font-weight:bold;">Mechanize::HTTP::Agent</span>
&nbsp;
  public
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> set_socks addr, port
    set_http <span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#0066ff; font-weight:bold;">@http</span>
    <span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#0066ff; font-weight:bold;">@http</span>
      attr_accessor <span style="color:#ff3333; font-weight:bold;">:socks_addr</span>, <span style="color:#ff3333; font-weight:bold;">:socks_port</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> http_class
        <span style="color:#6666ff; font-weight:bold;">Net::HTTP</span>.<span style="color:#9900CC;">SOCKSProxy</span><span style="color:#006600; font-weight:bold;">&#40;</span>socks_addr, socks_port<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>
    <span style="color:#0066ff; font-weight:bold;">@http</span>.<span style="color:#9900CC;">socks_addr</span> = addr
    <span style="color:#0066ff; font-weight:bold;">@http</span>.<span style="color:#9900CC;">socks_port</span> = port
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Как подключать файлы, с содержанием подобному выше, к Rails-приложению каждый знает и без меня.<br />
<meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2016/03/m1000x1000.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2016/03/05/mechanize-socks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>собственный способ отправки сообщений в ActionMailer</title>
		<link>http://blog.lukmus.ru/2014/08/22/add_delivery_method/</link>
		<comments>http://blog.lukmus.ru/2014/08/22/add_delivery_method/#comments</comments>
		<pubDate>Fri, 22 Aug 2014 03:03:39 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[ActionMailer]]></category>
		<category><![CDATA[ruby on rails 4]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=2195</guid>
		<description><![CDATA[Не типичная ситуация, но вполне реальная. Заголовок не очень доходчиво объясняет то, что я тут изложу. Предположим, вы используете Devise и хотите заместо E-mail, которая по умолчанию является обязательным полем для пользователя, а также с помощью протокола SMTP которой происходит восстановление пароля и прочие фенечки, воспользоваться жаббером. Короче говоря, после уточнений в офисе, ситуация такова: [...]]]></description>
			<content:encoded><![CDATA[<p>Не типичная ситуация, но вполне реальная. Заголовок не очень доходчиво объясняет то, что я тут изложу. Предположим, вы используете Devise и хотите заместо E-mail, которая по умолчанию является обязательным полем для пользователя, а также с помощью протокола SMTP которой происходит восстановление пароля и прочие фенечки, воспользоваться жаббером.<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2014/08/pYVHBrs3T60.jpg" alt="" title="ActionMailer is simple with Jen Psaki" width="517" height="435" class="alignnone size-full wp-image-2197" /><span id="more-2195"></span><br />
Короче говоря, <del datetime="2014-08-22T01:20:09+00:00">после уточнений в офисе</del>, ситуация такова: необходимо подменить способ отправки всех писем в Rails-приложений. Если обычно используется SMTP и сообщения являются обычными e-mail письмами, то тут будет рассматриваться случай когда письма являются сообщениями другого рода, например жаббер-сообщениями, а за место SMTP будет, соответственно, XMPP. Подменяться будут не какие-то отдельные сообщения в отдельно взятом экшене отдельного контроллера, а во всем приложении и сразу.</p>
<p>По началу я, будучи наивным юнцом, не знал, что в Rails предусмотрена возможность введения своего протокола отправки, и подумывал сделать так: с помощью <a href="https://github.com/aarongough/mini-smtp-server" rel='nofollow' target='_blank'>mini-smtp-server</a>, который бы я встроил в rake-фаил и на который бы настроил приложение, поднять SMTP-сервер, в котором уже и устроить подмену SMTP на нужный мне способ. Но судьба сложилась иначе и звезды указали мне путь на <code>ActionMailer::Base.add_delivery_method</code>.</p>
<p>Основу для данной инструкции я украл <a href="http://codedecoder.wordpress.com/2014/02/10/email-through-api-override-action_mailer-deliver/" rel='nofollow' target='_blank'>отсюда</a>, однако от приведенной в посте инструкции ваша радость была бы неполной <del datetime="2014-08-22T01:20:09+00:00">без горького шоколада &#8220;Россия&#8221;</del>, т.к. досконально выполнив все что там сказано, можно наблюдать:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">$ rails c
Loading development environment <span style="color:#006600; font-weight:bold;">&#40;</span>Rails 4.0.0<span style="color:#006600; font-weight:bold;">&#41;</span>
2.0.0p247 :001 <span style="color:#006600; font-weight:bold;">&gt;</span> User.<span style="color:#9900CC;">first</span>.<span style="color:#9900CC;">send_reset_password_instructions</span>
  User <span style="color:#CC0066; font-weight:bold;">Load</span> <span style="color:#006600; font-weight:bold;">&#40;</span>29.6ms<span style="color:#006600; font-weight:bold;">&#41;</span>  <span style="color:#CC0066; font-weight:bold;">SELECT</span> <span style="color:#996600;">`users`</span>.<span style="color:#006600; font-weight:bold;">*</span> FROM <span style="color:#996600;">`users`</span> ORDER BY <span style="color:#996600;">`users`</span>.<span style="color:#996600;">`id`</span> ASC LIMIT <span style="color:#006666;">1</span>
  User <span style="color:#CC0066; font-weight:bold;">Load</span> <span style="color:#006600; font-weight:bold;">&#40;</span>74.5ms<span style="color:#006600; font-weight:bold;">&#41;</span>  <span style="color:#CC0066; font-weight:bold;">SELECT</span> <span style="color:#996600;">`users`</span>.<span style="color:#006600; font-weight:bold;">*</span> FROM <span style="color:#996600;">`users`</span> WHERE <span style="color:#996600;">`users`</span>.<span style="color:#996600;">`reset_password_token`</span> = <span style="color:#996600;">'59c1c232f95e7a96c4ac735b8fd899b5d993b07f7261a9551c68280ceb443577'</span> LIMIT <span style="color:#006666;">1</span>
   <span style="color:#006600; font-weight:bold;">&#40;</span>0.2ms<span style="color:#006600; font-weight:bold;">&#41;</span>  <span style="color:#9966CC; font-weight:bold;">BEGIN</span>
  SQL <span style="color:#006600; font-weight:bold;">&#40;</span>101.3ms<span style="color:#006600; font-weight:bold;">&#41;</span>  UPDATE <span style="color:#996600;">`users`</span> SET <span style="color:#996600;">`reset_password_token`</span> = <span style="color:#996600;">'59c1c232f95e7a96c4ac735b8fd899b5d993b07f7261a9551c68280ceb443577'</span>, <span style="color:#996600;">`reset_password_sent_at`</span> = <span style="color:#996600;">'2014-08-22 02:18:36'</span>, <span style="color:#996600;">`updated_at`</span> = <span style="color:#996600;">'2014-08-22 02:18:36'</span> WHERE <span style="color:#996600;">`users`</span>.<span style="color:#996600;">`id`</span> = <span style="color:#006666;">1</span>
   <span style="color:#006600; font-weight:bold;">&#40;</span>297.8ms<span style="color:#006600; font-weight:bold;">&#41;</span>  COMMIT
<span style="color:#CC00FF; font-weight:bold;">ArgumentError</span>: wrong number of arguments <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1</span> <span style="color:#9966CC; font-weight:bold;">for</span> <span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        from <span style="color:#006600; font-weight:bold;">/</span>usr<span style="color:#006600; font-weight:bold;">/</span>local<span style="color:#006600; font-weight:bold;">/</span>rvm<span style="color:#006600; font-weight:bold;">/</span>gems<span style="color:#006600; font-weight:bold;">/</span>ruby<span style="color:#006600; font-weight:bold;">-</span>2.0.0<span style="color:#006600; font-weight:bold;">-</span>p247<span style="color:#006600; font-weight:bold;">/</span>gems<span style="color:#006600; font-weight:bold;">/</span>mail<span style="color:#006600; font-weight:bold;">-</span>2.5.4<span style="color:#006600; font-weight:bold;">/</span>lib<span style="color:#006600; font-weight:bold;">/</span>mail<span style="color:#006600; font-weight:bold;">/</span>message.<span style="color:#9900CC;">rb</span>:<span style="color:#006666;">257</span>:<span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#996600;">`initialize'
        from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/mail-2.5.4/lib/mail/message.rb:257:in `</span>new<span style="color:#996600;">'
        from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/mail-2.5.4/lib/mail/message.rb:257:in `delivery_method'</span>
        from <span style="color:#006600; font-weight:bold;">/</span>usr<span style="color:#006600; font-weight:bold;">/</span>local<span style="color:#006600; font-weight:bold;">/</span>rvm<span style="color:#006600; font-weight:bold;">/</span>gems<span style="color:#006600; font-weight:bold;">/</span>ruby<span style="color:#006600; font-weight:bold;">-</span>2.0.0<span style="color:#006600; font-weight:bold;">-</span>p247<span style="color:#006600; font-weight:bold;">/</span>gems<span style="color:#006600; font-weight:bold;">/</span>actionmailer<span style="color:#006600; font-weight:bold;">-</span>4.0.0<span style="color:#006600; font-weight:bold;">/</span>lib<span style="color:#006600; font-weight:bold;">/</span>action_mailer<span style="color:#006600; font-weight:bold;">/</span>delivery_methods.<span style="color:#9900CC;">rb</span>:<span style="color:#006666;">66</span>:<span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#996600;">`wrap_delivery_behavior'
        from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/actionmailer-4.0.0/lib/action_mailer/delivery_methods.rb:80:in `</span>wrap_delivery_behavior!<span style="color:#996600;">'
        from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/actionmailer-4.0.0/lib/action_mailer/base.rb:684:in `mail'</span>
        from <span style="color:#006600; font-weight:bold;">/</span>usr<span style="color:#006600; font-weight:bold;">/</span>local<span style="color:#006600; font-weight:bold;">/</span>rvm<span style="color:#006600; font-weight:bold;">/</span>gems<span style="color:#006600; font-weight:bold;">/</span>ruby<span style="color:#006600; font-weight:bold;">-</span>2.0.0<span style="color:#006600; font-weight:bold;">-</span>p247<span style="color:#006600; font-weight:bold;">/</span>gems<span style="color:#006600; font-weight:bold;">/</span>devise<span style="color:#006600; font-weight:bold;">-</span>3.1.1<span style="color:#006600; font-weight:bold;">/</span>lib<span style="color:#006600; font-weight:bold;">/</span>devise<span style="color:#006600; font-weight:bold;">/</span>mailers<span style="color:#006600; font-weight:bold;">/</span>helpers.<span style="color:#9900CC;">rb</span>:<span style="color:#006666;">16</span>:<span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#996600;">`devise_mail'
        from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/devise-3.1.1/app/mailers/devise/mailer.rb:11:in `</span>reset_password_instructions<span style="color:#996600;">'
        from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/actionpack-4.0.0/lib/abstract_controller/base.rb:189:in `process_action'</span>
        from <span style="color:#006600; font-weight:bold;">/</span>usr<span style="color:#006600; font-weight:bold;">/</span>local<span style="color:#006600; font-weight:bold;">/</span>rvm<span style="color:#006600; font-weight:bold;">/</span>gems<span style="color:#006600; font-weight:bold;">/</span>ruby<span style="color:#006600; font-weight:bold;">-</span>2.0.0<span style="color:#006600; font-weight:bold;">-</span>p247<span style="color:#006600; font-weight:bold;">/</span>gems<span style="color:#006600; font-weight:bold;">/</span>actionpack<span style="color:#006600; font-weight:bold;">-</span>4.0.0<span style="color:#006600; font-weight:bold;">/</span>lib<span style="color:#006600; font-weight:bold;">/</span>abstract_controller<span style="color:#006600; font-weight:bold;">/</span>callbacks.<span style="color:#9900CC;">rb</span>:<span style="color:#006666;">18</span>:<span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#996600;">`block in process_action'
        from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.0/lib/active_support/callbacks.rb:373:in `</span>_run__3933474617966347476__process_action__callbacks<span style="color:#996600;">'
        from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.0/lib/active_support/callbacks.rb:80:in `run_callbacks'</span>
        from <span style="color:#006600; font-weight:bold;">/</span>usr<span style="color:#006600; font-weight:bold;">/</span>local<span style="color:#006600; font-weight:bold;">/</span>rvm<span style="color:#006600; font-weight:bold;">/</span>gems<span style="color:#006600; font-weight:bold;">/</span>ruby<span style="color:#006600; font-weight:bold;">-</span>2.0.0<span style="color:#006600; font-weight:bold;">-</span>p247<span style="color:#006600; font-weight:bold;">/</span>gems<span style="color:#006600; font-weight:bold;">/</span>actionpack<span style="color:#006600; font-weight:bold;">-</span>4.0.0<span style="color:#006600; font-weight:bold;">/</span>lib<span style="color:#006600; font-weight:bold;">/</span>abstract_controller<span style="color:#006600; font-weight:bold;">/</span>callbacks.<span style="color:#9900CC;">rb</span>:<span style="color:#006666;">17</span>:<span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#996600;">`process_action'
        from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/actionpack-4.0.0/lib/abstract_controller/base.rb:136:in `</span>process<span style="color:#996600;">'
        from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/actionpack-4.0.0/lib/abstract_controller/rendering.rb:44:in `process'</span>
        from <span style="color:#006600; font-weight:bold;">/</span>usr<span style="color:#006600; font-weight:bold;">/</span>local<span style="color:#006600; font-weight:bold;">/</span>rvm<span style="color:#006600; font-weight:bold;">/</span>gems<span style="color:#006600; font-weight:bold;">/</span>ruby<span style="color:#006600; font-weight:bold;">-</span>2.0.0<span style="color:#006600; font-weight:bold;">-</span>p247<span style="color:#006600; font-weight:bold;">/</span>gems<span style="color:#006600; font-weight:bold;">/</span>actionmailer<span style="color:#006600; font-weight:bold;">-</span>4.0.0<span style="color:#006600; font-weight:bold;">/</span>lib<span style="color:#006600; font-weight:bold;">/</span>action_mailer<span style="color:#006600; font-weight:bold;">/</span>base.<span style="color:#9900CC;">rb</span>:<span style="color:#006666;">503</span>:<span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#996600;">`process'
        from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/actionmailer-4.0.0/lib/action_mailer/base.rb:497:in `</span>initialize<span style="color:#996600;">'
        from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/actionmailer-4.0.0/lib/action_mailer/base.rb:480:in `new'</span>
        from <span style="color:#006600; font-weight:bold;">/</span>usr<span style="color:#006600; font-weight:bold;">/</span>local<span style="color:#006600; font-weight:bold;">/</span>rvm<span style="color:#006600; font-weight:bold;">/</span>gems<span style="color:#006600; font-weight:bold;">/</span>ruby<span style="color:#006600; font-weight:bold;">-</span>2.0.0<span style="color:#006600; font-weight:bold;">-</span>p247<span style="color:#006600; font-weight:bold;">/</span>gems<span style="color:#006600; font-weight:bold;">/</span>actionmailer<span style="color:#006600; font-weight:bold;">-</span>4.0.0<span style="color:#006600; font-weight:bold;">/</span>lib<span style="color:#006600; font-weight:bold;">/</span>action_mailer<span style="color:#006600; font-weight:bold;">/</span>base.<span style="color:#9900CC;">rb</span>:<span style="color:#006666;">480</span>:<span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#996600;">`method_missing'
        from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/devise-3.1.1/lib/devise/models/authenticatable.rb:175:in `</span>send_devise_notification<span style="color:#996600;">'
        from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/devise-3.1.1/lib/devise/models/recoverable.rb:54:in `send_reset_password_instructions'</span>
        from <span style="color:#006600; font-weight:bold;">&#40;</span>irb<span style="color:#006600; font-weight:bold;">&#41;</span>:<span style="color:#006666;">1</span>
        from <span style="color:#006600; font-weight:bold;">/</span>usr<span style="color:#006600; font-weight:bold;">/</span>local<span style="color:#006600; font-weight:bold;">/</span>rvm<span style="color:#006600; font-weight:bold;">/</span>gems<span style="color:#006600; font-weight:bold;">/</span>ruby<span style="color:#006600; font-weight:bold;">-</span>2.0.0<span style="color:#006600; font-weight:bold;">-</span>p247<span style="color:#006600; font-weight:bold;">/</span>gems<span style="color:#006600; font-weight:bold;">/</span>railties<span style="color:#006600; font-weight:bold;">-</span>4.0.0<span style="color:#006600; font-weight:bold;">/</span>lib<span style="color:#006600; font-weight:bold;">/</span>rails<span style="color:#006600; font-weight:bold;">/</span>commands<span style="color:#006600; font-weight:bold;">/</span>console.<span style="color:#9900CC;">rb</span>:<span style="color:#006666;">90</span>:<span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#996600;">`start'
        from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in `</span>start<span style="color:#996600;">'
        from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands.rb:64:in `&lt;top (required)&gt;'</span>
        from bin<span style="color:#006600; font-weight:bold;">/</span>rails:<span style="color:#006666;">4</span>:<span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#996600;">`require'
        from bin/rails:4:in `</span><span style="color:#006600; font-weight:bold;">&lt;</span>main<span style="color:#006600; font-weight:bold;">&gt;</span><span style="color:#996600;">'2.0.0p247 :002 &gt;</span></pre></td></tr></table></div>

<p>Поэтому я перескажу все от начала и до конца с учетом поправки косяка, который не заметил Arun Kumar Singh (так зовут перца, который ведет этот codedecoder.wordpress.com), при этом мой новый способ отправки будет XMPP.</p>
<h3>свой класс со способом отправки</h3>
<p>Создаем файл <code>lib/xmpp_delivery.rb</code> с классом, который будет содержать новый способ доставки.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> XMPPDelivery
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>opts=<span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@settings</span>=opts
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> deliver!<span style="color:#006600; font-weight:bold;">&#40;</span>message<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#008000; font-style:italic;">#тут как бы горы кода по отправки сообщений в жабу</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> xmpp.<span style="color:#9900CC;">deliver</span>!<span style="color:#006600; font-weight:bold;">&#40;</span>@settings<span style="color:#006600; font-weight:bold;">&#41;</span>
        <span style="color:#CC0066; font-weight:bold;">p</span> message
        <span style="color:#0000FF; font-weight:bold;">true</span>
      <span style="color:#9966CC; font-weight:bold;">else</span> <span style="color:#0000FF; font-weight:bold;">false</span> <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Ошибка Codedecoder&#8217;а исправляется уже на этом этапе &#8211; он забыл копипастнуть в листинг приведенного им модуля, метод <code>initialize</code> с одним обязательным параметром, который указывается в <code>/usr/local/rvm/gems/ruby-2.0.0-p247/gems/mail-2.5.4/lib/mail/message.rb:257</code>.</p>
<h3>подключение нового класса</h3>
<p>Далее в config/environment.rb необходимо подключить созданный файл:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># Load the Rails application.</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">expand_path</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'../application'</span>, <span style="color:#0000FF; font-weight:bold;">__FILE__</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'xmpp_delivery.rb'</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Initialize the Rails application.</span>
<span style="color:#6666ff; font-weight:bold;">PsakiSpeechCreator::Application</span>.<span style="color:#9900CC;">initialize</span>!</pre></td></tr></table></div>

<h3>объявление нового способа</h3>
<p>Теперь надо добавить инициатор <code>config/initializers/mailer.rb</code>, в котором будет торжественно объявляться новый способ:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#6666ff; font-weight:bold;">ActionMailer::Base</span>.<span style="color:#9900CC;">add_delivery_method</span> <span style="color:#ff3333; font-weight:bold;">:xmpp</span>, XMPPDelivery</pre></td></tr></table></div>

<h3>настройка на новый способ</h3>
<p>И в конце, в настройках нужной среды (например в <code>config/environments/development.rb</code>), указать способ как основной:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">...
  <span style="color:#9900CC;">config</span>.<span style="color:#9900CC;">action_mailer</span>.<span style="color:#9900CC;">default_url_options</span> = <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:host</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'localhost'</span><span style="color:#006600; font-weight:bold;">&#125;</span>
  config.<span style="color:#9900CC;">action_mailer</span>.<span style="color:#9900CC;">delivery_method</span> = <span style="color:#ff3333; font-weight:bold;">:xmpp</span>
...</pre></td></tr></table></div>

<p>А если кому-то серьезно надоел e-mail в Devise и он хочет сделать отправку в жабу, то вам пригодится гем xmpp4r-simple, ошибки которого были замечены <a href="http://blog.lukmus.ru/2011/08/12/xmpp4rxmpp4r-simple-uchim-russkomu/">тут</a> и <a href="http://blog.lukmus.ru/2011/08/12/xmpp4r-simple-na-ruby-1-9-2/">тут</a>.</p>
<p><meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2014/08/pYVHBrs3T60.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2014/08/22/add_delivery_method/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Backup на Яндекс.Диск</title>
		<link>http://blog.lukmus.ru/2014/01/10/backup-na-yandeks-disk/</link>
		<comments>http://blog.lukmus.ru/2014/01/10/backup-na-yandeks-disk/#comments</comments>
		<pubDate>Fri, 10 Jan 2014 01:54:06 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[настройка и установка]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[Яндекс.Диск]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=2134</guid>
		<description><![CDATA[Для того чтобы сливать бэкапы на сторонний сервер или в локальную директорию уже давным давно можно не писать самопальные скрипты, а воспользоваться гемом Backup. И то, что это гем и написан он на Ruby, совершенно не означает, что организовывать бэкапы он может только для Ruby. Backup много чего умеет делать, работает с двумя вагонами СУБД [...]]]></description>
			<content:encoded><![CDATA[<p>Для того чтобы сливать бэкапы на сторонний сервер или в локальную директорию уже давным давно можно не писать самопальные скрипты, а воспользоваться <a href="http://meskyanichi.github.io/backup/v4/" rel="nofollow" target="_blank">гемом Backup</a>. И то, что это гем и написан он на Ruby, совершенно не означает, что организовывать бэкапы он может только для Ruby.<br />
<img class="alignnone size-full wp-image-2135" title="backup" src="http://blog.lukmus.ru/wp-content/uploads/2014/01/back-up.png" alt="" width="517" height="356" /><span id="more-2134"></span><br />
Backup много чего умеет делать, работает с двумя вагонами СУБД (MySQL, PostgreSQL, MongoDB итд), может закачивать сами бэкапы на триллионы различных площадок (Dropbox, CloudFiles, S3 итд) используя килотонны всевозможных протоколов (SFTP, FTP, SCP итд), подробнее об этом давно уже <a href="http://habrahabr.ru/post/123401/" rel="nofollow" target="_blank">расписано на Хабре</a>. Одна беда у гема: он не поддерживает протокол WebDAV и площадку Яндекс.Диск. Ну, а почему собственно необходим Яндекс.Диск и чем он лучше всех остальных можно узнать перейдя по <a title="http://disk.yandex.ru/invite/?hash=TDPUYYYP" href="http://disk.yandex.ru/invite/?hash=TDPUYYYP" rel="nofollow" target="_blank">моей партнерской ссылке</a> (новый шедевр скрытой рекламы).</p>
<h2>установка backup</h2>
<p>Тут ничего нового, все тоже самое, что и в <a href="http://meskyanichi.github.io/backup/v4/installation/" rel="nofollow" target="_blank">официальной инструкции</a>.<br />
Сама установка:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;"># </span>gem <span style="color: #c20cb9; font-weight: bold;">install</span> backup</pre></td></tr></table></div>

<p>Генерация конфига:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">$ backup generate:model <span style="color: #660033;">--trigger</span> my_backup
Generated model file: <span style="color: #ff0000;">'~/Backup/models/my_backup.rb'</span>.</pre></td></tr></table></div>

<p>В результате этих манипуляций возникнет директория <code>~/Backup</code> с какой-то лабудой в <code>~/Backup/config.rb</code> и собственно с конфигом одной из задач в <code>~/Backup/models/my_backup.rb</code>.</p>
<h2>интерфейс для Яндекс.Диска</h2>
<p>Управлять ЯДом можно как через API, так и напрямую через WebDAV. Для взаимодействия по WebDAV есть <a href="https://github.com/search?l=Ruby&amp;q=webdav&amp;ref=cmdform&amp;type=Repositories" rel="nofollow" target="_blank">отдельные специальные гемы</a>, но нормально закачать что-нибудь вряд ли удастся т.к. для авторизации по WebDAV придется использовать пару логин:пароль, в то время как ЯД позволяет загружать только при авторизации по ключу приложения, насколько я понял.</p>
<p>К счастью существует <a href="https://github.com/anjlab/yandex-disk" rel="nofollow" target="_blank">гем yandex-disk</a>, через который и будут заливаться бэкапы.</p>
<p>После установки гема:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;"># </span>gem <span style="color: #c20cb9; font-weight: bold;">install</span> yandex-disk</pre></td></tr></table></div>

<p>чтобы иметь права не только на чтение, необходимо получить токен от Яндекса. Для этого надо:</p>
<ol>
<li>авторизоваться в Яндексе</li>
<li><a href="https://oauth.yandex.ru/client/my" rel="nofollow" target="_blank">выбрать имеющееся приложение или создать новое</a></li>
<li>получить токен пройдя по ссылке: https://oauth.yandex.ru/authorize?response_type=token&amp;client_id=YOUR_APP_ID</li>
</ol>
<h2>настройка backup под Яндекс.Диск</h2>
<p>Удивительно, но на странице гема yandex-disk в самом низу приведен конфиг модели под backup, лично для себя, я приведу указанную конфигурацию к mysql-евскому виду:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># encoding: utf-8</span>
&nbsp;
<span style="color:#008000; font-style:italic;">##</span>
<span style="color:#008000; font-style:italic;"># Backup Generated: my_backup</span>
<span style="color:#008000; font-style:italic;"># Once configured, you can run the backup with the following command:</span>
<span style="color:#008000; font-style:italic;">#</span>
<span style="color:#008000; font-style:italic;"># $ backup perform -t my_backup [-c ]</span>
<span style="color:#008000; font-style:italic;">#</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'yandex/disk/backup/storage'</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">Backup::Model</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:my_backup</span>, <span style="color:#996600;">'My backup DB to Yandex.Disk'</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#008000; font-style:italic;">##</span>
  <span style="color:#008000; font-style:italic;"># Split [Splitter]</span>
  <span style="color:#008000; font-style:italic;">#</span>
  <span style="color:#008000; font-style:italic;"># Split the backup file in to chunks of 250 megabytes</span>
  <span style="color:#008000; font-style:italic;"># if the backup file size exceeds 250 megabytes</span>
  <span style="color:#008000; font-style:italic;">#</span>
  split_into_chunks_of <span style="color:#006666;">500</span>
&nbsp;
  database MySQL <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>db<span style="color:#006600; font-weight:bold;">|</span>
    db.<span style="color:#9900CC;">name</span>  = <span style="color:#996600;">'mydb'</span>
    db.<span style="color:#9900CC;">username</span> = <span style="color:#996600;">'myuser'</span>
    db.<span style="color:#9900CC;">password</span> = <span style="color:#996600;">'mypass'</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  compress_with Gzip
&nbsp;
  store_with <span style="color:#6666ff; font-weight:bold;">Yandex::Disk</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>disk<span style="color:#006600; font-weight:bold;">|</span>
    disk.<span style="color:#9900CC;">access_token</span> = <span style="color:#996600;">'mysupersecretyandexapptoken'</span>
    disk.<span style="color:#9900CC;">path</span>         = <span style="color:#996600;">'/backups/'</span>
    disk.<span style="color:#9900CC;">keep</span> = <span style="color:#006666;">5</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<h2>запуск</h2>
<p>И вот казалось бы все готово, осталось только запустить backup:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">$ backup perform <span style="color: #660033;">-t</span> my_backup
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Performing Backup <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #ff0000;">'My backup DB to Yandex.Disk (my_backup)'</span><span style="color: #000000; font-weight: bold;">!</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> backup 3.4.0 : ruby 2.0.0p247 <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2013</span>-06-<span style="color: #000000;">27</span> revision <span style="color: #000000;">41674</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>x86_64-linux<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Database::MySQL Started...
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Using Compressor::Gzip <span style="color: #000000; font-weight: bold;">for</span> compression.
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span>   Command: <span style="color: #ff0000;">'/bin/gzip'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span>   Ext: <span style="color: #ff0000;">'.gz'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Database::MySQL Finished<span style="color: #000000; font-weight: bold;">!</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Packaging the backup files...
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Splitter configured with a chunk <span style="color: #c20cb9; font-weight: bold;">size</span> of 500MB.
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Packaging Complete<span style="color: #000000; font-weight: bold;">!</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Cleaning up the temporary files...
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Yandex::Disk Started...
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>error<span style="color: #7a0874; font-weight: bold;">&#93;</span> ModelError: Backup <span style="color: #000000; font-weight: bold;">for</span> Backup OA DB to Yandex.Disk <span style="color: #7a0874; font-weight: bold;">&#40;</span>oabackup<span style="color: #7a0874; font-weight: bold;">&#41;</span> Failed<span style="color: #000000; font-weight: bold;">!</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>error<span style="color: #7a0874; font-weight: bold;">&#93;</span>   An Error occured <span style="color: #c20cb9; font-weight: bold;">which</span> has caused this Backup to abort before completion.
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>error<span style="color: #7a0874; font-weight: bold;">&#93;</span>   Reason: NoMethodError
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>error<span style="color: #7a0874; font-weight: bold;">&#93;</span>   undefined method <span style="color: #000000; font-weight: bold;">`</span>present?<span style="color: #ff0000;">' for &quot;mysupersecretyandexapptoken&quot;:String
[2014/01/08 18:53:06][error] 
[2014/01/08 18:53:06][error] Backtrace:
[2014/01/08 18:53:06][error]   /usr/local/rvm/gems/ruby-2.0.0-p247/gems/yandex-disk-0.0.5/lib/yandex/disk/client.rb:17:in `block in initialize'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>error<span style="color: #7a0874; font-weight: bold;">&#93;</span>   <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-2.0.0-p247<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>faraday-0.8.8<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>faraday<span style="color: #000000; font-weight: bold;">/</span>connection.rb:<span style="color: #000000;">65</span>:in <span style="color: #000000; font-weight: bold;">`</span>initialize<span style="color: #ff0000;">'
[2014/01/08 18:53:06][error]   /usr/local/rvm/gems/ruby-2.0.0-p247/gems/faraday-0.8.8/lib/faraday.rb:11:in `new'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>error<span style="color: #7a0874; font-weight: bold;">&#93;</span>   <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-2.0.0-p247<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>faraday-0.8.8<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>faraday.rb:<span style="color: #000000;">11</span>:in <span style="color: #000000; font-weight: bold;">`</span>new<span style="color: #ff0000;">'
[2014/01/08 18:53:06][error]   /usr/local/rvm/gems/ruby-2.0.0-p247/gems/yandex-disk-0.0.5/lib/yandex/disk/client.rb:16:in `initialize'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>error<span style="color: #7a0874; font-weight: bold;">&#93;</span>   <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-2.0.0-p247<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>yandex-disk-0.0.5<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>yandex<span style="color: #000000; font-weight: bold;">/</span>disk<span style="color: #000000; font-weight: bold;">/</span>backup<span style="color: #000000; font-weight: bold;">/</span>storage.rb:<span style="color: #000000;">18</span>:in <span style="color: #000000; font-weight: bold;">`</span>new<span style="color: #ff0000;">'
[2014/01/08 18:53:06][error]   /usr/local/rvm/gems/ruby-2.0.0-p247/gems/yandex-disk-0.0.5/lib/yandex/disk/backup/storage.rb:18:in `connection'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>error<span style="color: #7a0874; font-weight: bold;">&#93;</span>   <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-2.0.0-p247<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>yandex-disk-0.0.5<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>yandex<span style="color: #000000; font-weight: bold;">/</span>disk<span style="color: #000000; font-weight: bold;">/</span>backup<span style="color: #000000; font-weight: bold;">/</span>storage.rb:<span style="color: #000000;">22</span>:in <span style="color: #000000; font-weight: bold;">`</span>transfer<span style="color: #000000; font-weight: bold;">!</span><span style="color: #ff0000;">'
[2014/01/08 18:53:06][error]   /usr/local/rvm/gems/ruby-2.0.0-p247/gems/backup-3.4.0/lib/backup/storage/base.rb:34:in `perform!'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>error<span style="color: #7a0874; font-weight: bold;">&#93;</span>   <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-2.0.0-p247<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>backup-3.4.0<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>backup<span style="color: #000000; font-weight: bold;">/</span>model.rb:<span style="color: #000000;">242</span>:in <span style="color: #000000; font-weight: bold;">`</span>each<span style="color: #ff0000;">'
[2014/01/08 18:53:06][error]   /usr/local/rvm/gems/ruby-2.0.0-p247/gems/backup-3.4.0/lib/backup/model.rb:242:in `block in perform!'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>error<span style="color: #7a0874; font-weight: bold;">&#93;</span>   <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-2.0.0-p247<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>backup-3.4.0<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>backup<span style="color: #000000; font-weight: bold;">/</span>model.rb:<span style="color: #000000;">240</span>:in <span style="color: #000000; font-weight: bold;">`</span>each<span style="color: #ff0000;">'
[2014/01/08 18:53:06][error]   /usr/local/rvm/gems/ruby-2.0.0-p247/gems/backup-3.4.0/lib/backup/model.rb:240:in `perform!'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>error<span style="color: #7a0874; font-weight: bold;">&#93;</span>   <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-2.0.0-p247<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>backup-3.4.0<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>backup<span style="color: #000000; font-weight: bold;">/</span>cli.rb:<span style="color: #000000;">163</span>:in <span style="color: #000000; font-weight: bold;">`</span>block <span style="color: #000000; font-weight: bold;">in</span> perform<span style="color: #ff0000;">'
[2014/01/08 18:53:06][error]   /usr/local/rvm/gems/ruby-2.0.0-p247/gems/backup-3.4.0/lib/backup/cli.rb:162:in `each'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>error<span style="color: #7a0874; font-weight: bold;">&#93;</span>   <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-2.0.0-p247<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>backup-3.4.0<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>backup<span style="color: #000000; font-weight: bold;">/</span>cli.rb:<span style="color: #000000;">162</span>:in <span style="color: #000000; font-weight: bold;">`</span>perform<span style="color: #ff0000;">'
[2014/01/08 18:53:06][error]   /usr/local/rvm/gems/ruby-2.0.0-p247/gems/thor-0.18.1/lib/thor/command.rb:27:in `run'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>error<span style="color: #7a0874; font-weight: bold;">&#93;</span>   <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-2.0.0-p247<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>thor-0.18.1<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>thor<span style="color: #000000; font-weight: bold;">/</span>invocation.rb:<span style="color: #000000;">120</span>:in <span style="color: #000000; font-weight: bold;">`</span>invoke_command<span style="color: #ff0000;">'
[2014/01/08 18:53:06][error]   /usr/local/rvm/gems/ruby-2.0.0-p247/gems/thor-0.18.1/lib/thor.rb:363:in `dispatch'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>error<span style="color: #7a0874; font-weight: bold;">&#93;</span>   <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-2.0.0-p247<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>thor-0.18.1<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>thor<span style="color: #000000; font-weight: bold;">/</span>base.rb:<span style="color: #000000;">439</span>:in <span style="color: #000000; font-weight: bold;">`</span>start<span style="color: #ff0000;">'
[2014/01/08 18:53:06][error]   /usr/local/rvm/gems/ruby-2.0.0-p247/gems/backup-3.4.0/bin/backup:5:in `&lt;top (required)&gt;'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>error<span style="color: #7a0874; font-weight: bold;">&#93;</span>   <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-2.0.0-p247<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>backup:<span style="color: #000000;">23</span>:in <span style="color: #000000; font-weight: bold;">`</span>load<span style="color: #ff0000;">'
[2014/01/08 18:53:06][error]   /usr/local/rvm/gems/ruby-2.0.0-p247/bin/backup:23:in `&lt;main&gt;'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>error<span style="color: #7a0874; font-weight: bold;">&#93;</span>   <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-2.0.0-p247<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>ruby_executable_hooks:<span style="color: #000000;">15</span>:in <span style="color: #000000; font-weight: bold;">`</span><span style="color: #7a0874; font-weight: bold;">eval</span><span style="color: #ff0000;">'
[2014/01/08 18:53:06][error]   /usr/local/rvm/gems/ruby-2.0.0-p247/bin/ruby_executable_hooks:15:in `&lt;main&gt;'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span> CleanerError: Cleanup Warning
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span>   The temporary backup folder <span style="color: #ff0000;">'~/Backup/.tmp'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span>   appears to contain the backup files <span style="color: #c20cb9; font-weight: bold;">which</span> were to be stored:
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span>  ~<span style="color: #000000; font-weight: bold;">/</span>Backup<span style="color: #000000; font-weight: bold;">/</span>.tmp<span style="color: #000000; font-weight: bold;">/</span>my_backup.tar
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span>   
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span>   Make sure you check these files before the next scheduled backup <span style="color: #000000; font-weight: bold;">for</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span>   <span style="color: #ff0000;">'My backup DB to Yandex.Disk (my_backup)'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span>   These files will be removed at that <span style="color: #000000; font-weight: bold;">time</span><span style="color: #000000; font-weight: bold;">!</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> ModelError: If you have other Backup <span style="color: #7a0874; font-weight: bold;">jobs</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>triggers<span style="color: #7a0874; font-weight: bold;">&#41;</span> configured to run,
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span>   Backup will now attempt to continue...</pre></td></tr></table></div>

<p>И, как уже догадался проницательный читатель, бэкап не залился на ЯД, но не стоит расстраиваться. Пристально и с презрением посмотрите на строки:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">18</span>:<span style="color: #000000;">53</span>:06<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>error<span style="color: #7a0874; font-weight: bold;">&#93;</span>   undefined method <span style="color: #000000; font-weight: bold;">`</span>present?<span style="color: #ff0000;">' for &quot;mysupersecretyandexapptoken&quot;:String
[2014/01/08 18:53:06][error] 
[2014/01/08 18:53:06][error] Backtrace:
[2014/01/08 18:53:06][error]   /usr/local/rvm/gems/ruby-2.0.0-p247/gems/yandex-disk-0.0.5/lib/yandex/disk/client.rb:17:in `block in initialize'</span></pre></td></tr></table></div>

<p>и откройте файл <code>/usr/local/rvm/gems/ruby-2.0.0-p247/gems/yandex-disk-0.0.5/lib/yandex/disk/client.rb</code>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># coding: utf-8</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'base64'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'faraday'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'faraday_middleware'</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">Faraday::Connection::METHODS</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#ff3333; font-weight:bold;">:propfind</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">module</span> Yandex
  <span style="color:#9966CC; font-weight:bold;">module</span> Disk
    <span style="color:#9966CC; font-weight:bold;">class</span> Client
      <span style="color:#CC0066; font-weight:bold;">autoload</span> <span style="color:#ff3333; font-weight:bold;">:Request</span>, <span style="color:#996600;">'yandex/disk/client/request'</span>
&nbsp;
      <span style="color:#9966CC; font-weight:bold;">def</span> initialize options=<span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
        <span style="color:#0066ff; font-weight:bold;">@timeout</span> = options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:timeout</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">||</span> <span style="color:#006666;">300</span>
        <span style="color:#0066ff; font-weight:bold;">@http</span> = Faraday.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:url</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'https://webdav.yandex.ru'</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>builder<span style="color:#006600; font-weight:bold;">|</span>
          <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:access_token</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">present</span>?
            builder.<span style="color:#9900CC;">request</span> <span style="color:#ff3333; font-weight:bold;">:authorization</span>, <span style="color:#996600;">&quot;OAuth&quot;</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:access_token</span><span style="color:#006600; font-weight:bold;">&#93;</span>
          <span style="color:#9966CC; font-weight:bold;">else</span>
            basic_token = <span style="color:#CC00FF; font-weight:bold;">Base64</span>.<span style="color:#9900CC;">encode64</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;#{options[:login]}:#{options[:password]}&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            builder.<span style="color:#9900CC;">request</span> <span style="color:#ff3333; font-weight:bold;">:authorization</span>, <span style="color:#996600;">&quot;Basic&quot;</span>, basic_token
          <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
          builder.<span style="color:#9900CC;">response</span> <span style="color:#ff3333; font-weight:bold;">:follow_redirects</span>
&nbsp;
          <span style="color:#9966CC; font-weight:bold;">if</span> faraday_configurator = options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:faraday_configurator</span><span style="color:#006600; font-weight:bold;">&#93;</span>
            faraday_configurator.<span style="color:#9900CC;">call</span><span style="color:#006600; font-weight:bold;">&#40;</span>builder<span style="color:#006600; font-weight:bold;">&#41;</span>
          <span style="color:#9966CC; font-weight:bold;">else</span>
            builder.<span style="color:#9900CC;">adapter</span> <span style="color:#ff3333; font-weight:bold;">:excon</span>
          <span style="color:#9966CC; font-weight:bold;">end</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
...</pre></td></tr></table></div>

<p>По неизвестным науке обстоятельствам ошибка возникает при вызове метода <code>present?</code> для String-элемента в хэше. Наивный читатель может предложить заменить</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:access_token</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">present</span>?</pre></td></tr></table></div>

<p>на</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">unless</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:access_token</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">blank</span>?</pre></td></tr></table></div>

<p>но спешу заметить, что такая рокировка вызовет аналогичную ошибку, поэтому в данном случае я предлагаю строку №17 привести к виду:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>16
17
18
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">        <span style="color:#0066ff; font-weight:bold;">@http</span> = Faraday.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:url</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'https://webdav.yandex.ru'</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>builder<span style="color:#006600; font-weight:bold;">|</span>
          <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:access_token</span><span style="color:#006600; font-weight:bold;">&#93;</span>
            builder.<span style="color:#9900CC;">request</span> <span style="color:#ff3333; font-weight:bold;">:authorization</span>, <span style="color:#996600;">&quot;OAuth&quot;</span>, options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:access_token</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></td></tr></table></div>

<p>После такой магии у меня все запустилось:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">$ backup perform <span style="color: #660033;">-t</span> my_backup
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:03<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Performing Backup <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #ff0000;">'My backup DB to Yandex.Disk (my_backup)'</span><span style="color: #000000; font-weight: bold;">!</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:03<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> backup 3.4.0 : ruby 2.0.0p247 <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2013</span>-06-<span style="color: #000000;">27</span> revision <span style="color: #000000;">41674</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>x86_64-linux<span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span> CleanerError: Cleanup Warning
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span>   The temporary backup folder <span style="color: #ff0000;">'~/Backup/.tmp'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span>   appears to contain the package files from the previous backup<span style="color: #000000; font-weight: bold;">!</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span>   ~<span style="color: #000000; font-weight: bold;">/</span>Backup<span style="color: #000000; font-weight: bold;">/</span>.tmp<span style="color: #000000; font-weight: bold;">/</span>my_backup.tar
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span>   These files will now be removed.
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span>   
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span>   Please check the log <span style="color: #000000; font-weight: bold;">for</span> messages and<span style="color: #000000; font-weight: bold;">/</span>or your notifications
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span>   concerning this backup: <span style="color: #ff0000;">'My backup DB to Yandex.Disk (my_backup)'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span>   The temporary files <span style="color: #c20cb9; font-weight: bold;">which</span> had to be removed should not have existed.
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Database::MySQL Started...
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Using Compressor::Gzip <span style="color: #000000; font-weight: bold;">for</span> compression.
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span>   Command: <span style="color: #ff0000;">'/bin/gzip'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:04<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span>   Ext: <span style="color: #ff0000;">'.gz'</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:<span style="color: #000000;">10</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Database::MySQL Finished<span style="color: #000000; font-weight: bold;">!</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:<span style="color: #000000;">10</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Packaging the backup files...
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:<span style="color: #000000;">10</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Splitter configured with a chunk <span style="color: #c20cb9; font-weight: bold;">size</span> of 500MB.
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:<span style="color: #000000;">10</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Packaging Complete<span style="color: #000000; font-weight: bold;">!</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:<span style="color: #000000;">10</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Cleaning up the temporary files...
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:<span style="color: #000000;">10</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Yandex::Disk Started...
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:09:<span style="color: #000000;">12</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Storing <span style="color: #ff0000;">'/backups/my_backup/2014.01.08.19.09.03/my_backup.tar'</span>...
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:<span style="color: #000000;">10</span>:<span style="color: #000000;">13</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Cycling Started...
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:<span style="color: #000000;">10</span>:<span style="color: #000000;">13</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Yandex::Disk Finished<span style="color: #000000; font-weight: bold;">!</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:<span style="color: #000000;">10</span>:<span style="color: #000000;">13</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>info<span style="color: #7a0874; font-weight: bold;">&#93;</span> Cleaning up the package files...
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2014</span><span style="color: #000000; font-weight: bold;">/</span>01<span style="color: #000000; font-weight: bold;">/</span>08 <span style="color: #000000;">19</span>:<span style="color: #000000;">10</span>:<span style="color: #000000;">13</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>warn<span style="color: #7a0874; font-weight: bold;">&#93;</span> Backup <span style="color: #000000; font-weight: bold;">for</span> <span style="color: #ff0000;">'My backup DB to Yandex.Disk (my_backup)'</span> Completed Successfully <span style="color: #7a0874; font-weight: bold;">&#40;</span>with Warnings<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">in</span> 00:01:<span style="color: #000000;">10</span></pre></td></tr></table></div>

<p><meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2014/01/back-up.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2014/01/10/backup-na-yandeks-disk/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>установка ruby 2.0, rails 4, nginx+passenger</title>
		<link>http://blog.lukmus.ru/2013/10/05/ustanovka-ruby-2-0-rails-4-nginxpassenger/</link>
		<comments>http://blog.lukmus.ru/2013/10/05/ustanovka-ruby-2-0-rails-4-nginxpassenger/#comments</comments>
		<pubDate>Sat, 05 Oct 2013 10:33:56 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[настройка и установка]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[passenger]]></category>
		<category><![CDATA[ruby 2.0]]></category>
		<category><![CDATA[ruby on rails 4]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=2105</guid>
		<description><![CDATA[Установка Ruby 2.0 через RVM и Rails4+Passenger+Nginx практически ни чем не отличается от аналогичной ситуацией с Rails 3, однако я опишу весь процесс просто для того, чтобы каждый раз не искать новый сайт RVM. установка ruby 2.0 Тут будет все практически тоже самое, что и для Ruby 1.9 и Rails 3, измениться практически только команда [...]]]></description>
			<content:encoded><![CDATA[<p>Установка Ruby 2.0 через RVM и Rails4+Passenger+Nginx практически ни чем не отличается от аналогичной ситуацией с Rails 3, однако я опишу весь процесс просто для того, чтобы каждый раз не искать новый сайт RVM.<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2013/10/PngNgt4U5MM.jpg" alt="" title="Rails Girls" width="517" height="550" class="alignnone size-full wp-image-2112" /><br />
<span id="more-2105"></span></p>
<h2>установка ruby 2.0</h2>
<p>Тут будет все практически тоже самое, что и для <a href='http://blog.lukmus.ru/?p=985'>Ruby 1.9 и Rails 3</a>, измениться практически только команда установки самой RVM.</p>
<p>Итак, для начала надо установить Git.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;"># </span><span style="color: #c20cb9; font-weight: bold;">yum install</span> <span style="color: #c20cb9; font-weight: bold;">git</span> <span style="color: #660033;">-y</span></pre></td></tr></table></div>

<p>Далее надо установить RVM, как написано на <a href="https://rvm.io/" target="_blank" rel='nofollow'>офсайте</a> делаем:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;"># </span>\curl <span style="color: #660033;">-L</span> https:<span style="color: #000000; font-weight: bold;">//</span>get.rvm.io <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">bash</span> <span style="color: #660033;">-s</span> stable</pre></td></tr></table></div>

<p>Теперь надо выйти из консоли и зайти обратно, после чего можно установить непосредственно сам Ruby 2.0:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># rvm -v</span>
&nbsp;
rvm 1.22.16 <span style="color: #7a0874; font-weight: bold;">&#40;</span>stable<span style="color: #7a0874; font-weight: bold;">&#41;</span> by Wayne E. Seguin <span style="color: #000000; font-weight: bold;">&lt;</span>wayneeseguin<span style="color: #000000; font-weight: bold;">@</span>gmail.com<span style="color: #000000; font-weight: bold;">&gt;</span>, Michal Papis <span style="color: #000000; font-weight: bold;">&lt;</span>mpapis<span style="color: #000000; font-weight: bold;">@</span>gmail.com<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>https:<span style="color: #000000; font-weight: bold;">//</span>rvm.io<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># rvm install 2.0</span></pre></td></tr></table></div>

<p>Когда Ruby 2.0 установлен, если необходимо можно поставить его используемым по умолчанию.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># rvm use 2.0 --default</span>
Using <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-2.0.0-p247
<span style="color: #666666; font-style: italic;"># ruby -v</span>
ruby 2.0.0p247 <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2013</span>-06-<span style="color: #000000;">27</span> revision <span style="color: #000000;">41674</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>i686-linux<span style="color: #7a0874; font-weight: bold;">&#93;</span></pre></td></tr></table></div>

<h2>установка rails 4</h2>
<p>Надо просто установить соответствующий gem.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># gem install rails</span>
<span style="color: #666666; font-style: italic;"># rails -v</span>
Rails 4.0.0</pre></td></tr></table></div>

<h2>установка nginx+passenger</h2>
<p>Установка Nginx+Passenger для Rails 4, точно такая же как и <a href='http://blog.lukmus.ru/?p=1106'>для Rails 3</a>.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># gem install passenger</span>
<span style="color: #666666; font-style: italic;"># passenger-install-nginx-module</span></pre></td></tr></table></div>

<p>Теперь осталось воспользоваться предоставленными Passenger&#8217;ом настройками и правильно сконфигурировать конфиг Nginx <code>/opt/nginx/conf/nginx.conf</code>.</p>
<p>p.s. честно говоря, этот пост написан по двум причинам: давно не писал и хотелось бы забить ключевик <strong>установка rails 4</strong>.<br />
<meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2013/10/PngNgt4U5MM.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2013/10/05/ustanovka-ruby-2-0-rails-4-nginxpassenger/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>страничное кэширование мультидоменного сайта на Rails 3+Nginx</title>
		<link>http://blog.lukmus.ru/2013/03/07/stranichnoe-keshirovanie-multidomenn/</link>
		<comments>http://blog.lukmus.ru/2013/03/07/stranichnoe-keshirovanie-multidomenn/#comments</comments>
		<pubDate>Thu, 07 Mar 2013 14:46:48 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[cache_page]]></category>
		<category><![CDATA[expire_cache]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[ruby on rails 3]]></category>
		<category><![CDATA[subdomain]]></category>
		<category><![CDATA[кэш]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1902</guid>
		<description><![CDATA[«Наиболее эффективными считаются те запросы, которые никогда не выдаются», ― говорит Сэм Руби. Страничное кэширование с этой точки зрения не максимально эффективно, но близко к максимуму т.к. страница загруженная полностью из кэша не делает ни одного запроса к БД. Однако, в случае если сайт имеет поддомены, например, для определения локали (en.site.com, ru.site.com), кэш страницы в [...]]]></description>
			<content:encoded><![CDATA[<p>«Наиболее эффективными считаются те запросы, которые никогда не выдаются», ― говорит Сэм Руби. Страничное кэширование с этой точки зрения не максимально эффективно, но близко к максимуму т.к. страница загруженная полностью из кэша не делает ни одного запроса к БД. Однако, в случае если сайт имеет поддомены, например, для определения локали (en.site.com, ru.site.com), кэш страницы в одной локале будет затираться кэшом в другой. В этой статье мой опыт борьбы с этой проблемой.<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2013/03/patriarh.jpg" alt="" title="патриарх Кирилл" width="517" height="388" class="alignnone size-full wp-image-1903" /><span id="more-1902"></span><br />
Если загуглить решение этой проблемы, то одно из первых, что выскакивает это статья Ryan Stout <a href="http://www.agileproductions.com/blog_posts/16-Page-Caching-by-Subdomain-in-Rails-and-Nginx" target="_blank" rel='nofollow'>«Page Caching by Subdomain in Rails and Nginx»</a>. Собственно, по ней я и пытался кэшировать на поддоменах, но не все так гладко как там описано. Поэтому я кое-что добавил от себя, а кое-что изменил.</p>
<h3>ApplicationController</h3>
<p>Прежде всего, как и описано в статье надо добавить кое-что в <code>ApplicationController</code>, но тут помимо указанного у Ryan&#8217;а метода <code>cache_page</code> надо будет еще перегрузить <code>expire_page</code> иначе обновить кэш из под рельс можно будет только на велосипеде.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><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> cache_page<span style="color:#006600; font-weight:bold;">&#40;</span>content = <span style="color:#0000FF; font-weight:bold;">nil</span>, options = <span style="color:#0000FF; font-weight:bold;">nil</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    path = <span style="color:#996600;">&quot;/#{request.host}/&quot;</span>
    path <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#9966CC; font-weight:bold;">case</span> options
    <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#CC00FF; font-weight:bold;">Hash</span>
      url_for<span style="color:#006600; font-weight:bold;">&#40;</span>options.<span style="color:#9900CC;">merge</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:only_path</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>, <span style="color:#ff3333; font-weight:bold;">:skip_relative_url_root</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>, :<span style="color:#CC0066; font-weight:bold;">format</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> params<span style="color:#006600; font-weight:bold;">&#91;</span>:<span style="color:#CC0066; font-weight:bold;">format</span><span style="color:#006600; font-weight:bold;">&#93;</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;">when</span> <span style="color:#CC0066; font-weight:bold;">String</span>
      options
    <span style="color:#9966CC; font-weight:bold;">else</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> request.<span style="color:#9900CC;">path</span>.<span style="color:#9900CC;">empty</span>? <span style="color:#006600; font-weight:bold;">||</span> request.<span style="color:#9900CC;">path</span> == <span style="color:#996600;">'/'</span>
        <span style="color:#996600;">'/index'</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        request.<span style="color:#9900CC;">path</span>
      <span style="color:#9966CC; font-weight:bold;">end</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>content, path<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> expire_page<span style="color:#006600; font-weight:bold;">&#40;</span>options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    path = <span style="color:#996600;">&quot;/#{request.host}/&quot;</span>
    params<span style="color:#006600; font-weight:bold;">&#91;</span>:<span style="color:#CC0066; font-weight:bold;">format</span><span style="color:#006600; font-weight:bold;">&#93;</span>=:html <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span>:<span style="color:#CC0066; font-weight:bold;">format</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    path <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#9966CC; font-weight:bold;">case</span> options
    <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#CC00FF; font-weight:bold;">Hash</span>
      url_for<span style="color:#006600; font-weight:bold;">&#40;</span>options.<span style="color:#9900CC;">merge</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:only_path</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>, :<span style="color:#CC0066; font-weight:bold;">format</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> params<span style="color:#006600; font-weight:bold;">&#91;</span>:<span style="color:#CC0066; font-weight:bold;">format</span><span style="color:#006600; font-weight:bold;">&#93;</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;">when</span> <span style="color:#CC0066; font-weight:bold;">String</span>
      options
    <span style="color:#9966CC; font-weight:bold;">else</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> request.<span style="color:#9900CC;">path</span>.<span style="color:#9900CC;">empty</span>? <span style="color:#006600; font-weight:bold;">||</span> request.<span style="color:#9900CC;">path</span> == <span style="color:#996600;">'/'</span>
        <span style="color:#996600;">'/index'</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        request.<span style="color:#9900CC;">path</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9966CC; font-weight:bold;">class</span>.<span style="color:#9900CC;">expire_page</span><span style="color:#006600; font-weight:bold;">&#40;</span>path<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></td></tr></table></div>

<h3>настройка самого rails-приложения</h3>
<p>Согласно статье, кэш будет храниться в директории <code>public/cache</code>. Чтобы так и было нужно, во-первых, создать папку <code>cache</code> в <code>public</code>, а, во-вторых, сообщить о пути кэша самому приложению. Для этого можно, например, в <code>config/environments/production.rb</code> дописать:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#6666ff; font-weight:bold;">MyApp::Application</span>.<span style="color:#9900CC;">configure</span> <span style="color:#9966CC; font-weight:bold;">do</span>
...
  <span style="color:#9900CC;">config</span>.<span style="color:#9900CC;">action_controller</span>.<span style="color:#9900CC;">page_cache_directory</span> = Rails.<span style="color:#9900CC;">root</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;public/cache&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<h3>nginx</h3>
<p>В настройке сайта в <code>nginx.conf</code> нужно указать, что и в оригинальной статье:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="text" style="font-family:monospace;"># If the file exists in the public folder, send it
if (-f $request_filename) {
  break;	  
}
&nbsp;
# Check / files with index.html
if (-f $document_root/cache/$host/$uri/index.html) {
  rewrite (.*) /cache/$host/$1/index.html break;
}
&nbsp;
# Check the path + .html
if (-f $document_root/cache/$host/$uri.html) {
  rewrite (.*) /cache/$host/$1.html break;
}
&nbsp;
# Check directly
if (-f $document_root/cache/$host/$uri) {
  rewrite (.*) /cache/$host/$1 break;
}</pre></td></tr></table></div>

<p>Добавление этих условников говорит Nginx&#8217;у куда записывать кэш если его нет и откуда его читать если для данного адреса есть кэш. Вот тут и возникает проблема, Nginx не будет различать это GET-запрос или POST. И если в случае с GET, все хорошо, то когда поступает PUT-запрос на обновление модели (экшены <code>update</code> и <code>show</code> имеют один и тот же URL по умолчанию) Nginx с радостью обнаружит закэшированную страницу и выдаст ошибку 505.<br />
Язык конфигурации Nginx не поддерживает вложенные условники и не понимает конъюнкцию (&#038;&#038; или AND или еще как угодно), все, что остается это строить велосипед что-то типа:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="text" style="font-family:monospace;">if ( $request_method = GET ) {
  set $method_and_file &quot;method&quot;;
}
&nbsp;
if (-f $request_filename) {
  set $method_and_file $method_and_file+&quot;&amp;file&quot;;
}
&nbsp;
if ($method_and_file = &quot;method&amp;file&quot;) {
  break;
}</pre></td></tr></table></div>

<p>Но эти костыли у меня не завелись с первого раза и я забил на эти грязные мысли.</p>
<h2>как же тогда обновить кэш?</h2>
<p>Для обновления кэша я предлагаю такой, на мой взгляд, не самый кровавый вариант. Надо делать форму модели AJAX-вую и в вызове <code>expire_cache</code> явно указывать формат кэша.</p>
<h3>пример на модели Page</h3>
<p><strong>app/controllers/pages_controller.rb:</strong></p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> PagesController <span style="color:#006600; font-weight:bold;">&lt;</span> ApplicationController
...
  <span style="color:#9900CC;">caches_page</span> <span style="color:#ff3333; font-weight:bold;">:show</span>
  caches_page <span style="color:#ff3333; font-weight:bold;">:index</span>
...
  <span style="color:#9966CC; font-weight:bold;">def</span> update
    respond_to <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span><span style="color:#CC0066; font-weight:bold;">format</span><span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@page</span>.<span style="color:#9900CC;">update_attributes</span><span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:page</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        expire_page<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span>action: <span style="color:#ff3333; font-weight:bold;">:show</span>, id: <span style="color:#0066ff; font-weight:bold;">@page</span>.<span style="color:#9900CC;">id</span>, <span style="color:#CC0066; font-weight:bold;">format</span>: <span style="color:#ff3333; font-weight:bold;">:html</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        expire_page<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span>action: <span style="color:#ff3333; font-weight:bold;">:index</span>, <span style="color:#CC0066; font-weight:bold;">format</span>: <span style="color:#ff3333; font-weight:bold;">:html</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#006600; font-weight:bold;">&#123;</span> redirect_to <span style="color:#0066ff; font-weight:bold;">@page</span>, notice: <span style="color:#996600;">'Page was successfully updated.'</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">js</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#006600; font-weight:bold;">&#123;</span> render action: <span style="color:#996600;">&quot;edit&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">js</span>
        <span style="color:#008000; font-style:italic;">#format.json { render json: @page.errors, status: :unprocessable_entity }</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
...
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p><strong>/app/views/pages/update.js:</strong></p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">setTimeout<span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'window.location.replace(&quot;&lt;%=page_path(@page)%&gt;&quot;)'</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1500</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><strong>/app/views/pages/_form.html.erb:</strong></p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&lt;%</span>= form_for<span style="color:#006600; font-weight:bold;">&#40;</span>@page, remote: <span style="color:#0000FF; font-weight:bold;">true</span>, <span style="color:#CC0066; font-weight:bold;">format</span>: <span style="color:#ff3333; font-weight:bold;">:js</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>f<span style="color:#006600; font-weight:bold;">|%&gt;</span>
...
<span style="color:#006600; font-weight:bold;">&lt;%</span>end<span style="color:#006600; font-weight:bold;">%&gt;</span></pre></td></tr></table></div>

<p><meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2013/03/patriarh.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2013/03/07/stranichnoe-keshirovanie-multidomenn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>хлебные крошки на rails. breadcrumbs_on_rails</title>
		<link>http://blog.lukmus.ru/2013/02/05/hlebnyie-kroshki-na-rails-breadcrumbs_on_rails/</link>
		<comments>http://blog.lukmus.ru/2013/02/05/hlebnyie-kroshki-na-rails-breadcrumbs_on_rails/#comments</comments>
		<pubDate>Tue, 05 Feb 2013 22:41:19 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[breadcrumbs_on_rails]]></category>
		<category><![CDATA[ruby on rails 3]]></category>
		<category><![CDATA[хлебные крошки]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1889</guid>
		<description><![CDATA[Хлебные крошки для RoR-приложения уже давно не нужно писать самому. Уже не менее 2-х лет существует как минимум один gem для быстрой реализации хлебных крошек ― breadcrumbs_on_rails. Ниже я только опишу свой опыт работы с этим гемом, который мало чем отличается от описанного на офстранице breadcrumbs_on_rails. установка В Gemfile добавляем: gem &#34;breadcrumbs_on_rails&#34; и бандлим: $ [...]]]></description>
			<content:encoded><![CDATA[<p>Хлебные крошки для RoR-приложения уже давно не нужно писать самому. Уже не менее 2-х лет существует как минимум один gem для быстрой реализации хлебных крошек ― <a href="https://github.com/weppos/breadcrumbs_on_rails" target="_blank" rel='nofollow'>breadcrumbs_on_rails</a>. Ниже я только опишу свой опыт работы с этим гемом, который мало чем отличается от описанного на <a href="http://www.simonecarletti.com/code/breadcrumbs_on_rails/docs/" target="_blank" rel='nofollow'>офстранице breadcrumbs_on_rails</a>.<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2013/02/425771.jpg" alt="" title="42577" width="517" height="405" class="alignnone size-full wp-image-1891" /><span id="more-1889"></span></p>
<h3>установка</h3>
<p>В Gemfile добавляем:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">gem <span style="color:#996600;">&quot;breadcrumbs_on_rails&quot;</span></pre></td></tr></table></div>

<p>и бандлим:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">$ </span><span style="color: #c20cb9; font-weight: bold;">su</span> <span style="color: #660033;">-c</span> <span style="color: #ff0000;">'bundle install'</span></pre></td></tr></table></div>

<h3>эксплуатация</h3>
<p>Для отображения &#8216;хлебных крошек&#8217; в нужное представление необходимо вставить хелпер:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&lt;%</span>= render_breadcrumbs <span style="color:#006600; font-weight:bold;">%&gt;</span></pre></td></tr></table></div>

<p>Хелпер может принимать параметр <code>separator</code>:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="rails" style="font-family:monospace;">&lt;body&gt;
  <span style="color:#006600; font-weight:bold;">&lt;%</span>= render_breadcrumbs <span style="color:#ff3333; font-weight:bold;">:separator</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">' / '</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
&lt;/body&gt;</pre></td></tr></table></div>

<p>В контроллере для определения текста и ссылки &#8216;хлебной крошки&#8217; используется метод <code>add_breadcrumb</code>:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">add_breadcrumb <span style="color:#006600; font-weight:bold;">&lt;</span>анкор<span style="color:#006600; font-weight:bold;">&gt;</span>, <span style="color:#006600; font-weight:bold;">&lt;</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;">&lt;</span>необязательный хэш с параметрами ссылки<span style="color:#006600; font-weight:bold;">&gt;</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></td></tr></table></div>

<p>Путь может представлять из себя как чистый &#8216;путевой&#8217; хелпер, так и символ &#8216;путевого&#8217; хелпера.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> MyController
&nbsp;
  add_breadcrumb <span style="color:#996600;">&quot;home&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:root_path</span>
  add_breadcrumb <span style="color:#996600;">&quot;my&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:my_path</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> index
    add_breadcrumb <span style="color:#996600;">&quot;index&quot;</span>, index_path, <span style="color:#ff3333; font-weight:bold;">:title</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Back to the Index&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p><meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2013/02/425771.jpg"></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2013/02/05/hlebnyie-kroshki-na-rails-breadcrumbs_on_rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>нейронные сети на ruby</title>
		<link>http://blog.lukmus.ru/2013/01/21/neyronnyie-seti-na-ruby/</link>
		<comments>http://blog.lukmus.ru/2013/01/21/neyronnyie-seti-na-ruby/#comments</comments>
		<pubDate>Mon, 21 Jan 2013 22:31:28 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby-fann]]></category>
		<category><![CDATA[искусственный интеллект]]></category>
		<category><![CDATA[нейронная сеть]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1774</guid>
		<description><![CDATA[Недавно я узнал о том, что больше не надо заморачиваться и писать всю логику работы нейросетки. Собственно говоря, это уже давно можно было не делать благодаря существованию такой библиотеки на C как Fast Artificial Neural Network. А спустя считанные минуты я с удивлением обнаружил, что FANN уже давно портатированна на различные языки более высокого уровня, [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно я узнал о том, что больше не надо заморачиваться и писать всю логику работы нейросетки. Собственно говоря, это уже давно можно было не делать благодаря существованию такой библиотеки на C как <a href="http://leenissen.dk/fann/wp/" target="_blank" rel='nofollow'>Fast Artificial Neural Network</a>. А спустя считанные минуты я с удивлением обнаружил, что FANN уже давно портатированна на <a href="http://leenissen.dk/fann/wp/language-bindings/" target="_blank" rel='nofollow'>различные языки более высокого уровня</a>, включая PHP, Python и, конечно, апогей человеческого гения &#8211; Ruby.<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2013/01/kaspersky.jpg" alt="Касперский пиарится на Красном Октябре" title="Касперский пиарится на Красном Октябре" width="517" height="400" class="aligncenter size-full wp-image-1776" /><span id="more-1774"></span><br />
Для Ruby интерфейс к FANN обеспечивает гем <a href="http://ruby-fann.rubyforge.org/" target="_blank" rel='nofollow'>ruby-fann</a>.</p>
<h2>установка</h2>
<p>Для установки его под рельсы надо закинуть в <code>Gemfile</code></p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">gem <span style="color:#996600;">'ruby-fann'</span></pre></td></tr></table></div>

<p>и забандлить</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">bundle <span style="color: #c20cb9; font-weight: bold;">install</span></pre></td></tr></table></div>

<h3>установка graphviz</h3>
<p>Еще для отображения графической схемы нейронной сети можно воспользоваться <code>graphviz</code>. Эта штука вроде как должна экспортировать графическую схему сетки в PNG или VRML.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">yum install</span> graphviz
gem <span style="color: #c20cb9; font-weight: bold;">install</span> ruby-graphviz</pre></td></tr></table></div>

<h2>эксплуатация</h2>
<p>У гема есть <a href="http://ruby-fann.rubyforge.org/rdoc/" target="_blank" rel='nofollow'>подробная документация</a>.<br />
В качестве примера я не буду дублировать код на сайте гема, а приведу нейросеть для решения <a href="http://www.aiportal.ru/downloads/neural-networks/nn_xor.html" target="_blank" rel='nofollow'>классической задачи с XOR</a>, только с большим количеством нейронов.<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2013/01/image0341.jpg" alt="" title="image034" width="517" height="294" class="alignnone size-full wp-image-1791" /><br />
Код упакован в rake-файл рельс.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">namespace <span style="color:#ff3333; font-weight:bold;">:test</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  desc <span style="color:#996600;">'test NN'</span>
  task <span style="color:#ff3333; font-weight:bold;">:nn</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:environment</span> <span style="color:#9966CC; font-weight:bold;">do</span>
&nbsp;
    <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'ruby_fann/neural_network'</span>
    <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'ruby_fann/neurotica'</span> <span style="color:#008000; font-style:italic;">#только для graphviz</span>
&nbsp;
    <span style="color:#008000; font-style:italic;">#объявляется ИНС</span>
    fann = <span style="color:#6666ff; font-weight:bold;">RubyFann::Standard</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>
	<span style="color:#ff3333; font-weight:bold;">:num_inputs</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006666;">2</span>, <span style="color:#008000; font-style:italic;">#входы</span>
	<span style="color:#008000; font-style:italic;">#кол-во нейронов на первом и </span>
        <span style="color:#008000; font-style:italic;">#втором уровнях соответственно</span>
	<span style="color:#ff3333; font-weight:bold;">:hidden_neurons</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">3</span>, <span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span>, 
	<span style="color:#ff3333; font-weight:bold;">:num_outputs</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006666;">1</span> <span style="color:#008000; font-style:italic;">#выходы</span>
    <span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;">#обучение</span>
    pairs=<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span>,<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span>,<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#008000; font-style:italic;">#учебные данные</span>
    training_data = <span style="color:#6666ff; font-weight:bold;">RubyFann::TrainData</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>
  	<span style="color:#ff3333; font-weight:bold;">:inputs</span><span style="color:#006600; font-weight:bold;">=&gt;</span>pairs, 
  	<span style="color:#008000; font-style:italic;">#правильные результаты в соответствии с учебными данными</span>
  	<span style="color:#ff3333; font-weight:bold;">:desired_outputs</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;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<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:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>,<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:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;">#собственно само обучение</span>
    fann.<span style="color:#9900CC;">train_on_data</span><span style="color:#006600; font-weight:bold;">&#40;</span>
	training_data, <span style="color:#008000; font-style:italic;">#данные для обучения</span>
	<span style="color:#006666;">1000</span>, <span style="color:#008000; font-style:italic;">#макс. кол-во эпох</span>
	<span style="color:#006666;">1</span>, <span style="color:#008000; font-style:italic;">#кол-во эпох спустя которые выводить рез-тат</span>
	<span style="color:#006666;">0.01</span> <span style="color:#008000; font-style:italic;">#допустимая погрешность</span>
    <span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;">#проверка обученности сети</span>
    pairs.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>pair<span style="color:#006600; font-weight:bold;">|</span>
	<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;#{pair}: #{fann.run(pair)}&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    <span style="color:#008000; font-style:italic;">#вывод полученных нейронов</span>
    fann.<span style="color:#9900CC;">get_neurons</span>.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>n<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#CC0066; font-weight:bold;">p</span> n<span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
    <span style="color:#008000; font-style:italic;">#вывод графической схемы</span>
    graph=<span style="color:#6666ff; font-weight:bold;">RubyFann::Neurotica</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    graph.<span style="color:#9900CC;">graph</span><span style="color:#006600; font-weight:bold;">&#40;</span>fann, <span style="color:#996600;">'xor_nn.png'</span><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></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">$ bundle <span style="color: #7a0874; font-weight: bold;">exec</span> rake test:nn
Max epochs     <span style="color: #000000;">1000</span>. Desired error: <span style="color: #000000;">0.0099999998</span>.
Epochs            <span style="color: #000000;">1</span>. Current error: <span style="color: #000000;">0.2501267791</span>. Bit fail <span style="color: #000000;">4</span>.
Epochs            <span style="color: #000000;">2</span>. Current error: <span style="color: #000000;">0.2520069778</span>. Bit fail <span style="color: #000000;">4</span>.
Epochs            <span style="color: #000000;">3</span>. Current error: <span style="color: #000000;">0.2551138699</span>. Bit fail <span style="color: #000000;">4</span>.
Epochs            <span style="color: #000000;">4</span>. Current error: <span style="color: #000000;">0.2513942719</span>. Bit fail <span style="color: #000000;">4</span>.
Epochs            <span style="color: #000000;">5</span>. Current error: <span style="color: #000000;">0.2500072420</span>. Bit fail <span style="color: #000000;">4</span>.
...
Epochs          <span style="color: #000000;">370</span>. Current error: <span style="color: #000000;">0.0440760627</span>. Bit fail <span style="color: #000000;">1</span>.
Epochs          <span style="color: #000000;">371</span>. Current error: <span style="color: #000000;">0.0343447179</span>. Bit fail <span style="color: #000000;">0</span>.
Epochs          <span style="color: #000000;">372</span>. Current error: <span style="color: #000000;">0.0233961642</span>. Bit fail <span style="color: #000000;">0</span>.
Epochs          <span style="color: #000000;">373</span>. Current error: <span style="color: #000000;">0.0175627228</span>. Bit fail <span style="color: #000000;">0</span>.
Epochs          <span style="color: #000000;">374</span>. Current error: <span style="color: #000000;">0.0113563286</span>. Bit fail <span style="color: #000000;">0</span>.
Epochs          <span style="color: #000000;">375</span>. Current error: <span style="color: #000000;">0.0067548323</span>. Bit fail <span style="color: #000000;">0</span>.
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0</span>, <span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0.045396712927026114</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">1</span>, <span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0.9389753126711914</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0</span>, <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0.9501094945639519</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">1</span>, <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0.061412697926247546</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>:<span style="color: #007800;">activation_function</span>=<span style="color: #000000; font-weight: bold;">&gt;</span>:linear, :<span style="color: #007800;">activation_steepness</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">0.0</span>, :<span style="color: #007800;">layer</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">0</span>, :<span style="color: #007800;">sum</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">0.0</span>, :<span style="color: #007800;">value</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">1.0</span>, :<span style="color: #007800;">connections</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>:<span style="color: #007800;">activation_function</span>=<span style="color: #000000; font-weight: bold;">&gt;</span>:linear, :<span style="color: #007800;">activation_steepness</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">0.0</span>, :<span style="color: #007800;">layer</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">0</span>, :<span style="color: #007800;">sum</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">0.0</span>, :<span style="color: #007800;">value</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">1.0</span>, :<span style="color: #007800;">connections</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>:<span style="color: #007800;">activation_function</span>=<span style="color: #000000; font-weight: bold;">&gt;</span>:sigmoid_stepwise, :<span style="color: #007800;">activation_steepness</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">0.5</span>, :<span style="color: #007800;">layer</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">1</span>, :<span style="color: #007800;">sum</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">1.3608390766086655</span>, :<span style="color: #007800;">value</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">0.9258633161869951</span>, :<span style="color: #007800;">connections</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0</span>, <span style="color: #000000;">1</span>, <span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>:<span style="color: #007800;">activation_function</span>=<span style="color: #000000; font-weight: bold;">&gt;</span>:sigmoid_stepwise, :<span style="color: #007800;">activation_steepness</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">0.5</span>, :<span style="color: #007800;">layer</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">1</span>, :<span style="color: #007800;">sum</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">5.5199047483640955</span>, :<span style="color: #007800;">value</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">1.0</span>, :<span style="color: #007800;">connections</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0</span>, <span style="color: #000000;">1</span>, <span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>:<span style="color: #007800;">activation_function</span>=<span style="color: #000000; font-weight: bold;">&gt;</span>:sigmoid_stepwise, :<span style="color: #007800;">activation_steepness</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">0.5</span>, :<span style="color: #007800;">layer</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">1</span>, :<span style="color: #007800;">sum</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">1.7510475747029322</span>, :<span style="color: #007800;">value</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">0.9606836699618748</span>, :<span style="color: #007800;">connections</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0</span>, <span style="color: #000000;">1</span>, <span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>:<span style="color: #007800;">activation_function</span>=<span style="color: #000000; font-weight: bold;">&gt;</span>:sigmoid_stepwise, :<span style="color: #007800;">activation_steepness</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">0.5</span>, :<span style="color: #007800;">layer</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">2</span>, :<span style="color: #007800;">sum</span>=<span style="color: #000000; font-weight: bold;">&gt;</span>-<span style="color: #000000;">2.005618142945213</span>, :<span style="color: #007800;">value</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">0.029562103469001694</span>, :<span style="color: #007800;">connections</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">3</span>, <span style="color: #000000;">4</span>, <span style="color: #000000;">5</span>, <span style="color: #000000;">6</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>:<span style="color: #007800;">activation_function</span>=<span style="color: #000000; font-weight: bold;">&gt;</span>:sigmoid_stepwise, :<span style="color: #007800;">activation_steepness</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">0.5</span>, :<span style="color: #007800;">layer</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">2</span>, :<span style="color: #007800;">sum</span>=<span style="color: #000000; font-weight: bold;">&gt;</span>-<span style="color: #000000;">2.3070915806646646</span>, :<span style="color: #007800;">value</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">0.018010737799533</span>, :<span style="color: #007800;">connections</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">3</span>, <span style="color: #000000;">4</span>, <span style="color: #000000;">5</span>, <span style="color: #000000;">6</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>:<span style="color: #007800;">activation_function</span>=<span style="color: #000000; font-weight: bold;">&gt;</span>:sigmoid_stepwise, :<span style="color: #007800;">activation_steepness</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">0.5</span>, :<span style="color: #007800;">layer</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">3</span>, :<span style="color: #007800;">sum</span>=<span style="color: #000000; font-weight: bold;">&gt;</span>-<span style="color: #000000;">1.4195548161431304</span>, :<span style="color: #007800;">value</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000;">0.061412697926247546</span>, :<span style="color: #007800;">connections</span>=<span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">7</span>, <span style="color: #000000;">8</span>, <span style="color: #000000;">9</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#125;</span>
rake aborted<span style="color: #000000; font-weight: bold;">!</span>
graph attribute <span style="color: #ff0000;">'output'</span> invalid
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-1.9.2-p290<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-graphviz-1.0.8<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>graphviz<span style="color: #000000; font-weight: bold;">/</span>attrs.rb:<span style="color: #000000;">53</span>:in <span style="color: #000000; font-weight: bold;">`</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>=<span style="color: #ff0000;">'
/usr/local/rvm/gems/ruby-1.9.2-p290/gems/ruby-graphviz-1.0.8/lib/graphviz.rb:378:in `[]='</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-1.9.2-p290<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-graphviz-1.0.8<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>graphviz.rb:<span style="color: #000000;">901</span>:in <span style="color: #000000; font-weight: bold;">`</span>block <span style="color: #000000; font-weight: bold;">in</span> initialize<span style="color: #ff0000;">'
/usr/local/rvm/gems/ruby-1.9.2-p290/gems/ruby-graphviz-1.0.8/lib/graphviz.rb:878:in `each'</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-1.9.2-p290<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-graphviz-1.0.8<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>graphviz.rb:<span style="color: #000000;">878</span>:in <span style="color: #000000; font-weight: bold;">`</span>initialize<span style="color: #ff0000;">'
/usr/local/rvm/gems/ruby-1.9.2-p290/gems/ruby-fann-1.1.3/lib/ruby_fann/neurotica.rb:37:in `new'</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>rvm<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-1.9.2-p290<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>ruby-fann-1.1.3<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>ruby_fann<span style="color: #000000; font-weight: bold;">/</span>neurotica.rb:<span style="color: #000000;">37</span>:in <span style="color: #000000; font-weight: bold;">`</span>graph<span style="color: #ff0000;">'
/home/username/ror/nn/lib/tasks/test.rake:42:in `block (2 levels) in &lt;top (required)&gt;'</span>
Tasks: TOP =<span style="color: #000000; font-weight: bold;">&gt;</span> test:nn
<span style="color: #7a0874; font-weight: bold;">&#40;</span>See full trace by running task with --trace<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></td></tr></table></div>

<p>Как видно по ошибке в конце вывода, удалось все кроме создания PNG-файла. Но т.к. <code>graphviz</code> далеко не самый важный и нужный элемент, то и Бог с ним.<br />
Описываемое далее выходит за рамки темы объявленной в заголовке, однако, чтобы не забыть я напишу.</p>
<h3>определение количества нейронов</h3>
<p>Теоретически, именно теоретически, количество нейронов определяется по формуле из следствия теорем Арнольда – Колмогорова – Хехт-Нильсена:<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2013/01/18-0.gif" alt="" title="18-0" width="330" height="54"  /><br />
N<sub>y</sub> — количество выходов;<br />
Q — количество обучающих примеров;<br />
N<sub>w</sub> — необходимое число синаптических связей;<br />
N<sub>x</sub> — количество входов.<br />
Из этого неравенства следует, что количество нейронов для сети с одним скрытым слоем определяется:<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2013/01/19-0.gif" alt="" title="19-0" width="106" height="52" class="alignnone size-full wp-image-1809" /><br />
Если нарисовать схему нейросети с более чем одним скрытым слоем, то становится очевидным равенство:<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2013/01/f1.jpg" alt="" title="f1" width="220" height="59" class="alignnone size-full wp-image-1811" /><br />
l — количество слоев;<br />
N<sub>i</sub> — количество нейронов в i-м слое.<br />
Если же в каждом скрытом слое подразумевается одно и тоже количество нейронов, то тождество преобретает вид:<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2013/01/f2.jpg" alt="" title="f2" width="220" height="59" class="alignnone size-full wp-image-1814" /><br />
Решив квадратное уравнение относительно N и отбросив заведомо отрицательный корень, получаем, что количество нейронов в каждом скрытом слое определяется по формуле:<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2013/01/f31.jpg" alt="" title="f3" width="259" height="59" class="alignnone size-full wp-image-1817" /><br />
На этом с математикой пока все. Все что идет после следствия из теорем выводилось мной, поэтому возможна ошибка.<br />
<meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2013/01/kaspersky.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2013/01/21/neyronnyie-seti-na-ruby/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>автоматическое подключение декоратора от Draper в rails 3</title>
		<link>http://blog.lukmus.ru/2012/12/20/avtomaticheskoe-podklyuchenie-dekorato/</link>
		<comments>http://blog.lukmus.ru/2012/12/20/avtomaticheskoe-podklyuchenie-dekorato/#comments</comments>
		<pubDate>Thu, 20 Dec 2012 08:45:45 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[draper]]></category>
		<category><![CDATA[method_missing]]></category>
		<category><![CDATA[ruby on rails 3]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1725</guid>
		<description><![CDATA[Если использовать декоратор Draper, то для использования методов модели описанных в декораторе приходиться использовать явное подключение декоратора через YourModelDecorator.new() или YourModelDecorator.decorate(). Британскими учеными установлено, что явное подключение декоратора утомляет и вызывает сонливость. Для отказа от постоянного декорирования можно задействовать метод класса, который вызывается в случае отсутствия метода с указанным именем method_missing(). 1 2 3 4 [...]]]></description>
			<content:encoded><![CDATA[<p>Если использовать <a href="http://blog.lukmus.ru/?p=1702">декоратор Draper</a>, то для использования методов модели описанных в декораторе приходиться использовать явное подключение декоратора через <code>YourModelDecorator.new()</code> или <code>YourModelDecorator.decorate()</code>. Британскими учеными установлено, что явное подключение декоратора утомляет и вызывает сонливость.<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2012/12/x_01e790b1.jpg" alt="" title="draper" width="517"  class="aligncenter size-full wp-image-1726" /><span id="more-1725"></span><br />
Для отказа от постоянного декорирования можно задействовать метод класса, который вызывается в случае отсутствия метода с указанным именем <code>method_missing()</code>.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> YourModel <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
...
  <span style="color:#9966CC; font-weight:bold;">def</span> method_missing<span style="color:#006600; font-weight:bold;">&#40;</span>name, <span style="color:#006600; font-weight:bold;">*</span>args, <span style="color:#006600; font-weight:bold;">&amp;</span>block<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;tried to handle unknown method %s&quot;</span> <span style="color:#006600; font-weight:bold;">%</span> name
    your_model=YourModelDecorator.<span style="color:#9900CC;">new</span> <span style="color:#0000FF; font-weight:bold;">self</span>
    <span style="color:#0000FF; font-weight:bold;">return</span> your_model.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span>name.<span style="color:#9900CC;">to_sym</span>, <span style="color:#006600; font-weight:bold;">*</span>args,<span style="color:#006600; font-weight:bold;">&amp;</span>block<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> block_given? <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> !args.<span style="color:#9900CC;">empty</span>?
    <span style="color:#0000FF; font-weight:bold;">return</span> your_model.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span>name.<span style="color:#9900CC;">to_sym</span>, <span style="color:#006600; font-weight:bold;">*</span>args<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">unless</span> args.<span style="color:#9900CC;">empty</span>?
    <span style="color:#0000FF; font-weight:bold;">return</span> your_model.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span>name.<span style="color:#9900CC;">to_sym</span>, <span style="color:#006600; font-weight:bold;">&amp;</span>block<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> block_given?
    your_model.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span>name.<span style="color:#9900CC;">to_sym</span><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></td></tr></table></div>

<p>И пусть, в самом декораторе, например, следующее:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> YourModelDecorator <span style="color:#006600; font-weight:bold;">&lt;</span> ApplicationDecorator
...
  <span style="color:#9966CC; font-weight:bold;">def</span> test
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;method without args &amp; block&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> test_with_args<span style="color:#006600; font-weight:bold;">&#40;</span>str<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;method with args: #{str}&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> test_with_block
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;start block&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">yield</span> <span style="color:#9966CC; font-weight:bold;">if</span> block_given?
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;end block&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> test_with_args_and_block<span style="color:#006600; font-weight:bold;">&#40;</span>str,<span style="color:#006600; font-weight:bold;">&amp;</span>block<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;start block with #{str}&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">yield</span> block
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;end block&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
...
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Теперь можно увидеть в консоли примерно следующее:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="irb" style="font-family:monospace;">&gt; your_model=YourModel.first
&gt; your_model.unknown_method
tried to handle unknown method unknown_method
NoMethodError: undefined method `unknown_method'
&gt; your_model.test
tried to handle unknown method test
method without args &amp; block
 =&gt; nil 
&gt; your_model.test_with_args(&quot;i don't like the drugs&quot;)
tried to handle unknown method test_with_args
method with args: i don't like the drugs
 =&gt; nil 
&gt; your_model.test_with_block{puts &quot;but the drugs like me&quot;}
tried to handle unknown method test_with_block
start block
but the drugs like me
end block
 =&gt; nil 
&gt; your_model.test_with_args_and_block(&quot;there's a hole in our soul&quot;){puts &quot;that we fill with dope&quot;}
tried to handle unknown method test_with_args_and_block
start block with there's a hole in our soul
that we fill with dope
end block
 =&gt; nil 
&gt; your_model=YourModelDecorator.new
&gt; your_model.test
method without args &amp; block</pre></td></tr></table></div>

<p>Не претендую на оригинальность и простоту, зато таким образом методы декоратора подгружаются только по необходимости.<br />
<meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2012/12/x_01e790b1.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2012/12/20/avtomaticheskoe-podklyuchenie-dekorato/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rails 3 + декоратор Draper</title>
		<link>http://blog.lukmus.ru/2012/12/18/rails-3-dekorator-draper/</link>
		<comments>http://blog.lukmus.ru/2012/12/18/rails-3-dekorator-draper/#comments</comments>
		<pubDate>Tue, 18 Dec 2012 04:31:21 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[draper]]></category>
		<category><![CDATA[ruby on rails 3]]></category>
		<category><![CDATA[декоратор]]></category>
		<category><![CDATA[к]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1702</guid>
		<description><![CDATA[Захламлять модели своими методами в Rails-приложении это говнокод, это наверное знает каждый, в отличие от меня, однако, наличие дополнительных методов может существенно облегчить представление. Решить эту дилемму помогают декораторы. Ниже описан мой опыт знакомства с декораторами на примере гема Draper. Зачем нужен рефакторинг моделей и что это такое написано еще тут. А вот гем Draper. [...]]]></description>
			<content:encoded><![CDATA[<p>Захламлять модели своими методами в Rails-приложении это говнокод, это наверное знает каждый, <del datetime="2012-12-18T00:58:42+00:00"><a href="http://rubyclub.com.ua/messages/show/18571" rel="nofollow" target="_blank">в отличие от меня</a></del>, однако, наличие дополнительных методов может существенно облегчить представление. Решить эту дилемму помогают декораторы. Ниже описан мой опыт знакомства с декораторами на примере гема Draper.<br />
<img class="aligncenter size-full wp-image-1706" title="illusion" src="http://blog.lukmus.ru/wp-content/uploads/2012/12/illusion.jpg" alt="" width="517" height="291" /><span id="more-1702"></span><br />
Зачем нужен рефакторинг моделей и что это такое написано еще <a href="http://habrahabr.ru/post/158011/" rel="nofollow" target="_blank">тут</a>. А вот <a href="https://github.com/drapergem/draper" rel="nofollow" target="_blank">гем Draper</a>.</p>
<h2>установка</h2>
<p>Тут все как обычно. Добавляем в <code>Gemfile</code></p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">gem 'draper'</pre></td></tr></table></div>

<p>и бандлим</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">bundle install</pre></td></tr></table></div>

<h2>эксплуатация</h2>
<h3>генерация</h3>
<p>Если модель генерируется после того как был установлен Draper, то декоратор создастся сам автоматически. Для ручной генерации декоратора есть команда:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">rails g decorator YourModel</pre></td></tr></table></div>

<p>После выполнения генерации можно увидеть директорию <code>app/decorators</code> где будет лежать файл <code>your_model_decorator.rb</code>. В этом файле и нужно прописывать дополнительные методы модели.</p>
<h3>ошибки</h3>
<p>Тут я не буду следовать инструкции со страницы гема т.к. она не соответствует реальности, по крайней мере с Rails 3.1.<br />
Итак, на данный момент существует файл декоратора модели YourModel <code>app/decorators/your_model_decorator.rb</code>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> YourModelDecorator <span style="color:#006600; font-weight:bold;">&lt;</span> ApplicationDecorator
  decorates <span style="color:#ff3333; font-weight:bold;">:your_model</span>
  <span style="color:#008000; font-style:italic;">#bla-bla-bla</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>И если сейчас запустить консоль, то вылетит ошибка:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">$ rails c
/home/username/ror/myapp/app/decorators/your_model_decorator.rb:<span style="">2</span>:in `': uninitialized constant ApplicationDecorator <span class="br0">&#40;</span>NameError<span class="br0">&#41;</span>
...</pre></td></tr></table></div>

<p>Конечно, можно создать файл <code>app/decorators/application_decorator.rb</code> как советует страница на гитхабе:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> ApplicationDecorator <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">Draper::Decorator</span>
  <span style="color:#008000; font-style:italic;"># your methods go here</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>но это вряд ли поможет, т.к. выскочит другая ошибка при запуске консоли:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">$ rails c
/home/username/ror/myapp/app/decorators/your_model_decorator.rb:<span style="">2</span>:in `': uninitialized constant Draper::Decorator <span class="br0">&#40;</span>NameError<span class="br0">&#41;</span>
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/draper-0.12.0/lib/draper/system.rb:<span style="">9</span>:in `block in load_app_local_decorators'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/draper-0.12.0/lib/draper/system.rb:<span style="">9</span>:in `each'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/draper-0.12.0/lib/draper/system.rb:<span style="">9</span>:in `load_app_local_decorators'
...</pre></td></tr></table></div>

<p>Пошарясь немного по файлам в директории <code>/usr/local/rvm/gems/ruby-1.9.2-p290/gems/draper-0.12.0/lib/draper/</code>, а конкретнее в файле <code>/usr/local/rvm/gems/ruby-1.9.2-p290/gems/draper-0.12.0/lib/draper/base.rb</code> становится ясно, что <code>app/decorators/application_decorator.rb</code> надо привести к виду:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> ApplicationDecorator <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">Draper::Base</span>
  <span style="color:#008000; font-style:italic;"># your methods go here</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>И тут все ошибки резко пропадают.</p>
<h3>использование</h3>
<p>Теперь в декоратор нужно перенести лишние методы из модели. Для того чтобы экземпляры модели пополнились методами из декоратора при их использовании в контроллере или еще где-либо нужно делать так:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">&gt; your_model_exemplar=YourModel.first
&gt; your_model_exemplar.new_method_which_is_in_decorator
NoMethodError: undefined method `new_method_which_is_in_decorator' for #
&gt; your_model_exemplar=YourModelDecorator.new YourModel.first
&gt; your_model_exemplar.new_method_which_is_in_decorator
=&gt; &quot;it really works&quot;
&gt; your_model_exemplars=YourModelDecorator.decorate YourModel.first<span class="br0">&#40;</span><span style="">10</span><span class="br0">&#41;</span>
&gt; your_model_exemplars.first.new_method_which_is_in_decorator
=&gt; &quot;it really works&quot;</pre></td></tr></table></div>

<p>Для коллекции обязательно использовать метод <code>decorate</code>, для единичного экземпляра можно и <code>new</code>, и <code>decorate</code>. Сказка про <code>decorate_collection</code> для коллекции, которая написана на гитхабе это всего лишь сказка, ее рекомендации не работают в реальном мире.</p>
<h3>хелперы в декораторе</h3>
<p>Офстраница на гитхабе советует задействовать хелперы через <code>helpers</code> и сокращенную форму <code>h</code> или без дополнительных примочек просто подключив модуль <code>include Draper::LazyHelpers</code> (ниже дезинформация с https://github.com/drapergem/draper):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> ArticleDecorator <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">Draper::Decorator</span>   
  <span style="color:#9966CC; font-weight:bold;">def</span> published_at     
    date = h.<span style="color:#9900CC;">content_tag</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:span</span>, article.<span style="color:#9900CC;">published_at</span>.<span style="color:#9900CC;">strftime</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;%A, %B %e&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">squeeze</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot; &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>, :<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'date'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    time = h.<span style="color:#9900CC;">content_tag</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:span</span>, article.<span style="color:#9900CC;">published_at</span>.<span style="color:#9900CC;">strftime</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;%l:%M%p&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>, :<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'time'</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">delete</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot; &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    h.<span style="color:#9900CC;">content_tag</span> <span style="color:#ff3333; font-weight:bold;">:span</span>, date <span style="color:#006600; font-weight:bold;">+</span> time, :<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'created_at'</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>У меня ничего из предложенного не прокатило, зато неожиданно прокатил способ с <code>helper</code>.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> YourModelDecorator <span style="color:#006600; font-weight:bold;">&lt;</span> ApplicationDecorator
  <span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">Draper::LazyHelpers</span> <span style="color:#008000; font-style:italic;">#по идее должен избавить от явного объявления helper, но нет</span>
  decorates <span style="color:#ff3333; font-weight:bold;">:your_model</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> test_helpers
    content_tag <span style="color:#ff3333; font-weight:bold;">:div</span>, <span style="color:#996600;">&quot;it really works&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> test_helpers_via_h
    h.<span style="color:#9900CC;">content_tag</span> <span style="color:#ff3333; font-weight:bold;">:div</span>, <span style="color:#996600;">&quot;it really works&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>    
  <span style="color:#9966CC; font-weight:bold;">def</span> test_helpers_via_helpers
    helpers.<span style="color:#9900CC;">content_tag</span> <span style="color:#ff3333; font-weight:bold;">:div</span>, <span style="color:#996600;">&quot;it really works&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>   
  <span style="color:#9966CC; font-weight:bold;">def</span> may_be_that_is_working?
    helper.<span style="color:#9900CC;">content_tag</span> <span style="color:#ff3333; font-weight:bold;">:div</span>, <span style="color:#996600;">&quot;Hallelujah!&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>  
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">&gt; your_model_exemplar=YourModelDecorator.new YourModel.first
&gt; your_model_exemplar.test_helpers
NoMethodError: undefined method `content_tag' for #
&gt; your_model_exemplar.test_helpers_via_h
NoMethodError: undefined method `content_tag' for nil:NilClass
&gt; your_model_exemplar.test_helpers_via_helpers
NoMethodError: undefined method `content_tag' for nil:NilClass
&gt; your_model_exemplar.may_be_that_is_working?
=&gt; &quot;&lt;div&gt;Hallelujah!&lt;/div&gt;&quot;</pre></td></tr></table></div>

<p>Собственно все. Быть может все эти ошибки из-за того, что у меня ruby 1.9.2, а гем писался для 1.9.3 или рельсы у меня старые, а может просто доки у гема что-то типа квеста.<br />
<meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2012/12/illusion.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2012/12/18/rails-3-dekorator-draper/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
