<?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>The WebDevil &#187; Ruby</title>
	<atom:link href="http://dmitry.shaposhnik.name/category/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://dmitry.shaposhnik.name</link>
	<description>Enjoy development</description>
	<lastBuildDate>Mon, 24 May 2010 01:29:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Monitoring apache with GOD</title>
		<link>http://dmitry.shaposhnik.name/2009/11/30/monitoring-apache-with-god/</link>
		<comments>http://dmitry.shaposhnik.name/2009/11/30/monitoring-apache-with-god/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 09:38:07 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/?p=301</guid>
		<description><![CDATA[&#8220;Посчастливилось&#8221; мне заполучить VPS с сайтом на битриксе. Из-за Zend Optimizer (сорсы покриптованы) нет возможности установить APC. Вроде бы умеет xcache работать вместе с ним, еще не проверял. Периодически апач съедает всю память, свап, и машинка умирает окончательно. Хуже то, что апач работает с mpm-prefork, то есть он порождает не потоки, а процессы. И при [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Посчастливилось&#8221; мне заполучить VPS с сайтом на битриксе. Из-за Zend Optimizer (сорсы покриптованы) нет возможности установить APC. Вроде бы умеет xcache работать вместе с ним, еще не проверял. Периодически апач съедает всю память, свап, и машинка умирает окончательно. Хуже то, что апач работает с mpm-prefork, то есть он порождает не потоки, а процессы. И при мониторинге виден родительский процесс, который занимает всего 13М памяти. </p>
<p>Вначале для рестарта апача в период дикого роста я пытался использовать monit, но результат был неадекватный &#8211; при указании memory > 90% он убивал его когда памяти была занята всего треть.</p>
<p>После <a href="http://mmonit.com/monit/">monit</a> я попробовал использовать <a href="http://god.rubyforge.org/">god</a>. Но он мониторит только один процесс, без его чайлдов. Вроде бы есть проект <a href="http://github.com/arya/bluepill/">bluepill</a>, который идейно растет из god. Но примеры найти оказалось проблематично, да и в процессе решил таки остаться с god.</p>
<p>Среди условий у god была обнаружена фича &#8211; :lambda. После недолгого размышления на bash была написана строка, показывающая занятый апачем процент памяти:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ps -e -o pmem,cmd | grep apache2 | grep -v grep | awk '{sum += $1;}END{print sum;}'</div></div>
<p>что сразу переродилось в</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">w.restart_if do |restart|<br />
&nbsp; restart.condition(:lambda) do |c|<br />
&nbsp; &nbsp; c.lambda = lambda{`ps -e -o pmem,cmd | grep apache2 | grep -v grep | awk '{sum += \$1;}END{print sum;}'`.to_i &gt; 90}<br />
&nbsp; end<br />
end</div></div>
<p>Итого конфиг для апача выглядит так:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">God::Contacts::Email.delivery_method = :sendmail<br />
<br />
God.contact(:email) do |c|<br />
&nbsp; c.name = 'maintainer'<br />
&nbsp; c.email = 'pager@sms.gate.isp'<br />
end<br />
<br />
<br />
God::Contacts::Email.format = lambda do |name, email, message, time, priority, category, host|<br />
&nbsp; &lt; &lt;-EOF<br />
From: god<br />
To: #{name} &lt;#{email}&gt;<br />
Subject: Alert!<br />
Date: #{Time.now.httpdate}<br />
Message-Id: &lt; #{rand(1000000000).to_s(36)}.#{$$}.#{self.message_settings[:from]}&gt;<br />
<br />
#{host} (#{priority}): #{message}<br />
&nbsp; EOF<br />
end<br />
<br />
<br />
%w{80}.each do |port|<br />
&nbsp; God.watch do |w|<br />
&nbsp; &nbsp; w.name = &quot;apache2&quot;<br />
&nbsp; &nbsp; w.pid_file = &quot;/var/run/apache2.pid&quot;<br />
&nbsp; &nbsp; w.interval = 10.seconds # default<br />
&nbsp; &nbsp; w.start = &quot;/etc/init.d/apache2 start&quot;<br />
&nbsp; &nbsp; w.stop = &quot;/etc/init.d/apache2 stop&quot;<br />
&nbsp; &nbsp; w.restart = &quot;/etc/init.d/apache2 restart&quot;<br />
&nbsp; &nbsp; w.start_grace = 10.seconds<br />
&nbsp; &nbsp; w.restart_grace = 20.seconds<br />
<br />
&nbsp; &nbsp; w.start_if do |start|<br />
&nbsp; &nbsp; &nbsp; start.condition(:process_running) do |c|<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; c.interval = 5.seconds<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; c.running = false<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; end<br />
&nbsp; &nbsp; w.restart_if do |restart|<br />
&nbsp; &nbsp; &nbsp; restart.condition(:lambda) do |c|<br />
&nbsp; &nbsp; &nbsp; &nbsp; c.lambda = lambda{`ps -e -o pmem,cmd | grep apache2 | grep -v grep | awk '{sum += \$1;}END{print sum;}'`.to_i &gt; 90}<br />
&nbsp; &nbsp; &nbsp; &nbsp; c.notify = 'maintainer'<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; end<br />
&nbsp; end<br />
end</div></div>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2009/11/30/monitoring-apache-with-god/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DDoS</title>
		<link>http://dmitry.shaposhnik.name/2008/10/10/ddos/</link>
		<comments>http://dmitry.shaposhnik.name/2008/10/10/ddos/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 16:35:49 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Networking]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/?p=241</guid>
		<description><![CDATA[Привалило мне сие несчастье некоторое время назад. Ничем не примечательный сайт, ДДоСят уже неделю. В процессе борьбы выросло небольшое детище на Ruby, именуемое Bananoid. От слова bann. И живет оно на Github&#8217;е. Пока оно меня спасает, но непростительно есть 50-100% CPU. Ну что ж, будем лечить.
Хочу особо поблагодарить Критика, Devil&#8217;a и Andrew за помощь в [...]]]></description>
			<content:encoded><![CDATA[<p>Привалило мне сие несчастье некоторое время назад. Ничем не примечательный сайт, ДДоСят уже неделю. В процессе борьбы выросло небольшое детище на Ruby, именуемое <a href="http://github.com/daemon/bananoid/tree/master">Bananoid</a>. От слова bann. И живет оно на <a href="http://github.com">Github&#8217;е</a>. Пока оно меня спасает, но непростительно есть 50-100% CPU. Ну что ж, будем лечить.</p>
<p>Хочу особо поблагодарить <a href="http://kpumuk.info/">Критика</a>, <a href="http://devil.mk.ua/">Devil&#8217;a</a> и <a href="http://andrew2002.com/">Andrew</a> за помощь в бою.</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2008/10/10/ddos/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Ruby fixed in Ubuntu</title>
		<link>http://dmitry.shaposhnik.name/2008/06/27/ruby-fixed-in-ubuntu/</link>
		<comments>http://dmitry.shaposhnik.name/2008/06/27/ruby-fixed-in-ubuntu/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 08:00:26 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/?p=180</guid>
		<description><![CDATA[Наконец-то в Ubuntu полечили уязвимость в Ruby, обновление доступно из репозитария security.ubuntu.com.
Провериться можно выполнив (хоть в irb) код:
ary = &#91;&#93;; ary&#91;0x7fffffff&#93; = &#34;A&#34;
Тут больше и подробнее
]]></description>
			<content:encoded><![CDATA[<p>Наконец-то в Ubuntu полечили уязвимость в Ruby, обновление доступно из репозитария security.ubuntu.com.</p>
<p>Провериться можно выполнив (хоть в irb) код:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ary = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>; ary<span style="color:#006600; font-weight:bold;">&#91;</span>0x7fffffff<span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">&quot;A&quot;</span></div></div>
<p><a href="http://www.matasano.com/log/1070/updates-on-drew-yaos-terrible-ruby-vulnerabilities/">Тут больше и подробнее</a></p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2008/06/27/ruby-fixed-in-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FAM and Gamin</title>
		<link>http://dmitry.shaposhnik.name/2008/03/13/fam-and-gamin/</link>
		<comments>http://dmitry.shaposhnik.name/2008/03/13/fam-and-gamin/#comments</comments>
		<pubDate>Thu, 13 Mar 2008 11:24:01 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Newbie]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/2008/03/13/fam-and-gamin/</guid>
		<description><![CDATA[Вчера потратил немного времени и произвел скрипт-демон для отлова изменений в указанной папке.
Но вот работает связка только с FAM. А в Linux сейчас уже используется более продвинутый Gamin. Как подружить Ruby с Gamin?

Собссно, сам демон:
#!/usr/bin/ruby

# load the fam bindings
require 'fam'

require 'logger'
require 'rubygems'
require 'daemons'

my_path = Dir.pwd
monitored_path = Dir.pwd + '/monitored/'
Daemons.daemonize 
#Daemons.daemonize :ontop =&#62; true # For [...]]]></description>
			<content:encoded><![CDATA[<p>Вчера потратил немного времени и произвел скрипт-демон для отлова изменений в указанной папке.<br />
Но вот работает связка только с FAM. А в Linux сейчас уже используется более продвинутый Gamin. Как подружить Ruby с Gamin?<br />
<span id="more-178"></span><br />
Собссно, сам демон:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;">#!/usr/bin/ruby</span><br />
<br />
<span style="color:#008000; font-style:italic;"># load the fam bindings</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'fam'</span><br />
<br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'logger'</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'daemons'</span><br />
<br />
my_path = <span style="color:#CC00FF; font-weight:bold;">Dir</span>.<span style="color:#9900CC;">pwd</span><br />
monitored_path = <span style="color:#CC00FF; font-weight:bold;">Dir</span>.<span style="color:#9900CC;">pwd</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">'/monitored/'</span><br />
Daemons.<span style="color:#9900CC;">daemonize</span> <br />
<span style="color:#008000; font-style:italic;">#Daemons.daemonize :ontop =&gt; true # For debugging purposes. Doesn't detach.</span><br />
<br />
logger = <span style="color:#CC00FF; font-weight:bold;">Logger</span>.<span style="color:#9900CC;">new</span> my_path <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">'/dirmon.log'</span><br />
logger.<span style="color:#9900CC;">level</span> = <span style="color:#CC00FF; font-weight:bold;">Logger</span>::INFO<br />
<br />
<span style="color:#9966CC; font-weight:bold;">unless</span> test ?d, monitored_path<br />
&nbsp; log_file.<span style="color:#9900CC;">write</span> <span style="color:#996600;">'ERROR: Specified directory does not exist.'</span><br />
&nbsp; <span style="color:#CC0066; font-weight:bold;">exit</span> <span style="color:#006666;">1</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
pid = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>my_path <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">'/dirmon.pid'</span>,<span style="color:#996600;">&quot;w&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
pid.<span style="color:#9900CC;">write</span> <span style="color:#CC00FF; font-weight:bold;">Process</span>.<span style="color:#9900CC;">pid</span><br />
pid.<span style="color:#9900CC;">close</span><br />
<br />
<span style="color:#CC00FF; font-weight:bold;">Dir</span>.<span style="color:#9900CC;">chdir</span><span style="color:#006600; font-weight:bold;">&#40;</span>my_path<span style="color:#006600; font-weight:bold;">&#41;</span><br />
<br />
<span style="color:#008000; font-style:italic;"># open a connection to FAM and start monitoring specified path</span><br />
fam = <span style="color:#6666ff; font-weight:bold;">Fam::Connection</span>.<span style="color:#9900CC;">new</span><br />
fam.<span style="color:#9900CC;">monitor_dir</span> monitored_path<br />
logger.<span style="color:#9900CC;">info</span> <span style="color:#996600;">&quot;Fam connected&quot;</span><br />
<br />
<span style="color:#9966CC; font-weight:bold;">while</span> <span style="color:#0000FF; font-weight:bold;">true</span><br />
&nbsp; <span style="color:#008000; font-style:italic;"># if there are fam events pending, then process them</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">if</span> fam.<span style="color:#9900CC;">pending</span>?<br />
&nbsp; &nbsp; ev = fam.<span style="color:#9900CC;">next_event</span><br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">case</span> ev.<span style="color:#9900CC;">code</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#6666ff; font-weight:bold;">Fam::Event::CHANGED</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; logger.<span style="color:#9900CC;">info</span> <span style="color:#996600;">'File changed: '</span> <span style="color:#006600; font-weight:bold;">+</span> ev.<span style="color:#9900CC;">file</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#6666ff; font-weight:bold;">Fam::Event::DELETED</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; logger.<span style="color:#9900CC;">info</span> <span style="color:#996600;">'File deleted: '</span> <span style="color:#006600; font-weight:bold;">+</span> ev.<span style="color:#9900CC;">file</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#6666ff; font-weight:bold;">Fam::Event::CREATED</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; logger.<span style="color:#9900CC;">info</span> <span style="color:#996600;">'File created: '</span> <span style="color:#006600; font-weight:bold;">+</span> ev.<span style="color:#9900CC;">file</span><br />
&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2008/03/13/fam-and-gamin/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Railsforum.ru</title>
		<link>http://dmitry.shaposhnik.name/2008/01/18/railsforumru/</link>
		<comments>http://dmitry.shaposhnik.name/2008/01/18/railsforumru/#comments</comments>
		<pubDate>Thu, 17 Jan 2008 23:24:17 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[RoR]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/2008/01/18/railsforumru/</guid>
		<description><![CDATA[
Открылся новый ресурс &#8211; http://www.railsforum.ru.
Прошу любить и жаловать.
]]></description>
			<content:encoded><![CDATA[<p><img src='http://dmitry.shaposhnik.name/files/2008/01/rails.png' alt='rails logo' /><br />
Открылся новый ресурс &#8211; <a href="http://www.railsforum.ru">http://www.railsforum.ru</a>.<br />
Прошу любить и жаловать.</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2008/01/18/railsforumru/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>ruby directory listing</title>
		<link>http://dmitry.shaposhnik.name/2007/12/29/ruby-directory-listing/</link>
		<comments>http://dmitry.shaposhnik.name/2007/12/29/ruby-directory-listing/#comments</comments>
		<pubDate>Fri, 28 Dec 2007 22:27:54 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[RoR]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/2007/12/29/ruby-directory-listing/</guid>
		<description><![CDATA[Делая первые шаги в руби и рельсах наткнулся на необходимость получить листинг папки без &#8220;.&#8221; и &#8220;..&#8221;. Вот так реализовалось:
class Dir
&#160; def self.listing&#40;path, &#38;block&#41;
&#160; &#160; return nil if path.nil?
&#160; &#160; entries = Dir.entries&#40;path&#41;.reject! &#123; &#124;filename&#124; filename=='.' or filename=='..'&#125;
&#160; &#160; entries.each&#40;&#38;block&#41; if block_given?
&#160; &#160; entries
&#160; end
end
Огромаднейшее спасибо kpumuk&#8216;у за подсказки и помощь нюбу =)
]]></description>
			<content:encoded><![CDATA[<p>Делая первые шаги в руби и рельсах наткнулся на необходимость получить листинг папки без &#8220;.&#8221; и &#8220;..&#8221;. Вот так реализовалось:</p>
<div class="codecolorer-container ruby default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#CC00FF; font-weight:bold;">Dir</span><br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">listing</span><span style="color:#006600; font-weight:bold;">&#40;</span>path, <span style="color:#006600; font-weight:bold;">&amp;</span>block<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#0000FF; font-weight:bold;">nil</span> <span style="color:#9966CC; font-weight:bold;">if</span> path.<span style="color:#0000FF; font-weight:bold;">nil</span>?<br />
&nbsp; &nbsp; entries = <span style="color:#CC00FF; font-weight:bold;">Dir</span>.<span style="color:#9900CC;">entries</span><span style="color:#006600; font-weight:bold;">&#40;</span>path<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">reject</span>! <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>filename<span style="color:#006600; font-weight:bold;">|</span> filename==<span style="color:#996600;">'.'</span> <span style="color:#9966CC; font-weight:bold;">or</span> filename==<span style="color:#996600;">'..'</span><span style="color:#006600; font-weight:bold;">&#125;</span><br />
&nbsp; &nbsp; entries.<span style="color:#9900CC;">each</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&amp;</span>block<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> block_given?<br />
&nbsp; &nbsp; entries<br />
&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>Огромаднейшее спасибо <a href="http://kpumuk.info">kpumuk</a>&#8216;у за подсказки и помощь нюбу =)</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2007/12/29/ruby-directory-listing/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>rails got the power</title>
		<link>http://dmitry.shaposhnik.name/2007/12/19/rails-got-the-power/</link>
		<comments>http://dmitry.shaposhnik.name/2007/12/19/rails-got-the-power/#comments</comments>
		<pubDate>Wed, 19 Dec 2007 12:38:24 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[RoR]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/2007/12/19/rails-got-the-power/</guid>
		<description><![CDATA[Работаю сейчас над проектом. И вот для публикации надо сделать

кол-во просмотров
теги
рейтинги
комментарии

Начал писать на рельсах. И обнаружил

acts_as_taggable
acts_as_rated
acts_as_commentable

Только кол-во просмотров надо писать самому. Сильно впечатлился.
]]></description>
			<content:encoded><![CDATA[<p>Работаю сейчас над проектом. И вот для публикации надо сделать</p>
<ul>
<li>кол-во просмотров</li>
<li>теги</li>
<li>рейтинги</li>
<li>комментарии</li>
</ul>
<p>Начал писать на рельсах. И обнаружил</p>
<ul>
<li><a href="http://agilewebdevelopment.com/plugins/acts_as_taggable_on_steroids">acts_as_taggable</a></li>
<li><a href="http://acts-as-rated.rubyforge.org/">acts_as_rated</a></li>
<li><a href="http://www.juixe.com/techknow/index.php/2006/06/18/acts-as-commentable-plugin/">acts_as_commentable</a></li>
</ul>
<p>Только кол-во просмотров надо писать самому. Сильно впечатлился.</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2007/12/19/rails-got-the-power/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>NetBeans 6.0 released</title>
		<link>http://dmitry.shaposhnik.name/2007/12/04/netbeans-60-released/</link>
		<comments>http://dmitry.shaposhnik.name/2007/12/04/netbeans-60-released/#comments</comments>
		<pubDate>Mon, 03 Dec 2007 21:26:22 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RoR]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/2007/12/04/netbeans-60-released/</guid>
		<description><![CDATA[Наконец-то вышел NetBeans 6.0 &#8211; замечательная Java IDE. Для меня она ценна изумительной поддержкой Ruby, а также наличием в плагинах средств для работы с UML, PHP, C/C++.

]]></description>
			<content:encoded><![CDATA[<p>Наконец-то вышел NetBeans 6.0 &#8211; замечательная Java IDE. Для меня она ценна изумительной поддержкой Ruby, а также наличием в плагинах средств для работы с UML, PHP, C/C++.</p>
<p><a href="http://download.netbeans.org/netbeans/6.0/final/"><img src="http://blogs.sun.com/tor/resource/110x32_dl2.gif"/></a></p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2007/12/04/netbeans-60-released/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Rails: first steps</title>
		<link>http://dmitry.shaposhnik.name/2007/04/10/rails-first-steps/</link>
		<comments>http://dmitry.shaposhnik.name/2007/04/10/rails-first-steps/#comments</comments>
		<pubDate>Tue, 10 Apr 2007 06:34:46 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Newbie]]></category>
		<category><![CDATA[RoR]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://0804team.kiev.ua/dm/blog/2007/04/10/rails-first-steps/</guid>
		<description><![CDATA[Робко и нерешительно я начал делать первые шаги по рельсам. И что я могу сказать &#8211; мне нравится.

Первое с чем я пока столкнулся &#8211; с ковырянием в БД. Реализация &#8211; просто зверь!
Миграции &#8211; это нечто. Итак, для начала имеем пустую миграцию &#8211; версия 0. Далее была создана миграция (автоматом) v1. Что есть миграция? Вот что:
class [...]]]></description>
			<content:encoded><![CDATA[<p>Робко и нерешительно я начал делать первые шаги по рельсам. И что я могу сказать &#8211; мне нравится.<br />
<span id="more-105"></span><br />
Первое с чем я пока столкнулся &#8211; с ковырянием в БД. Реализация &#8211; просто зверь!<br />
Миграции &#8211; это нечто. Итак, для начала имеем пустую миграцию &#8211; версия 0. Далее была создана миграция (автоматом) v1. Что есть миграция? Вот что:</p>
<div class="codecolorer-container rails default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="rails codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">class</span> CreateNews <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Migrationdef</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">up</span><br />
create_table <span style="color:#ff3333; font-weight:bold;">:news</span>, <span style="color:#ff3333; font-weight:bold;">:force</span>=<span style="color:#006600; font-weight:bold;">&amp;</span>gt;true, &nbsp;<span style="color:#ff3333; font-weight:bold;">:options</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">&quot;ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_unicode_ci&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>t<span style="color:#006600; font-weight:bold;">|</span><br />
t.<span style="color:#9900CC;">column</span> <span style="color:#ff3333; font-weight:bold;">:title</span>, <span style="color:#ff3333; font-weight:bold;">:string</span>, <span style="color:#ff3333; font-weight:bold;">:limit</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006666;">255</span>, <span style="color:#ff3333; font-weight:bold;">:null</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">false</span><br />
t.<span style="color:#9900CC;">column</span> <span style="color:#ff3333; font-weight:bold;">:teaser</span>, <span style="color:#ff3333; font-weight:bold;">:text</span>, <span style="color:#ff3333; font-weight:bold;">:null</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">false</span> <br />
t.<span style="color:#9900CC;">column</span> <span style="color:#ff3333; font-weight:bold;">:body</span>, <span style="color:#ff3333; font-weight:bold;">:text</span>, <span style="color:#ff3333; font-weight:bold;">:null</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">false</span><br />
t.<span style="color:#9900CC;">column</span> <span style="color:#ff3333; font-weight:bold;">:created_at</span>, <span style="color:#ff3333; font-weight:bold;">:datetime</span>, <span style="color:#ff3333; font-weight:bold;">:null</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">false</span> <br />
t.<span style="color:#9900CC;">column</span> <span style="color:#ff3333; font-weight:bold;">:updated_at</span>, <span style="color:#ff3333; font-weight:bold;">:datetime</span>, <span style="color:#ff3333; font-weight:bold;">:null</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">false</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
<span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">down</span><br />
drop_table <span style="color:#ff3333; font-weight:bold;">:newsend</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>По привычке у меня установлен mysql (v5). И когда первый разописал структуру, тотекстовые данные сплошь были latin1. Потому в опциях добавил кодировку. Но после этого таблица стала не InnoDB! Оказалось, что по умолчанию рельсы создают таблицы типа InnoDB, если другое не указано в опциях. Как только добавляешь опции &#8211; требуется указать и таблицу. Ну вот и указал.</p>
<p>У многих возникает вопрос: а зачем же описывать структуру БД в коде? А для того, чтоб можно было красиво и легко переходить между изменениями, внесенными в процессе разработки. И не говорите, что БД спроектированная в начале работы над проектом не меняется никогда- не поверю, сам давно так думал, но всегда что-то но менялось.</p>
<p>И вот можно в следующей миграции описать какие поля добавить, что где поменять и т.п. &#8211; и в консоли на сервере сделать rake db:migrate VERSION=x. Разве это не удобно? Например, при откате на предыдущую версию тут же можно описать какие действия выполнять.</p>
<p>Ну и кроме миграций есть еще один плюс, который бросился мне в глаза: ведь эту же структуру не изменяя (вероятней всего, еще не пробовал) можно загнать и в PostgreSQL, и хоть в оракл.</p>
<p>И после этого &#8211; вот такой код для выбора всех новостей:</p>
<div class="codecolorer-container rails default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="rails codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#9966CC; font-weight:bold;">def</span> index<br />
&nbsp; <span style="color:#0066ff; font-weight:bold;">@news</span> = News.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:all</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>
<p>После написания таких кусочков задумался, а как же реализованы шаблоны и сильно порадовался &#8211; есть такая штука как layout и, собственно, view. View используется для отображения конкретного куска, а layout и есть шаблон всей страницы.</p>
<p>Layout:</p>
<div class="codecolorer-container rails default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="rails codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#006600; font-weight:bold;">&lt;</span>html<span style="color:#006600; font-weight:bold;">&gt;&lt;</span>head<span style="color:#006600; font-weight:bold;">&gt;&lt;</span>title<span style="color:#006600; font-weight:bold;">&gt;</span>FirstStep<span style="color:#006600; font-weight:bold;">&lt;/</span>title<span style="color:#006600; font-weight:bold;">&gt;</span><br />
<span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>= <span style="color:#5A0A0A; font-weight:bold;">javascript_include_tag</span> <span style="color:#996600;">'prototype'</span><span style="color:#006600; font-weight:bold;">%&gt;</span><br />
<span style="color:#006600; font-weight:bold;">&lt;/</span>head<span style="color:#006600; font-weight:bold;">&gt;&lt;</span>body<span style="color:#006600; font-weight:bold;">&gt;</span><br />
<span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>= <span style="color:#9966CC; font-weight:bold;">yield</span> <span style="color:#006600; font-weight:bold;">%&gt;&lt;/</span>body<span style="color:#006600; font-weight:bold;">&gt;</span><br />
<span style="color:#006600; font-weight:bold;">&lt;/</span>html<span style="color:#006600; font-weight:bold;">&gt;</span></div></div>
<p>View:</p>
<div class="codecolorer-container rails default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="rails codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#006600; font-weight:bold;">&lt;</span>ul<span style="color:#006600; font-weight:bold;">&gt;&lt;</span> <span style="color:#006600; font-weight:bold;">%</span> <span style="color:#0066ff; font-weight:bold;">@news</span>.<span style="color:#5A0A0A; font-weight:bold;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>sss<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#006600; font-weight:bold;">%&gt;</span><br />
<span style="color:#006600; font-weight:bold;">&lt;</span>li<span style="color:#006600; font-weight:bold;">&gt;</span><br />
<span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#006600; font-weight:bold;">%</span>= sss.<span style="color:#9900CC;">title</span> <span style="color:#006600; font-weight:bold;">%&gt;</span><br />
<br />
<span style="color:#006600; font-weight:bold;">&lt;/</span>li<span style="color:#006600; font-weight:bold;">&gt;</span><br />
<span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#006600; font-weight:bold;">%</span> <span style="color:#9966CC; font-weight:bold;">end</span> <span style="color:#006600; font-weight:bold;">%&gt;</span><br />
<span style="color:#006600; font-weight:bold;">&lt;/</span>ul<span style="color:#006600; font-weight:bold;">&gt;</span></div></div>
<p>Вот что я могу сказать о первых своих шагах &#8211; жутко нравится.</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2007/04/10/rails-first-steps/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Rails screencasts</title>
		<link>http://dmitry.shaposhnik.name/2007/04/09/rails-screencasts/</link>
		<comments>http://dmitry.shaposhnik.name/2007/04/09/rails-screencasts/#comments</comments>
		<pubDate>Mon, 09 Apr 2007 09:54:55 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[RoR]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[tutorials]]></category>

		<guid isPermaLink="false">http://0804team.kiev.ua/dm/blog/2007/04/09/rails-screencasts/</guid>
		<description><![CDATA[Найден поистине неисчерпаемый источник знаний
]]></description>
			<content:encoded><![CDATA[<p>Найден поистине <a href="http://www.bestechvideos.com/tag/ruby-on-rails/">неисчерпаемый источник знаний</a></p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2007/04/09/rails-screencasts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
