<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Are you in software?</title>
	
	<link>http://rbdev.ru</link>
	<description>Персональный блог Печорина Андрея</description>
	<lastBuildDate>Tue, 05 Oct 2010 19:09:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/are-you-in-software" /><feedburner:info uri="are-you-in-software" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>are-you-in-software</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fare-you-in-software" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fare-you-in-software" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><item>
		<title>Ядро Ruby, часть 2</title>
		<link>http://feedproxy.google.com/~r/are-you-in-software/~3/OLAjGp_YiEU/</link>
		<comments>http://rbdev.ru/2010/10/yadro-ruby-chast-2/#comments</comments>
		<pubDate>Tue, 05 Oct 2010 12:53:31 +0000</pubDate>
		<dc:creator>pechorin-andrey</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://rbdev.ru/?p=153</guid>
		<description><![CDATA[В прошлый раз мы кратко познакомились с основными структурами интерпретатора ruby. Сегодня я попробую углубиться в интересующую нас тему. Помимо этого, я буду приводить некоторые разъясняющие примеры, как на языке си, так и на руби. Как лучше всего практиковать изучения ядра Ruby Теория это хорошо, но честно говоря лучше практиковать и ошибаться :) По крайней [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="http://rbdev.ru/wp-content/uploads/2010/07/FAA_hacking1.jpg"><img class="alignleft size-full wp-image-140" title="FAA_hacking" src="http://rbdev.ru/wp-content/uploads/2010/07/FAA_hacking1.jpg" alt="" width="300" height="300" /></a></p>
<p>В прошлый раз мы кратко познакомились с основными структурами интерпретатора ruby. Сегодня я попробую углубиться в интересующую нас тему. Помимо этого, я буду приводить некоторые разъясняющие примеры, как на языке си, так и на руби.</p>
<p><span id="more-153"></span></p>
<h3>Как лучше всего практиковать изучения ядра Ruby</h3>
<p>Теория это хорошо, но честно говоря лучше практиковать и ошибаться :) По крайней мере в этом деле.</p>
<p>Я расскажу вам о своем workflow:</p>
<p>MacOSX-10.5.8 + Xcode + текстовый редактор + исходники ruby 1.8.7 + установленный по-умолчанию ruby.</p>
<p>1) Подготавливаем файлы</p>
<pre>rbdev$ cd path/to/ruby/source
rbdev$ mkdir x
rbdev$ cd x
rbdev$ touch my_ext.c
rbdev$ touch extconf.rb</pre>
<p>2) Редактируем extconf.rb<br />
Самый простой вариант того, как должен выглядеть этот файл:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'mkmf'</span>
create_makefile<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;my_ext&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>3) Открываем файл нашего расширения (my_ext.c) и заполняем:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;ruby.h&gt;</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">void</span> Init_My_Ext<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// инициализация нашего расширения происходит здесь</span>
	<span style="color: #666666; font-style: italic;">// создадим константу</span>
	VALUE global_const_value <span style="color: #339933;">=</span> rb_str_new2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #ff0000;">&quot;This is my global CONST&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	rb_define_global_const<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #ff0000;">&quot;MyGlobalConst&quot;</span><span style="color: #339933;">,</span> global_const_value<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>4) Компилируем (с правами рута, например)</p>
<pre>bash-3.2# ruby extconf.rb
creating Makefile

bash-3.2# make
gcc -I. -I/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin9.0 -I/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin9.0 -I.  -fno-common -arch ppc -arch i386 -Os -pipe -fno-common  -c my_ext.c
cc -arch ppc -arch i386 -pipe -bundle -undefined dynamic_lookup -o my_ext.bundle my_ext.o -L. -L/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib -L. -arch ppc -arch i386    -lruby  -lpthread -ldl -lm 

bash-3.2# make install
/usr/bin/install -c -m 0755 my_ext.bundle /Library/Ruby/Site/1.8/universal-darwin9.0</pre>
<p>5) Проверяем наше скомпилированное расширения</p>
<pre>bash-3.2# irb
&gt;&gt; require "My_Ext"
=&gt; true
&gt;&gt; MyGlobalConst
=&gt; "This is my global CONST"</pre>
<p>Как видите мы успешно создали наше расширение, давайте посмотрим еще один вариант &#8220;вскрытия внутренностей&#8221; (my_ext.c)</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> Init_My_Ext<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">char</span><span style="color: #339933;">*</span> my_code <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #ff0000;">&quot;puts 100, &quot;</span>Welcome to debugger<span style="color: #ff0000;">&quot;&quot;</span><span style="color: #339933;">;</span>
	rb_eval_string<span style="color: #009900;">&#40;</span>my_code<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%sn&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> <span style="color: #ff0000;">&quot;We can output to irb directly from c-code :D&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Irb вывыдет три строки, как и ожидалось:</p>
<pre>&gt;&gt; require "My_Ext"
100
Welcome to debugger
We can output to irb directly from c-code :D</pre>
<p>Так же легко это делается на системах linux. (Сколько бы я не пытался заставить компилироваться расширения руби на Windows &#8211; у меня ничего не получилось)</p>
<h3>Освежим память</h3>
<p>Весь наш с тобою разговор, читатель, будет проходить вокруг уже знакомых тебе структур, составляющих основу интерпретатора руби.</p>
<p>Давай освежим память и взглянем на них:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> RBasic <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span> flags<span style="color: #339933;">;</span>
	VALUE klass<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">struct</span> RObject <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">struct</span> RBasic basic<span style="color: #339933;">;</span>
	<span style="color: #993333;">struct</span> st_table <span style="color: #339933;">*</span>iv_tbl<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">struct</span> RClass <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">struct</span> RBasic basic<span style="color: #339933;">;</span>
	<span style="color: #993333;">struct</span> st_table <span style="color: #339933;">*</span>iv_tbl<span style="color: #339933;">;</span>
	<span style="color: #993333;">struct</span> st_table <span style="color: #339933;">*</span>m_tbl<span style="color: #339933;">;</span>
	VALUE super<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Как ты уже понял, структуруа RBasic находится внутри структур RClass и RObject.<br />
Я не хочу запутать вас, и попробую привести пример &#8220;вложенности&#8221; используя руби:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">RBasic = <span style="color:#CC00FF; font-weight:bold;">Struct</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:klass</span><span style="color:#006600; font-weight:bold;">&#41;</span>
RObject = <span style="color:#CC00FF; font-weight:bold;">Struct</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:r_basic</span><span style="color:#006600; font-weight:bold;">&#41;</span> 
&nbsp;
r_basic = RBasic.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#9966CC; font-weight:bold;">Class</span><span style="color:#006600; font-weight:bold;">&#41;</span>
r_object = RObject.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>r_basic<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> r_object.<span style="color:#9900CC;">r_basic</span>.<span style="color:#9900CC;">klass</span> <span style="color:#008000; font-style:italic;"># =&gt; Class</span></pre></div></div>

<p>Из вышеописанного кода понятно, что мы создаем две структуры &#8211; RBasic и RObject. RBasic содержит в себе &#8220;указатель&#8221; на класс. Структура RObject содержит в себе структуру RBasic, которая в свою очередь содержит в себе указатель на класс.</p>
<p>Давайте я легко заменю класс, содержащийся внутри RBasic:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">r_basic = RBasic.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>MyCustomClass<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#008000; font-style:italic;"># ...</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> r_object.<span style="color:#9900CC;">r_basic</span>.<span style="color:#9900CC;">klass</span> <span style="color:#008000; font-style:italic;"># =&gt; MyCustomClass</span></pre></div></div>

<h3>unsigned long VALUE</h3>
<p>И так, обрати внимание на строку «VALUE klass» структуры интерпретатора руби(!) struct RBasic.<br />
Если ты читал первую часть моего рассказа, то понял, что это ничто иное как указатель на класс. Но тип переменной VALUE (typedef unsigned long VALUE) используется не только для этого.</p>
<p>VALUE может указывать и на структуры других типов, например RString или RFile.</p>
<p>Как это происходит? Дело в том, что VALUE определен как unsigned long, поэтому мы легко можем хранить внутри этой переменной адрес другой структуры. Для этого нам придётся воспользоваться type-cast’ингом.<br />
Вот тебе небольшой пример того, как можно «кастить»:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;stdio.h&gt;  </span>
&nbsp;
<span style="color: #993333;">struct</span> class <span style="color: #009900;">&#123;</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> name<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>  
<span style="color: #993333;">typedef</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span> VALUE<span style="color: #339933;">;</span> 
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> class Class<span style="color: #339933;">;</span>  
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 	
<span style="color: #666666; font-style: italic;">// Пример номер один: 	</span>
<span style="color: #666666; font-style: italic;">// ptr объявлен как обычный int, и он будет содержать в себе адрес переменной a,     </span>
<span style="color: #666666; font-style: italic;">// мы вручную “кастим” адрес переменной a к типу int: 	</span>
    <span style="color: #993333;">int</span> a <span style="color: #339933;">=</span> <span style="color: #0000dd;">10</span><span style="color: #339933;">;</span> 	
    <span style="color: #993333;">int</span> ptr <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>a<span style="color: #339933;">;</span>  	
<span style="color: #666666; font-style: italic;">// сначала кастим наш int в указатель на int (int*), а потом достаем значение по адресу 	</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%in&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>ptr<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// выведет 10  	</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Пример номер два: 	</span>
    VALUE object<span style="color: #339933;">;</span> 	
    Class my<span style="color: #339933;">;</span> 	
    object <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>VALUE<span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>my<span style="color: #339933;">;</span> 	
    <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>Class<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>object<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-&gt;</span> name <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #ff0000;">&quot;MySuperClass&quot;</span><span style="color: #339933;">;</span>  	
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%sn&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>Class<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>object<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-&gt;</span> name <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// выведет &quot;MySuperClass&quot;  }</span></pre></div></div>

<p>Но нам не придется мучиться и писать откровенно страшный и непонятный код, создатели руби заранее придумали макросы, для облегчения повседневных задач.</p>
<p>Давайте рассмотрим пример с объектом-строкой:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// макрос</span>
<span style="color: #339933;">#define RSTRING(obj) (R_CAST(RString)(obj))</span></pre></div></div>

<p>Взглянем на структуру RString:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> RString <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">struct</span> RBasic basic<span style="color: #339933;">;</span>
    <span style="color: #993333;">long</span> len<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>ptr<span style="color: #339933;">;</span>
    <span style="color: #993333;">union</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #993333;">long</span> capa<span style="color: #339933;">;</span>
		VALUE shared<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> aux<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Существуют специальные функции, которые создают объекты разных классов. Например, функция rb_str_new2 создает объект класса String и возвращает указатель на созданный объект:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> Init_My_Ext<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// создаем простую строку</span>
	<span style="color: #993333;">char</span><span style="color: #339933;">*</span> simple_string <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #ff0000;">&quot;My String&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// создаем строку в руби и присваиваем адрес нового объекта переменной my_string</span>
	VALUE my_string <span style="color: #339933;">=</span> rb_str_new2<span style="color: #009900;">&#40;</span>simple_string<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// нам не приходится вручную писать type-кастинги, мы просто воспользуемся макросом RSTRING</span>
	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%in&quot;</span><span style="color: #339933;">,</span> RSTRING<span style="color: #009900;">&#40;</span>my_string<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-&gt;</span> len<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// выведет длинну строки =&gt; 9</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/*
	так как структура RString содержит в себе указатель на строку (в нашем случае на simple_string)
	мы легко можем воспользоваться этим %)
	*/</span>
	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%sn&quot;</span><span style="color: #339933;">,</span>RSTRING<span style="color: #009900;">&#40;</span>my_string<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-&gt;</span> ptr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// выведет &quot;My String&quot;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

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

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> Init_My_Ext<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">char</span><span style="color: #339933;">*</span> my_c_str <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #ff0000;">&quot;MyString&quot;</span><span style="color: #339933;">;</span>
	VALUE my_rb_str1 <span style="color: #339933;">=</span> rb_str_new2<span style="color: #009900;">&#40;</span>my_c_str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	VALUE my_rb_str2 <span style="color: #339933;">=</span> rb_str_new2<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> RString<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>my_rb_str1<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-&gt;</span> ptr <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%sn&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> RString<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>my_rb_str1<span style="color: #009900;">&#41;</span> <span style="color: #339933;">-&gt;</span> ptr<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Когда я впервые увидел ruby.h я был полностью шокирован. Теперь я понимаю, что макросы облегчают жизнь, и конечно же ими нужно не пренебрегать, а аккуратно изучать и использовать.</p>
