<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-439775273064312982</atom:id><lastBuildDate>Mon, 09 Nov 2009 16:30:48 +0000</lastBuildDate><title>PhoeniX, гикнутый птиц</title><description>Пролетая над гнездом пингвинов. Непопулярно от Linux и open-source до интернета и разработки.</description><link>http://thegeekbird.blogspot.com/</link><managingEditor>noreply@blogger.com (PhoeniX)</managingEditor><generator>Blogger</generator><openSearch:totalResults>193</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/geekbird" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-5547831953020445575</guid><pubDate>Sat, 24 Oct 2009 16:22:00 +0000</pubDate><atom:updated>2009-10-24T22:46:28.494+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">c/objc/c++</category><category domain="http://www.blogger.com/atom/ns#">devel</category><title>C/C++/Obj-C closures</title><description>Не так давно решил таки ознакомиться (никак не мигрировать, боже упаси) на представленный в MacOS X 10.6 GCD, почитал их введение в это дело (ровно одна строчка кода, всё остальное - маркетоидный буллщит), но одна фраза заставила на себя обратить внимание - основной компонент этого GCD - блоки - что-то подозрительно напоминали. И добрался до расшаренной коллегой &lt;a href="http://cocoawithlove.com/2009/10/how-blocks-are-implemented-and.html"&gt;статьи про реализацию блоков&lt;/a&gt;, и понял - ну точно, это ж самые что ни на есть closures, которым скоро 50 лет, их наконец-то добавят и в эти языки... Однако, всё сильнее и сильнее этот лагерь офункционаливается.&lt;br /&gt;Со статьёй крайне рекомендую ознакомиться, а потом по ссылкам в конце. Особенно по первой, там чуть ли не дословно цитируют ruby stdlib и часть парадигм RoR и вообще рубишных фреймворков.&lt;br /&gt;Однако в руби их использование гораздо более синтаксически-слаще...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-5547831953020445575?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/l7ONGy9ahL0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/l7ONGy9ahL0/ccobj-c-closures.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/10/ccobj-c-closures.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-5737768127543083668</guid><pubDate>Mon, 12 Oct 2009 14:30:00 +0000</pubDate><atom:updated>2009-10-12T20:43:46.042+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">rails</category><category domain="http://www.blogger.com/atom/ns#">devel</category><category domain="http://www.blogger.com/atom/ns#">rake</category><category domain="http://www.blogger.com/atom/ns#">db</category><title>Cache money warm-up</title><description>С недавнего времени использую в своём проекте &lt;a href="http://github.com/nkallen/cache-money"&gt;Cache money&lt;/a&gt;. Вещь хорошая, но, конечно же, есть и недостатки, впрочем, это предмет для форка и багфиксов. Стоит также отметить, что решение может уже и существует среди форков, коих много.&lt;br /&gt;Если у вас всё в порядке с памятью (RAM, I mean), то может возникнуть желание принудительно заполнить кеш по всем индексам всех моделей. Сниппет извлечён из моего Rakefile'а и адаптирован для использования в рельсах. Предупреждение: не тестировалось именно в рельсах и против составных индексов (хотя и предусматривает их использование).&lt;br /&gt;&lt;script src="http://gist.github.com/208457.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-5737768127543083668?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/71BSXNq32kk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/71BSXNq32kk/cache-money-warm-up.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/10/cache-money-warm-up.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-2221720028328095844</guid><pubDate>Thu, 27 Aug 2009 04:41:00 +0000</pubDate><atom:updated>2009-08-27T10:53:20.897+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><title>Using DRb</title><description>Сегодня ночью понял, что вслед за книгой the Ruby way дал маху и имел лишний вызов DRb.start_service на клиенте. Если почитать документацию, то в комментариях сэмпл кода  выясняется, что это требуется далеко не всегда и уже в доке к классу DRbServer выясняются детали. А ведь пока в сорец не залез - не понял. А это устранило единственный крупный bottleneck в приложении.&lt;br /&gt;Вот и читай после этого полезные книги.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-2221720028328095844?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/x6NoJmZ9e7Q" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/x6NoJmZ9e7Q/using-drb.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/08/using-drb.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-2730052826665344685</guid><pubDate>Sun, 09 Aug 2009 18:23:00 +0000</pubDate><atom:updated>2009-08-10T00:25:27.855+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">devel</category><category domain="http://www.blogger.com/atom/ns#">camping</category><title>Camping 1.9, Passenger &amp; ruby 1.9</title><description>Стремление найти себе на разные места приключений никогда не покидает таких как я, вот и захотелось завести текущий проект под ruby 1.9.1 и перевести под passenger.&lt;br /&gt;Пара слов - по общему моему впечатлению, мир руби не готов ещё использовать 1.9.1. То одно, то другое не работает, приходится хачить уже написанное, вставлять проверки версии языка, что-то вообще не лечится (так, у меня не завёлся монгрел, даже после советов с isitruby19.com)&lt;br /&gt;Начнём с самого ruby. Даже на InfoQ засветился скрипт для установки и переключения разных версий Ruby: &lt;a href="http://github.com/relevance/etc/blob/26ae85c2f6c7d2640a3c75d619ad7ab8fc1cc570/bash/ruby_switcher.sh"&gt;ruby_swither&lt;/a&gt;.&lt;br /&gt;Однако для моей цели пришлось внести в него поравки в секции для 1.9.1 (OMG, опять на одну маленькую строчку я убил полдня):&lt;br /&gt;&lt;div class="code" style="background-color: rgb(51, 51, 51); color: rgb(255, 255, 255);"&gt;&lt;font face="monospace"&gt;&amp;nbsp;&lt;font color="#8c37c8"&gt;&lt;b&gt;export&lt;/b&gt;&lt;/font&gt;&lt;font color="#98fa98"&gt;&amp;nbsp;GEM_HOME&lt;/font&gt;&lt;font color="#8c37c8"&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;~/.ruby_versions/ruby&lt;font color="#ffa0a0"&gt;-1&lt;/font&gt;.&lt;font color="#ffa0a0"&gt;9&lt;/font&gt;.&lt;font color="#ffa0a0"&gt;1&lt;/font&gt;-p129/lib/ruby/gems/&lt;font color="#ffa0a0"&gt;1&lt;/font&gt;.&lt;font color="#ffa0a0"&gt;9&lt;/font&gt;.&lt;font color="#ffa0a0"&gt;1&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;Дальше всё привычно - ставим гемы, ставим camping:&lt;br /&gt;gem install camping --source http://gems.judofyr.net&lt;br /&gt;Сам camping придётся поправить, вот патчик:&lt;br /&gt;&lt;div class="code" style="background-color: rgb(51, 51, 51); color: rgb(255, 255, 255);"&gt;&lt;font face="monospace"&gt;&lt;font color="#0095ff"&gt;&lt;b&gt;--- /Users/phoenix/projects/camping/lib/camping.rb&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2009-07-05 00:35:46.000000000 +0600&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0095ff"&gt;&lt;b&gt;+++ /Users/phoenix/.ruby_versions/ruby-1.9.1-p129/lib/ruby/gems/1.9.1/gems/camping-1.9.316/lib/camping.rb&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2009-08-09 18:07:48.000000000 +0600&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#8c37c8"&gt;&lt;b&gt;@@ -3,12 +3,12 @@&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;S=IO.read(__FILE__)rescue nil;P="&amp;lt;h1&amp;gt;Cam\ping Problem!&amp;lt;/h1&amp;gt;&amp;lt;h2&amp;gt;%s&amp;lt;/h2&amp;gt;"&lt;br /&gt;&amp;nbsp;U=Rack::Utils;Apps=[];class H&amp;lt;Hash&lt;br /&gt;&amp;nbsp;def method_missing m,*a;m.to_s=~/=$/?self[$`]=a[0]:a==[]?self[m.to_s]:super end&lt;br /&gt;&lt;font color="#ffdeac"&gt;-undef id,type;end;module Helpers;def R c,*g&lt;/font&gt;&lt;br /&gt;&lt;font color="#98fa98"&gt;+undef id,type if respond_to? :id;end;module Helpers;def R c,*g&lt;/font&gt;&lt;br /&gt;&amp;nbsp;p,h=/\(.+?\)/,g.grep(Hash);g-=h;raise"bad route"unless u=c.urls.find{|x|&lt;br /&gt;&amp;nbsp;break x if x.scan(p).size==g.size&amp;amp;&amp;amp;/^#{x}\/?$/=~(x=g.inject(x){|x,a|&lt;br /&gt;&amp;nbsp;x.sub p,U.escape((a[a.class.primary_key]rescue a))})}&lt;br /&gt;&amp;nbsp;h.any?? u+"?"+U.build_query(h[0]):u end;def / p&lt;br /&gt;&lt;font color="#ffdeac"&gt;-p[0]==?/?@root+p:p end;def URL c='/',*a;c=R(c, *a) if c.respond_to?:urls&lt;/font&gt;&lt;br /&gt;&lt;font color="#98fa98"&gt;+p[0]==?/?@root+p : p end;def URL c='/',*a;c=R(c, *a) if c.respond_to?:urls&lt;/font&gt;&lt;br /&gt;&amp;nbsp;c=self/c;c=@request.url[/.{8,}?(?=\/)/]+c if c[0]==?/;URI c end&lt;br /&gt;&amp;nbsp;end;module Base;attr_accessor:input,:cookies,:headers,:body,:status,:root&lt;br /&gt;&amp;nbsp;M=proc{|_,o,n|o.merge(n,&amp;amp;M)}&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;В прошлый раз я дал маху, заявив, что новые версии camping под Passenger не идут  - исправляюсь. config.ru:&lt;br /&gt;&lt;div class="code" style="background-color: rgb(51, 51, 51); color: rgb(255, 255, 255);"&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#98fa98"&gt;ENV&lt;/font&gt;[&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;GEM_HOME&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;] = &lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;/Users/phoenix/.ruby_versions/ruby-1.9.1-p129/lib/ruby/gems/1.9.1&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;br /&gt;&lt;font color="#cc5c5c"&gt;require&lt;/font&gt;&amp;nbsp;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;rubygems&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;br /&gt;&lt;font color="#cc5c5c"&gt;require&lt;/font&gt;&amp;nbsp;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;camping&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;br /&gt;&lt;font color="#98fa98"&gt;$:&lt;/font&gt;&amp;nbsp;&amp;lt;&amp;lt; ::&lt;font color="#0095ff"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/font&gt;.expand_path(::&lt;font color="#0095ff"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/font&gt;.dirname(&lt;font color="#ffa0a0"&gt;__FILE__&lt;/font&gt;))&lt;br /&gt;&lt;font color="#cc5c5c"&gt;require&lt;/font&gt;&amp;nbsp;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;bin/app&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#0095ff"&gt;&lt;b&gt;App&lt;/b&gt;&lt;/font&gt;.create &lt;font color="#8c37c8"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#0095ff"&gt;&lt;b&gt;App&lt;/b&gt;&lt;/font&gt;.respond_to? &lt;font color="#ffa0a0"&gt;:create&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;run &lt;font color="#0095ff"&gt;&lt;b&gt;App&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;Удачного полёта!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-2730052826665344685?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/BAtiA-Tugmc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/BAtiA-Tugmc/camping-19-passenger-ruby-19.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/08/camping-19-passenger-ruby-19.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-7144337161760964203</guid><pubDate>Fri, 07 Aug 2009 17:57:00 +0000</pubDate><atom:updated>2009-08-07T23:59:11.656+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">devel</category><category domain="http://www.blogger.com/atom/ns#">camping</category><title>Делегирование методов контроллеров в Camping</title><description>Потребовалось мне недавно написать обёртку ко всем существующим ныне в приложении контроллерам, дабы их можно было вызывать через единую точку входа. Именно обёртку, поскольку всё к чертям переписывать не хотелось принципиально да и старый механизм работы мне бы самому пригодился. После пятнично-вечернего воскуривания сорцов Camping'а я это сделал (&amp;lt;ненависть&amp;gt;сорцы кемпинга - это лютое изнасилование мозга. Пусть этому вроде как и есть оправдание - '4K full of gags pocket framework', но так писать а тем более читать код нельзя&amp;lt;/ненависть&amp;gt;). Вот вам примерчик - пусть есть контроллер, который просто возвращает завёрнутые в JSON свои параметры, и есть потребность вызвать его из другого контроллера:&lt;br /&gt;&lt;div class="code" style="background-color: rgb(51, 51, 51); color: rgb(255, 255, 255);"&gt;&lt;font face="monospace"&gt;&amp;nbsp; &lt;font color="#cc5c5c"&gt;class&lt;/font&gt;&amp;nbsp;&lt;font color="#0095ff"&gt;&lt;b&gt;Controller&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#cc5c5c"&gt;def&lt;/font&gt;&amp;nbsp;&lt;font color="#98fa98"&gt;post&lt;/font&gt;(param1, param2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8c37c8"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#ffdeac"&gt;"&lt;/font&gt;&lt;font color="#ffa0a0"&gt;{\"&lt;/font&gt;&lt;font color="#ffdeac"&gt;#{&lt;/font&gt;param1&lt;font color="#ffdeac"&gt;}&lt;/font&gt;&lt;font color="#ffa0a0"&gt;\":\"&lt;/font&gt;&lt;font color="#ffdeac"&gt;#{&lt;/font&gt;param2&lt;font color="#ffdeac"&gt;}&lt;/font&gt;&lt;font color="#ffa0a0"&gt;\"}&lt;/font&gt;&lt;font color="#ffdeac"&gt;"&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#cc5c5c"&gt;end&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#cc5c5c"&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="monospace"&gt; controller_post_responce = &lt;font color="#0095ff"&gt;&lt;b&gt;App&lt;/b&gt;&lt;/font&gt;.post(&lt;font color="#ffa0a0"&gt;:Controller&lt;/font&gt;, &lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;param1&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;, &lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;param2&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;).body&lt;/font&gt;&lt;br /&gt;&lt;/div&gt;При этом вызываемый контроллер унаследует все куки, хедеры, окружение и прочий мусор вызывающего, так что вызываемый контролер и не заметит подвоха и менять в нём ничего не придётся.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-7144337161760964203?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/dFQAdr4UCjI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/dFQAdr4UCjI/blog-post_07.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/08/blog-post_07.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-8570499306690480785</guid><pubDate>Sun, 02 Aug 2009 17:48:00 +0000</pubDate><atom:updated>2009-08-02T23:49:42.724+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">blog</category><title>Шаблон</title><description>Сменил шаблон блога на какой-то другой - теперь он резиновый и не уродует так код. Он мне не нравится, но я более-менее подправил цвета, чтобы глаз не резало.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-8570499306690480785?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/QX-6yGZB8po" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/QX-6yGZB8po/blog-post.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/08/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-3409311542986212993</guid><pubDate>Sun, 02 Aug 2009 16:48:00 +0000</pubDate><atom:updated>2009-08-02T23:17:13.388+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">camping</category><title>способы запуска Camping приложений</title><description>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Недавно ради интереса посчитал - после моих экспериментов над Camping приложением его можно запустить 4 способами:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;традиционным camping app.rb&lt;/li&gt;&lt;li&gt;напрямую app.rb или ruby app.rb&lt;/li&gt;&lt;li&gt;через Passenger&lt;/li&gt;&lt;li&gt;с использованием библиотеки Daemons&lt;/li&gt;&lt;/ul&gt;Первый не требует никаких дополнительных действий и использует все традиционные умолчания, этим и удобен.&lt;br /&gt;Второй требует, чтобы приложение само себя запустило, примерно таким кодом:&lt;br /&gt;&lt;div style="background-color: rgb(51, 51, 51); color: rgb(255, 255, 255);" class="code"&gt;&lt;span style="font-family:monospace;"&gt; &lt;span style="color:#8c37c8;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#ffa0a0;"&gt;__FILE__&lt;/span&gt; == &lt;span style="color:#98fa98;"&gt;$0&lt;/span&gt; || !&lt;span style="color:#98fa98;"&gt;ENV&lt;/span&gt;[&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;RACK_ENV&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;].nil?&lt;br /&gt;  &lt;span style="color:#0095ff;"&gt;&lt;b&gt;App&lt;/b&gt;&lt;/span&gt;::&lt;span style="color:#0095ff;"&gt;&lt;b&gt;Models&lt;/b&gt;&lt;/span&gt;::&lt;span style="color:#0095ff;"&gt;&lt;b&gt;Base&lt;/b&gt;&lt;/span&gt;.establish_connection &lt;span style="color:#ffa0a0;"&gt;:adapter&lt;/span&gt; =&amp;gt; &lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;sqlite3&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;, \&lt;br /&gt;    &lt;span style="color:#ffa0a0;"&gt;:database&lt;/span&gt; =&amp;gt; &lt;span style="color:#ffdeac;"&gt;"&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;#{&lt;/span&gt;&lt;span style="color:#0095ff;"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/span&gt;.expand_path(&lt;span style="color:#0095ff;"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/span&gt;.dirname(&lt;span style="color:#ffa0a0;"&gt;__FILE__&lt;/span&gt;))&lt;span style="color:#ffdeac;"&gt;}&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;/../app.db&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;"&lt;/span&gt;&lt;br /&gt;  &lt;span style="color:#0095ff;"&gt;&lt;b&gt;App&lt;/b&gt;&lt;/span&gt;.create&lt;br /&gt;&lt;span style="color:#8c37c8;"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#8c37c8;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#ffa0a0;"&gt;__FILE__&lt;/span&gt; == &lt;span style="color:#98fa98;"&gt;$0&lt;/span&gt;&lt;br /&gt;  &lt;span style="color:#cc5c5c;"&gt;require&lt;/span&gt; &lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;mongrel/camping&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;br /&gt;  server = &lt;span style="color:#0095ff;"&gt;&lt;b&gt;Mongrel&lt;/b&gt;&lt;/span&gt;::&lt;span style="color:#0095ff;"&gt;&lt;b&gt;Camping&lt;/b&gt;&lt;/span&gt;::start(&lt;span style="color:#0095ff;"&gt;&lt;b&gt;OPTIONS&lt;/b&gt;&lt;/span&gt;[&lt;span style="color:#ffa0a0;"&gt;:app_host&lt;/span&gt;], &lt;span style="color:#0095ff;"&gt;&lt;b&gt;OPTIONS&lt;/b&gt;&lt;/span&gt;[&lt;span style="color:#ffa0a0;"&gt;:app_port&lt;/span&gt;], &lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;/&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;, &lt;span style="color:#0095ff;"&gt;&lt;b&gt;App&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&lt;div style="background-color: rgb(51, 51, 51); color: rgb(255, 255, 255);" id="code"&gt;&lt;span style="font-family:monospace;"&gt;   &lt;span style="color:#8c37c8;"&gt;&lt;b&gt;trap&lt;/b&gt;&lt;/span&gt;(&lt;span style="color:#ffdeac;"&gt;"&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;INT&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;"&lt;/span&gt;){server.stop;&lt;span style="color:#8c37c8;"&gt;&lt;b&gt;exit&lt;/b&gt;&lt;/span&gt;}&lt;br /&gt;  &lt;span style="color:#8c37c8;"&gt;&lt;b&gt;trap&lt;/b&gt;&lt;/span&gt;(&lt;span style="color:#ffdeac;"&gt;"&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;KILL&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;"&lt;/span&gt;){server.stop;&lt;span style="color:#8c37c8;"&gt;&lt;b&gt;exit&lt;/b&gt;&lt;/span&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;  &lt;span style="color:#98fa98;"&gt;$logger&lt;/span&gt;.info &lt;span style="color:#ffdeac;"&gt;"&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;Apnp server running at &lt;a href="http://255.255.255.255/"&gt;http://&lt;/a&gt;&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;#{&lt;/span&gt;&lt;span style="color:#0095ff;"&gt;&lt;b&gt;OPTIONS&lt;/b&gt;&lt;/span&gt;[&lt;span style="color:#ffa0a0;"&gt;:app_host&lt;/span&gt;]&lt;span style="color:#ffdeac;"&gt;}&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;:&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;#{&lt;/span&gt;&lt;span style="color:#0095ff;"&gt;&lt;b&gt;OPTIONS&lt;/b&gt;&lt;/span&gt;[&lt;span style="color:#ffa0a0;"&gt;:app_port&lt;/span&gt;]&lt;span style="color:#ffdeac;"&gt;}&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;"&lt;/span&gt;&lt;br /&gt;  server.acceptor.join&lt;br /&gt;&lt;span style="color:#8c37c8;"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Первый условный блок общий для данного метода и запуска из-под Passenger. Полезно, если требуется запустить как-то нестандартно - с другим адаптером БД etc. Есть один неприятный момент - этот метод работает только с 1.5 версией Camping, так что если используется Git-версия(1.9) - то стоит или ставить обычным gem install camping или использовать другой способ запуска (судя по экспериментам, для 1.9 работает только первый).&lt;br /&gt;Третий способ тоже требует создания AR подключения и запуска приложения. Запуск из-под Passenger обнаруживается по наличию переменной окружения &lt;a href="http://www.modrails.com/documentation/Users%20guide%20Apache.html#_deploying_a_rack_based_ruby_application"&gt;RACK_ENV&lt;/a&gt;. Об использовании этой переменной немного ниже. Ну а config.ru выглядит так:&lt;br /&gt;&lt;div style="background-color: rgb(51, 51, 51); color: rgb(255, 255, 255);" class="code"&gt;&lt;span style="font-family:monospace;"&gt; &lt;span style="color:#008000;"&gt;# vim:syntax=ruby&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#cc5c5c;"&gt;require&lt;/span&gt; &lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;rubygems&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#cc5c5c;"&gt;require&lt;/span&gt; &lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;rack&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#98fa98;"&gt;$:&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style="color:#0095ff;"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/span&gt;.expand_path(&lt;span style="color:#0095ff;"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/span&gt;.dirname(&lt;span style="color:#ffa0a0;"&gt;__FILE__&lt;/span&gt;))&lt;br /&gt;&lt;span style="color:#cc5c5c;"&gt;require&lt;/span&gt; &lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;bin/app&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;br /&gt;run &lt;span style="color:#0095ff;"&gt;&lt;b&gt;Rack&lt;/b&gt;&lt;/span&gt;::&lt;span style="color:#0095ff;"&gt;&lt;b&gt;Adapter&lt;/b&gt;&lt;/span&gt;::&lt;span style="color:#0095ff;"&gt;&lt;b&gt;Camping&lt;/b&gt;&lt;/span&gt;.new(&lt;span style="color:#0095ff;"&gt;&lt;b&gt;App&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Самый, на мой взгляд, удобный способ со многими преимуществами: легко перезапускать приложение (да, уже не автоматически, как в первом), ну и все возможности апача на руках. С автоматическим перезапуском поможет vim:&lt;br /&gt;&lt;div style="background-color: rgb(51, 51, 51); color: rgb(255, 255, 255);" class="code"&gt;&lt;span style="font-family:monospace;"&gt; &lt;span style="color:#008000;"&gt;" restart Passenger app&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#8c37c8;"&gt;&lt;b&gt;au&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#0095ff;"&gt;&lt;b&gt;BufWritePost&lt;/b&gt;&lt;/span&gt; * &lt;span style="color:#8c37c8;"&gt;&lt;b&gt;silent&lt;/b&gt;&lt;/span&gt; !test &lt;span style="color:#8c37c8;"&gt;&lt;b&gt;-&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#8c37c8;"&gt;&lt;b&gt;f&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#ffa0a0;"&gt;'tmp/restart.txt'&lt;/span&gt; &lt;span style="color:#8c37c8;"&gt;&lt;b&gt;&amp;amp;&amp;amp;&lt;/b&gt;&lt;/span&gt; touch &lt;span style="color:#ffa0a0;"&gt;'tmp/restart.txt'&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Четвёртый способ заключается в написании небольшого враппера вокруг приложения, который запускает его вторым способом, но в фоне:&lt;br /&gt;&lt;div style="background-color: rgb(51, 51, 51); color: rgb(255, 255, 255);" class="code"&gt;&lt;span style="font-family:monospace;"&gt; &lt;span style="color:#cc5c5c;"&gt;#!/usr/bin/env ruby&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#cc5c5c;"&gt;require&lt;/span&gt; &lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;rubygems&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#cc5c5c;"&gt;require&lt;/span&gt; &lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;daemons&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0095ff;"&gt;&lt;b&gt;Daemons&lt;/b&gt;&lt;/span&gt;.run( &lt;span style="color:#0095ff;"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/span&gt;.expand_path(&lt;span style="color:#0095ff;"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/span&gt;.dirname(&lt;span style="color:#ffa0a0;"&gt;__FILE__&lt;/span&gt;))+&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;/app.rb&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Однако на практике, имхо, это проблем создаёт больше, чем преимуществ, и ради демонизации приложения можно использовать того же пассажира.&lt;br /&gt;Ну и напоследок об окружениях. Идея RAILS_ENV хороша, почему бы и тут не сделать так же.&lt;br /&gt;&lt;div style="background-color: rgb(51, 51, 51); color: rgb(255, 255, 255);" class="code"&gt;&lt;span style="font-family:monospace;"&gt; &lt;span style="color:#0095ff;"&gt;&lt;b&gt;DEVELOPMENT&lt;/b&gt;&lt;/span&gt; = &lt;span style="color:#98fa98;"&gt;ENV&lt;/span&gt;[&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;RACK_ENV&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;].nil? || &lt;span style="color:#98fa98;"&gt;ENV&lt;/span&gt;[&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;RACK_ENV&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;] == &lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;development&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt; &lt;span style="color:#008000;"&gt;# some things are for development purposes only&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#98fa98;"&gt;$logger&lt;/span&gt; = ((&lt;span style="color:#98fa98;"&gt;ENV&lt;/span&gt;[&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;RACK_ENV&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;'&lt;/span&gt;] || &lt;span style="color:#8c37c8;"&gt;&lt;b&gt;defined?&lt;/b&gt;&lt;/span&gt; &lt;span style="color:#0095ff;"&gt;&lt;b&gt;Daemons&lt;/b&gt;&lt;/span&gt; )? \&lt;br /&gt;           &lt;span style="color:#008000;"&gt;# file-based logger for background execution and stdout for the rest&lt;/span&gt;&lt;br /&gt;           &lt;span style="color:#0095ff;"&gt;&lt;b&gt;Logger&lt;/b&gt;&lt;/span&gt;.new(&lt;span style="color:#ffdeac;"&gt;"&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;#{&lt;/span&gt;&lt;span style="color:#0095ff;"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/span&gt;.expand_path(&lt;span style="color:#0095ff;"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/span&gt;.dirname(&lt;span style="color:#ffa0a0;"&gt;__FILE__&lt;/span&gt;))&lt;span style="color:#ffdeac;"&gt;}&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;/../log/app.log&lt;/span&gt;&lt;span style="color:#ffdeac;"&gt;"&lt;/span&gt;, &lt;span style="color:#ffa0a0;"&gt;10&lt;/span&gt;, &lt;span style="color:#ffa0a0;"&gt;1024000&lt;/span&gt;) : \&lt;br /&gt;           &lt;span style="color:#0095ff;"&gt;&lt;b&gt;Logger&lt;/b&gt;&lt;/span&gt;.new(&lt;span style="color:#98fa98;"&gt;STDOUT&lt;/span&gt;))&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Так, у меня в development окружении поставлены в некоторых местах задержки для тестирования клиента этого приложения, а для всех фоновых способов запуска логи пишутся в файл вместо стандартного вывода. При желании, раз уж нам бесплатно досталась в руки RACK_ENV, то можно делать подключения к разным базам и писать логи в разные файлы в зависимости от неё.&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img src="http://img.zemanta.com/pixy.gif?x-id=f86c8470-fae5-811a-aaa4-eaeaec8fb9a2" alt="" class="zemanta-pixie-img" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-3409311542986212993?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/EcHtB4gW6hU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/EcHtB4gW6hU/camping.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/08/camping.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-6129780720977388515</guid><pubDate>Thu, 30 Jul 2009 05:22:00 +0000</pubDate><atom:updated>2009-07-30T11:24:01.056+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">devel</category><category domain="http://www.blogger.com/atom/ns#">iphone</category><title>XCode screenshots</title><description>Заметка на полях - XCode сохраняет скриншоты с устройств в ~/Library/Application Support/Developer/Shared/Xcode/Screenshots&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-6129780720977388515?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/pGCP8IL3IRE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/pGCP8IL3IRE/xcode-screenshots.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/07/xcode-screenshots.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-549067295962953299</guid><pubDate>Fri, 17 Jul 2009 07:39:00 +0000</pubDate><atom:updated>2009-07-17T13:42:04.782+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">fun</category><category domain="http://www.blogger.com/atom/ns#">dvcs</category><category domain="http://www.blogger.com/atom/ns#">devel</category><title>Colored svn diff</title><description>С подачи &lt;a href="http://www.sdfgh153.ru/2009/07/blog-post.html"&gt;Тапа&lt;/a&gt; делаем svn diff а-ля гит - цветной и в less'е:&lt;br /&gt;&lt;div id="code" style="background-color:#333333; color:#ffffff"&gt;&lt;font face="monospace"&gt; &lt;font color="#fbf204"&gt;1 &lt;/font&gt;&lt;font color="#008000"&gt;#!/bin/sh&lt;/font&gt;&lt;br /&gt;&lt;font color="#fbf204"&gt;2 &lt;/font&gt;svn diff | awk &lt;font color="#8c37c8"&gt;&lt;b&gt;'&lt;/b&gt;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;/^\+(.*)$/ { print &amp;quot;\033[32m&amp;quot; $0 &amp;quot;\033[0m&amp;quot;}; /^-(.*)$/ { print &amp;quot;\033[31m&amp;quot; $0 &amp;quot;\033[0m&amp;quot;}; /^[^+-].*$/ {print $0}&lt;/font&gt;&lt;font color="#8c37c8"&gt;&lt;b&gt;'&lt;/b&gt;&lt;/font&gt;&amp;nbsp;| less &lt;font color="#ffdeac"&gt;-r&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-549067295962953299?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/WFGXIKmHKlI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/WFGXIKmHKlI/colored-svn-diff.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/07/colored-svn-diff.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-2819192899537937225</guid><pubDate>Tue, 14 Jul 2009 11:45:00 +0000</pubDate><atom:updated>2009-07-14T17:54:41.353+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">blog</category><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">google</category><title>О моветоне в поведении моего блога</title><description>Обратил внимание после того, как мне пришёл комментарий. Внезапно в ленте руникса всплыли все (или многие, не суть) мои записи про линукс. Подозреваю в этом глюк гугла, который недавно заподозрил мой блог в спаме и заблокировал, вероятно происшедшее - результат разблокирования. Хотя в ридере лента этого блога не обновилась (да, я читаю себя и иногда даже нахожу опечатки и отправляюсь править пост), так что это может быть и глюк агрегатора руникса. Делайте выводы.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-2819192899537937225?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/MLzMHz90caM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/MLzMHz90caM/blog-post.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">8</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/07/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-3791703423744873054</guid><pubDate>Tue, 14 Jul 2009 06:41:00 +0000</pubDate><atom:updated>2009-07-14T12:50:52.789+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">camping</category><title>Роутинг в Camping, Regexp'ы в Ruby</title><description>Если коротко - не следуйте документации в способе задания роутов для контроллеров. Документация советует так:&lt;br /&gt;&lt;div id="code" style="background-color:#333333; color:#ffffff"&gt;&lt;font face="monospace"&gt; &lt;font color="#fbf204"&gt;147 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#cc5c5c"&gt;class&lt;/font&gt;&amp;nbsp;&lt;font color="#0095ff"&gt;&lt;b&gt;AccountAck&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;lt; &lt;font color="#0095ff"&gt;&lt;b&gt;R&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;/([\dabcdef]+)/&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;А надо так:&lt;br /&gt;&lt;div id="code" style="background-color:#333333; color:#ffffff"&gt;&lt;font face="monospace"&gt; &lt;font color="#fbf204"&gt;147 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#cc5c5c"&gt;class&lt;/font&gt;&amp;nbsp;&lt;font color="#0095ff"&gt;&lt;b&gt;AccountAck&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;lt; &lt;font color="#0095ff"&gt;&lt;b&gt;R&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#ffdeac"&gt;%r!&lt;/font&gt;&lt;font color="#ffa0a0"&gt;/([\dabcdef]+)/&lt;/font&gt;&lt;font color="#ffdeac"&gt;!&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;иначе может статься, что на более сложных роутах вы получите 404.&lt;br /&gt;PS: если кто запамятовал, то %r!regexp! (где вместо ! может быть и другой символ) - это такой способ обрамить регексп, наряду с /regexp/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-3791703423744873054?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/nCw6EiNzGKo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/nCw6EiNzGKo/camping-regexp-ruby.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/07/camping-regexp-ruby.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-3488154347508356739</guid><pubDate>Sun, 12 Jul 2009 17:45:00 +0000</pubDate><atom:updated>2009-07-13T00:22:22.795+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">c/objc/c++</category><category domain="http://www.blogger.com/atom/ns#">testing</category><category domain="http://www.blogger.com/atom/ns#">rake</category><category domain="http://www.blogger.com/atom/ns#">camping</category><title>Github'но-тестировочное</title><description>Смотрел я тут скринкаст на тему ObjC, было там немного про тестирование, и понял я - дальше так нельзя - тестировать. Полез в гугль (хотя кхе, туда я за этим давно залезал, руки не доходили применить), тот меня выкинул сначала на одного из коммитеров в Camping с его тестсьюитом '&lt;a href="http://github.com/judofyr/camping-test/tree/master"&gt;camping/test&lt;/a&gt;', а потом и на &lt;a href="http://github.com/topfunky/mosquito/tree"&gt;mosquito&lt;/a&gt; в &lt;a href="http://github.com/topfunky"&gt;репозитарии автора&lt;/a&gt; того самого скринкаста. Скажу сразу, москит отстал от жизни и не работает, зато в том репозитории нашлось много полезного: ruby-style &lt;a href="http://github.com/topfunky/categories/tree/master"&gt;категории&lt;/a&gt; над основными Cocoa классами, &lt;a href="http://github.com/topfunky/osx-window-sizing/tree"&gt;скрипты&lt;/a&gt; для &lt;span style="font-style:italic;"&gt;правильной&lt;/span&gt; максимизации окна (очень пригождается с MacVim) и куча пищи для размышлений.&lt;br /&gt;&lt;br /&gt;Заодно накидал Rake task для дампа фикстур из используемого кемпингом (и только кемпингом, забудем про Rails, аминь) sqlite:&lt;br /&gt;&lt;div id="code" style="background-color:#333333; color:#ffffff"&gt;&lt;font face="monospace"&gt; &lt;font color="#fbf204"&gt;&amp;nbsp;1 &lt;/font&gt;&lt;font color="#cc5c5c"&gt;require&lt;/font&gt;&amp;nbsp;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;rake&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;br /&gt;&lt;font color="#fbf204"&gt;&amp;nbsp;2 &lt;/font&gt;&lt;br /&gt;&lt;font color="#fbf204"&gt;&amp;nbsp;3 &lt;/font&gt;&lt;font color="#cc5c5c"&gt;require&lt;/font&gt;&amp;nbsp;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;rubygems&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;br /&gt;&lt;font color="#fbf204"&gt;&amp;nbsp;4 &lt;/font&gt;&lt;font color="#cc5c5c"&gt;require&lt;/font&gt;&amp;nbsp;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;activerecord&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;br /&gt;&lt;font color="#fbf204"&gt;&amp;nbsp;5 &lt;/font&gt;&lt;br /&gt;&lt;font color="#fbf204"&gt;&amp;nbsp;6 &lt;/font&gt;desc &lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;Generate fixtures for all tables of current project&lt;/font&gt;&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fbf204"&gt;&amp;nbsp;7 &lt;/font&gt;task &lt;font color="#ffa0a0"&gt;:generate_fixtures&lt;/font&gt;&amp;nbsp;&lt;font color="#8c37c8"&gt;&lt;b&gt;do&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fbf204"&gt;&amp;nbsp;8 &lt;/font&gt;&amp;nbsp;&amp;nbsp;database = &lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffdeac"&gt;#{&lt;/font&gt;&lt;font color="#98fa98"&gt;ENV&lt;/font&gt;[&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;HOME&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;]&lt;font color="#ffdeac"&gt;}&lt;/font&gt;&lt;font color="#ffa0a0"&gt;/.camping.db&lt;/font&gt;&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fbf204"&gt;&amp;nbsp;9 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#0095ff"&gt;&lt;b&gt;ActiveRecord&lt;/b&gt;&lt;/font&gt;::&lt;font color="#0095ff"&gt;&lt;b&gt;Base&lt;/b&gt;&lt;/font&gt;.establish_connection(&lt;font color="#ffa0a0"&gt;:adapter&lt;/font&gt;&amp;nbsp;=&amp;gt; &lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;sqlite3&lt;/font&gt;&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;, &lt;font color="#ffa0a0"&gt;:database&lt;/font&gt;&amp;nbsp;=&amp;gt; database)&lt;br /&gt;&lt;font color="#fbf204"&gt;10 &lt;/font&gt;&amp;nbsp;&amp;nbsp;project = &lt;font color="#0095ff"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/font&gt;.basename(&lt;font color="#0095ff"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/font&gt;.expand_path(&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;.&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;)).downcase&lt;br /&gt;&lt;font color="#fbf204"&gt;11 &lt;/font&gt;&amp;nbsp;&amp;nbsp;tables = &lt;font color="#ffdeac"&gt;`&lt;/font&gt;&lt;font color="#ffa0a0"&gt;sqlite3 &lt;/font&gt;&lt;font color="#ffdeac"&gt;#{&lt;/font&gt;database&lt;font color="#ffdeac"&gt;}&lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;nbsp;&amp;quot;.tables&amp;quot;&lt;/font&gt;&lt;font color="#ffdeac"&gt;`&lt;/font&gt;.split(&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;).reject{ |&lt;font color="#98fa98"&gt;t&lt;/font&gt;|&amp;nbsp;t.include?(&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;sessions&lt;/font&gt;&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;) || t.include?(&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;schema_infos&lt;/font&gt;&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;)}.collect{|&lt;font color="#98fa98"&gt;t&lt;/font&gt;|&amp;nbsp;t &lt;font color="#8c37c8"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;t.include? project}&lt;br /&gt;&lt;font color="#fbf204"&gt;12 &lt;/font&gt;&amp;nbsp;&amp;nbsp;tables.each &lt;font color="#8c37c8"&gt;&lt;b&gt;do&lt;/b&gt;&lt;/font&gt;&amp;nbsp;|&lt;font color="#98fa98"&gt;table_name&lt;/font&gt;|&lt;br /&gt;&lt;font color="#fbf204"&gt;13 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0095ff"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/font&gt;.open(&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;test/fixtures/&lt;/font&gt;&lt;font color="#ffdeac"&gt;#{&lt;/font&gt;table_name&lt;font color="#ffdeac"&gt;}&lt;/font&gt;&lt;font color="#ffa0a0"&gt;.yml&lt;/font&gt;&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;, &lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;w&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;) &lt;font color="#8c37c8"&gt;&lt;b&gt;do&lt;/b&gt;&lt;/font&gt;&amp;nbsp;|&lt;font color="#98fa98"&gt;file&lt;/font&gt;|&lt;br /&gt;&lt;font color="#fbf204"&gt;14 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data = &lt;font color="#0095ff"&gt;&lt;b&gt;ActiveRecord&lt;/b&gt;&lt;/font&gt;::&lt;font color="#0095ff"&gt;&lt;b&gt;Base&lt;/b&gt;&lt;/font&gt;.connection.select_all(&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;SELECT * FROM &lt;/font&gt;&lt;font color="#ffdeac"&gt;#{&lt;/font&gt;table_name&lt;font color="#ffdeac"&gt;}&lt;/font&gt;&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;)&lt;br /&gt;&lt;font color="#fbf204"&gt;15 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rows = {}&lt;br /&gt;&lt;font color="#fbf204"&gt;16 &lt;/font&gt;&lt;br /&gt;&lt;font color="#fbf204"&gt;17 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data.each &lt;font color="#8c37c8"&gt;&lt;b&gt;do&lt;/b&gt;&lt;/font&gt;&amp;nbsp;|&lt;font color="#98fa98"&gt;record&lt;/font&gt;|&lt;br /&gt;&lt;font color="#fbf204"&gt;18 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rows[&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffdeac"&gt;#{&lt;/font&gt;table_name&lt;font color="#ffdeac"&gt;}&lt;/font&gt;&lt;font color="#ffa0a0"&gt;_&lt;/font&gt;&lt;font color="#ffdeac"&gt;#{&lt;/font&gt;record[&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;id&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;]&lt;font color="#ffdeac"&gt;}&lt;/font&gt;&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;] = record&lt;br /&gt;&lt;font color="#fbf204"&gt;19 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8c37c8"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fbf204"&gt;20 &lt;/font&gt;&lt;br /&gt;&lt;font color="#fbf204"&gt;21 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file.write rows.to_yaml&lt;br /&gt;&lt;font color="#fbf204"&gt;22 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#8c37c8"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fbf204"&gt;23 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#8c37c8"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#fbf204"&gt;24 &lt;/font&gt;&lt;font color="#8c37c8"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;Там много 'длиннострочников', но понять можно. Дампит все таблицы используя в качестве имени проекта имя текущей директории.&lt;br /&gt;Не могу не пнуть попутно юродивый svn - перед тестированием всего и вся разложил сорцы по полочкам, так svn положенный в другое место файл считает новым, в то время как гит даже частично патченный и перемещённый после этого файл понимает и считает именно перемещённым.&lt;br /&gt;Думается, пора покрыть тестами, оформить и выкинуть на гитхаб в виде библиотечки часть одного интересного  проекта, но это уже как руки дойдут.&lt;br /&gt;Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-3488154347508356739?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/ya2CbO-FGac" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/ya2CbO-FGac/github.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/07/github.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-2153989403856280676</guid><pubDate>Sun, 05 Jul 2009 08:22:00 +0000</pubDate><atom:updated>2009-07-13T00:22:22.814+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">rant</category><category domain="http://www.blogger.com/atom/ns#">rails</category><title>ActiveSupport и Logger</title><description>&lt;blockquote&gt;NEVER Override Existing Methods.&lt;br /&gt;Never, ever do this. Never override an existing method. Period, full stop, no excuse.&lt;br /&gt;&lt;a href="http://www.pathf.com/blogs/2008/12/rails-worst-practices-13-coding-nightmares-you-should-avoid/"&gt;Rails Worst Practices: 13 Coding Nightmares You Should Avoid&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Сначала грешил на Camping. А Camping использует ActiveSupport. И вот к чему это приводит.&lt;br /&gt;ActiveSupport весь такой на белом коне приходит и превращает все сообщения стандартного логгера в абсолютно бесполезные puts без какой-либо полезной информации о времени и уровне сообщения. В документации способ отключения этого безобразия либо нерабочий либо нетривиальный - у меня не пошло. Ну так по рукам ему за это!&lt;br /&gt;&lt;div id="code" style="background-color:#333333; color:#ffffff"&gt;&lt;font face="monospace"&gt;&lt;font color="#cc5c5c"&gt;class&lt;/font&gt;&amp;nbsp;&lt;font color="#0095ff"&gt;&lt;b&gt;Logger&lt;/b&gt;&lt;/font&gt;; &lt;font color="#8c37c8"&gt;&lt;b&gt;undef&lt;/b&gt;&lt;/font&gt;&amp;nbsp;format_message; &lt;font color="#cc5c5c"&gt;alias&lt;/font&gt;&amp;nbsp;&lt;font color="#98fa98"&gt;format_message&lt;/font&gt;&amp;nbsp;old_format_message;&lt;font color="#cc5c5c"&gt;end&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-2153989403856280676?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/VkaicdaCUZs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/VkaicdaCUZs/activesupport-logger.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/07/activesupport-logger.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-4049545129448245502</guid><pubDate>Sat, 04 Jul 2009 14:33:00 +0000</pubDate><atom:updated>2009-07-13T00:22:22.829+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">google</category><category domain="http://www.blogger.com/atom/ns#">camping</category><title>ActionMailer с Gmail без Rails: Camping</title><description>В последнее время пишу прототип внутреннего сервиса на &lt;a href="http://camping.rubyforge.org/files/README.html"&gt;Camping&lt;/a&gt;. Попутно должен заметить, что это весьма хорошая штука от чокнутого _why для очень быстрого прототипирования - весь мой фронтэнд лежит в одном файле и занимает 150 строк.&lt;br /&gt;И само собой, без отправки электронной почты не обошлось. А раз уж camping это такие очень маленькие рельсы - почему бы не встать на плечи ещё одного из гигантов мира рельс - ActionMailer. К условиям задачи добавилась и необходимость использования Google Apps for Domains.&lt;br /&gt;Первым делом нужно научить Ruby &lt;= 1.8.7 там авторизоваться:&lt;br /&gt;&lt;blockquote&gt;sudo gem install openrain-action_mailer_tls -s http://gems.github.com&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://github.com/openrain/action_mailer_tls/tree/master"&gt;подробнее&lt;/a&gt;&lt;br /&gt;и в корне проекта с camping приложением создаём mailer.rb&lt;br /&gt;&lt;div id="code" style="background-color:#333333; color:#ffffff"&gt;&lt;font face="monospace"&gt; &lt;br /&gt;&lt;font color="#86cdeb"&gt;# for this example the folder structure should be as follow&lt;/font&gt;&lt;br /&gt;&lt;font color="#86cdeb"&gt;#&lt;/font&gt;&lt;br /&gt;&lt;font color="#86cdeb"&gt;# --+ camping_project_root&lt;/font&gt;&lt;br /&gt;&lt;font color="#86cdeb"&gt;#&amp;nbsp;&amp;nbsp; |-- mailer.rb (this file)&lt;/font&gt;&lt;br /&gt;&lt;font color="#86cdeb"&gt;#&amp;nbsp;&amp;nbsp; |--+ mailer&lt;/font&gt;&lt;br /&gt;&lt;font color="#86cdeb"&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|-- new_account.erb&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;font color="#cc5c5c"&gt;require&lt;/font&gt;&amp;nbsp;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;rubygems&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;br /&gt;&lt;font color="#cc5c5c"&gt;require&lt;/font&gt;&amp;nbsp;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;action_mailer&lt;/font&gt;&lt;font color="#ffdeac"&gt;'&lt;/font&gt;&lt;br /&gt;&lt;font color="#cc5c5c"&gt;require&lt;/font&gt;&amp;nbsp;&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;smtp_tls&lt;/font&gt;&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;font color="#cc5c5c"&gt;class&lt;/font&gt;&amp;nbsp;&lt;font color="#0095ff"&gt;&lt;b&gt;Mailer&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&amp;lt; &lt;font color="#0095ff"&gt;&lt;b&gt;ActionMailer&lt;/b&gt;&lt;/font&gt;::&lt;font color="#0095ff"&gt;&lt;b&gt;Base&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#cc5c5c"&gt;def&lt;/font&gt;&amp;nbsp;&lt;font color="#98fa98"&gt;new_account&lt;/font&gt;(bar)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recipients recipient&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;noreply@company.com&lt;/font&gt;&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;subject&amp;nbsp;&amp;nbsp; &lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;New account confirmation&lt;/font&gt;&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;body&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;:foo&lt;/font&gt;&amp;nbsp;=&amp;gt; bar &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#cc5c5c"&gt;end&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;font color="#cc5c5c"&gt;end&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;font color="#0095ff"&gt;&lt;b&gt;Mailer&lt;/b&gt;&lt;/font&gt;.template_root = &lt;font color="#0095ff"&gt;&lt;b&gt;File&lt;/b&gt;&lt;/font&gt;.dirname(&lt;font color="#ffa0a0"&gt;__FILE__&lt;/font&gt;)&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;font color="#0095ff"&gt;&lt;b&gt;Mailer&lt;/b&gt;&lt;/font&gt;.smtp_settings = {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;:address&lt;/font&gt;&amp;nbsp;&amp;nbsp;=&amp;gt; &lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;smtp.gmail.com&lt;/font&gt;&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;:domain&lt;/font&gt;&amp;nbsp;=&amp;gt; &lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;company.com&lt;/font&gt;&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;:port&lt;/font&gt;&amp;nbsp;&amp;nbsp;=&amp;gt; &lt;font color="#ffa0a0"&gt;587&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;:user_name&lt;/font&gt;&amp;nbsp;&amp;nbsp;=&amp;gt; &lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;noreply@company.com&lt;/font&gt;&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;:password&lt;/font&gt;&amp;nbsp;&amp;nbsp;=&amp;gt; &lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;noway&lt;/font&gt;&lt;font color="#ffdeac"&gt;&amp;quot;&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;:authentication&lt;/font&gt;&amp;nbsp;=&amp;gt; &lt;font color="#ffa0a0"&gt;:plain&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;:enable_starttls_auto&lt;/font&gt;&amp;nbsp;=&amp;gt; &lt;font color="#ffa0a0"&gt;true&lt;/font&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;И в camping приложении подключаем этот мэйлер.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-4049545129448245502?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/bpAY0E5Ov8I" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/bpAY0E5Ov8I/actionmailer-gmail-rails-camping.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/07/actionmailer-gmail-rails-camping.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-6848884446027480022</guid><pubDate>Sat, 20 Jun 2009 06:51:00 +0000</pubDate><atom:updated>2009-07-13T00:22:22.781+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">devel</category><category domain="http://www.blogger.com/atom/ns#">mac</category><category domain="http://www.blogger.com/atom/ns#">iphone</category><title>Использование акселерометра мака для симулятора</title><description>Захотелось мне использовать в своём приложении акселерометр, симулятор его не поддерживает, а железяка для тестирования ещё в пути. А тут такая оказия - на ловца и &lt;a href="http://ifiddling.blogspot.com/2009/01/dummy2.html"&gt;пост&lt;/a&gt; с описанием и решением проблемы бежит.&lt;br /&gt;Если очень коротко, то идея состоит в захвате данных с акселерометра мака и посылке этих данных по сети приложению в симуляторе.&lt;br /&gt;Итак, берём &lt;a href="http://unimotion.sourceforge.net/"&gt;Unimotion&lt;/a&gt;, собираем, туда же кладём питон скрипт, приведённый в указанном выше посте. Запускаем эту связку:&lt;br /&gt;&lt;blockquote&gt;./motion -f 17 | python sendaccsim.py&lt;/blockquote&gt;&lt;br /&gt; Из &lt;a href="http://code.google.com/p/accelerometer-simulator/source/checkout"&gt;симулятора акселерометра&lt;/a&gt; берём два файла (AccelerometerSimulation.h и AccelerometerSimulation.m) и подключаем хедер там, где используем акселерометр. Запускаем симулятор, крутим наш мак и так и сяк. Со стороны выглядит странно, внимание, использовать только при наличии вменяемых коллег.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-6848884446027480022?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/yuesXNDvmQk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/yuesXNDvmQk/blog-post_20.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/06/blog-post_20.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-6544811625283193202</guid><pubDate>Fri, 19 Jun 2009 18:56:00 +0000</pubDate><atom:updated>2009-07-13T00:22:22.782+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">mac</category><title>Пара MacOs полезностей</title><description>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Как и всякий свитчер, пытаюсь прогнуть под себя новое окружение. Сгладить неровности отсутствующих возможностей. И вот две из них.&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Возможность развернуть окно по хотекею.&lt;/b&gt;&lt;br/&gt;Ну что за моветон, показывать в окне лишь часть необходимого для восприятия содержимого, и не иметь в самой keyboard-friendly системе шортката для разворачивания окна? Solved. Читаем &lt;a href='http://www.macosxhints.com/article.php?story=20051227001809626'&gt;пост&lt;/a&gt;, пишем скрипт, вешаем на хоткей в QuickSilver.&lt;br/&gt;&lt;br/&gt;&lt;b&gt;Возможность запретить показ иконки запущенного приложения в доке.&lt;/b&gt;&lt;br/&gt;Я и так знаю, что у меня бегут QuickSilver и Namely, мне не нужны их иконки в доке. И если первый имеет для такого опцию - что с остальным? &lt;a href='http://foggynoggin.com/dockdodger'&gt;Dock Dodger&lt;/a&gt; в помощь. Читаем дисклеймер, не пугаемся - всё обратимо, отучаем приложения от дурного поведения.&lt;br/&gt;Пока всё, остался открытым вопрос файлового менеджера.&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-6544811625283193202?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/tjF04_KCYRo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/tjF04_KCYRo/macos.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/06/macos.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-7874044565793987526</guid><pubDate>Sat, 13 Jun 2009 18:13:00 +0000</pubDate><atom:updated>2009-07-13T00:22:22.792+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">mac</category><title>Linux -&gt; MacOs switcher'ство</title><description>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Ну вот вам и первый свитчерский пост.&lt;br/&gt;Я не буду говорить, как хорош или плох мак и линукс, я яростно ненавижу макодрочеров и не понимаю оголтелых линупсоедов (да-да, можете начинать отписываться), скажу в этой заметке лишь о том, чего мне не хватало в маке после линукса.&lt;br/&gt;Вообще, хорошей отправной точкой может послужить &lt;a href='http://www.culater.net/software/SIMBL/SIMBL.php'&gt;SIMBL&lt;/a&gt; с его плагинами, из которых я сразу поставил &lt;a href='http://limechat.net/inputswitcher/'&gt;InputSwitcher&lt;/a&gt;, дабы в каждом окне была своя раскладка клавиатуры (согласитесь, глупо иметь в терминале русский и в IM, за редким случаем, английский) и &lt;a href='http://visor.binaryage.com/'&gt;Visor&lt;/a&gt; - терминал должен быть под рукой всегда, на любом из Spaces, а это и zsh и git и vim и многое другое. В качестве замены gkrellm (не идеальной, не хватает иногда шкал, обновляемых в реальном времени) подойдёт &lt;a href='http://islayer.com/apps/istatmenus/'&gt;iStatMenus&lt;/a&gt; - видно, когда процесс ушёл в бесконечный цикл, пора прибить обожравшийся памяти браузер или невовремя дорвавшийся до тарифицирумого траффика iTunes. Для быстрого запуска приложений в стиле автодополнения коммандной строки и krunner подойдёт &lt;a href='http://amarsagoo.info/namely/'&gt;namely&lt;/a&gt;.&lt;br/&gt;Кроме того, нашёл мак сборки давно знакомых вещей - git, MacVim, zsh, arora, keepassx - это всё-таки такой специальный уличный юникс, много чего родного тут работает.&lt;br/&gt;Чего не хватает до сих пор - толкового двухпанельного файлового менеджера и плеера (iTunes не предлагать, плавали  - знаем). Тут я готов прослыть извращенцем и поставить krusader &amp;amp; amarok в маковской сборке.&lt;br/&gt;Такой вот кратенький забег. Для остального либо нашлись очевидные аналоги - либо вопрос пока открыт...&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-7874044565793987526?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/mCVCXRZ_6UY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/mCVCXRZ_6UY/linux-macos-switcher.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">10</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/06/linux-macos-switcher.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-1963657432350737618</guid><pubDate>Sat, 13 Jun 2009 09:07:00 +0000</pubDate><atom:updated>2009-07-13T00:22:22.800+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">blog</category><category domain="http://www.blogger.com/atom/ns#">mac</category><category domain="http://www.blogger.com/atom/ns#">live</category><title>О текущем положении</title><description>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;В связи с некоторыми жизненными обстоятельствами, сдерживающими публикацию материалов, часть их пролежала даже не в столе а в голове, но Besser spät als gar nicht, как говорят немцы.&lt;br/&gt;Итак, уже две недели я работаю в новой компании, основная сфера моей деятельности теперь будет связана с разработкой под маки и в частности под iPhone OS. Как вы понимаете, из этого вытекает несколько вероятных следствий:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;появятся посты с мак и свитчерской тематикой&lt;/li&gt;&lt;li&gt;появятся посты о разработке в данной области&lt;/li&gt;&lt;li&gt;посты про Linux не пропадут, но упадёт их частота&lt;/li&gt;&lt;li&gt;к maemo возможно даже увеличение внимания - я стал чаще таскать свою таблетку&lt;/li&gt;&lt;/ul&gt;Ну вот, предупреждённый вооружён, думайте сами, а я пока продолжу просвещаться, радоваться жизни и черкать следующую заметку.&lt;br/&gt;PS: &lt;a href='http://sdfgh153.ru/'&gt;Тап&lt;/a&gt;, опять тебе спасибо.&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-1963657432350737618?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/bgDMVhr0tio" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/bgDMVhr0tio/blog-post.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/06/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-5603658329202781871</guid><pubDate>Thu, 28 May 2009 06:43:00 +0000</pubDate><atom:updated>2009-07-13T00:22:22.823+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">n810</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>низкий уровень звука в maemo</title><description>Продолжая ковырять таблетку.&lt;br /&gt;Как уже неоднократно убеждались владельцы, использовать maemo девайсы в качестве плеера крайне неудобно - &lt;a href="http://talk.maemo.org/showthread.php?t=14490"&gt;они тихие&lt;/a&gt;.&lt;br /&gt;А дело в том, что каждый раз при втыкании и вытыкании наушников программым методом снижается уровень pcm канала. Понаблюдать и порулить этим можно из миксера aumix, который водится в том же треде. И как одно из решений - тем же самым аумиксом по крону устанавливать звук на максимум (не бойтесь, не оглохнете - плеера управляют другим каналом):&lt;br /&gt;&lt;blockquote&gt;aumix -w + 100&lt;/blockquote&gt;&lt;br /&gt;Это решение универсально и гарантированно выжмет максимум во всех приложениях. Правда, не кардинально, но ощутимо.&lt;br /&gt;&lt;br /&gt;Ещё один путь - сорвать к чертям программный микшер, что, например, позволяет делать mplayer:&lt;br /&gt;&lt;blockquote&gt;cat ~/.mplayer/config&lt;br /&gt;softvol=1&lt;br /&gt;softvol-max=300&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;300% от нормального - уже достаточно для мегаполиса и поездов с идущей в комплекте гарнитурой (даже слегка слишком - появляются шумы, которые слышны даже моему отдавленному взводом медведей уху). Минус - шумы, не все плееры поддерживают вывод через mplayer (kagu умеет).&lt;br /&gt;&lt;br /&gt;В принципе, этого достаточно, хотя остаётся ещё несколько путей - replay gain, HAL, крутейшие наушники KOSS - но я уже слегка оглох...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-5603658329202781871?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/ZGGGzHsfYRI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/ZGGGzHsfYRI/maemo.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/05/maemo.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-7085922090207882859</guid><pubDate>Wed, 27 May 2009 08:34:00 +0000</pubDate><atom:updated>2009-07-13T00:22:22.784+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">n810</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>идентификация ОС</title><description>Байка: в одном продукте под ОС семейства видовс версия ОС определялась по наличию в корне диска c: папок с именами windows, winnt и т.п., что приводило к странным флуктуациям при наличии нескольких или отсутствию таковых.&lt;br /&gt;&lt;br /&gt;Призказка: работал на n810 плеер kagu, да и перестал. И UKMP тоже перестал. А без kagu n810 вообще не плеер, поскольку была в kagu самая главная возможность любого плеера - быстро поставить его на паузу (аппаратной кнопкой на корпусе или на родной гарнитуре).&lt;br /&gt;&lt;br /&gt;Сказка: а причина была как в той самой байке - из-за странного способа идентификации ОС: по наличию определённого пути (который я удалил, дабы в автодополнении шелла не мешал). Вот так:&lt;br /&gt;&lt;blockquote&gt;#/usr/bin/MediaCenter.py&lt;br /&gt;if os.name=="posix" and os.path.exists('/media/mmc1'): ISMAEMO=1&lt;/blockquote&gt;&lt;br /&gt;Из-за этого устанавливалась неправильная глубина цвета и любое приложение, использовавшее pygame, падало.&lt;br /&gt;&lt;br /&gt;Мораль: надо определять ОС другим способом. Хотя бы по ядру:&lt;br /&gt;&lt;blockquote&gt;uname -a&lt;br /&gt;Linux Nokia-N810-23-14 2.6.21-omap1 #2 Wed Jul 16 12:29:11 EEST 2008 armv6l unknown&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-7085922090207882859?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/TtwOPEOCLrI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/TtwOPEOCLrI/blog-post.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/05/blog-post.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-3585909904230049971</guid><pubDate>Thu, 12 Mar 2009 17:08:00 +0000</pubDate><atom:updated>2009-07-13T00:22:22.795+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><title>дисковые буфера и hibernate в Linux</title><description>Пока нет ничего серьёзного к опубликованию, вот вам лёгенькая тема.&lt;br /&gt;Заметил давно, что используемый мой метод hibernate в виде ядра с патчами &lt;a href="http://www.tuxonice.net"&gt;tuxonice&lt;/a&gt; и скриптом оттуда же ну слишком уж медленный. Краткое раскидывание мозгами и раскапывание вопроса показало, что достаточно большую долю времени занимает сохранение дисковых буферов, что само по себе весьма экстравагантный финт - сохранять на винт кеш обращений к винту. Решил отключать кеш перед засыпанием и восстанавливать после просыпания:&lt;br /&gt;&lt;blockquote&gt;#/etc/hibernate/common.conf&lt;br /&gt;OnSuspend 10 echo 3 &gt; /proc/sys/vm/drop_caches&lt;br /&gt;OnResume 10 echo 0 &gt; /proc/sys/vm/drop_caches &lt;/blockquote&gt;&lt;br /&gt;Время засыпания теперь - "как в лучших домах Лондона и Филадельфии".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-3585909904230049971?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/gwCImPwArKI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/gwCImPwArKI/hibernate-linux.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/03/hibernate-linux.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-1150464466055539254</guid><pubDate>Sun, 01 Mar 2009 13:20:00 +0000</pubDate><atom:updated>2009-07-13T00:22:22.780+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Убираем многословность в Kopete</title><description>Часто бывает - постишь код, кусок документации или просто цитату в Kopete и лог разговора моментально забивается так, что за деревьями леса не видно. Скальпель!&lt;br /&gt;В папке с темой оформления окна разговора Kopete (я скопировал одну из стандартных, получился такой путь: ~/.kde/share/apps/kopete/styles/PXClear/Contents/Resources) ищем main.css и добавляем&lt;br /&gt;&lt;br /&gt;&lt;div id="code" style="background-color:#333333; color:#ffffff"&gt;&lt;font face="monospace"&gt; &lt;font color="#98fb98"&gt;.OutgoingMessage&lt;/font&gt;&lt;span style="background-color: #333333"&gt;&lt;font color="#ffffff"&gt;,&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;font color="#98fb98"&gt;.NextOutgoingMessage&lt;/font&gt;&lt;br /&gt;&lt;font color="#98fb98"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0095ff"&gt;&lt;b&gt;height&lt;/b&gt;&lt;/font&gt;: &lt;font color="#ffa0a0"&gt;40px&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0095ff"&gt;&lt;b&gt;overflow&lt;/b&gt;&lt;/font&gt;:&lt;font color="#0095ff"&gt;&lt;b&gt;hidden&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color="#98fb98"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#98fb98"&gt;.OutgoingMessage&lt;/font&gt;:&lt;font color="#cd5c5c"&gt;hover&lt;/font&gt;,&amp;nbsp;&lt;font color="#98fb98"&gt;.NextOutgoingMessage&lt;/font&gt;:&lt;font color="#cd5c5c"&gt;hover&lt;/font&gt;&lt;br /&gt;&lt;font color="#98fb98"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0095ff"&gt;&lt;b&gt;height&lt;/b&gt;&lt;/font&gt;:&lt;font color="#0095ff"&gt;&lt;b&gt;auto&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color="#98fb98"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#98fb98"&gt;.IncomingMessage&lt;/font&gt;&lt;span style="background-color: #333333"&gt;&lt;font color="#ffffff"&gt;,&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;font color="#98fb98"&gt;.NextIncomingMessage&lt;/font&gt;&lt;br /&gt;&lt;font color="#98fb98"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0095ff"&gt;&lt;b&gt;height&lt;/b&gt;&lt;/font&gt;: &lt;font color="#ffa0a0"&gt;40px&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0095ff"&gt;&lt;b&gt;overflow&lt;/b&gt;&lt;/font&gt;:&lt;font color="#0095ff"&gt;&lt;b&gt;hidden&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color="#98fb98"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#98fb98"&gt;.IncomingMessage&lt;/font&gt;:&lt;font color="#cd5c5c"&gt;hover&lt;/font&gt;,&amp;nbsp;&lt;font color="#98fb98"&gt;.NextIncomingMessage&lt;/font&gt;:&lt;font color="#cd5c5c"&gt;hover&lt;/font&gt;&lt;br /&gt;&lt;font color="#98fb98"&gt;{&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0095ff"&gt;&lt;b&gt;height&lt;/b&gt;&lt;/font&gt;:&lt;font color="#0095ff"&gt;&lt;b&gt;auto&lt;/b&gt;&lt;/font&gt;;&lt;br /&gt;&lt;font color="#98fb98"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;посты длиннее двух строчек (с моим размером шрифта) отображаются полностью только при наведении на них мышки.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-1150464466055539254?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/Acen5M5_xzk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/Acen5M5_xzk/kopete.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/02/kopete.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-355351833412129514</guid><pubDate>Fri, 27 Feb 2009 20:46:00 +0000</pubDate><atom:updated>2009-07-13T00:22:22.832+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">rant</category><title>О web-based IDE и тонких клиентах вообще</title><description>Вся эта шумиха вокруг web-based IDE(bespin, heroku) и тонких клиентах для веб-сервисов вообще (google mail, docs) останется шумихой до тех пор, пока тонкий клиент (ноутбук, MID, телефон etc. + браузер) не будет считаться неработоспособным, если он не в состоянии функционировать в течении всего периода бодрствования человека без подзарядки (скажем 20 часов - в случае более длительного периода без доступа к розетке вам скорее нужно ружьё, нож и палатка) и обеспечить доступ в сеть из любой точки земного шара, включая метро, самолёт, глухую тайгу и дикие горы.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-355351833412129514?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/FWHvpWlxgkc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/FWHvpWlxgkc/web-based-ide.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/02/web-based-ide.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-3449270792680524739</guid><pubDate>Sun, 08 Feb 2009 14:07:00 +0000</pubDate><atom:updated>2009-07-13T00:23:34.642+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">c/objc/c++</category><category domain="http://www.blogger.com/atom/ns#">devel</category><title>Improving KDE4.2 taskbar plasmoid</title><description>Захотелось мне удобства дополнительного в вышеозначенном плазмоиде, а именно - знакомого по браузерным вкладкам поведения, когда шелчок по заголовку вкладки средней кнопкой закрывает её. Так и тут захотел закрывать окна шелчком колеса на соотв. кнопке таскбара (важно - при этом не затрагиваются окна, бывшие ранее в группе - я не использую группировку). В общем-то, всё просто, хотя пришлось вспомнить великий могучий цпп и поползать по иерархии классов:&lt;br /&gt;&lt;br /&gt;&lt;div id="code" style="background-color:#333333; color:#ffffff"&gt;&lt;font face="monospace"&gt; &lt;font color="#ffff00"&gt;&amp;nbsp;1 &lt;/font&gt;&lt;font color="#0095ff"&gt;&lt;b&gt;diff --git a/plasma/applets/tasks/windowtaskitem.cpp b/plasma/applets/tasks/windowtaskitem.cpp&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&amp;nbsp;2 &lt;/font&gt;index aaaabbd..d4adaa4 100644&lt;br /&gt;&lt;font color="#ffff00"&gt;&amp;nbsp;3 &lt;/font&gt;&lt;font color="#0095ff"&gt;&lt;b&gt;--- a/plasma/applets/tasks/windowtaskitem.cpp&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&amp;nbsp;4 &lt;/font&gt;&lt;font color="#0095ff"&gt;&lt;b&gt;+++ b/plasma/applets/tasks/windowtaskitem.cpp&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&amp;nbsp;5 &lt;/font&gt;&lt;font color="#ee82ee"&gt;&lt;b&gt;@@ -84,6 +84,10 @@&lt;/b&gt;&lt;/font&gt;&lt;font color="#cd5c5c"&gt;&amp;nbsp;void WindowTaskItem::mousePressEvent(QGraphicsSceneMouseEvent *event)&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;&amp;nbsp;6 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (isGrouped()) {&lt;br /&gt;&lt;font color="#ffff00"&gt;&amp;nbsp;7 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; parentGroup()-&amp;gt;collapse();&lt;br /&gt;&lt;font color="#ffff00"&gt;&amp;nbsp;8 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;font color="#ffff00"&gt;&amp;nbsp;9 &lt;/font&gt;&lt;font color="#98fb98"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else{&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;10 &lt;/font&gt;&lt;font color="#98fb98"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_task-&amp;gt;close();&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;11 &lt;/font&gt;&lt;font color="#98fb98"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; close();&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;12 &lt;/font&gt;&lt;font color="#98fb98"&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff00"&gt;13 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&lt;font color="#ffff00"&gt;14 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AbstractTaskItem::mousePressEvent(event);&lt;br /&gt;&lt;font color="#ffff00"&gt;15 &lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;В связи с чем вопрос - кому-то интересно такое поведение плазмоида?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-3449270792680524739?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/jrIRSjmnBl4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/jrIRSjmnBl4/improving-kde42-taskbar-plasmoid.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/02/improving-kde42-taskbar-plasmoid.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-439775273064312982.post-7079340110036615824</guid><pubDate>Mon, 02 Feb 2009 00:44:00 +0000</pubDate><atom:updated>2009-07-13T00:22:22.791+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">gentoo</category><category domain="http://www.blogger.com/atom/ns#">linux</category><title>gentoo, kdeprefix useflag, KDE 4.2, Phonon and backends</title><description>Ну в общем в курсе все, что 4.2 вышел, он крут и наступило щастье. Так что это пока не обсуждаем.&lt;br /&gt;А вот то, что поломался звук - предмет нашего разговора.&lt;br /&gt;Поломался звук, amarok не играет, а всё потому что phonon не видит свои backend'ы, ибо всё раскидано в разных местах, понеже кто-то на useflag kdeprefix внимание обращает, а кто-то нет и кладёт всё по FHS.&lt;br /&gt;Варианта, как водится, два.&lt;br /&gt;1. Отмержить к чёрту все версии KDE ниже 4.2, отключить kdeprefix, только тогда ставить 4.2. Более правильный на мой взгляд. В воздухе повисшим оставим тот вопрос, что же делать с k3b и прочим антиквариатом.&lt;br /&gt;2. Помочь найти потерянные backends.&lt;br /&gt;&lt;blockquote&gt;ln -s /usr/share/kde4/services/phononbackends/ /usr/kde/4.2/share/kde4/services/phononbackends&lt;/blockquote&gt;&lt;br /&gt;Костыль, но быстрый и действенный.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/439775273064312982-7079340110036615824?l=thegeekbird.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/geekbird/~4/5aANccwxZs4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/geekbird/~3/5aANccwxZs4/gentoo-kdeprefix-useflag-kde-42-phonon.html</link><author>noreply@blogger.com (PhoeniX)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://thegeekbird.blogspot.com/2009/02/gentoo-kdeprefix-useflag-kde-42-phonon.html</feedburner:origLink></item></channel></rss>
