<feed version="0.3" xml:lang="en-US" xmlns="http://purl.org/atom/ns#">
  <title>Ruby on Rails в России</title>
  <tagline mode="escaped" type="text/html"/>
  <id>tag:planet.rubyonrails.ru,2005:Planet</id>
  <generator url="http://www.leetsoft.com">Planet</generator>
  <link href="http://planet.rubyonrails.ru/articles" rel="alternate" type="text/html"/>
  <modified>2010-02-05T12:40:39+03:00</modified>
  <entry>
    <author>
      <name>Anton Dyachuk</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2621</id>
    <issued>2010-02-05T12:17:00+03:00</issued>
    <modified>2010-02-05T12:40:39+03:00</modified>
    <title>Anton Dyachuk: Ссылки за неделю # 10/02/05</title>
    <link href="http://web-dev.posterous.com/-100205" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html">&lt;p&gt;
	&lt;p&gt;&lt;span style="text-decoration: underline; font-size: medium;"&gt;Ruby/Rails&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://guides.rails.info/3_0_release_notes.html"&gt;Rails 3.0: Release Notes&lt;/a&gt; &amp;ndash; Заголовок ссылки говорит сам за себя, буквально сегодня Rails 3 перевели в статус беты.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.digimonkey.com/2010/02/why-use-haml-and-sass-i-already-know-html/"&gt;Why use HAML (and SASS)? I already know HTML.&lt;/a&gt; &amp;ndash; Список причин почему стоит использовать &lt;a href="http://haml-lang.com/"&gt;HAML&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://litanyagainstfear.com/blog/2010/02/03/the-rails-module/"&gt;The Rails Module (in Rails 3)&lt;/a&gt; &amp;ndash; описание методов, доступных в модуле Rails. Некоторые из них доступны уже сейчас.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/jcoglan/faye"&gt;faye&lt;/a&gt; &amp;ndash; Comet сервер и клиент, построенные на основе &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; и &lt;a href="http://rack.rubyforge.org/"&gt;Rack&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/AtelierConvivialite/webtranslateit"&gt;webtranslateit&lt;/a&gt; &amp;ndash; Rails плагин, позволяющий синхронизировать переводы между приложением и сервисом &lt;a href="https://webtranslateit.com/"&gt;Web Translate It&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="text-decoration: underline;"&gt;Разное&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://diveintomark.org/archives/2010/01/29/tinkerers-sunset"&gt;Tinkerer&amp;rsquo;s Sunset&lt;/a&gt; &amp;ndash; Эссе об Apple, закрытых системах и будущем программирования.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developers.facebook.com/news.php?blog=1&amp;amp;story=358"&gt;HipHop for PHP: Move Fast&lt;/a&gt; &amp;ndash; Facebook разработал и открыл собственный инструмент для оптимизации PHP (не к ночи будет помянут), если в двух словах, то это компилятор PHP в C  .&lt;/li&gt;
&lt;li&gt;&lt;a href="http://spyced.blogspot.com/2010/01/linux-performance-basics.html"&gt;Linux performance basics&lt;/a&gt; &amp;ndash; Основы исследования производительности Linux при помощи vmstat, iostat и top.&lt;/li&gt;
&lt;/ul&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/-100205"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/-100205#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Maxim Kulkin</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2620</id>
    <issued>2010-02-02T11:18:00+03:00</issued>
    <modified>2010-02-02T11:20:05+03:00</modified>
    <title>Maxim Kulkin: Do you use LiveJournal ?</title>
    <link href="http://maximkulkin.blogspot.com/2010/02/do-you-use-livejournal.html" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html">Every time I visit someone's page on LiveJournal, I see something like &amp;lt;a href="http://ooprizrakoo.livejournal.com/"&amp;gt;this&amp;lt;/a&amp;gt;.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;It reminds me a &amp;lt;a href="http://www.youtube.com/watch?v=uMyEGgbrJBw"&amp;gt;Homer Simpson's web page&amp;lt;/a&amp;gt;. How people can use that crap ? Duh.&amp;lt;div class="blogger-post-footer"&amp;gt;&amp;lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25445709-5647995947316032662?l=maximkulkin.blogspot.com' alt='' /&amp;gt;&amp;lt;/div&amp;gt;</content>
  </entry>
  <entry>
    <author>
      <name>Anton Dyachuk</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2619</id>
    <issued>2010-01-29T12:36:00+03:00</issued>
    <modified>2010-01-29T13:20:46+03:00</modified>
    <title>Anton Dyachuk: Ссылки за неделю # 10/01/29</title>
    <link href="http://web-dev.posterous.com/-100129" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html">&lt;p&gt;
	&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Ruby/Rails&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.engineyard.com/blog/2010/rails-and-merb-merge-rails-core-part-4-of-6/"&gt;Rails and Merb Merge: Rails Core (Part 4 of 6)&lt;/a&gt;&amp;nbsp;&amp;ndash; очередные вести с полей от Yehuda Katz о текущем статусе Rails 3.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://m.onkey.org/2010/1/22/active-record-query-interface"&gt;Active Record Query Interface 3.0&lt;/a&gt;&amp;nbsp;&amp;ndash; перечень изменений в ActiveRecord, которые появятся в Rails 3.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://omgbloglol.com/post/359147788/rails-upgrade-automating-a-portion-of-the-rails-3"&gt;Automating a portion of the Rails 3 upgrade process&lt;/a&gt;&amp;nbsp;&amp;ndash; gem, содержащий набор скриптов для автоматического апгрейда rails приложений на Rails 3.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.fngtps.com/2009/12/ordering-and-comparing-text-in-rails-and-mysql"&gt;Ordering and comparing text in Rails and MySQL&lt;/a&gt; &amp;ndash; статья о том как работает сравнение интернациональных текстов в MySQL и как это можно использовать в Rails. Если вы не знаете про collation, то настоятельно рекомендую прочитать, независимо от того используете вы Rails или нет.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.fepus.net/ruby1line.txt"&gt;HANDY ONE-LINERS FOR RUBY&lt;/a&gt; &amp;ndash; набор однострочных ruby скриптов "на все случаи жизни". Очень напоминает подобные рецепты на перле, видимо корни дают о себе знать.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.logankoester.com/bayesian-classification-on-rails"&gt;Bayesian Classification on Rails&lt;/a&gt; &amp;ndash; небольшой туториал, описывающий использование классификации Байеса в рельсовом приложении для поиска интересующих твитов.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;JavaScript&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://dailyjs.com/2010/01/27/pro-practices-1"&gt;Park your Horse, Code Cowboy: Professional JavaScript Workflows, Part 1&lt;/a&gt; &amp;ndash; статья об организации JavaScript кода и управлении зависимостями при помощи клиентских и серверных компонентов.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Разработка&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://bishop-it.ru/2009/07/kanban-development/"&gt;Канбан в IT (Kanban Development)&lt;/a&gt; &amp;ndash; основы методологии Канбан, применительно к IT, что это такое и зачем нужно.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Разное&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://sikuli.csail.mit.edu/"&gt;Project SIKULI&lt;/a&gt; &amp;ndash; интересный проект по скриптованию GUI интерфейсов при помощи обычных скриншотов.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://webplanet.ru/knowhow/life/admin/2010/01/25/andreessen.html"&gt;Марк Андрессен: Как делать дела&lt;/a&gt; &amp;ndash; вебпланета перевела статью Марка Андрессена "Как делать дела". По сути очередная вариация на тему GTD, но не лишенная интересных идей.&lt;/li&gt;