<p><strong>Подведем итог:</strong></p>
<p>VALUE создан для того, чтобы ссылаться на различные R***** структуры. Но это далеко не все,что можно рассказать о VALUE. Я вернусь к этому чуточку позже.</p>
<h3>flags</h3>
<p>Помимо класса, структура RBasic содержит строку «unsigned long flags». Вы наверно спросите — «Почему не заменять unsigned long flags на VALUE flags?». Дело в том, что создатели руби заранее определились, что будут использовать VALUE только как указатель на структуры R******. К тому же во многих макросах используется определение VALUE, что может вызвать ошибку, если мы подсунем указатель НЕ НА СТРУКТУРУ (а мы все с вами знаем, что сделать это как два пальца ******ть). Думаю в этом нет ничего сложного, немного поработав с исходниками руби и написав несколько расширений вы лучше поймёте о чем идёт речь.</p>
<p>Во-первых, flags содержит в себе тип структуры. (смотрим в наш любимый ruby.h и находим там определения типов структур, например: T_NIL, T_OBJECT, T_STRING, T_CLASS и т.д.)<br />
Во-вторых, flags содержит в себе специальные флаги для интерпрнтатора ruby, о которых я возможно когда-нибудь расскажу (если конечно меня вообще заинтересуют лезть так глубоко)</p>
<p>Попробуем немного поработать с флагами:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> Init_My_Ext<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// создадим новую строку</span>
	VALUE my_str <span style="color: #339933;">=</span> rb_str_new2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #ff0000;">&quot;Rails rocks!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>TYPE<span style="color: #009900;">&#40;</span>my_str<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> T_STRING<span style="color: #009900;">&#41;</span>
		<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Yeah, this is stringn&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>TYPE<span style="color: #009900;">&#40;</span>my_str<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> T_OBJECT<span style="color: #009900;">&#41;</span>
		<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;OBJECT?n&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Выведет только &#8220;Yeah, this is string&#8221;. Так же мы можем воспользоваться макросом CLASS_OF:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> Init_My_Ext<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	VALUE my_str <span style="color: #339933;">=</span> rb_str_new2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #ff0000;">&quot;Rails rocks!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>CLASS_OF<span style="color: #009900;">&#40;</span>my_str<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> rb_cString<span style="color: #009900;">&#41;</span>
		<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;yeah, this is string-classn&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>CLASS_OF<span style="color: #009900;">&#40;</span>my_str<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> rb_cObject<span style="color: #009900;">&#41;</span>
		<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;yeah, this is object-classn&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Выведет только  &#8220;yeah, this is string-class&#8221;.</p>
<p>Посмотрим на определение макроса CLASS_OF:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define CLASS_OF(v) rb_class_of((VALUE)(v))</span></pre></div></div>

<p>затем смотрим в определение функции rb_class_of:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">static</span> <span style="color: #000000; font-weight: bold;">inline</span> VALUE
<span style="color: #339933;">#if defined(HAVE_PROTOTYPES)</span>
rb_class_of<span style="color: #009900;">&#40;</span>VALUE obj<span style="color: #009900;">&#41;</span>
<span style="color: #339933;">#else</span>
rb_class_of<span style="color: #009900;">&#40;</span>obj<span style="color: #009900;">&#41;</span>
    VALUE obj<span style="color: #339933;">;</span>
<span style="color: #339933;">#endif</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>FIXNUM_P<span style="color: #009900;">&#40;</span>obj<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> rb_cFixnum<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>obj <span style="color: #339933;">==</span> Qnil<span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> rb_cNilClass<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>obj <span style="color: #339933;">==</span> Qfalse<span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> rb_cFalseClass<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>obj <span style="color: #339933;">==</span> Qtrue<span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> rb_cTrueClass<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>SYMBOL_P<span style="color: #009900;">&#40;</span>obj<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> rb_cSymbol<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> RBASIC<span style="color: #009900;">&#40;</span>obj<span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span>klass<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Во-первых нас интересует последняя строка -&gt; &#8220;return RBASIC(obj) -&gt; klass&#8221;.<br />
Мы уже знаем, что сама по себе структуру RString не содержит никакой информации о своем классе, но она содежит в себе структуру RBasic, которая в свою очередь содержит указатель на класс объекта. Таким образом строка &#8220;return RBASIC(obj) -&gt; klass&#8221; обращается к структуре basic, находящейся внутри obj и возвращает класс объекта, например rb_cString.</p>
<p>Но почему перед этой строкой стоят какие-то странные условия? А дело все в том, что не каждая структура руби содержит в себе структуру RBasic.<br />
Несмотря на то, что в руби все &#8211; объект, классы Symbol, Fixnum, NilClass, FalseClass, TrueClass не содержат внутри себя структуры RBasic. Это сделано для того, чтобы ускорить интерпритатор. Только подумайте, чтобы случилось, если бы на каждое новое число создавалась целая структура.</p>
<p>Небольшой пример на руби:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">puts</span> 1.<span style="color:#9900CC;">object_id</span> <span style="color:#008000; font-style:italic;"># =&gt; 3</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> 1.<span style="color:#9900CC;">object_id</span> <span style="color:#008000; font-style:italic;"># =&gt; 3</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#ff3333; font-weight:bold;">:text</span>.<span style="color:#9900CC;">object_id</span> <span style="color:#008000; font-style:italic;"># =&gt; 109858</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#ff3333; font-weight:bold;">:text</span>.<span style="color:#9900CC;">object_id</span> <span style="color:#008000; font-style:italic;"># =&gt; 109858</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Hello, habr&quot;</span>.<span style="color:#9900CC;">object_id</span> <span style="color:#008000; font-style:italic;"># =&gt; 33970</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Hello, habr&quot;</span>.<span style="color:#9900CC;">object_id</span> <span style="color:#008000; font-style:italic;"># =&gt; 33950  (!!!)</span></pre></div></div>

<p>Сколько бы мы не пытались узнать id объекта Fixnum или Symbol -&gt; мы получаем одно и тоже значение. А вот со строкой все иначе, она создалась два раза. Именно поэтому выгоднее использовать символы, вместо строк, особенно это касается разработчиков ruby on rails ( ну или любого другого софта на руби ):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">map.<span style="color:#9900CC;">root</span> <span style="color:#ff3333; font-weight:bold;">:controller</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:main</span>, <span style="color:#ff3333; font-weight:bold;">:action</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:index</span> <span style="color:#008000; font-style:italic;"># отлично</span>
map.<span style="color:#9900CC;">root</span> <span style="color:#ff3333; font-weight:bold;">:controller</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;main&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:action</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;index&quot;</span> <span style="color:#008000; font-style:italic;"># не очень хорошо</span></pre></div></div>

<h3>Что дальше?</h3>
<p>В следующей статье я познакомлю вас с ID, более подробно расскажу о работе с числами и объектами класса Symbol. Конечно же весь мой рассказ будет сопровождаться поясняющими примерами на руби и си.</p>
<img src="http://rbdev.ru/?ak_action=api_record_view&id=153&type=feed" alt="" /><div class="tw_button" style=";float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2FaOgiSx&amp;text=%D0%AF%D0%B4%D1%80%D0%BE%20Ruby%2C%20%D1%87%D0%B0%D1%81%D1%82%D1%8C%202&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Frbdev.ru%2F2010%2F10%2Fyadro-ruby-chast-2%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://rbdev.ru/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=OLAjGp_YiEU:KZ8qj2FNGis:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=OLAjGp_YiEU:KZ8qj2FNGis:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=OLAjGp_YiEU:KZ8qj2FNGis:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?i=OLAjGp_YiEU:KZ8qj2FNGis:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/are-you-in-software/~4/OLAjGp_YiEU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rbdev.ru/2010/10/yadro-ruby-chast-2/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		<feedburner:origLink>http://rbdev.ru/2010/10/yadro-ruby-chast-2/</feedburner:origLink></item>
		<item>
		<title>VIM power, Часть 1</title>
		<link>http://feedproxy.google.com/~r/are-you-in-software/~3/iz7FoqNiAB0/</link>
		<comments>http://rbdev.ru/2010/08/vim-story-part-1/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 12:59:08 +0000</pubDate>
		<dc:creator>pechorin-andrey</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://rbdev.ru/?p=111</guid>
		<description><![CDATA[VIM &#8211; это сила. Мало того, что для этого замечательного текстового редактора написали уже более 3-ёх тысяч расширений, так еще и пишутся они достаточно легко. К слову говоря, если полазить по дебрям каталога плагинов, можно найти множество интересных и полезных утилит. Но сила VIM не только в его расширяемости. VIM сам по себе &#8211; очень [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="http://rbdev.ru/wp-content/uploads/2010/08/vim.jpg"><img class="size-full wp-image-118 alignleft" title="vim" src="http://rbdev.ru/wp-content/uploads/2010/08/vim.jpg" alt="" width="429" height="153" /></a></p>
<h3>VIM &#8211; это сила.</h3>
<p>Мало того, что для этого замечательного текстового редактора написали уже более <a href="http://www.vim.org/scripts/index.php">3-ёх тысяч расширений</a>, так еще и пишутся они достаточно легко. К слову говоря, если полазить по дебрям каталога плагинов, можно найти множество интересных и полезных утилит.</p>
<p>Но сила VIM не только в его расширяемости. VIM сам по себе &#8211; очень мощная штука, которую можно настроить как угодно. Именно за это он мне и нравится &#8211; я как бы создаю свою рабочую среду. Многие любители &#8220;сделай сам&#8221; поймут о чем я говорю.</p>
<p><span id="more-111"></span><br />
VIM &#8211; это новое.</p>
<p>Текстовому редактору VIM и его предку VI гораздо больше лет, чем мне. И не смотря на это, я нашел работу в виме необычной, и могу смело сказать &#8211; что это разрыв привычной текстовой обыденности.</p>
<p>Мы привыкли к IDE, привыкли клацать мышкой и выделять фрагменты текста, привыкли, что наша правая рука прыгает от букв к стрелочкам, а потом легким движением оказывается на мышке, и потом снова на стрелочках, а потом опять на буквах клавиатуры. Всё это обыденность.</p>
<p>С VIM вы будете делать всё совершенно иначе. Моя рука всегда в одном положении, я полностью забыл о клавишах-стрелочках и мышке. Они просто не нужны. Я так же смог забыть о клавише CTRL. Мне больше не нужно зажимать мизинцем CTRL SHIFT ALT.</p>
<p>Вим имеет несколько режимов. Основные режимы это Вставка и Normal-mode. В режиме вставки vim ведет себя так же, как и обычные текстовые редакторы. Normal-mode создан для того, чтобы манипулировать текстом.</p>
<p>Вим очень минималистичный, в нём нету красивых кнопок и рамок. Многим не нравиться это, но в действительности это позволяет вам сосредоточиться на тексте, дать тексту больше места, освободив экран от ненужных элементов, к котором вы обращаетесь раз в неделю.</p>
<h3>VIM &#8211; это вы.</h3>
<p>Вы вольны настроить всё так как вам нужно. Не нравиться то, что переход в normal режим происходит по клавише ESC? Это можно легко исправить! Хотите, чтобы цвет фона в режиме вставки был другого цвета? Легко! Хотите, чтобы цветовая схема отличалась в разное время суток? Пожалуйста! Хотите написать своё дополнение? Тогда пишите его на родном Vimscript, или воспользуйтесь Ruby, Python, Tcl, Perl или Lua!</p>
<h3>VIM &#8211; это расширяемость вашей мечты!</h3>
<p>vim на самом деле легко расширять и дополнять. Помимо простейшего встроенного языка программирования Vimscript вы можете воспользоваться своими любимыми языками, вот краткий пример на ruby:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># выведем имя текущего буфера:</span>
VIM::message <span style="color:#6666ff; font-weight:bold;">VIM::Buffer</span>.<span style="color:#9900CC;">current</span>.<span style="color:#9900CC;">name</span>
<span style="color:#008000; font-style:italic;"># проверим, есть ли в текущем буфере TODO задачи:</span>
buffer_object = <span style="color:#6666ff; font-weight:bold;">VIM::Buffer</span>.<span style="color:#9900CC;">current</span>
1.<span style="color:#9900CC;">upto</span><span style="color:#006600; font-weight:bold;">&#40;</span>buffer_object.<span style="color:#9900CC;">length</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>count<span style="color:#006600; font-weight:bold;">|</span>
	<span style="color:#9966CC; font-weight:bold;">if</span> buffer_object<span style="color:#006600; font-weight:bold;">&#91;</span>count<span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">match</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/</span>TODO<span style="color:#006600; font-weight:bold;">/</span><span style="color:#006600; font-weight:bold;">&#41;</span>
		VIM::message <span style="color:#996600;">&quot;TODO detected! in string number #{count}&quot;</span>
	<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Разве это не мечта настоящего хакера? Инструмент, который так легко расширять и дополнять!</p>
<h3>VIM &#8211; это не так сразу.</h3>
<p>Проблема в том, что вам придётся потратить некоторое количество времени на освоение базовых возможностей. Многих отпугивает это, но в действительности, через некоторое время вы получите мощнейший инструмент в своих собственных руках.</p>
<h3>А что дальше?</h3>
<p>В следующей статье я хочу более подробно рассказать о расширениях, приведя пример простенького расширения на языке руби.</p>
<p>Надеюсь вам понравилось.</p>
<img src="http://rbdev.ru/?ak_action=api_record_view&id=111&type=feed" alt="" /><div class="tw_button" style=";float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2FbTWxfr&amp;text=VIM%20power%2C%20%D0%A7%D0%B0%D1%81%D1%82%D1%8C%201&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Frbdev.ru%2F2010%2F08%2Fvim-story-part-1%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://rbdev.ru/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=iz7FoqNiAB0:cj5nL3oOwvY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=iz7FoqNiAB0:cj5nL3oOwvY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=iz7FoqNiAB0:cj5nL3oOwvY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?i=iz7FoqNiAB0:cj5nL3oOwvY:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/are-you-in-software/~4/iz7FoqNiAB0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rbdev.ru/2010/08/vim-story-part-1/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		<feedburner:origLink>http://rbdev.ru/2010/08/vim-story-part-1/</feedburner:origLink></item>
		<item>
		<title>Почему на самом деле стоит выучить Английский</title>
		<link>http://feedproxy.google.com/~r/are-you-in-software/~3/xSz7btJmEmw/</link>
		<comments>http://rbdev.ru/2010/08/pochemu-na-samom-dele-stoit-vyuchit-anglijskij/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 13:11:44 +0000</pubDate>
		<dc:creator>pechorin-andrey</dc:creator>
				<category><![CDATA[Философия]]></category>

		<guid isPermaLink="false">http://rbdev.ru/?p=104</guid>
		<description><![CDATA[Каждому из нас когда-нибудь объясняли ценность английского языка. Не смотря на все это, я не очень-то следовал этому. И конечно пожалел об этом. Я рад, что смог во время осознать ценность английского языка и начать исправлять плачевную ситуацию. Сегодня я расскажу вам о том, почему же я начал изучать английский и забросил русский. Книги Примерно [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="http://rbdev.ru/wp-content/uploads/2010/08/LIST_kid_hate_school.jpg"><img class="alignleft size-full wp-image-128" title="LIST_kid_hate_school" src="http://rbdev.ru/wp-content/uploads/2010/08/LIST_kid_hate_school.jpg" alt="" width="260" height="239" /></a></p>
<p>Каждому из нас когда-нибудь объясняли ценность английского языка. Не смотря на все это, я не очень-то следовал этому. И конечно пожалел об этом.<br />
Я рад, что смог во время осознать ценность английского языка и начать исправлять плачевную ситуацию.</p>
<p>Сегодня я расскажу вам о том, почему же я начал изучать английский и забросил русский.<br />
<span id="more-104"></span></p>
<h3>Книги</h3>
<p>Примерно полтора года назад я спонтанно решил начать “серьезное программирование”. До этого я уже имел небольшой опыт в этой сфере, но на более “простом” языке. Решено – сделано! Я немедленно отправился в книжный магазин и закупился парой учебников на русском языке:</p>
<table border="0">
<tbody>
<tr>
<td><a href="http://www.ozon.ru/context/detail/id/4468317/"><img class="alignnone" title="Язык программирования Java и среда NetBeans" src="http://www.ozon.ru/multimedia/books_covers/1001118767.jpg" alt="" width="200" height="290" /></a></td>
<td><a href="http://www.ozon.ru/context/detail/id/3284124/"><img class="alignnone" title="Java для студента" src="http://www.ozon.ru/multimedia/books_covers/1000522172.jpg" alt="" width="200" height="297" /></a></td>
</tr>
</tbody>
</table>
<p>Всегда поражаюсь убогостью оформления русских книг, яркий пример тому – вторая книга. Я бы не показал такую книгу своим друзьям. Так же ужасно я чувствовал себя, когда читал комиксы “Микки-маус”, сидя в метро. Правда тогда мне было около 8, и я очень стыдился, что кто-то заметит этот комикс в моих руках. Но интерес к картинкам победил комплексы юного обывателя.</p>
<p>В тот же вечер я приступил к чтению. Было очень трудно. Оно и не удивительно. Я понимал, что так резко столкнутся с реальным ООП будет тяжело. Но я не сдавался и вдавливал в себя каждую строку. Проблема в том, что я люблю понять всё, прежде чем сказать себе “я могу с этим работать”. Поэтому процесс затянулся.</p>
<p>Через какое-то время я наткнулся на великую и ужасную “Thinking in Java”, а точнее говоря на ее русский вариант:</p>
<table border="0">
<tbody>
<tr>
<td><a href="http://www.ozon.ru/context/detail/id/4073388/"><img class="alignnone" title="Философия Java" src="http://www.ozon.ru/multimedia/books_covers/1000896427.jpg" alt="" width="200" height="281" /></a></td>
</tr>
</tbody>
</table>
<p>Это очень хорошая книга, но мне, совсем-совсем зеленому было трудновато. Я и не жаловался. Если я что-то не понимал в одной главе – я находил аналогичную главу в другой книги. Таким образом мне удавалось получить альтернативный вариант изложения материала.</p>
<p>Беда заключалась в том, что я часто замечал, что во время чтения мой мозг отключается. Мне слишком тяжело давались эти термины. Нет, я попробую перефразировать – мне слишком тяжело давалось сочетание “литературно-научного” русского языка. К тому же я являюсь фанатом аналогий.</p>
<p>Аналогии – это здорово. Любую вещь, даже самую сложною, можно объяснить представив более простой аналог. Не понимаю, почему авторы таких сложных книг отказываются от этого приёма.<br />
Иногда мне было трудно понять, для чего же придумали эту вещь. Я не видел причины в ее существовании.</p>
<p>Не смотря на всё это, я справлялся. Читая то одну, то другую, то третью книгу я продолжал изучение Java.<br />
Но я устал.<br />
И совершенно случайно я открыл оригинальный вариант книги “<strong>Thinking in Java</strong>”.</p>
<p><strong>Я испытал настоящий шок.</strong></p>
<p>Мой английский ужасен, но даже с таким уровнем я понимал каждую строку в 5 раз лучше, чем из русского варианта. Я понял, что английский менее богат на красивые словечки, нежели русский, и эту особенность стоит использовать!</p>
<p>Обучение пошло в РАЗЫ быстрее. Я был действительно счастлив. Я читал книгу на инородном языке и понимал его лучше, чем свой родной.</p>
<h3>История с Ruby on Rails</h3>
<p>Около года назад я решил изучать фреймворк Ruby on Rails. Я уже знал ruby на очень начальном уровне, достаточном, чтобы манипулировать классами и объектами. Зайдя в книжный магазин я нашел маленькую книжку-руководство:</p>
<table border="0">
<tbody>
<tr>
<td><a href="http://www.ozon.ru/context/detail/id/3839212/"><img class="alignnone" title="Ruby on Rails. Быстрая веб-разработка" src="http://www.ozon.ru/multimedia/books_covers/1000754889.jpg" alt="" width="200" height="288" /></a></td>
</tr>
</tbody>
</table>
<p>Я пытался перечитать ее 3 раза! И ни разу я не смог понять, что такое MVC. Черт подери, это самое простое, что только может быть.</p>
<p>Это прозвучит как бред, но начав читать книгу “<strong>Agile web development with Rails</strong>” на английской языке я сразу же врубился во все аспекты MVC и начал разработку на rails.</p>
<p>Думайте, что хотите, но теперь я очень редко обращаюсь к “родной” литературе. И я понятия не имею с чем это связано. Возможно, я действительно глуп для русских писателей.</p>
<h3>Блоги</h3>
<p>Вы когда-нибудь пользовались Google-reader’ом? А вы когда-нибудь смотрели на список своих подписок? И много там русских?<br />
Это грустно, но я не нашел ни одного интересного мне tech-блога на русском языке. Хабр не в счет. Кроме него ничего и нет.</p>
<p>Складывается ощущение, что русские ребята даже не стараются создать что-то своё. Стоит признать, что большинству просто до фонаря блогинг, как платформа получения информации.</p>
<p>Я ежедневно читаю десятки тематических английских блогов на разные темы, начиная от дизайна, заканчивая программированием. И я не вижу не одной достойной русской альтернативы.</p>
<p><strong>Учите английский. Начните с малого. Подпишитесь на один блог и переведите все статьи. Со временем ваш английский будет улучшаться. И вы сможете открыть для себя море интересной информации. Такой информации, которую никогда не найти на просторах русского интернета. </strong></p>
<img src="http://rbdev.ru/?ak_action=api_record_view&id=104&type=feed" alt="" /><div class="tw_button" style=";float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2FbkNOcA&amp;text=%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83%20%D0%BD%D0%B0%20%D1%81%D0%B0%D0%BC%D0%BE%D0%BC%20%D0%B4%D0%B5%D0%BB%D0%B5%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%90%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Frbdev.ru%2F2010%2F08%2Fpochemu-na-samom-dele-stoit-vyuchit-anglijskij%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://rbdev.ru/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=xSz7btJmEmw:mBM9Tl-QWDI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=xSz7btJmEmw:mBM9Tl-QWDI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=xSz7btJmEmw:mBM9Tl-QWDI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?i=xSz7btJmEmw:mBM9Tl-QWDI:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/are-you-in-software/~4/xSz7btJmEmw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rbdev.ru/2010/08/pochemu-na-samom-dele-stoit-vyuchit-anglijskij/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		<feedburner:origLink>http://rbdev.ru/2010/08/pochemu-na-samom-dele-stoit-vyuchit-anglijskij/</feedburner:origLink></item>
		<item>
		<title>Более подробно о методе inherited</title>
		<link>http://feedproxy.google.com/~r/are-you-in-software/~3/Y3EE-lK9pgc/</link>
		<comments>http://rbdev.ru/2010/07/bolee-podrobno-o-metode-inherited/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 13:49:08 +0000</pubDate>
		<dc:creator>pechorin-andrey</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://rbdev.ru/?p=96</guid>
		<description><![CDATA[Многие из вас слышали о замечательном методе inherited. Если кто-то не понимает о чем сейчас идёт речь, то поясню, что этот метод вызывается, когда какой-нибудь класс унаследовал другой (базовый) класс. Сегодня вы узнаете, как этот метод может быть полез в хозяйстве ;) Например: class A def self.inherited&#40;child&#41; puts “Now I am parent of class #{child}!” [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Многие из вас слышали о замечательном методе <strong>inherited</strong>.</p>
<p>Если кто-то не понимает о чем сейчас идёт речь, то поясню, что этот метод вызывается, когда какой-нибудь класс унаследовал другой (базовый) класс. Сегодня вы узнаете, как этот метод может быть полез в хозяйстве ;)</p>
<p><span id="more-96"></span> Например:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> A
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">inherited</span><span style="color:#006600; font-weight:bold;">&#40;</span>child<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> “Now I am parent of <span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#008000; font-style:italic;">#{child}!”</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> B <span style="color:#006600; font-weight:bold;">&lt;</span> A
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#=&gt; “Now I am parent of class B”</span></pre></div></div>

<p>Такие методы называются методами <a href="http://ru.wikipedia.org/wiki/Callback_(программирование)">обратного вызова</a> (callback).</p>
<p><strong>Но для чего оно может пригодиться нам?</strong></p>
<p>Например, вы разрабатываете свой фреймворк и вам необходимо узнать о классах, которые унаследовали базовый класс:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> MyController <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">MyFrameWork::Base</span></pre></div></div>

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

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> MyCustomWidget <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">Widgets::Base</span></pre></div></div>

<p>Скрипт читал каждый .rb файл в директории “<em>widgets</em>” и загружал его в память. Как только интерпретатор замечал, что какой-нибудь класс унаследовал <strong>Widgets::Base</strong>, он сразу заносил имя этого класса в хранилище.</p>
<p>Проблема в том, что <strong>при срабатывании метода inherited вам недоступны методы, объявленные в теле класса – потомка</strong>. Потому что интерпретатор еще не успел занести методы класса в память. Это может стать проблемой. Я обошел эту проблему простым путём: узнал о всех классах, унаследовавших базовый класс, позволил интерпретатору загрузить методы классов, а уже после этого создал объекты классов:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> initialize
  <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">pool</span> = <span style="color:#6666ff; font-weight:bold;">EasyWidgets::Pool</span>.<span style="color:#9900CC;">new</span>
  <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">load_widgets</span>
  <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">pool</span>.<span style="color:#9900CC;">init_objects_pool</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p><a href="ru.wikipedia.org/wiki/Объектный_пул">Более подробно об объектном пуле</a></p>
<p><strong>Хорошо это или плохо?</strong></p>
<p>С одной стороны вам не нужно создавать и следовать <em>naming-convention</em>. Как, например в <strong>Rails</strong>:</p>
<pre>[main_controller.rb]: MainController &lt; базовый_класс</pre>
<p>Вы сможете делать что-то вроде этого:</p>
<pre>[любое_имя_файла.rb]: MySuperClass &lt; базовый_класс</pre>
<p>Меня огорчил тот факт, что метод inherited срабатывает ДО того, как руби занёс методы класса в память.</p>
<p>Но по сути это не является серьезной проблемой.</p>
<p>Я думаю это первое &#8220;ограничение&#8221;, которое мне удалось встретить при работе с ruby :)</p>
<img src="http://rbdev.ru/?ak_action=api_record_view&id=96&type=feed" alt="" /><div class="tw_button" style=";float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2F9zIRp3&amp;text=%D0%91%D0%BE%D0%BB%D0%B5%D0%B5%20%D0%BF%D0%BE%D0%B4%D1%80%D0%BE%D0%B1%D0%BD%D0%BE%20%D0%BE%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B5%20inherited&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Frbdev.ru%2F2010%2F07%2Fbolee-podrobno-o-metode-inherited%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://rbdev.ru/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=Y3EE-lK9pgc:GIQR6y4kvrY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=Y3EE-lK9pgc:GIQR6y4kvrY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=Y3EE-lK9pgc:GIQR6y4kvrY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?i=Y3EE-lK9pgc:GIQR6y4kvrY:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/are-you-in-software/~4/Y3EE-lK9pgc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rbdev.ru/2010/07/bolee-podrobno-o-metode-inherited/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://rbdev.ru/2010/07/bolee-podrobno-o-metode-inherited/</feedburner:origLink></item>
		<item>
		<title>Советы начинающим Rails-разработчикам.</title>
		<link>http://feedproxy.google.com/~r/are-you-in-software/~3/g0HKeBC6cPk/</link>
		<comments>http://rbdev.ru/2010/07/sovety-nachinayushhim-rails-razrabotchikam/#comments</comments>
		<pubDate>Thu, 08 Jul 2010 08:34:08 +0000</pubDate>
		<dc:creator>pechorin-andrey</dc:creator>
				<category><![CDATA[Разработка]]></category>

		<guid isPermaLink="false">http://rbdev.ru/?p=92</guid>
		<description><![CDATA[Это не просто голые советы, за всем этим стоит личный опыт и море потерянного времени. Эту статью стоило назвать &#8220;Мои ошибки, совершенные при работе с Rails приложениями&#8221;, но получилось бы как-то слишком длинно. Толстые модели и голые контроллеры Моё первое rails-приложение было просто ужасно. Большая часть логики лежала в контроллерах. Я обрабатывал списки тегов и [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="http://rbdev.ru/wp-content/uploads/2010/07/18-advice-post-it.jpg"><img class="alignleft size-full wp-image-134" title="18-advice-post-it" src="http://rbdev.ru/wp-content/uploads/2010/07/18-advice-post-it.jpg" alt="" width="300" height="225" /></a></p>
<p>Это не просто голые советы, за всем этим стоит личный опыт и море потерянного времени.<br />
Эту статью стоило назвать &#8220;Мои ошибки, совершенные при работе с Rails приложениями&#8221;, но получилось бы как-то слишком длинно.</p>
<p><span id="more-92"></span></p>
<h3><strong>Толстые модели и голые контроллеры</strong></h3>
<p>Моё первое rails-приложение было просто ужасно. Большая часть логики лежала в контроллерах. Я обрабатывал списки тегов и создавал ассоциации в контроллере, я почему-то отказывался от замечательного метода <strong>accepts_nested_attributes_for</strong>.</p>
<p>Всё было хорошо, но чёрт подери, я не люблю тестировать контроллеры! Гораздо проще и приятнее тестировать модели.</p>
<p>Обработка списка тегов очень простая задача, и почему же лучше выделить код этого обработчика в модель, а не контроллер?</p>
<ul>
<li><strong>Удобство</strong>. Вы просто открываете модель Post и находите там все методы, которые работают с вашей моделью. У вас нет нужды открывать контроллер и править методы там.</li>
<li><strong>Дальнейшая расширяемость</strong>. Если код обработчика будет висеть в методе контроллера, то практически, этот код будет навсегда привязан к контроллеру. А что если вы захотите обработать список тегов в консоли?</li>
<li><strong>Предназначение</strong>. Контроллеры не предназначены для разбивки списка тегов.</li>
</ul>
<h3><strong>Рисуйте и продумывайте</strong></h3>
<p>Да, это действительно помогает! Попробуйте обрисовать все связи вашего сайта. Попробуйте представить сложности, которые могут возникнуть. Конечно, при отсутствии опыта это может показаться очень трудным. Вы можете просто не знать, какие сложности будут ждать вас. Предварительное проектирование будет развивать вас. При обретении достаточного количества опыта, вы сможете заранее устранить многие сложности на этапе проектирования.</p>
<p>Я бы сэкономил уйму времени, если бы заранее нарисовал систему взаимодействия элементов меню со страницами и категориями на моем сайте.</p>
<p>Но я перемудрил и создал одну лишнюю модель. В итоге пришлось переписать всё.</p>
<p><strong>А что дают рисунки?</strong></p>
<p>В дальнейшем, спустя много времени вы сможете освежить свою память, просто взглянув на ваш рисунок. Иногда связи бывают очень сложными и “врубаться” заново в проект очень тяжело.</p>
<p>Графическая информация более проста к понимаю, поэтому она быстро освежит вам память и позволит сэкономить время.</p>
<h3><strong>Продумывайте ваш </strong><strong>css </strong><strong>заранее</strong></h3>
<p>Я потерял около двух дней на этом. Это был мой первый проект. Я решил отложить создание css-скелета на будущее. Я совершил роковую ошибку. Пришлось вручную править каждый view-файл.</p>
<p>Это было ужасно, но еще хуже то, что в первый раз я сделал это не правильно и пришлось повторно пройтись по всем файлам.</p>
<p>Избегайте этого, создавайте ваш css-скелет заранее и следуйте ему.</p>
<h3><strong>Описывайте сложные модели в комментариях</strong></h3>
<p>Это здорово помогло мне. Когда я создавал сложную систему меню с множеством простых и полиморфных связей.</p>
<p>Я решил заранее описать суть этой модели в комментариях.</p>
<p>Когда я создавал модель, всё было понятно, но уже через пару недель я не мог вспомнить всех тонкостей. Комментарии помогли мне.</p>
<h3><strong>Думайте о расширяемости</strong></h3>
<p>Если вы создаете модель комментариев и привязываете эту модель к постам, подумайте, а что если в будущем вам понадобится добавить комментарии к голосованию, или к статичной странице? Продумайте расширяемость заранее, в будущем это сэкономит вам время.</p>
<p>Вы можете быстро сдать заказ, но что если через месяц что-то сломается или вам придётся добавить новую “фичу”? Гораздо приятнее работать с четкой структурой, нежели морем костылей.</p>
<p><strong> </strong></p>
<img src="http://rbdev.ru/?ak_action=api_record_view&id=92&type=feed" alt="" /><div class="tw_button" style=";float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2F9BZ2YK&amp;text=%D0%A1%D0%BE%D0%B2%D0%B5%D1%82%D1%8B%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D0%BC%20Rails-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0%D0%BC.&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Frbdev.ru%2F2010%2F07%2Fsovety-nachinayushhim-rails-razrabotchikam%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://rbdev.ru/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=g0HKeBC6cPk:uCjVS_m1J_E:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=g0HKeBC6cPk:uCjVS_m1J_E:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=g0HKeBC6cPk:uCjVS_m1J_E:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?i=g0HKeBC6cPk:uCjVS_m1J_E:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/are-you-in-software/~4/g0HKeBC6cPk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rbdev.ru/2010/07/sovety-nachinayushhim-rails-razrabotchikam/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://rbdev.ru/2010/07/sovety-nachinayushhim-rails-razrabotchikam/</feedburner:origLink></item>
		<item>
		<title>Опровержение статьи “Как получить работу Rails-разработчика не имея опыта”</title>
		<link>http://feedproxy.google.com/~r/are-you-in-software/~3/lFPq8ig1Lw0/</link>
		<comments>http://rbdev.ru/2010/07/oproverzhenie-stati-kak-poluchit-rabotu-rails-razrabotchika-ne-imeya-opyta/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 21:15:00 +0000</pubDate>
		<dc:creator>pechorin-andrey</dc:creator>
				<category><![CDATA[Переводы]]></category>

		<guid isPermaLink="false">http://rbdev.ru/?p=85</guid>
		<description><![CDATA[Недавно я перевёл статью &#8220;How To Land a Rails Job with No Experience&#8220;. Сегодня наткнулся на опровержение этой теории. Скажу честно, опровержение понравилось мне больше, чем оригинал. Если кого-то интересует, то я могу перевести это опровержение.]]></description>
			<content:encoded><![CDATA[<p></p><p>Недавно я <a href="http://rbdev.ru/2010/07/kak-poluchit-rabotu-rails-razrabotchika-ne/">перевёл</a> статью &#8220;<a href="http://codeulate.com/2010/06/land-a-rails-job-with-no-experience/">How To Land a Rails Job with No Experience</a>&#8220;. </p>
<p>Сегодня наткнулся на <a href="http://smartic.us/2010/06/30/landing-a-rails-job-with-no-experience-is-just-silly-talk/">опровержение</a> этой теории.</p>
<p>Скажу честно, опровержение понравилось мне больше, чем оригинал. Если кого-то интересует, то я могу перевести это опровержение.</p>
<img src="http://rbdev.ru/?ak_action=api_record_view&id=85&type=feed" alt="" /><div class="tw_button" style=";float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2F9pwvNA&amp;text=%D0%9E%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%81%D1%82%D0%B0%D1%82%D1%8C%D0%B8%20%22%D0%9A%D0%B0%D0%BA%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%83%20Rails-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0%20%D0%BD%D0%B5%20%D0%B8%D0%BC%D0%B5%D1%8F%20%D0%BE%D0%BF%D1%8B%D1%82%D0%B0%22&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Frbdev.ru%2F2010%2F07%2Foproverzhenie-stati-kak-poluchit-rabotu-rails-razrabotchika-ne-imeya-opyta%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://rbdev.ru/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=lFPq8ig1Lw0:H0hU6tmNOWQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=lFPq8ig1Lw0:H0hU6tmNOWQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=lFPq8ig1Lw0:H0hU6tmNOWQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?i=lFPq8ig1Lw0:H0hU6tmNOWQ:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/are-you-in-software/~4/lFPq8ig1Lw0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rbdev.ru/2010/07/oproverzhenie-stati-kak-poluchit-rabotu-rails-razrabotchika-ne-imeya-opyta/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://rbdev.ru/2010/07/oproverzhenie-stati-kak-poluchit-rabotu-rails-razrabotchika-ne-imeya-opyta/</feedburner:origLink></item>
		<item>
		<title>Как получить работу Rails-разработчика не имея опыта</title>
		<link>http://feedproxy.google.com/~r/are-you-in-software/~3/I7mmPqTdMeM/</link>
		<comments>http://rbdev.ru/2010/07/kak-poluchit-rabotu-rails-razrabotchika-ne/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 18:20:42 +0000</pubDate>
		<dc:creator>pechorin-andrey</dc:creator>
				<category><![CDATA[Переводы]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://rbdev.ru/?p=47</guid>
		<description><![CDATA[Перевод статьи &#8220;How To Land a Rails Job with No Experience&#8220; 18 месяцев назад я получил отличную работу Rails-разработчика, не имея опыта в ruby. Ниже представлены три трюка, которые помогут сделать вам тоже самое. 1. Создайте приложение для своего портфолио. Очень важно создать Rails-приложение и дать возможность работодателю изучить его. Самое лучше доказательство вашей компетентности [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="http://rbdev.ru/wp-content/uploads/2010/07/B003JZC7CW_comfort_lapdesk_lifestyle.jpg"><img class="alignleft size-medium wp-image-135" title="B003JZC7CW_comfort_lapdesk_lifestyle" src="http://rbdev.ru/wp-content/uploads/2010/07/B003JZC7CW_comfort_lapdesk_lifestyle-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p><em>Перевод статьи &#8220;<a href="http://codeulate.com/2010/06/land-a-rails-job-with-no-experience/">How To Land a Rails Job with No Experience</a>&#8220;</em></p>
<p>18 месяцев назад я получил отличную работу Rails-разработчика, не имея опыта в ruby.<br />
Ниже представлены три трюка, которые помогут сделать вам тоже самое.</p>
<p><span id="more-47"></span></p>
<h3>1. Создайте приложение для своего портфолио.</h3>
<p>Очень важно создать Rails-приложение и дать возможность работодателю изучить его. Самое лучше доказательство вашей компетентности — это ваш рабочий код. Даже самое простое Rails приложение показывает, что вы освоили целый набор технологий: базы данных, ruby, rails, erb, html, css, развертывание rails приложения и некоторые другие. Если вы абсолютный новичок в мире Ruby on Rails, то я советую вам следовать следующим рекомендациям:</p>
<ul>
<li>Прочтите эту книгу — <a href="http://www.railstutorial.org/">http://www.railstutorial.org/</a>. Я думаю это отличная книга. Однако, как и в случае многих книг по программированию, вам не стоит просто читать текст. Следуйте примерам книги, создайте тестовое приложение. Придумайте простые задачи, сделайте так, чтобы ваше приложение решало их! Так вы быстрее научитесь многим вещам.</li>
<li>После прочтения книги придумайте небольшое приложение для портфолио. Выберите что-нибудь маленькое и работайте над этим.</li>
<li>Когда ваше приложение начнёт работать, используйте его как площадку для экспериментов. Попробуйте установить различные плагины и gem’ы. Переключитесь с Test::Unit на RSpec. Попробуйте перейти со стандартных фикстур на что-нибудь вроде <a href="http://github.com/thoughtbot/factory_girl">factory girl</a>. Переписывайте ваш код.</li>
<li>Теперь выберите интересующие вас вакансии Rails-разработчика. Каждая из вакансий должна содержать в себе список технологий, которые используются в данной конторе. Внимательно просмотрите этот список и найдите то, что не очень знакомо вам. Возможно, вы еще не освоили Jquery, TDD и git. Уделите время и внедрите эти технологии в ваше приложение. Поймите, не обязательно в совершенстве владеть этими вещами, но уметь работать с этим на базом уровне всегда пригодится. Например, представьте себе такой диалог (которые обязательно случится) — <em>Работодатель</em>: Мы постоянно используем Jquery в наших разработках, вы владеете этим? <em>Вы</em>: я не владею этим в совершенстве, но я реализовал drag and drop и несколько визуальных эффектов в моей приложении. Вы должны доказать работодателю, что способны обучаться новым вещам. Если вы способны к самообучению, тогда работодатель наверняка обратит на вас внимание.</li>
</ul>
<h3>2. Используйте Github</h3>
<p>Если бы существовало какое-то официальное место для опубликования ruby-кода, то <a href="http://github.com">http://github.com</a> наверняка был бы этим местом. Вы просто обязаны иметь аккаунт на github и постоянно выкладывать ваш код туда. Работодателям будет гораздо легче оценить код проектов из вашего портфолио, если он будет находится на github.  Наблюдайте за программистами, которые интересуют вас. Читайте код их коммитов, тогда вы еще быстрее освоите стили программирования руби.</p>
<h3>3. Посещайте ruby-встречи.</h3>
<p>Это самый лучший способ получить свой шанс. Обычно такие встречи проходят локально, поэтому вы заранее будете знать многих участников. Вы сможете узнать о новых рабочих местах, и более того — отдать своё резюме в руки представителя какой-нибудь компании, что на практике гораздо лучше, нежели посылка резюме через электронную почту.</p>
<p>Помимо новых вакансий,  такие встречи хороши для поиска своего ruby-наставника. Многие люди готовы помочь новичкам, ответить на их вопросы, а так же оценить ваш код и указать на слабые места. Просто обратитесь к кому-нибудь, попросите его указать на самую ужасную часть кода и разузнайте то, как бы он исправил это.</p>
<h3>Ответы на некоторые вопросы:</h3>
<p><strong>Действительно ли рынок </strong><strong>Rails</strong><strong>-разработчиков ищет новых талантов?</strong></p>
<p>Конечно! На моей последней встречи на <a href="http://bostonrb.org/">http://bostonrb.org/</a> я слышал о 4+ открытых вакансиях. Позиция, которую сейчас занимаю я, была открыта на протяжении нескольких месяц. Потом они решили взять новичка и обучать его.</p>
<p><strong>Стоит ли пытаться ворваться в мир </strong><strong>Rails</strong><strong>?</strong></p>
<p>Определенно!<br />
Ruby — замечательный инструмент. Я люблю этот язык программирования. Помимо этого вы будете приятно удивлены rails-сообществом.</p>
<p><strong>Будут ли эти советы действенными для меня?</strong></p>
<p>Возможно. Они помогли мне! Я попал на желаемую работу после пары месяцев тяжелого труда.</p>
<img src="http://rbdev.ru/?ak_action=api_record_view&id=47&type=feed" alt="" /><div class="tw_button" style=";float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2FacYebW&amp;text=%D0%9A%D0%B0%D0%BA%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%83%20Rails-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0%20%D0%BD%D0%B5%20%D0%B8%D0%BC%D0%B5%D1%8F%20%D0%BE%D0%BF%D1%8B%D1%82%D0%B0&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Frbdev.ru%2F2010%2F07%2Fkak-poluchit-rabotu-rails-razrabotchika-ne%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://rbdev.ru/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=I7mmPqTdMeM:byfTHpF_hHA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=I7mmPqTdMeM:byfTHpF_hHA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=I7mmPqTdMeM:byfTHpF_hHA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?i=I7mmPqTdMeM:byfTHpF_hHA:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/are-you-in-software/~4/I7mmPqTdMeM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rbdev.ru/2010/07/kak-poluchit-rabotu-rails-razrabotchika-ne/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://rbdev.ru/2010/07/kak-poluchit-rabotu-rails-razrabotchika-ne/</feedburner:origLink></item>
		<item>
		<title>Изучаем ядро Ruby — классы и объекты</title>
		<link>http://feedproxy.google.com/~r/are-you-in-software/~3/-guJM3Zvle8/</link>
		<comments>http://rbdev.ru/2010/07/izuchaem-yadro-ruby-klassy-i-obekty/#comments</comments>
		<pubDate>Sun, 04 Jul 2010 22:35:18 +0000</pubDate>
		<dc:creator>pechorin-andrey</dc:creator>
				<category><![CDATA[Разработка]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://rbdev.ru/?p=35</guid>
		<description><![CDATA[Привет всем. Решил изучать исходники моего любимого Руби. Буду периодически делиться с вами своими наблюдениями. Небольшое предупреждение: Желательно знать Си. Хотя бы немного. Ладно-ладно, не знаете? Ну, тогда спрашивайте в комментариях, я вам на &#8220;яблоках&#8221; объясню (и почему я постоянно думаю, что кто-то вообще еще продолжает читать этот рассказ?). Пожалуйста, не пугайтесь слова &#8220;указатель&#8221;. Это [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="http://rbdev.ru/wp-content/uploads/2010/07/FAA_hacking1.jpg"><img class="alignleft size-full wp-image-140" title="FAA_hacking" src="http://rbdev.ru/wp-content/uploads/2010/07/FAA_hacking1.jpg" alt="" width="300" height="300" /></a></p>
<p>Привет всем.<br />
Решил изучать исходники моего любимого Руби. Буду периодически делиться с вами своими наблюдениями.</p>
<p><strong>Небольшое предупреждение</strong>:<br />
Желательно знать Си. Хотя бы немного. Ладно-ладно, не знаете? Ну, тогда спрашивайте в комментариях, я вам на &#8220;яблоках&#8221; объясню (и почему я постоянно думаю, что кто-то вообще еще продолжает читать этот рассказ?).</p>
<p>Пожалуйста, не пугайтесь слова &#8220;указатель&#8221;. Это переменная которая указывает на что-то другое (если выражаться очень понятным языком).<br />
Если попытаться привести простую аналогию указателей в руби, то на ум приходит следующая конструкция:</p>
<p><span id="more-35"></span><br />
Есть объект стандартного удостоверения личности. А есть человек, имеющий этот документ.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Document
  attr_accessor <span style="color:#ff3333; font-weight:bold;">:person</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># при создании документа указываем его номер а так же объект, которому будет принадлежать сей документ</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>object, number<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@document_number</span> = number
    <span style="color:#0066ff; font-weight:bold;">@person</span> = object
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Person = <span style="color:#CC00FF; font-weight:bold;">Struct</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># наш человек имеет имя Олег!</span>
someone = Person.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Oleg&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># теперь создадим документ</span>
<span style="color:#008000; font-style:italic;"># передадим в качестве аргументов функции нашего человека и номер документа</span>
doc = Document.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>someone,<span style="color:#006666;">23234</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># а теперь магия!</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> doc.<span style="color:#9900CC;">person</span>.<span style="color:#9900CC;">name</span>
<span style="color:#008000; font-style:italic;"># =&gt; &quot;Oleg&quot;</span>
doc.<span style="color:#9900CC;">person</span>.<span style="color:#9900CC;">name</span> = <span style="color:#996600;">&quot;Natalia&quot;</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> doc.<span style="color:#9900CC;">person</span>.<span style="color:#9900CC;">name</span>
<span style="color:#008000; font-style:italic;"># =&gt; &quot;Natalia&quot;</span></pre></div></div>

<p>На самом деле при создании нашего документа мы передали УКАЗАТЕЛЬ на объект Person. Таким образом получили возможность манипулировать этим объектом через класс Document.</p>
<p>В си нет классов, зато есть Структуры. И в руби они тоже есть (если вы не знали, то смотрим внимательно на класс Struct).<br />
Я начну свой рассказ с файла &#8220;ruby.h&#8221;, и не от того, что я уже как пять пальцев знаю всю архитектуру руби, а, наверное, из-за того, что именно этот файл мы инклудим при создании своего расширения на си для руби.</p>
<p>Обратим внимание на самые важные вещи для нас -&gt; класс и объект. Сейчас вы поймёте почему метапрограммирование в руби именно такое, почему можно сделать так и оно будет работать:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> MyClass
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">hello</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;hello&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span> 
&nbsp;
MyClass.<span style="color:#9900CC;">hello</span>
<span style="color:#008000; font-style:italic;"># &gt;&gt; &quot;hello&quot;</span>
&nbsp;
MyClass.<span style="color:#9900CC;">instance_eval</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> hello
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;goodbye&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
MyClass.<span style="color:#9900CC;">hello</span>
<span style="color:#008000; font-style:italic;"># &gt;&gt; goodbye</span></pre></div></div>

<p>Для себя я выделил 3 структуры, которые будут интересны нам:<br />
<strong>RBasic</strong>, <strong>RObject</strong> и <strong>RClass</strong>.</p>
<p>Вот код этих структур:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> RBasic <span style="color: #009900;">&#123;</span>
<span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span> flags<span style="color: #339933;">;</span>
VALUE klass<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">struct</span> RObject <span style="color: #009900;">&#123;</span>
<span style="color: #993333;">struct</span> RBasic basic<span style="color: #339933;">;</span>
<span style="color: #993333;">struct</span> st_table <span style="color: #339933;">*</span>iv_tbl<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">struct</span> RClass <span style="color: #009900;">&#123;</span>
<span style="color: #993333;">struct</span> RBasic basic<span style="color: #339933;">;</span>
<span style="color: #993333;">struct</span> st_table <span style="color: #339933;">*</span>iv_tbl<span style="color: #339933;">;</span>
<span style="color: #993333;">struct</span> st_table <span style="color: #339933;">*</span>m_tbl<span style="color: #339933;">;</span>
VALUE super<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Давайте внимательно взглянем на структуры <strong>RObject</strong> и <strong>RClass</strong> (Объект и Класс).<br />
Наверное, вы обратили внимание, что обе структуры имеют внутри себя еще одну структуру — <strong>RBasic</strong>.<br />
Структура <strong>RBasic</strong> содержит в себе интересную строку — &#8220;VALUE klass&#8221;.  Если узнать, что же такое VALUE, то оказывается, что это переменная типа unsigned long. Эта переменная хранит в себе адрес класса в памяти. Зная адрес класса в памяти мы можем обращаться к нему в любое время!</p>
<p>Объект и класс в руби, обязательно имеют VALUE klass. Понимаете к чему я веду? Класс тоже является объектом!</p>
<p>Да, это странно, и не похоже на некоторые другие языки.<br />
Именно это когда-то вскрыло мне мозги — &#8221;О боже, как так? Декларация класса тоже объект? no way!&#8221;</p>
<p>Давайте приглядимся к структуре <strong>RObject</strong>, помимо структуры <strong>RBasic</strong> она имеет ссылку на <strong>iv_tbl</strong>.<br />
<strong>iv_tbl</strong> расшифровывается как instance_variable_table, то есть таблица переменных объекта.</p>
<p>Класс тоже имеет ссылку на таблицу переменных объекта.<br />
Да, да, у класса тоже могут быть свои переменные =) Эти переменные будут преследовать класс на протяжении всего цикла работы программы.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> MyClass; <span style="color:#9966CC; font-weight:bold;">end</span>
MyClass.<span style="color:#9900CC;">instance_variable_set</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;@var&quot;</span>, <span style="color:#006666;">100</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> MyClass.<span style="color:#9900CC;">instance_variable_get</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;@var&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#008000; font-style:italic;"># &gt;&gt; 100</span>
obj = MyClass.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> obj.<span style="color:#9900CC;">instance_variable_get</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;@var&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#008000; font-style:italic;"># &gt;&gt; nil</span></pre></div></div>

<p>Выведет nil, так как @my_var является переменной объекта MyClass, а не переменной экземпляра класса MyClass. (Надеюсь, я не запутал вас)</p>
<p>Окей, мы попытались разобраться с <strong>iv_tbl</strong> ( таблица переменных объекта ), теперь попробуем перейти к <strong>m_tbl</strong>.<br />
Это указатель на таблицу методов (methods_table). Вы, наверное, уже заметили, что объект не имеет в себе указатель на таблицу методов.</p>
<p>Почему? Всё очень просто. Объект имеет внутри себя структуру <strong>RBasic</strong>, которая содержит в себе адрес своего класса.</p>
<p>Как происходит поиск методов?</p>
<p>Предположим мы написали такой код:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">object.<span style="color:#9900CC;">my_method</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Интерпретатор обращается к объекту, узнает адрес класса объекта, обращается к классу по этому адресу. Найдя класс, интерпретатор обращается к таблице методов класса и ищет там метод.</p>
<p>Вы уже заметили строку &#8220;VALUE super&#8221; в структуре <strong>RClass</strong>?<br />
Здесь содержится адрес родительского класса.</p>
<p>если мы сделаем что-то вроде:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> A; <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">class</span> B <span style="color:#006600; font-weight:bold;">&lt;</span> A; <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>То теперь в поле &#8220;VALUE super&#8221; класса <strong>B</strong> будет адрес класса <strong>A</strong>, так как класс <strong>A</strong> является родителем класса <strong>B</strong>.</p>
<p>Таким образом, когда мы вызываем метод объекта, интерпретатор узнает класс объекта, обращается к этому классу, узнает адрес таблицы методов и пытается найти метод в этой таблице. Если метод не был найден, интерпретатор узнает адрес класса-родителя и если такой имеется, то он продолжает поиск метода в таблице методов класса-родителя.<br />
Если метод не найден и в классе-родителе, то поиск продолжается в super классе нашего родителя:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> A
<span style="color:#9966CC; font-weight:bold;">def</span> my_method<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">class</span> B <span style="color:#006600; font-weight:bold;">&lt;</span> A; <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">class</span> C <span style="color:#006600; font-weight:bold;">&lt;</span> B; <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
c = C.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
c.<span style="color:#9900CC;">my_method</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Мы видим, что метод my_method() определен в классе A, таким образом интерпретатор сначала будет искать этот метод в классе C, затем перейдет к классу B, а затем к классу A.<br />
Это интересно, потому как раньше мне казалось, что создавая вот такое наследование:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> User <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>мы тянем за собой всю тонну классов ActiveRecord&#8217;а. Мне было страшно, что мой скромный класс User &#8220;заполняется&#8221; методами своего родителя, я переживал за память.<br />
Теперь мне легче. Умнеть иногда полезно =)</p>
<p>Думаю, теперь вы понимаете, что при наследовании руби создает цепочку классов, и каждый класс из этой цепи ссылается на свою таблицу методов.<br />
Руби будет искать метод до тех пор, пока не дойдет до самого высшего класса цепочки.</p>
<p>В следующем выпуске я хотел бы ближе рассмотреть модули, то как они включаются в цепь наследования, а так же получше рассмотреть таблицы методов и переменных объекта.</p>
<p>Спасибо за терпение, жду ваших отзывов.</p>
<p><a rev="vote-for" href="http://progg.ru/%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC-%D1%8F%D0%B4%D1%80%D0%BE-Ruby-%E2%80%94-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D1%8B-%D0%B8-%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B-Are-you-in-software"><img style="border: 0px;" src="http://progg.ru/image.axd?url=http%3A%2F%2Frbdev.ru%2Farticles%2F%D0%B8%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC-%D1%8F%D0%B4%D1%80%D0%BE-ruby-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D1%8B-%D0%B8-%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B" alt="Progg it" /></a></p>
<img src="http://rbdev.ru/?ak_action=api_record_view&id=35&type=feed" alt="" /><div class="tw_button" style=";float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2Fa4Jwa0&amp;text=%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC%20%D1%8F%D0%B4%D1%80%D0%BE%20Ruby%20%E2%80%94%20%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D1%8B%20%D0%B8%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Frbdev.ru%2F2010%2F07%2Fizuchaem-yadro-ruby-klassy-i-obekty%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://rbdev.ru/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=-guJM3Zvle8:GfvajoK-5nk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=-guJM3Zvle8:GfvajoK-5nk:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=-guJM3Zvle8:GfvajoK-5nk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?i=-guJM3Zvle8:GfvajoK-5nk:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/are-you-in-software/~4/-guJM3Zvle8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rbdev.ru/2010/07/izuchaem-yadro-ruby-klassy-i-obekty/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
		<feedburner:origLink>http://rbdev.ru/2010/07/izuchaem-yadro-ruby-klassy-i-obekty/</feedburner:origLink></item>
		<item>
		<title>95 – Пишите тесты для людей</title>
		<link>http://feedproxy.google.com/~r/are-you-in-software/~3/C5wDOfDqSjs/</link>
		<comments>http://rbdev.ru/2010/07/95-pishite-testy-dlya-lyudej/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 22:47:46 +0000</pubDate>
		<dc:creator>pechorin-andrey</dc:creator>
				<category><![CDATA[Переводы]]></category>

		<guid isPermaLink="false">http://rbdev.ru/?p=18</guid>
		<description><![CDATA[95-ая статья из книги 97 Things Every Programmer Should Know by Gerard Meszaros Вы пишите автоматические тесты для одного или всех своих приложений? Мои поздравления! Вы пишите тесты до написания кода? Это еще лучше! Просто делая это, вы приближаете себя к гордому званию настоящего разработчика. Но постойте, вы пишите хорошие тесты? Задайте себе вопрос — “Для кого [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="http://rbdev.ru/wp-content/uploads/2010/07/j0341513.jpg"><img class="alignleft size-medium wp-image-142" title="j0341513" src="http://rbdev.ru/wp-content/uploads/2010/07/j0341513-214x300.jpg" alt="" width="214" height="300" /></a></p>
<p><em>95-ая статья из книги <a href="http://programmer.97things.oreilly.com/wiki/index.php/97_Things_Every_Programmer_Should_Know">97 Things Every Programmer Should Know<br />
</a></em><em>by </em><strong><em>Gerard Meszaros </em></strong></p>
<p>Вы пишите автоматические тесты для одного или всех своих приложений? Мои поздравления!<br />
Вы пишите тесты до написания кода? Это еще лучше! Просто делая это, вы приближаете себя к гордому званию настоящего разработчика.</p>
<p>Но постойте, вы пишите хорошие тесты? Задайте себе вопрос — “Для кого я пишу тесты?”.</p>
<p>Писать тесты для себя или для компилятора не самая лучшая идея. Так для чего же на самом деле стоит писать тесты?</p>
<p><span id="more-18"></span></p>
<p>Тесты стоит писать для людей, которые в дальнейшем будут изучать ваш код. Хорошие тесты являются документацией к тестируемым программам. Они отлично описывают как и для чего работает код.</p>
<p>Можно выделить три основных сценария тестирования:</p>
<ul>
<li>Описание контекста тестируемой части программы, точку входа и данные, которые должны быть определены, перед выполнением теста</li>
<li>Демонстрация того, как программа должна быть вызвана</li>
<li>Описание ожидаемых результатов или условий, которые будут проверены</li>
</ul>
<p>Человек, который пытается понять ваш код должен просто взглянуть на тесты и получить понимание того, как работает программа и к каким последствиям могут привести различные действия.</p>
<p>Каждый из тестов должен кристально ясно демонстрировать один из трёх сценариев тестирования.</p>
<p>Это означает, что тесты должны демонстрировать не только то, что явно, но и то, что скрыто.</p>
<p>Слишком большие тесты могут быть тяжелы для понимания, так как читатель может отвлечься на незначительные вещи. Старайтесь убрать на второй план не особо значимые вещи. Рефакторинг — ваш лучший друг в данном вопросе, извлекайте методы из большого кода, сосредотачивайте внимание ваших читателей на самом важном. И конечно же не забывайте давать вашим тестам понятные названия, которые не будут запутывать, но и смогут раскрыть суть этого теста.</p>
<p>Тестируйте свои тесты. Звучит странно? Но это тоже хорошая идея.</p>
<p>Вы можете проверить смогли ли ваши тесты найти предполагаемые ошибки. Умышленно создайте ошибки в вашем проекте и посмотрите, смогли ли тесты вычислить их. Желательно делать это на локальной копии проекта, не стоит подвергать данные опасности. Убедитесь, что ошибки вызванные тестами понятно и четко описывают проблему, это так же поможет людям работать с вашим приложением.</p>
<p>Попросите своего партнера просмотреть ваши тесты. Непредвзятый взгляд сможет выявить сложные и непонятные места, над которыми вам стоит поработать. Если этот человек чего-то не понял, то скорее всего это не из-за того, что он глуп, а из-за того, что вы не смогли доходчиво передать суть теста. (А теперь вперед меняться ролями — почитайте тесты ваших коллег!)</p>
<img src="http://rbdev.ru/?ak_action=api_record_view&id=18&type=feed" alt="" /><div class="tw_button" style=";float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2FcC2hqC&amp;text=95%20-%20%D0%9F%D0%B8%D1%88%D0%B8%D1%82%D0%B5%20%D1%82%D0%B5%D1%81%D1%82%D1%8B%20%D0%B4%D0%BB%D1%8F%20%D0%BB%D1%8E%D0%B4%D0%B5%D0%B9&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Frbdev.ru%2F2010%2F07%2F95-pishite-testy-dlya-lyudej%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://rbdev.ru/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=C5wDOfDqSjs:gFhqLa0WGak:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=C5wDOfDqSjs:gFhqLa0WGak:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=C5wDOfDqSjs:gFhqLa0WGak:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?i=C5wDOfDqSjs:gFhqLa0WGak:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/are-you-in-software/~4/C5wDOfDqSjs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rbdev.ru/2010/07/95-pishite-testy-dlya-lyudej/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://rbdev.ru/2010/07/95-pishite-testy-dlya-lyudej/</feedburner:origLink></item>
		<item>
		<title>Немного слов о плохих переводах</title>
		<link>http://feedproxy.google.com/~r/are-you-in-software/~3/yZwIZMgBNQo/</link>
		<comments>http://rbdev.ru/2010/07/nemnogo-slov-o-ploxix-perevodax/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 22:39:50 +0000</pubDate>
		<dc:creator>pechorin-andrey</dc:creator>
				<category><![CDATA[Переводы]]></category>

		<guid isPermaLink="false">http://rbdev.ru/?p=16</guid>
		<description><![CDATA[Честно говоря я не очень хорошо знаю английский. Нет, ну конечно я его знаю. Почти вся литература, прочитанная мною, была на английском языке. Это скорее заслуга русских авторов. Я, знаете ли, не очень понимаю, что они иногда имеют ввиду. Ударьте меня, если я не прав, но нет ничего хуже, чем русская техническая литература. Ах, я [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Честно говоря я не очень хорошо знаю английский.</p>
<p>Нет, ну конечно я его знаю. Почти вся литература, прочитанная мною, была на английском языке. Это скорее заслуга русских авторов. Я, знаете ли, не очень понимаю, что они иногда имеют ввиду. Ударьте меня, если я не прав, но нет ничего хуже, чем русская техническая литература.</p>
<p>Ах, я отвлёкся от главной мысли. Я буду переводить до тех пор, пока не смогу понимать английский как свой родной. Все переводы, сделанные мною, называются &#8220;вольными&#8221;. Я могу дописать что-то своё или пропустить. Это не очень хорошо, но наверное это ваша плата за то, что вы не знаете английский. Конечно при условии, что кто-то вообще будет это читать.</p>
<img src="http://rbdev.ru/?ak_action=api_record_view&id=16&type=feed" alt="" /><div class="tw_button" style=";float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2Fc2Y95K&amp;text=%D0%9D%D0%B5%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%81%D0%BB%D0%BE%D0%B2%20%D0%BE%20%D0%BF%D0%BB%D0%BE%D1%85%D0%B8%D1%85%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%D0%B4%D0%B0%D1%85&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Frbdev.ru%2F2010%2F07%2Fnemnogo-slov-o-ploxix-perevodax%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://rbdev.ru/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=yZwIZMgBNQo:m13iGWaYZUk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=yZwIZMgBNQo:m13iGWaYZUk:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=yZwIZMgBNQo:m13iGWaYZUk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?i=yZwIZMgBNQo:m13iGWaYZUk:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/are-you-in-software/~4/yZwIZMgBNQo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rbdev.ru/2010/07/nemnogo-slov-o-ploxix-perevodax/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://rbdev.ru/2010/07/nemnogo-slov-o-ploxix-perevodax/</feedburner:origLink></item>
		<item>
		<title>Этот пост можно не читать</title>
		<link>http://feedproxy.google.com/~r/are-you-in-software/~3/16is89jgB60/</link>
		<comments>http://rbdev.ru/2010/07/etot-post-mozhno-ne-chitat/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 18:25:04 +0000</pubDate>
		<dc:creator>pechorin-andrey</dc:creator>
				<category><![CDATA[Философия]]></category>

		<guid isPermaLink="false">http://rbdev.ru/?p=13</guid>
		<description><![CDATA[Привет всем, надеюсь через много лет кому нибудь пригодятся записи в этом &#8220;очередном блоге&#8221;. Говорят, что нужно представляться. Собственно делать этого мы не будем. Кто-то даже говорит о своих планах. Но и здесь я промолчу, наверное от того, что боюсь &#8220;спугнуть&#8221;. Так что лучше читайте мои посты, которые конечно же когда нибудь заполнят этот блог [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Привет всем, надеюсь через много лет кому нибудь пригодятся записи в этом &#8220;очередном блоге&#8221;.</p>
<p>Говорят, что нужно представляться. Собственно делать этого мы не будем. Кто-то даже говорит о своих планах. Но и здесь я промолчу, наверное от того, что боюсь &#8220;спугнуть&#8221;.</p>
<p>Так что лучше читайте мои посты, которые конечно же когда нибудь заполнят этот блог до отвала.</p>
<img src="http://rbdev.ru/?ak_action=api_record_view&id=13&type=feed" alt="" /><div class="tw_button" style=";float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fbit.ly%2FcwgJCU&amp;text=%D0%AD%D1%82%D0%BE%D1%82%20%D0%BF%D0%BE%D1%81%D1%82%20%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D0%BD%D0%B5%20%D1%87%D0%B8%D1%82%D0%B0%D1%82%D1%8C&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Frbdev.ru%2F2010%2F07%2Fetot-post-mozhno-ne-chitat%2F"  class="twitter-share-button" target="_blank" style="width:55px;height:22px;background:transparent url('http://rbdev.ru/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=16is89jgB60:N3-Ne7jL11A:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=16is89jgB60:N3-Ne7jL11A:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/are-you-in-software?a=16is89jgB60:N3-Ne7jL11A:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/are-you-in-software?i=16is89jgB60:N3-Ne7jL11A:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/are-you-in-software/~4/16is89jgB60" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://rbdev.ru/2010/07/etot-post-mozhno-ne-chitat/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://rbdev.ru/2010/07/etot-post-mozhno-ne-chitat/</feedburner:origLink></item>
	</channel>
</rss>