&lt;/ul&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/-100129"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/-100129#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Anton Dyachuk</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2618</id>
    <issued>2010-01-28T19:59:00+03:00</issued>
    <modified>2010-01-28T23:40:43+03:00</modified>
    <title>Anton Dyachuk: Javascript I18n for Rails applications</title>
    <link href="http://web-dev.posterous.com/javascript-i18n-for-rails-applications" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html">&lt;p&gt;
	&lt;p&gt;Довольно часто в javascript приходится хранить текстовые данные, используемые, например, для отображения уведомлений, календаря и т.п. Естественно, что в многоязыковом приложении хотелось бы видеть эти данные локализованными. Именно для этого и предназначен rails плагин &lt;a href="http://github.com/ptzn/js_i18n"&gt;js_i18n&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Весь javascript код написан без использования каких бы то ни было фреймворков, так что прекрасно работает и с prototype.js, и с jQuery, и с любой другой библиотекой.&lt;/p&gt;
&lt;p&gt;После установки плагина стандартным образом, нужно вызвать генератор, передав ему в качестве параметра список локалей:&lt;br /&gt;&lt;em&gt;&lt;strong&gt;$script/generate js_locales en ru&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;После завершения ком

анды в приложении появятся файлы &lt;em&gt;public/javascripts/i18n.js&lt;/em&gt; и два файла локалей (&lt;em&gt;en.js&lt;/em&gt; и &lt;em&gt;ru.js&lt;/em&gt;) в каталоге &lt;em&gt;public/javascripts/locales&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Подключить эти скрипты можно при помощи хелпера javascript_i18n_include, просто добавьте следующую строку во вью:&lt;br /&gt;&lt;em&gt;&lt;strong&gt;&amp;lt;%= javascript_i18n_include %&amp;gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Этот хелпер всего лишь вызывает &lt;em&gt;javascript_include_tag&lt;/em&gt; для &lt;em&gt;i18n.js&lt;/em&gt; и одного из файлов локали. Какой файл локали подключать определяется исходя из значения &lt;em&gt;I18n.locale&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Файл локали содержит всего одну переменную &lt;em&gt;Translations&lt;/em&gt;, которая представляет собой обычный хэш, с обязательным ключом &lt;em&gt;locale&lt;/em&gt;. Если ключ &lt;em&gt;locale&lt;/em&gt; не существует, то по умолчанию считается, что локаль английская, т.е. &lt;em&gt;locale = "en"&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Пример содержимого файла &lt;em&gt;public/javascripts/locales/ru.js&lt;/em&gt;:&lt;br /&gt;&lt;div class="data syntax type-js"&gt;
    
      &lt;table cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            
            &lt;pre class="line_numbers"&gt;
&lt;span rel="#L1" id="LID1"&gt;1&lt;/span&gt;
&lt;span rel="#L2" id="LID2"&gt;2&lt;/span&gt;
&lt;span rel="#L3" id="LID3"&gt;3&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
            
              &lt;div class="highlight"&gt;&lt;pre /&gt;&lt;div class="line" id="LC1"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;Translations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC2"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ru&amp;#39;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC3"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
            
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
    
  &lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Ключ сообщения может быть задан в виде строки или вложенного хеша:&lt;br /&gt;&lt;div class="data syntax type-js"&gt;
    
      &lt;table cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            
            &lt;pre class="line_numbers"&gt;
&lt;span rel="#L1" id="LID1"&gt;1&lt;/span&gt;
&lt;span rel="#L2" id="LID2"&gt;2&lt;/span&gt;
&lt;span rel="#L3" id="LID3"&gt;3&lt;/span&gt;
&lt;span rel="#L4" id="LID4"&gt;4&lt;/span&gt;
&lt;span rel="#L5" id="LID5"&gt;5&lt;/span&gt;
&lt;span rel="#L6" id="LID6"&gt;6&lt;/span&gt;
&lt;span rel="#L7" id="LID7"&gt;7&lt;/span&gt;
&lt;span rel="#L8" id="LID8"&gt;8&lt;/span&gt;
&lt;span rel="#L9" id="LID9"&gt;9&lt;/span&gt;
&lt;span rel="#L10" id="LID10"&gt;10&lt;/span&gt;
&lt;span rel="#L11" id="LID11"&gt;11&lt;/span&gt;
&lt;span rel="#L12" id="LID12"&gt;12&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
            
              &lt;div class="highlight"&gt;&lt;pre /&gt;&lt;div class="line" id="LC1"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;Translations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC2"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ru&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC3"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="s2"&gt;&amp;quot;foo.bar&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;baz&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC4"&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="line" id="LC5"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="nx"&gt;nested&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC6"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC7"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="p"&gt;},&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC8"&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="line" id="LC9"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC10"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nx"&gt;times&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;{{count}} times&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC11"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC12"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
            
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
    
  &lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Получить значение ключа можно аналогично вызову в руби:&lt;br /&gt;&lt;div class="data syntax type-js"&gt;
    
      &lt;table cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            
            &lt;pre class="line_numbers"&gt;
&lt;span rel="#L1" id="LID1"&gt;1&lt;/span&gt;
&lt;span rel="#L2" id="LID2"&gt;2&lt;/span&gt;
&lt;span rel="#L3" id="LID3"&gt;3&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
            
              &lt;div class="highlight"&gt;&lt;pre /&gt;&lt;div class="line" id="LC1"&gt;&lt;span class="nx"&gt;I18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;foo.bar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// -&amp;gt; &amp;quot;baz&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC2"&gt;&lt;span class="nx"&gt;I18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;nested.hash&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// -&amp;gt; &amp;quot;value&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC3"&gt;&lt;span class="nx"&gt;I18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;message.times&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// -&amp;gt; &amp;quot;3 times&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
            
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
    
  &lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Текущую локаль можно получить используя &lt;em&gt;I18n.locale()&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;PS. Так называемый "pluralization" я реализовывать не стал, так как, во-первых, на данный момент оно мне не нужно; во-вторых, с русским языком все равно придется извращаться.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/javascript-i18n-for-rails-applications"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/javascript-i18n-for-rails-applications#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Gregory Man, Dimitri Krassovski</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2617</id>
    <issued>2010-01-24T18:05:00+03:00</issued>
    <modified>2010-01-24T18:20:55+03:00</modified>
    <title>Gregory Man, Dimitri Krassovski: Ruby NoName Podcast #23</title>
    <link href="http://ruby.rpod.ru/138653.html" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html">&amp;lt;p&amp;gt;Тви: &amp;lt;a href=&amp;quot;http://twitter.com/rubynoname&amp;quot;&amp;gt;rubynoname&amp;lt;/a&amp;gt;.
&amp;lt;p&amp;gt;&amp;lt;a href=&amp;quot;http://ruby.rpod.ru/rss.xml&amp;quot;&amp;gt;RSS&amp;lt;/a&amp;gt; и &amp;lt;a href=&amp;quot;http://ruby.rpod.ru/&amp;quot;&amp;gt;сайт подкаста на RPod.ru&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;br /&amp;gt;

&amp;lt;img src=&amp;quot;https://gregory.s3.amazonaws.com/cover.jpg&amp;quot; border=&amp;quot;0&amp;quot;&amp;gt;

&amp;lt;h2&amp;gt;&amp;lt;font size=4&amp;gt;Сегодня в программе, разговоры о:&amp;lt;/font&amp;gt;&amp;lt;/h2&amp;gt;
&amp;lt;ul&amp;gt;
  &amp;lt;li&amp;gt;Восставшие из ада.&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;Rails 3.0&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;http://aws.amazon.com/ec2/&amp;quot;&amp;gt;Amazon&amp;lt;/a&amp;gt; vs &amp;lt;a href=&amp;quot;http://www.linode.com/&amp;quot;&amp;gt;Linode&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;

&amp;lt;p&amp;gt;В подкасте использованы композиции &amp;lt;a href=&amp;quot;http://podsafeaudio.com/jamroom/bands/1454/music.php&amp;quot;&amp;gt;8 BIT Junkie by George Wood&amp;lt;/a&amp;gt; и &amp;lt;a href=&amp;quot;http://www.ru-bl.ru/&amp;quot;&amp;gt;Мы круче группы Рубль&amp;lt;/a&amp;gt;</content>
  </entry>
  <entry>
    <author>
      <name>Anton Dyachuk</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2616</id>
    <issued>2010-01-24T06:01:00+03:00</issued>
    <modified>2010-01-24T07:20:42+03:00</modified>
    <title>Anton Dyachuk: Rake task for checking missed locale keys</title>
    <link href="http://web-dev.posterous.com/rake-task-for-checking-missed-locale-keys" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html">&lt;p&gt;
	&lt;p&gt;Задача локализации приложения превращается в геморрой, если это приложение чуть более сложное чем "hello world" (ну или "блог за 15 минут" если хотите).&lt;br /&gt;Сразу возникают вопросы "какие ключи, относительно актуальной локали, отсутствуют в остальных?", "какие переводы устарели?", "есть ли в переводах лишние ключи?" и т.п.&amp;nbsp;На данный момент времени я столкнулся только с первым вопросом, который был решен созданием rake задачи:&lt;/p&gt;
&lt;p&gt;&lt;div class="data syntax type-ruby"&gt;
    
      &lt;table cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            
            &lt;pre class="line_numbers"&gt;
&lt;span rel="#L1" id="LID1"&gt;1&lt;/span&gt;
&lt;span rel="#L2" id="LID2"&gt;2&lt;/span&gt;
&lt;span rel="#L3" id="LID3"&gt;3&lt;/span&gt;
&lt;span rel="#L4" id="LID4"&gt;4&lt;/span&gt;
&lt;span rel="#L5" id="LID5"&gt;5&lt;/span&gt;
&lt;span rel="#L6" id="LID6"&gt;6&lt;/span&gt;
&lt;span rel="#L7" id="LID7"&gt;7&lt;/span&gt;
&lt;span rel="#L8" id="LID8"&gt;8&lt;/span&gt;
&lt;span rel="#L9" id="LID9"&gt;9&lt;/span&gt;
&lt;span rel="#L10" id="LID10"&gt;10&lt;/span&gt;
&lt;span rel="#L11" id="LID11"&gt;11&lt;/span&gt;
&lt;span rel="#L12" id="LID12"&gt;12&lt;/span&gt;
&lt;span rel="#L13" id="LID13"&gt;13&lt;/span&gt;
&lt;span rel="#L14" id="LID14"&gt;14&lt;/span&gt;
&lt;span rel="#L15" id="LID15"&gt;15&lt;/span&gt;
&lt;span rel="#L16" id="LID16"&gt;16&lt;/span&gt;
&lt;span rel="#L17" id="LID17"&gt;17&lt;/span&gt;
&lt;span rel="#L18" id="LID18"&gt;18&lt;/span&gt;
&lt;span rel="#L19" id="LID19"&gt;19&lt;/span&gt;
&lt;span rel="#L20" id="LID20"&gt;20&lt;/span&gt;
&lt;span rel="#L21" id="LID21"&gt;21&lt;/span&gt;
&lt;span rel="#L22" id="LID22"&gt;22&lt;/span&gt;
&lt;span rel="#L23" id="LID23"&gt;23&lt;/span&gt;
&lt;span rel="#L24" id="LID24"&gt;24&lt;/span&gt;
&lt;span rel="#L25" id="LID25"&gt;25&lt;/span&gt;
&lt;span rel="#L26" id="LID26"&gt;26&lt;/span&gt;
&lt;span rel="#L27" id="LID27"&gt;27&lt;/span&gt;
&lt;span rel="#L28" id="LID28"&gt;28&lt;/span&gt;
&lt;span rel="#L29" id="LID29"&gt;29&lt;/span&gt;
&lt;span rel="#L30" id="LID30"&gt;30&lt;/span&gt;
&lt;span rel="#L31" id="LID31"&gt;31&lt;/span&gt;
&lt;span rel="#L32" id="LID32"&gt;32&lt;/span&gt;
&lt;span rel="#L33" id="LID33"&gt;33&lt;/span&gt;
&lt;span rel="#L34" id="LID34"&gt;34&lt;/span&gt;
&lt;span rel="#L35" id="LID35"&gt;35&lt;/span&gt;
&lt;span rel="#L36" id="LID36"&gt;36&lt;/span&gt;
&lt;span rel="#L37" id="LID37"&gt;37&lt;/span&gt;
&lt;span rel="#L38" id="LID38"&gt;38&lt;/span&gt;
&lt;span rel="#L39" id="LID39"&gt;39&lt;/span&gt;
&lt;span rel="#L40" id="LID40"&gt;40&lt;/span&gt;
&lt;span rel="#L41" id="LID41"&gt;41&lt;/span&gt;
&lt;span rel="#L42" id="LID42"&gt;42&lt;/span&gt;
&lt;span rel="#L43" id="LID43"&gt;43&lt;/span&gt;
&lt;span rel="#L44" id="LID44"&gt;44&lt;/span&gt;
&lt;span rel="#L45" id="LID45"&gt;45&lt;/span&gt;
&lt;span rel="#L46" id="LID46"&gt;46&lt;/span&gt;
&lt;span rel="#L47" id="LID47"&gt;47&lt;/span&gt;
&lt;span rel="#L48" id="LID48"&gt;48&lt;/span&gt;
&lt;span rel="#L49" id="LID49"&gt;49&lt;/span&gt;
&lt;span rel="#L50" id="LID50"&gt;50&lt;/span&gt;
&lt;span rel="#L51" id="LID51"&gt;51&lt;/span&gt;
&lt;span rel="#L52" id="LID52"&gt;52&lt;/span&gt;
&lt;span rel="#L53" id="LID53"&gt;53&lt;/span&gt;
&lt;span rel="#L54" id="LID54"&gt;54&lt;/span&gt;
&lt;span rel="#L55" id="LID55"&gt;55&lt;/span&gt;
&lt;span rel="#L56" id="LID56"&gt;56&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
            
              &lt;div class="highlight"&gt;&lt;pre /&gt;&lt;div class="line" id="LC1"&gt;&lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="ss"&gt;:translations&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC2"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Show available locales&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC3"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:available&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:environment&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Available locales: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;I18n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;available_locales&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC5"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC6"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line" id="LC7"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Show missed translations depending on default language environment (:&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;I18n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default_locale&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; by default). You can change it providing LOCALE argument&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC8"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:missed&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:environment&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC9"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;locale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;LOCALE&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="no"&gt;I18n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default_locale&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC10"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Using :&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; as default locale&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC11"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="line" id="LC12"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;i18n_backend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;I18n&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backend&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC13"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;i18n_backend&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:init_translations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;i18n_backend&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;initialized?&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC14"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;translations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i18n_backend&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:translations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC15"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line" id="LC16"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;main_translation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;translations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_sym&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC17"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div class="line" id="LC18"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;translations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC19"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Checking :&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; translations:&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC20"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;find_keys_diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main_translation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC21"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty?&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC22"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; is up to date&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC23"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC24"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; here is list of missed translation keys&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC25"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt; &lt;/span&gt; &lt;span class="n"&gt;merge_diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n\t&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC26"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC27"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC28"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC29"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line" id="LC30"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="kp"&gt;private&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC31"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;find_keys_diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in_hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC32"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC33"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC34"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;in_hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_key?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC35"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_s&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC36"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;elsif&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC37"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;find_keys_diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in_hash&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC38"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_s&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty?&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC39"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC40"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;result&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC41"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC42"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC43"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line" id="LC44"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;merge_diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC45"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blank?&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC46"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC47"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC48"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt; =&lt;/span&gt; &lt;span class="n"&gt;merge_diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt; &lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC49"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC50"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="si"&gt;}#{&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC51"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC52"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="n"&gt;result&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC53"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC54"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC55"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC56"&gt;&amp;nbsp;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
            
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
    
  &lt;/div&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;rake translations:available&lt;/em&gt; - покажет используемые локали&lt;/li&gt;
&lt;li&gt;&lt;em&gt;rake translations:missed&lt;/em&gt; - покажет отсутствующие ключи по всем локалям относительно актуальной, которую можно изменить указав параметр LOCALE, т.е.&amp;nbsp;&lt;em&gt;rake translations:missed LOCALE=ru&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="font-style: normal;"&gt;В гуглогруппе &lt;a href="http://groups.google.com/group/ror2ru"&gt;ror2ru&lt;/a&gt; упоминался инструмент &lt;a href="http://github.com/newsdesk/translate"&gt;Translate&lt;/a&gt; (веб интерфейс для перевода локалей в виде rails плагина), кроме собственно веб интерфейса он предоставляет несколько полезных rake задач (в том числе и поиск не переведенных кусков текста). Мне он не подошел, так как слишком тяжел и перегружен для моих текущих требований.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style="display: inline !important;"&gt;&lt;span style="font-style: normal;"&gt;Быстро глянув в код, я обнаружил более страшный недостаток: translate считает, что переводы должны лежать в одном файле (то есть &lt;/span&gt;config/locales/en.yml&lt;span style="font-style: normal;"&gt; и т.д.), я же предпочитаю раскладывать их по каталогам внутри &lt;/span&gt;config/locales&lt;span style="font-style: normal;"&gt;, поэтому в своей rake задаче привязался к &lt;/span&gt;i18n.load_path&lt;span style="font-style: normal;"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Ссылки по теме:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p style="display: inline !important;"&gt;&lt;a href="http://guides.rubyonrails.org/i18n.html"&gt;Rails Internationalization (I18n) API&lt;/a&gt; &amp;ndash; мануал по использованию I18n&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p style="display: inline !important;"&gt;&lt;a href="http://rails-i18n.org/wiki"&gt;Rails I18n : Internationalization for Ruby on Rails&lt;/a&gt; &amp;ndash; большой список ссылок на хауту, документацию и тулзы.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/rake-task-for-checking-missed-locale-keys"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/rake-task-for-checking-missed-locale-keys#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Anton Dyachuk</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2615</id>
    <issued>2010-01-22T12:50:00+03:00</issued>
    <modified>2010-02-05T22:20:46+03:00</modified>
    <title>Anton Dyachuk: Ссылки за неделю # 10/01/22</title>
    <link href="http://web-dev.posterous.com/-012210" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html">&lt;p&gt;
	&lt;p&gt;Сим постом открываю еженедельные посты с подборками интересных ссылок.&amp;nbsp;Тематика будет соответствовать блогу, т.е. разработка в целом и ruby/rails в частности.&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Ruby/rails&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://github.com/jeffkreeftmeijer/navvy" title="navvy"&gt;navvy&lt;/a&gt; &amp;ndash; очередной rails плагин для фоновой обработки задач, основанный на delayed_job, но работающий с любыми ORM. "Из коробки" поддерживает ActiveRecord, MongoMapper и Sequel. &lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/a ndersondias/delayed_job_mailer"&gt;delayed_job_mailer&lt;/a&gt; &amp;ndash; rails плагин для асинхронной отправки email сообщений через delayed_job.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/dcrec1/inploy" title="inploy"&gt;inploy&lt;/a&gt; &amp;ndash; еще один инструмент для автоматизации deployment'а rails приложений.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://proutils.github.com/webme" title="Webme"&gt;Webme&lt;/a&gt; &amp;ndash; конвертирует README в статический сайт.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://avdi.org/devblog/2010/01/18/hammertime" title="Hammertime"&gt;Hammertime&lt;/a&gt; &amp;ndash; Интерактивная консоль ошибок для ruby приложений(&lt;a href="http://github.com/avdi/hammertime"&gt;github&lt;/a&gt;). Создатель вдохновился возможностями Lisp и Smaltalk.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;Другое&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://boredzo.org/pointers"&gt;Everything you need to know about pointers in C&lt;/a&gt; &amp;ndash; Если вы забыли (или не знали) что такое указатели и как с ними работать в C, то самое время вспомнить.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cb.vu/unixtoolbox.xhtml"&gt;Unix Toolbox&lt;/a&gt; &amp;ndash; набор команд и рецептов на все случаи жизни&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mr-aleph.livejournal.com/236446.html?style=mine"&gt;mr-aleph.livejournal.com&lt;/a&gt;&amp;nbsp;&amp;ndash; трактовка 7и смертных грехов в разрезе программирования&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ну и немного юмора:&amp;nbsp;&lt;a href="http://kvardek-du.kerno.org/2010/01/how-common-lisp-programmer-views-users.html"&gt;How a Common Lisp Programmer Views Users of Other Languages&lt;/a&gt;&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/-012210"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/-012210#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Ruby brothers</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2614</id>
    <issued>2010-01-17T03:20:31+03:00</issued>
    <modified>2010-01-17T03:20:31+03:00</modified>
    <title>Ruby brothers: &amp;#1052;&amp;#1086;&amp;#1081; &amp;#1085;&amp;#1086;&amp;#1074;&amp;#1099;&amp;#1081; &amp;#1076;&amp;#1078;&amp;#1077;&amp;#1084;: PrettyDiff</title>
    <link href="http://rubybrothers.ru/2010/1/16/my-new-gem-pretty_diff" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html"></content>
  </entry>
  <entry>
    <author>
      <name>Ruby brothers</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2613</id>
    <issued>2010-01-16T11:00:33+03:00</issued>
    <modified>2010-01-16T11:00:33+03:00</modified>
    <title>Ruby brothers: Мой новый джем: PrettyDiff</title>
    <link href="http://feedproxy.google.com/~r/RubyBrothers/~3/3uSPcaiweBo/my-new-gem-pretty_diff" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html"></content>
  </entry>
  <entry>
    <author>
      <name>Anton Dyachuk</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2612</id>
    <issued>2010-01-04T16:13:00+03:00</issued>
    <modified>2010-01-04T19:40:43+03:00</modified>
    <title>Anton Dyachuk: AppConfig rails plugin</title>
    <link href="http://web-dev.posterous.com/appconfig-rails-plugin" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html">&lt;p&gt;
	&lt;p&gt;Когда-то давно, мы с&amp;nbsp;&lt;a href="http://github.com/skojin"&gt;товарищем&lt;/a&gt;, взяв за основу статью &lt;a href="http://kpumuk.info/ruby-on-rails/flexible-application-configuration-in-ruby-on-rails/"&gt;Dmytro Shteflyuk&lt;/a&gt;, сделали rails плагин для хранения глобальных настроек приложения. Наконец-то дошли руки&amp;nbsp;выложить его на github &lt;a href="http://github.com/ptzn/app_config"&gt;http://github.com/ptzn/app_config&lt;/a&gt;, не прошло и трех лет да.&lt;/p&gt;
&lt;p&gt;Плагин прост как деревяшка, но от этого не теряет своей юзабельности и полезности. Если нужно хранить какие-то глобальные настройки&amp;nbsp;безо всяких изысков, будь-то емейл адреса, урлы, какие-то параметры и т.п. &amp;ndash; этот плагин то что нужно.&lt;/p&gt;
&lt;p&gt;После установки первое, что надо сделать &amp;ndash; это создать &lt;em&gt;config.yml&lt;/em&gt;. Это можно сделать двумя способами:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;вызвать генератор &lt;em&gt;script/generate app_config&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;создать файл руками в каталоге &lt;em&gt;config&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;По умолчанию содержимое файла следующее:&lt;br /&gt;&lt;p&gt;&lt;a href="http://gist.github.com/268501"&gt;http://gist.github.com/268501&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;Доступ к параметрам осуществляется очень просто: &lt;em&gt;AppConfig.NAME&lt;/em&gt; (&lt;em&gt;AppConfig.support_email&lt;/em&gt;, &lt;em&gt;AppConfig.root_url&lt;/em&gt;, etc), причем значение, например,&amp;nbsp;&lt;em&gt;AppConfig.root_url&lt;/em&gt; в production окружении будет отличаться от development.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/appconfig-rails-plugin"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/appconfig-rails-plugin#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Anton Dyachuk</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2611</id>
    <issued>2009-12-29T18:41:00+03:00</issued>
    <modified>2009-12-29T19:00:51+03:00</modified>
    <title>Anton Dyachuk: Вызов метода класса из C</title>
    <link href="http://web-dev.posterous.com/-c-305" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html">&lt;p&gt;
	&lt;p&gt;Предположим у нас есть следующий класс:&lt;/p&gt;
&lt;p&gt;&lt;div class="data syntax type-rb"&gt;
    
      &lt;table cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            
            &lt;pre class="line_numbers"&gt;
&lt;span rel="#L1" id="LID1"&gt;1&lt;/span&gt;
&lt;span rel="#L2" id="LID2"&gt;2&lt;/span&gt;
&lt;span rel="#L3" id="LID3"&gt;3&lt;/span&gt;
&lt;span rel="#L4" id="LID4"&gt;4&lt;/span&gt;
&lt;span rel="#L5" id="LID5"&gt;5&lt;/span&gt;
&lt;span rel="#L6" id="LID6"&gt;6&lt;/span&gt;
&lt;span rel="#L7" id="LID7"&gt;7&lt;/span&gt;
&lt;span rel="#L8" id="LID8"&gt;8&lt;/span&gt;
&lt;span rel="#L9" id="LID9"&gt;9&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
            
              &lt;div class="highlight"&gt;&lt;pre /&gt;&lt;div class="line" id="LC1"&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Foo&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC2"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Bar&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC3"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;baz&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC4"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;In Foo::Bar&amp;#39;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC6"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC7"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC8"&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="line" id="LC9"&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Foo&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Bar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;baz&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; In Foo::Bar&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
            
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
    
  &lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Мы хотим вызывать этот метод из C, используя Ruby API.&lt;/p&gt;
&lt;p&gt;Для вызова любого руби метода существует функция &lt;em&gt;rb_funcall&lt;/em&gt;:&lt;br /&gt; &lt;em&gt;&lt;strong&gt;VALUE rb_funcall( VALUE recv, ID id, int argc, ... )&lt;/strong&gt;&lt;/em&gt; &amp;ndash; Вызывает метод, переданный по &lt;em&gt;id&lt;/em&gt; на объекте &lt;em&gt;recv&lt;/em&gt;, с указанным количеством аргументов &lt;em&gt;argc&lt;/em&gt; и самими аргументами (если таковые есть).&lt;/p&gt;
&lt;p&gt;Для получения &lt;em&gt;id&lt;/em&gt; по имени чего-либо (метод, имя класса, etc) используется функция &lt;em&gt;rb_intern&lt;/em&gt;:&amp;nbsp;&lt;strong&gt;&lt;em&gt;ID rb_intern(const char *name)&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Так как мы хотим вызвать метод класса, то нам нужен объект этого класса. Получить его мы можем, используя функцию &lt;em&gt;rb_const_get&lt;/em&gt;:&amp;nbsp;&lt;strong&gt;&lt;em&gt;VALUE rb_const_get(VALUE obj, ID id)&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Итак, используя вышеперечисленное, пробуем:&lt;/p&gt;
&lt;p&gt;&lt;div class="data syntax type-cpp"&gt;
    
      &lt;table cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            
            &lt;pre class="line_numbers"&gt;
&lt;span rel="#L1" id="LID1"&gt;1&lt;/span&gt;
&lt;span rel="#L2" id="LID2"&gt;2&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
            
              &lt;div class="highlight"&gt;&lt;pre /&gt;&lt;div class="line" id="LC1"&gt;&lt;span class="n"&gt;VALUE&lt;/span&gt; &lt;span class="n"&gt;object_klass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rb_const_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rb_cObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rb_intern&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Foo::Bar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC2"&gt;&lt;span class="n"&gt;rb_funcall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object_klass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rb_intern&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;baz&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
            
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
    
  &lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Упс. Код не просто не работает, а сообщает нам о том, что не может найти "&lt;em&gt;Foo::Bar&lt;/em&gt;". Все дело в том, что функция &lt;em&gt;rb_intern&lt;/em&gt; не парсит переданную строку на наличие символов "::", поэтому каждый раз придется создавать иерархию вручную:&lt;/p&gt;
&lt;p&gt;&lt;div class="data syntax type-cpp"&gt;
    
      &lt;table cellspacing="0" cellpadding="0"&gt;
        &lt;tr&gt;
          &lt;td&gt;
            
            &lt;pre class="line_numbers"&gt;
&lt;span rel="#L1" id="LID1"&gt;1&lt;/span&gt;
&lt;span rel="#L2" id="LID2"&gt;2&lt;/span&gt;
&lt;span rel="#L3" id="LID3"&gt;3&lt;/span&gt;
&lt;/pre&gt;
          &lt;/td&gt;
          &lt;td width="100%"&gt;
            
              &lt;div class="highlight"&gt;&lt;pre /&gt;&lt;div class="line" id="LC1"&gt;&lt;span class="n"&gt;VALUE&lt;/span&gt; &lt;span class="n"&gt;module_klass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rb_const_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rb_cObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rb_intern&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC2"&gt;&lt;span class="n"&gt;VALUE&lt;/span&gt; &lt;span class="n"&gt;object_klass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rb_const_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;module_klass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rb_intern&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Bar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC3"&gt;&lt;span class="n"&gt;rb_funcall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object_klass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rb_intern&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;baz&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
            
          &lt;/td&gt;
        &lt;/tr&gt;
      &lt;/table&gt;
    
  &lt;/div&gt;&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/-c-305"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/-c-305#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Anton Dyachuk</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2591</id>
    <issued>2009-12-25T22:00:49+03:00</issued>
    <modified>2009-12-25T22:00:49+03:00</modified>
    <title>Anton Dyachuk: </title>
    <link href="http://webdev-notes.blogspot.com/feeds/5318231208776670679/comments/default" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html"></content>
  </entry>
  <entry>
    <author>
      <name>Неудачнег on rails</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2590</id>
    <issued>2009-12-24T19:20:38+03:00</issued>
    <modified>2009-12-24T19:20:38+03:00</modified>
    <title>Неудачнег on rails: &amp;#1052;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076; &amp;#1083;&amp;#1086;&amp;#1074;&amp;#1091;&amp;#1096;&amp;#1077;&amp;#1082; &amp;#1076;&amp;#1083;&amp;#1103; &amp;#1080;&amp;#1079;&amp;#1073;&amp;#1077;&amp;#1078;&amp;#1072;&amp;#1085;&amp;#1080;&amp;#1103; &amp;#1082;&amp;#1072;&amp;#1087;&amp;#1095;&amp;#1080;</title>
    <link href="http://tumalevich.pp.ru/2009/12/24/384" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html"></content>
  </entry>
  <entry>
    <author>
      <name>Dmytro Shteflyuk</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2589</id>
    <issued>2009-12-17T13:28:12+03:00</issued>
    <modified>2009-12-17T13:40:49+03:00</modified>
    <title>Dmytro Shteflyuk: Submitting a patch to the Open Source project: composite_primary_keys</title>
    <link href="http://feedproxy.google.com/~r/kpumuk/~3/TGfGFM5eIxM/" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html">Not so far ago I have found a weird bug in the Open Source Ruby gem called composite_primary_keys, occurred when you specify :primary_key option for has_one or has_many association. There are two ways to get it fixed: submit an issue and wait till someone will work out this problem or fix it by yourself and [...]</content>
  </entry>
  <entry>
    <author>
      <name>Anton Dyachuk</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2592</id>
    <issued>2009-12-10T14:38:00+03:00</issued>
    <modified>2009-12-26T12:20:46+03:00</modified>
    <title>Anton Dyachuk: Проблемы с locale на базовой системе</title>
    <link href="http://web-dev.posterous.com/-locale" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html">&lt;p&gt;
	На одном из VPS, предоставляющих базовый образ системы (в данном случае это была Ubuntu 9.04), столкнулся с тем, что на каждый вызов apt'а или dpkg получал вот такой прекрасный выхлоп:
&lt;pre&gt;&lt;code&gt;perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
  LANGUAGE = (unset),
  LC_ALL = (unset),
  LANG = "en_US.UTF-8"
are supported and installed on your system.&lt;/code&gt;&lt;/pre&gt;
Вылечилось просто:
&lt;pre&gt;&lt;code&gt;$ sudo locale-gen en_US.UTF-8
$ sudo dpkg-reconfigure locales&lt;/code&gt;&lt;/pre&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web-dev.posterous.com/-locale"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://web-dev.posterous.com/-locale#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Anton Dyachuk</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2588</id>
    <issued>2009-12-10T10:40:38+03:00</issued>
    <modified>2009-12-10T10:40:38+03:00</modified>
    <title>Anton Dyachuk: Проблемы с locale на базовой системе</title>
    <link href="http://webdev-notes.blogspot.com/feeds/6938866265033140798/comments/default" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html"></content>
  </entry>
  <entry>
    <author>
      <name>Ruby brothers</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2587</id>
    <issued>2009-12-04T09:00:36+03:00</issued>
    <modified>2009-12-04T09:00:36+03:00</modified>
    <title>Ruby brothers: &amp;#1054;&amp;#1073;&amp;#1077;&amp;#1079;&amp;#1074;&amp;#1088;&amp;#1077;&amp;#1078;&amp;#1080;&amp;#1074;&amp;#1072;&amp;#1077;&amp;#1084; &amp;#1086;&amp;#1076;&amp;#1080;&amp;#1085;&amp;#1072;&amp;#1088;&amp;#1085;&amp;#1099;&amp;#1077; &amp;#1082;&amp;#1072;&amp;#1074;&amp;#1099;&amp;#1095;&amp;#1082;&amp;#1080; &amp;#1074; Bash</title>
    <link href="http://rubybrothers.ru/2009/12/3/how-to-escape-single-quotes-in-bash" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html"></content>
  </entry>
  <entry>
    <author>
      <name>Ruby brothers</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2586</id>
    <issued>2009-12-03T19:20:30+03:00</issued>
    <modified>2009-12-03T19:20:30+03:00</modified>
    <title>Ruby brothers: Обезвреживаем одинарные кавычки в Bash</title>
    <link href="http://feedproxy.google.com/~r/RubyBrothers/~3/RHue272PHIM/how-to-escape-single-quotes-in-bash" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html"></content>
  </entry>
  <entry>
    <author>
      <name>Ruby brothers</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2585</id>
    <issued>2009-12-02T05:40:29+03:00</issued>
    <modified>2009-12-02T05:40:29+03:00</modified>
    <title>Ruby brothers: &amp;#1043;&amp;#1091;&amp;#1076;&amp;#1073;&amp;#1072;&amp;#1081; &amp;#1040;&amp;#1084;&amp;#1077;&amp;#1088;&amp;#1080;&amp;#1082;&amp;#1072;</title>
    <link href="http://rubybrothers.ru/2009/12/1/goodbye-america" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html"></content>
  </entry>
  <entry>
    <author>
      <name>Ruby brothers</name>
    </author>
    <id>tag:planet.rubyonrails.ru,2005:Planet-2584</id>
    <issued>2009-12-02T05:40:29+03:00</issued>
    <modified>2009-12-02T05:40:29+03:00</modified>
    <title>Ruby brothers: &amp;#1055;&amp;#1086;&amp;#1083; &amp;#1043;&amp;#1088;&amp;#1101;&amp;#1084;&amp;#1084; &amp;#1086; &amp;#1089;&amp;#1090;&amp;#1072;&amp;#1088;&amp;#1090;&amp;#1072;&amp;#1087;&amp;#1072;&amp;#1093;</title>
    <link href="http://rubybrothers.ru/2009/12/1/paul-graham-on-startups" rel="alternate" type="text/html"/>
    <content mode="escaped" type="text/html"></content>
  </entry>
</feed>
