<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Artem Melnikov feed</title>
    <link>http://ignar.name/rss/</link>
    <language>ru-ru</language>
    <ttl>40</ttl>
    <description>The main blog feed for my Web site.</description>
    
    
        <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ignar" /><feedburner:info uri="ignar" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
          <title>Ruby на linux платформе. Удобно и быстро с RVM</title>
          <description>&lt;h2&gt;О чем это?&lt;/h2&gt;
&lt;p&gt;Вместе с увеличением числа проектов на Ruby увеличивается список установленных gem&amp;#8217;ов, в какой то момент потребности в их версиях, а то и версиях Ruby расходятся. &lt;strong&gt;&lt;span class="caps"&gt;RVM&lt;/span&gt;&lt;/strong&gt; &amp;#8211; призвана лишить этих неудобств.&lt;/p&gt;
&lt;h3&gt;Вступление&lt;/h3&gt;
&lt;p&gt;Для разграничения различных версий Ruby, и не только для этого, существует &lt;strong&gt;&lt;a href="http://rvm.beginrescueend.com/"&gt;&lt;span class="caps"&gt;RVM&lt;/span&gt;&lt;/a&gt; ( Ruby Version Manager)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Как следует из названия, &lt;strong&gt;&lt;span class="caps"&gt;RVM&lt;/span&gt;&lt;/strong&gt; это утилита позволяющая бесконфликтно переключаться на различные сборки Ruby и наборы &lt;strong&gt;Gem&amp;#8217;ов&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ранее уже писалась статья  &lt;a href="http://ignar.name/articles/2010/08/10/-ruby-1-9-2-rails-3-rvm/"&gt;Установка Ruby 1.9.2 и Rails 3 с помощью &lt;span class="caps"&gt;RVM&lt;/span&gt;&lt;/a&gt; &amp;#8211; я решил ее обновить и представить в более универсальном виде.&lt;/p&gt;
&lt;h2&gt;Самое начало&lt;/h2&gt;
&lt;p&gt;Необходимые зависимости:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;curl&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;make&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;ruby&lt;/strong&gt; &amp;#8211; в системе должна стоят стандартная версия Ruby, установленная через менеджер пакетов системы&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;libmysqlclient-dev&lt;/strong&gt; &amp;#8211; необходимо для Rails и mysql/mysql2 gem&amp;#8217;ов&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;autoconf&lt;/strong&gt; &amp;#8211; необходимо установить через менеджер пакетов&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Установка&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;
bash &amp;lt; &amp;lt;( curl -s http://rvm.beginrescueend.com/releases/rvm-install-latest  )
&lt;/pre&gt;

&lt;p&gt;Эта комманда сделает все необходимое, в домашнем каталоге появится директория .rvm, куда все и установлено. &lt;br /&gt;
Хочу заметить, что другие пользователи не будут знать про существование других версий Ruby, кроме системного.&lt;br /&gt;
Все установка происходит локально, для конкретного пользователя.&lt;/p&gt;
&lt;p&gt;При установке создается, если у вас его не было, файл .bash_profile. Но у меня он не учитывается системой, можете его подключить, либо скопировать его содержимое в .bashrc:&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;
[[ -s "$HOME/.rvm/scripts/rvm" ]] &amp;amp;&amp;amp; source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
&lt;/pre&gt;
&lt;p&gt;Обязательно перед&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;
[ -z "$PS1" ] &amp;amp;&amp;amp; return
&lt;/pre&gt;

&lt;p&gt;И выполняем&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;
source ~/.rvm/scripts/rvm  
&lt;/pre&gt;
&lt;p&gt;Можно убедиться, что все установлено:&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;
rvm notes
&lt;/pre&gt;
&lt;p&gt;Ответ будет приблизительно таким и зависит от вашей системы:&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;
Notes for Linux ( DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.10
DISTRIB_CODENAME=maverick
DISTRIB_DESCRIPTION="Ubuntu 10.10" )
&lt;/pre&gt;

&lt;h2&gt;Установка Ruby&lt;/h2&gt;
&lt;p&gt;По зависимостям, для установки необходим &lt;a href="http://www.zlib.net"&gt;zlib&lt;/a&gt;, о чем нигде не пишут, но в конце компиляции возникает ошибка, о не найденной библиотеке. Заранее предотвращаем эту оплошность:&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;
rvm package install zlib  
&lt;/pre&gt;
&lt;p&gt;Ошибка при отсутствии &lt;strong&gt;zlib&lt;/strong&gt;:&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  no such file to load -- zlib
&lt;/pre&gt;
&lt;p&gt;Сюда же относится и &lt;strong&gt;autoconf&lt;/strong&gt;. Мы его ранее ставили через менеджер пакетов только ради необходимых зависимостей:&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;
rvm package install autoconf
&lt;/pre&gt;

&lt;p&gt;И последнее:&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;
rvm package install openssl 
&lt;/pre&gt;
&lt;p&gt;Возникающая ошибка при отсутствии &lt;strong&gt;openssl&lt;/strong&gt;&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;
no such file to load — openssl (LoadError)
&lt;/pre&gt;
&lt;p&gt;Если вы используете &lt;strong&gt;Rails&lt;/strong&gt; и консоль его окружения &lt;strong&gt;&amp;#8220;rails c&amp;#8221;&lt;/strong&gt; &amp;#8211; заранее установите &lt;strong&gt;readline&lt;/strong&gt;, иначе будет следующая ошибка&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;
no such file to load -- readline (LoadError)
&lt;/pre&gt;
&lt;p&gt;А так же устанавливаем &lt;strong&gt;bison&lt;/strong&gt; через менеджер пакетов.&lt;/p&gt;
&lt;p&gt;Если вы решите, что вам нужны последние версии исходников Ruby 1.9.2 &amp;#8211; проследите, что бы был установлен &lt;span class="caps"&gt;SVN&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Когда это все готово набираем:&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;
rvm install 1.9.2 -C --with-openssl-dir=$HOME/.rvm/usr --with-zlib-dir=$HOME/.rvm/usr --with-readline-dir=$HOME/.rvm/usr
&lt;/pre&gt;
&lt;p&gt;Для версии 1.9.2 или другую необходимую вам. Для установки самой последней версии 1.9.2 команду следует заменить на&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;
rvm install 1.9.2-head -C --with-openssl-dir=$HOME/.rvm/usr --with-zlib-dir=$HOME/.rvm/usr --with-readline-dir=$HOME/.rvm/usr
&lt;/pre&gt;
&lt;p&gt;Хочу обратить внимание, что устанавливать Ruby с dev версии следует, только, если вы знаете, что делаете.&lt;/p&gt;
&lt;p&gt;Все вышеописанное спасет вас от непонятных ошибок в процессе установки и других неприятностей.&lt;/p&gt;
&lt;h2&gt;Постустановка&lt;/h2&gt;
&lt;p&gt;Когда будет установлен выбранный вами &lt;strong&gt;Ruby&lt;/strong&gt; его наличие можно проверить командой&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;            
rvm list
&lt;/pre&gt;
&lt;p&gt;Она же показывает список всех установленных версий.&lt;/p&gt;
&lt;p&gt;Для переключения на нужную вам версию используйте:&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;            
rvm use 1.9.2
&lt;/pre&gt;
&lt;p&gt;В нашем случае 1.9.2, либо укажите любую другую из списка.&lt;/p&gt;
&lt;h2&gt;Разделение и использования пространства Gem&amp;#8217;ов&lt;/h2&gt;
&lt;h3&gt;Вступление&lt;/h3&gt;
&lt;p&gt;Очень удобно держать разные версии gem&amp;#8217;ов для разных проектов. Это предотвращает конфликты версий и помогает содержать набор только необходимых gem&amp;#8217;ов для текущего проекта.&lt;/p&gt;
&lt;p&gt;В &lt;span class="caps"&gt;RVM&lt;/span&gt; для каждой версии Ruby существует глобальный gemset &amp;#8220;global&amp;#8221;, который доступен для всех пространств имен, в нем полезно держать такие джемы, как rake и bundler, и постоянно следить за их актуальностью и обновлением.&lt;/p&gt;
&lt;h3&gt;Использование&lt;/h3&gt;
&lt;p&gt;Для создание своего gemset&amp;#8217;а:&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;  
rvm gemset create myproject
&lt;/pre&gt;
&lt;p&gt;Для его использования&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;  
rvm gemset use myproject
&lt;/pre&gt;
&lt;p&gt;Увидеть список gemset&amp;#8217;ов можно с помощью:&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;  
rvm gemset list
&lt;/pre&gt;
&lt;p&gt;В общем то, все по аналогии с управлением версий Ruby.&lt;/p&gt;
&lt;p&gt;Существует шортхенд для быстрого переключения на версию Ruby и определенный набор джемов:&lt;/p&gt;
&lt;pre name="code" class="brush:php"&gt;  
rvm use 1.9.2@myproject
&lt;/pre&gt;
&lt;p&gt;За более детальной документацией и вопросами, которые могут возникнуть при работе, лучше всего, обращаться на &lt;a href="http://rvm.beginrescueend.com/"&gt;официальный сайт&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Большое спасибо за комментарии и описание возникших у вас проблем.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ignar/~4/RCFy8wtKtzo" height="1" width="1"/&gt;</description>
          <pubDate>Tue, 18 Jan 2011 01:53:21 GMT</pubDate>
          <guid isPermaLink="false">http://ignar.name/articles/2011/01/18/ruby-linux-rvm/</guid>
          <link>http://feedproxy.google.com/~r/ignar/~3/RCFy8wtKtzo/</link>
          <author>Artem Melnikov</author>
        <feedburner:origLink>http://ignar.name/articles/2011/01/18/ruby-linux-rvm/</feedburner:origLink></item>
    
        <item>
          <title>Debugging Ruby: Understanding and Troubleshooting the VM and your Application</title>
          <description>&lt;a title="View Debugging Ruby on Scribd" href="http://www.scribd.com/doc/23548865/Debugging-Ruby" style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;"&gt;Debugging Ruby&lt;/a&gt; &lt;object id="doc_846296066065983" name="doc_846296066065983" height="500" width="450" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline:none;" &gt;		&lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"&gt;		&lt;param name="wmode" value="opaque"&gt; 		&lt;param name="bgcolor" value="#ffffff"&gt; 		&lt;param name="allowFullScreen" value="true"&gt; 		&lt;param name="allowScriptAccess" value="always"&gt; 		&lt;param name="FlashVars" value="document_id=23548865&amp;access_key=key-x28ugx92842n19ucqs&amp;page=1&amp;viewMode=slideshow"&gt; 		&lt;embed id="doc_846296066065983" name="doc_846296066065983" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=23548865&amp;access_key=key-x28ugx92842n19ucqs&amp;page=1&amp;viewMode=slideshow" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="500" width="450" wmode="opaque" bgcolor="#ffffff"&gt;&lt;/embed&gt; 	&lt;/object&gt;&lt;img src="http://feeds.feedburner.com/~r/ignar/~4/yvuyIGQZP4w" height="1" width="1"/&gt;</description>
          <pubDate>Fri, 14 Jan 2011 00:00:00 GMT</pubDate>
          <guid isPermaLink="false">http://ignar.name/articles/2011/01/14/debugging-ruby-understanding-and-troubleshooting-the-vm-and-your-application/</guid>
          <link>http://feedproxy.google.com/~r/ignar/~3/yvuyIGQZP4w/</link>
          <author>Artem Melnikov</author>
        <feedburner:origLink>http://ignar.name/articles/2011/01/14/debugging-ruby-understanding-and-troubleshooting-the-vm-and-your-application/</feedburner:origLink></item>
    
        <item>
          <title>Установка Hpricot на Windows 7 </title>
          <description>&lt;p&gt;Для установки Hpricot на Windows следует добавить опцию &lt;cite&gt;platform&lt;/cite&gt;&lt;/p&gt;
&lt;pre class="brush:bash"&gt;
gem install hpricot --platform=mswin32
&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/ignar/~4/CKs311BVzI8" height="1" width="1"/&gt;</description>
          <pubDate>Tue, 31 Aug 2010 00:56:16 GMT</pubDate>
          <guid isPermaLink="false">http://ignar.name/articles/2010/08/31/hpricot-windows-7/</guid>
          <link>http://feedproxy.google.com/~r/ignar/~3/CKs311BVzI8/</link>
          <author>Artem Melnikov</author>
        <feedburner:origLink>http://ignar.name/articles/2010/08/31/hpricot-windows-7/</feedburner:origLink></item>
    
        <item>
          <title>Познакомьтесь: лучший друг Novell - VMware</title>
          <description>&lt;p&gt;&lt;strong&gt;Дистрибутив Suse Linux обзавелся еще одним хорошим другом и партнером в лице VMware.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;И это помимо того, что Novell тесно сотрудничает с Microsoft и Microsoft официально рекомендует Suse Linux Enterprise для гибридных Windows/Linux систем.&lt;/p&gt;
&lt;p&gt;Доходы Novell в этом году достигли 36$ млн и это на 7% меньше чем в прошлом году. Востребованность Linux упала на 11% по сравнению с прошлым годом.&lt;/p&gt;
&lt;p&gt;В июне VMware и Novell &lt;a href="http://www.vmware.com/company/news/releases/novell-vmw-partnership.html"&gt;усилили сотрудничество&lt;/a&gt;. VMware будет поддерживать &lt;span class="caps"&gt;SUSE&lt;/span&gt; Linux Enterprise Server в каждой версии vSphere. vSphere это облачная операционная система от VMware.&lt;/p&gt;
&lt;p&gt;Для успешного развития и роста продаж Novell необходимо несколько сильных партнеров, которые смогли бы вводить в новые сферы рынка ее продукцию. Возможно, так же, что VMware станет главным претендентом на покупку Novell.&lt;/p&gt;
&lt;p&gt;По материалам &lt;a href="http://news.cnet.com/8301-1001_3-20014933-92.html"&gt;cnet&lt;/a&gt; и &lt;a href="http://www.zdnet.com/blog/btl/meet-novells-new-best-friend-vmware/38521"&gt;zdnet&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ignar/~4/4n5jE1BDmPw" height="1" width="1"/&gt;</description>
          <pubDate>Sun, 29 Aug 2010 00:00:00 GMT</pubDate>
          <guid isPermaLink="false">http://ignar.name/articles/2010/08/29/novell-vmware/</guid>
          <link>http://feedproxy.google.com/~r/ignar/~3/4n5jE1BDmPw/</link>
          <author>Artem Melnikov</author>
        <feedburner:origLink>http://ignar.name/articles/2010/08/29/novell-vmware/</feedburner:origLink></item>
    
        <item>
          <title>Rails 3 Beautiful Code</title>
          <description>&lt;div style="width:850px" id="__ss_3219240"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/GreggPollack/rails-3-beautiful-code-3219240" title="Rails 3 Beautiful Code"&gt;Rails 3 Beautiful Code&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse3219240" width="100%" height="500"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=beautifulcodeinrails3-greggpollack-100218130149-phpapp02&amp;stripped_title=rails-3-beautiful-code-3219240" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse3219240" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=beautifulcodeinrails3-greggpollack-100218130149-phpapp02&amp;stripped_title=rails-3-beautiful-code-3219240" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="100%" height="500"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/GreggPollack"&gt;GreggPollack&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ignar/~4/YGa0XjDUL24" height="1" width="1"/&gt;</description>
          <pubDate>Wed, 11 Aug 2010 17:54:45 GMT</pubDate>
          <guid isPermaLink="false">http://ignar.name/articles/2010/08/11/rails-3-beautiful-code/</guid>
          <link>http://feedproxy.google.com/~r/ignar/~3/YGa0XjDUL24/</link>
          <author>Artem Melnikov</author>
        <feedburner:origLink>http://ignar.name/articles/2010/08/11/rails-3-beautiful-code/</feedburner:origLink></item>
    
        <item>
          <title>Установка Ruby 1.9.2 и Rails 3 с помощью RVM</title>
          <description>&lt;p&gt;О установке последнего, на данный момент, уже много написано, каждый вариант в чем то уникален.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rails3&lt;/strong&gt; рекомендуется запускать под Ruby именно версии &lt;strong&gt;1.9.2&lt;/strong&gt;, либо 1.8.7, &lt;a href="#troubles"&gt;проблемы&lt;/a&gt; аналогичны, под &lt;strong&gt;1.9.1&lt;/strong&gt; они не рассчитаны и в разных местах выдают ошибку.&lt;/p&gt;
&lt;p&gt;&lt;del&gt;&lt;strong&gt;Ruby 1.9.2&lt;/strong&gt; еще далеко не стабильная версия, поэтому лучше всего оградить его окружение и джемы, под те же не стабильные &lt;strong&gt;Rails3&lt;/strong&gt;, которые в бете на данный момент, от остальных приложений. Для этого лучше &lt;a href="http://rvm.beginrescueend.com"&gt;Ruby Version Manager&lt;/a&gt; &amp;#8211; не придумаешь.&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;UPD&lt;/span&gt;&lt;/strong&gt; На данный момент, Rail3 стабильная версия, я с успехом ее использую уже три месяца, проблем не было.&lt;/p&gt;
&lt;p&gt;Все примеры рассчитаны под &lt;strong&gt;Linux&lt;/strong&gt;, поскольку под &lt;strong&gt;Windows это просто не работает&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;UPD&lt;/span&gt;&lt;/strong&gt; Поскольку &lt;span class="caps"&gt;RVM&lt;/span&gt; нет под Windows, ему существует альтернатива &lt;a href="http://github.com/vertiginous/pik"&gt;&lt;span class="caps"&gt;PIK&lt;/span&gt;&lt;/a&gt;, которая не входит в эту статью.&lt;/p&gt;
&lt;h4&gt;Самым важным наследием этой статьи являются &lt;a href="#troubles"&gt;проблемы&lt;/a&gt;, с которыми вы можете столкнуться, если у вас возникло что-то необычное пишите в комментариях.&lt;/h4&gt;
&lt;p&gt;И так:&lt;/p&gt;
&lt;p&gt;Если у вас нет &lt;strong&gt;curl&lt;/strong&gt; ставим его сразу. В каждом дистрибутиве по разному, примера не навожу.&lt;/p&gt;
&lt;h2&gt;Шаг первый &amp;#8211; устанавливаем &lt;span class="caps"&gt;RVM&lt;/span&gt;&lt;/h2&gt;
&lt;pre name="code" class="brush:bash"&gt;
  bash &amp;lt; &amp;lt;( curl http://rvm.beginrescueend.com/releases/rvm-install-latest )
&lt;/pre&gt;
&lt;p&gt;Ищем в &lt;strong&gt;.bashrc&lt;/strong&gt; вот такую строчку&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  [ -z "$PS1" ] &amp;amp;&amp;amp; return
&lt;/pre&gt;
&lt;p&gt;Перед ней вставляем это:&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  [[ -s "$HOME/.rvm/scripts/rvm" ]] &amp;amp;&amp;amp; . "$HOME/.rvm/scripts/rvm"  # This loads RVM into a shell session.
&lt;/pre&gt;
&lt;h2&gt;Шаг второй &amp;#8211; проверяем&lt;/h2&gt;
&lt;p&gt;Для вступление в силу необходимо либо перезапустить текущую консоль, либо самому прийти к горе, набрав&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  source ~/.rvm/scripts/rvm
&lt;/pre&gt;
&lt;p&gt;По идее установка завершена. Тестируем&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  type rvm | head -n1
&lt;/pre&gt;
&lt;p&gt;Должно выдать нечто осмысленное, у меня это&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  rvm является функцией
&lt;/pre&gt;
&lt;h2&gt;Шаг третий &amp;#8211; Проверка зависимостей&lt;/h2&gt;
&lt;p&gt;Команда&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  rvm notes
&lt;/pre&gt;
&lt;p&gt;Показывает что необходимо для разных Ruby. Нам, для простого &amp;#8211; ничего.&lt;/p&gt;
&lt;h2&gt;Шаг четвертый &amp;#8211; Приступаем к установке Ruby 1.9.2&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;Необходимо по зависимостям &lt;strong&gt;zlib&lt;/strong&gt;, о этом нигде не пишут, но в конце компиляции выскакивает ошибка о не найденной библиотеке. Заранее предотвращаем эту оплошность:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre name="code" class="brush:bash"&gt;
  rvm package install zlib
&lt;/pre&gt;
&lt;ul&gt;
	&lt;li&gt;Сюда же относится и &lt;strong&gt;autoconf&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre name="code" class="brush:bash"&gt;
  rvm package install autoconf
&lt;/pre&gt;
&lt;ul&gt;
	&lt;li&gt;Если последнее не сработает, пробуйте установить &lt;strong&gt;autoconf&lt;/strong&gt; через менеджер пакетов вашего дистрибутива &amp;#8211; это помогает.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Установить &lt;strong&gt;bison&lt;/strong&gt; с помощь менеджера пакетов.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Если у вас нет &lt;strong&gt;&lt;span class="caps"&gt;SVN&lt;/span&gt;&lt;/strong&gt; установите и его, поскольку версия &lt;strong&gt;Ruby 1.9.2 загружается именно с &lt;span class="caps"&gt;SVN&lt;/span&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Когда все это готово &amp;#8211; смело набирайте&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  rvm install 1.9.2-head
&lt;/pre&gt;
&lt;p&gt;Установка займет некоторое время.&lt;/p&gt;
&lt;p&gt;После установки назначаем эту версию по умолчанию:&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  rvm use 1.9.2-head --default
&lt;/pre&gt;
&lt;p&gt;Проверяем:&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  ruby -v
&lt;/pre&gt;
&lt;p&gt;Должен вернуть искомую версию.&lt;/p&gt;
&lt;h2&gt;Шаг пятый, последний &amp;#8211; Установка &lt;strong&gt;Rails 3&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Создаем отдельное пространство Gem&amp;#8217;ов&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  rvm --create use 1.9.2-head@rails3
&lt;/pre&gt;
&lt;p&gt;И устанавливаем в нем необходимые gem&amp;#8217;ы&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  gem install rails --pre
&lt;/pre&gt;
&lt;h2&gt;&lt;a name="troubles"&gt;&lt;/a&gt;Возникшие неприятности и их устранение&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;UPD&lt;/span&gt;&lt;/strong&gt; &amp;#8211; для корректной установки необходимым условием является наличие установленной стандартной версии Ruby. В ином случае возникает ошибка&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  make: *** [miniprelude.c] Ошибка 1
&lt;/pre&gt;
&lt;p&gt;Которую можно найти в логе:&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  .rvm/log/ruby-1.9.2-head/make.error.log 
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;UPD&lt;/span&gt; 2&lt;/strong&gt; При возникновении трудностей с &lt;strong&gt;zlib&lt;/strong&gt;, симптомы при попытке &lt;em&gt;gem update &amp;#8212;system&lt;/em&gt;:&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  no such file to load -- zlib
&lt;/pre&gt;
&lt;p&gt;Попрубуйте скачать и установить &lt;a href="http://www.zlib.net"&gt;zlib&lt;/a&gt; напрямую, затем выполнить&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  rvm package install zlib
&lt;/pre&gt;
&lt;p&gt;Удалить &lt;strong&gt;Ruby 1.9.2&lt;/strong&gt; и установить заново с опцией:&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  rvm remove 1.9.2-head;
  rvm install 1.9.2-head -C --with-zlib-dir=$HOME/.rvm/usr
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;UPD&lt;/span&gt; 3&lt;/strong&gt; &amp;#8211; если возникают проблемы с gem&amp;#8217;ом &lt;strong&gt;Mysql&lt;/strong&gt;&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
Building native extensions.  This could take a while...
ERROR:  Error installing mysql:
	ERROR: Failed to build gem native extension.

/home/ignar/.rvm/rubies/ruby-1.9.2-head/bin/ruby extconf.rb
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lnsl... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lmygcc... no
checking for mysql_query() in -lmysqlclient... no
*** extconf.rb failed ***
&lt;/pre&gt;
&lt;p&gt;Установите &lt;strong&gt;libmysqlclient-dev&lt;/strong&gt; &amp;#8211; это мне помогло&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;UPD&lt;/span&gt; 4&lt;/strong&gt; &amp;#8211; при возникновении проблем с &lt;strong&gt;openssl&lt;/strong&gt;&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  no such file to load -- openssl
&lt;/pre&gt;
&lt;p&gt;Необходимо удалить и установить ruby с &lt;strong&gt;openssl&lt;/strong&gt;&lt;/p&gt;
&lt;pre name="code" class="brush:bash"&gt;
  rvm package install openssl;
  rvm remove 1.9.2-head;
  rvm install 1.9.2-head -C --with-openssl-dir=$HOME/.rvm/usr
&lt;/pre&gt;
&lt;p&gt;Если вы раньше указывали дерикторию к &lt;strong&gt;zlib&lt;/strong&gt; укажите оба флага.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ignar/~4/7Y6P_LqUAvA" height="1" width="1"/&gt;</description>
          <pubDate>Tue, 10 Aug 2010 11:06:53 GMT</pubDate>
          <guid isPermaLink="false">http://ignar.name/articles/2010/08/10/-ruby-1-9-2-rails-3-rvm/</guid>
          <link>http://feedproxy.google.com/~r/ignar/~3/7Y6P_LqUAvA/</link>
          <author>Artem Melnikov</author>
        <feedburner:origLink>http://ignar.name/articles/2010/08/10/-ruby-1-9-2-rails-3-rvm/</feedburner:origLink></item>
    
        <item>
          <title>EventMachine: scalable non-blocking i/o in ruby</title>
          <description>&lt;a title="View EventMachine: scalable non-blocking i/o in ruby on Scribd" href="http://www.scribd.com/doc/28253878/EventMachine-scalable-non-blocking-i-o-in-ruby" style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;"&gt;EventMachine: scalable non-blocking i/o in ruby&lt;/a&gt; &lt;object id="doc_852055765260621" name="doc_852055765260621" height="500" width="100%" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline:none;" &gt;		&lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"&gt;		&lt;param name="wmode" value="opaque"&gt; 		&lt;param name="bgcolor" value="#ffffff"&gt; 		&lt;param name="allowFullScreen" value="true"&gt; 		&lt;param name="allowScriptAccess" value="always"&gt; 		&lt;param name="FlashVars" value="document_id=28253878&amp;access_key=key-1rb2iijpl7bew7i1f04i&amp;page=1&amp;viewMode=slideshow"&gt; 		&lt;embed id="doc_852055765260621" name="doc_852055765260621" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=28253878&amp;access_key=key-1rb2iijpl7bew7i1f04i&amp;page=1&amp;viewMode=slideshow" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="500" width="100%" wmode="opaque" bgcolor="#ffffff"&gt;&lt;/embed&gt; 	&lt;/object&gt;&lt;img src="http://feeds.feedburner.com/~r/ignar/~4/8nBWh8o2s8Q" height="1" width="1"/&gt;</description>
          <pubDate>Sun, 18 Jul 2010 11:00:00 GMT</pubDate>
          <guid isPermaLink="false">http://ignar.name/articles/2010/07/18/eventmachine-scalable-non-blocking-io-in-ruby/</guid>
          <link>http://feedproxy.google.com/~r/ignar/~3/8nBWh8o2s8Q/</link>
          <author>Artem Melnikov</author>
        <feedburner:origLink>http://ignar.name/articles/2010/07/18/eventmachine-scalable-non-blocking-io-in-ruby/</feedburner:origLink></item>
    
        <item>
          <title>Garbage Collection Slides from LA Ruby Conference</title>
          <description>&lt;a title="View Garbage Collection and the Ruby Heap on Scribd" href="http://www.scribd.com/doc/27174770/Garbage-Collection-and-the-Ruby-Heap" style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;"&gt;Garbage Collection and the Ruby Heap&lt;/a&gt; &lt;object id="doc_384256329632550" name="doc_384256329632550" height="500" width="100%" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline:none;" &gt;		&lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"&gt;		&lt;param name="wmode" value="opaque"&gt; 		&lt;param name="bgcolor" value="#ffffff"&gt; 		&lt;param name="allowFullScreen" value="true"&gt; 		&lt;param name="allowScriptAccess" value="always"&gt; 		&lt;param name="FlashVars" value="document_id=27174770&amp;access_key=key-2g5x6qhwa28yz3ia1hih&amp;page=1&amp;viewMode=slideshow"&gt; 		&lt;embed id="doc_384256329632550" name="doc_384256329632550" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=27174770&amp;access_key=key-2g5x6qhwa28yz3ia1hih&amp;page=1&amp;viewMode=slideshow" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="500" width="100%" wmode="opaque" bgcolor="#ffffff"&gt;&lt;/embed&gt; 	&lt;/object&gt;&lt;img src="http://feeds.feedburner.com/~r/ignar/~4/uaJ4nMwxwaU" height="1" width="1"/&gt;</description>
          <pubDate>Sat, 17 Jul 2010 17:51:18 GMT</pubDate>
          <guid isPermaLink="false">http://ignar.name/articles/2010/07/17/garbage-collection-slides-from-la-ruby-conference/</guid>
          <link>http://feedproxy.google.com/~r/ignar/~3/uaJ4nMwxwaU/</link>
          <author>Artem Melnikov</author>
        <feedburner:origLink>http://ignar.name/articles/2010/07/17/garbage-collection-slides-from-la-ruby-conference/</feedburner:origLink></item>
    
        <item>
          <title>Киев Google Technology User Group</title>
          <description>&lt;h2&gt;Сегодня, 17 июля, посетил &lt;a href="http://kyiv.gtugs.org/"&gt;Kyiv &lt;span class="caps"&gt;GTUG&lt;/span&gt;&lt;/a&gt; и спешу поделиться впечатлениями.&lt;/h2&gt;
&lt;p&gt;Выступали:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Крис Шабо, Google&lt;/strong&gt;. Крис работает над &lt;strong&gt;Google Buzz&lt;/strong&gt;. Под впечатлением его выступления я снова включил свой Buzz в Gmail.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Владимир Билоненко&lt;/strong&gt;, &lt;a href="http://www.maplos.com/"&gt;Maplos&lt;/a&gt; Создатель и ведущий разработчик сервиса &lt;strong&gt;&lt;a href="http://maplos.com/" rel="nofollow"&gt;Maplos&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Михайло Кашкин, &lt;a href="http://www.iparkcorp.com/"&gt;iPark&lt;/a&gt;&lt;/strong&gt; (сайт не очень впечатляет :), но поверьте на слово, работающие там ребята &amp;#8211; молодцы)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Постараюсь немного описать, про что говорилось и какие поднимались вопросы.&lt;/p&gt;
&lt;p&gt;Как это было в прошлый раз:&lt;/p&gt;
&lt;p&gt;&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="288" height="192" wmode="transparent" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="host=picasaweb.google.com&amp;amp;RGB=0x000000&amp;amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fvelmyshanovnyi%2Falbum%2F20100123_gtug_gmp%3Fkind%3Dphoto%26alt%3Drss%26"&gt;&lt;/p&gt;
&lt;h2&gt;Крис Шабо&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Google Buzz&lt;/strong&gt; &amp;#8211; если выделить самое главное из слов Криса, то Buzz никогда не хотел составлять конкуренцию Twitter&amp;#8217;y.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Ребята из Google очень любят Тви :)&lt;/em&gt; &amp;copy;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Buzz&lt;/strong&gt; &amp;#8211; разрабатывался как сервис общения, а не как платформа для микроблоггинга, это его отличает от Тви, он объединяет множество социальных сетей и сервисов (&lt;strong&gt;Google Reader&lt;/strong&gt;, &lt;strong&gt;Flickr&lt;/strong&gt;, &lt;strong&gt;Twitter&lt;/strong&gt; etc), давая таким образом объединять людей и их мнения.&lt;/p&gt;
&lt;p&gt;Сейчас, придя домой, я почистил свой Buzz, настроил и буду пользоваться. Окончательно решил дать еще один шанс этому продукту от Google.&lt;/p&gt;
&lt;h2&gt;&lt;a href="http://twitter.com/delfrrr"&gt;Владимир Билоненко&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Создатель и ведущий разработчик сервиса &lt;strong&gt;&lt;a href="http://maplos.com/" rel="nofollow"&gt;Maplos&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maplos&lt;/strong&gt; &amp;#8211; сервис создан для поиска адресов на веб страницах. Основное отличие от Google Maps в отсутствии определенной базы данных с адресами и компаниями, как например в &lt;a href="http://mapia.ua" rel="nofollow"&gt;Mapia&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maplos&lt;/strong&gt; пользуется результатами поиска &lt;strong&gt;Googla&amp;#8217;a&lt;/strong&gt;, &lt;strong&gt;Yandex&amp;#8217;a&lt;/strong&gt; или &lt;strong&gt;Bing&amp;#8217;a&lt;/strong&gt;, по вашему запросу, находит указанный адрес на странице и показывает его на карте с указанной вероятностью для введенного запроса.&lt;/p&gt;
&lt;p&gt;Очень просто и элегантно, как указывал Владимир.&lt;/p&gt;
&lt;h2&gt;Михайло Кашкин&lt;/h2&gt;
&lt;p&gt;Видео &lt;strong&gt;Обход ограничений Google App Engine&lt;/strong&gt; с участием Михаила.&lt;/p&gt;
&lt;p&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/1CCUGHxZJt8&amp;amp;hl=ru_RU&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/1CCUGHxZJt8&amp;amp;hl=ru_RU&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;Михаил поднимал вопросы организации работы команды программистов.&lt;/p&gt;
&lt;p&gt;Основные тезисы:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;em&gt;Каждое утро небольшое собрание на 15 минут, на котором обсуждается текущее состояния и возникшие проблемы.&lt;/em&gt; Думаю &amp;#8211; это здраво.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;em&gt;Каждые две недели релиз&lt;/em&gt; &amp;#8211; такая политика помогает довести за отведенный срок код до конечного, готового состояния.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;em&gt;Распределенная система версий&lt;/em&gt; &amp;#8211; &lt;strong&gt;Mercurial&lt;/strong&gt;, отношения с &lt;strong&gt;&lt;span class="caps"&gt;GIT&lt;/span&gt;&lt;/strong&gt; не сложились исторически. Думаю, централизированная система версий себя изжила, двумя руками за такие технологии.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;em&gt;Работа только в офисе&lt;/em&gt; &amp;#8211; вся работа только в офисе, хороший отдых и полные два выходных.&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/ignar/~4/rr2lu9zf0xc" height="1" width="1"/&gt;</description>
          <pubDate>Sat, 17 Jul 2010 16:50:24 GMT</pubDate>
          <guid isPermaLink="false">http://ignar.name/articles/2010/07/17/kyiv-google-technology-user-group/</guid>
          <link>http://feedproxy.google.com/~r/ignar/~3/rr2lu9zf0xc/</link>
          <author>Artem Melnikov</author>
        <feedburner:origLink>http://ignar.name/articles/2010/07/17/kyiv-google-technology-user-group/</feedburner:origLink></item>
    
        <item>
          <title>SQL - Взаимные связи объектов</title>
          <description>&lt;h2&gt;Задача&lt;/h2&gt;
&lt;p&gt;У меня возникла необходимость хранить информацию о взаимном отношении объектов.&lt;/p&gt;
&lt;p&gt;В данном примере это отношения пользователей, что визуально выглядит следующим образом:&lt;/p&gt;
&lt;p&gt;&lt;img src="/upload/user-relations.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Два пользователя дружат взаимно, а второй только хочет дружить с третьим, о чем он еще не знает. Наша задача предупредить его об этом.&lt;/p&gt;
&lt;h2&gt;Решение&lt;/h2&gt;
&lt;p&gt;Создаем следующую таблицу:&lt;/p&gt;
&lt;p&gt;&lt;img src="/upload/mutual-relations.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Она содержит три поля&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;id&lt;/strong&gt; &amp;#8211; primary key&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;user_id&lt;/strong&gt; &amp;#8211; пользователь инициировавший отношения&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;friend_id&lt;/strong&gt; &amp;#8211; с кем инициировавший отношения пользователь дружит&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;user_id и friend_id &amp;#8211; это фактически &lt;strong&gt;foreign keys&lt;/strong&gt; к некой третьей таблице, которая содержит информацию о пользователях.&lt;/p&gt;
&lt;p&gt;Вот так вот будут выглядеть данные в таблице &lt;strong&gt;`relations`&lt;/strong&gt; представленные на картинке с человечками:&lt;/p&gt;
&lt;table style="width:200px;"&gt;
	&lt;tr style="text-align:left;background:gray;"&gt;
		&lt;th&gt;id&lt;/th&gt;
		&lt;th&gt;user_id&lt;/th&gt;
		&lt;th&gt;friend_id&lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;1&lt;/td&gt;
		&lt;td&gt;1&lt;/td&gt;
		&lt;td&gt;2&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr style="text-align:left;" class="grey"&gt;
		&lt;td&gt;2&lt;/td&gt;
		&lt;td&gt;2&lt;/td&gt;
		&lt;td&gt;1&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;3&lt;/td&gt;
		&lt;td&gt;2&lt;/td&gt;
		&lt;td&gt;3&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Задача состоит в определении всех новых друзей пользователя c id=3.&lt;/p&gt;
&lt;p&gt;Для начала давайте найдем уникальные отношения:&lt;/p&gt;
&lt;pre class="brush:sql"&gt;
(select f.id, f.user_id, f.friend_id, 0 flag from relations f where f.friend_id = {user_id})
union 
(select ff.id, ff.friend_id as user_id, ff.user_id as friend_id, 1 flag from relations ff where ff.user_id = {user_id})
&lt;/pre&gt;
&lt;p&gt;Где {user_id} &amp;#8211; это id нужного нам пользователя.&lt;/p&gt;
&lt;p&gt;Из запроса выходит, что мы выбираем все три поля и дополнительное четвертое &amp;#8211; &lt;strong&gt;flag&lt;/strong&gt; которое принимает значения &lt;strong&gt;0&lt;/strong&gt; или &lt;strong&gt;1&lt;/strong&gt;.&lt;br /&gt;
0 &amp;#8211; если пользователь не инициатор данного отношения&lt;br /&gt;
1 &amp;#8211; если инициатор.&lt;/p&gt;
&lt;p&gt;Выполнив этот запрос получаем:&lt;/p&gt;
&lt;table style="width:200px;"&gt;
	&lt;tr style="text-align:left;background:gray;"&gt;
		&lt;th&gt;id&lt;/th&gt;
		&lt;th&gt;user_id&lt;/th&gt;
		&lt;th&gt;friend_id&lt;/th&gt;
		&lt;th&gt;flag&lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;3&lt;/td&gt;
		&lt;td&gt;2&lt;/td&gt;
		&lt;td&gt;3&lt;/td&gt;
		&lt;td&gt;0&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Получаем, что пользователь 2 установил отношение с пользователем 3.&lt;/p&gt;
&lt;p&gt;Но с этого запроса нельзя понять взаимные эти отношения или нет.&lt;/p&gt;
&lt;p&gt;Модифицируем запрос далее:&lt;/p&gt;
&lt;pre class="brush:sql"&gt;
select id, user_id, friend_id, if(count(*) = 2, 1, 0) mutual, flag from (
    select f.id, f.user_id, f.friend_id, 0 flag from relations f where f.friend_id = {user_id})
    union 
    select ff.id, ff.friend_id as user_id, ff.user_id as friend_id, 1 flag from relations ff where ff.user_id = {user_id})
    ) t3
group by user_id, friend_id
&lt;/pre&gt;
&lt;p&gt;Добавляем еще одно поле, назовем его &lt;strong&gt;flag&lt;/strong&gt;, оно считает количество найденных одинаковых связей. Обязательно правильно сгруппировав результат так, как нам надо, по user_id, friend_id.&lt;/p&gt;
&lt;p&gt;В результате выборка становится более информативной:&lt;/p&gt;
&lt;table style="width:200px;"&gt;
	&lt;tr style="text-align:left;background:gray;"&gt;
		&lt;th&gt;id&lt;/th&gt;
		&lt;th&gt;user_id&lt;/th&gt;
		&lt;th&gt;friend_id&lt;/th&gt;
		&lt;th&gt;mutual&lt;/th&gt;
		&lt;th&gt;flag&lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;3&lt;/td&gt;
		&lt;td&gt;2&lt;/td&gt;
		&lt;td&gt;3&lt;/td&gt;
		&lt;td&gt;0&lt;/td&gt;
		&lt;td&gt;0&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Поле &lt;strong&gt;mutual&lt;/strong&gt; показывает, что отношения не взаимные и наш пользователь не их инициатор.&lt;/p&gt;
&lt;p&gt;По постановке проблемы нам нужны только новые не взаимные связи:&lt;/p&gt;
&lt;pre class="brush:sql"&gt;
select id, user_id, friend_id, if(count(*) = 2, 1, 0) mutual, flag from (
    select f.id, f.user_id, f.friend_id, 0 flag from relations f where f.friend_id = {user_id})
    union 
    select ff.id, ff.friend_id as user_id, ff.user_id as friend_id, 1 flag from relations ff where ff.user_id = {user_id})
    ) t3
where friend_id = {user_id}
group by user_id, friend_id
having mutual = 0 and flag = 0
&lt;/pre&gt;
&lt;p&gt;Добавленное условие &lt;strong&gt;having&lt;/strong&gt; с полями &lt;strong&gt;mutual&lt;/strong&gt; и &lt;strong&gt;flag&lt;/strong&gt; равными &lt;strong&gt;0&lt;/strong&gt; отсекает все лишнее. Условие &lt;strong&gt;where&lt;/strong&gt; в общем то не обязательно.&lt;/p&gt;
&lt;p&gt;Для окончательно проверки нашего запроса добавим больше связей в таблицу:&lt;/p&gt;
&lt;table style="width:200px;"&gt;
	&lt;tr style="text-align:left;background:gray;"&gt;
		&lt;th&gt;id&lt;/th&gt;
		&lt;th&gt;user_id&lt;/th&gt;
		&lt;th&gt;friend_id&lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;1&lt;/td&gt;
		&lt;td&gt;1&lt;/td&gt;
		&lt;td&gt;2&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr style="text-align:left;" class="grey"&gt;
		&lt;td&gt;2&lt;/td&gt;
		&lt;td&gt;2&lt;/td&gt;
		&lt;td&gt;1&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr style="text-align:left;background-color:#FAFEC8;"&gt;
		&lt;td&gt;3&lt;/td&gt;
		&lt;td&gt;2&lt;/td&gt;
		&lt;td&gt;3&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr style="text-align:left;" class="grey"&gt;
		&lt;td&gt;4&lt;/td&gt;
		&lt;td&gt;1&lt;/td&gt;
		&lt;td&gt;3&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;5&lt;/td&gt;
		&lt;td&gt;3&lt;/td&gt;
		&lt;td&gt;1&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr style="text-align:left;" class="grey"&gt;
		&lt;td&gt;6&lt;/td&gt;
		&lt;td&gt;3&lt;/td&gt;
		&lt;td&gt;6&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;h3&gt;Окончательный запрос&lt;/h3&gt;
&lt;p&gt;Из всего нас интересует только связь с id=3 где пользователю надо ответить или не ответить взаимностью, выполнив следующий запрос:&lt;/p&gt;
&lt;pre class="brush:sql"&gt;
select id, user_id, friend_id, if(count(*) = 2, 1, 0) mutual, flag from (
    select f.id, f.user_id, f.friend_id, 0 flag from relations f where f.friend_id = 3)
    union 
    select ff.id, ff.friend_id as user_id, ff.user_id as friend_id, 1 flag from relations ff where ff.user_id = 3)
    ) t3
where friend_id = 3
group by user_id, friend_id
having mutual = 0 and flag = 0
&lt;/pre&gt;
&lt;p&gt;Получим необходимый результат:&lt;/p&gt;
&lt;table style="width:200px;"&gt;
	&lt;tr style="text-align:left;background:gray;"&gt;
		&lt;th&gt;id&lt;/th&gt;
		&lt;th&gt;user_id&lt;/th&gt;
		&lt;th&gt;friend_id&lt;/th&gt;
		&lt;th&gt;mutual&lt;/th&gt;
		&lt;th&gt;flag&lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt;3&lt;/td&gt;
		&lt;td&gt;2&lt;/td&gt;
		&lt;td&gt;3&lt;/td&gt;
		&lt;td&gt;0&lt;/td&gt;
		&lt;td&gt;0&lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Задача решена.&lt;/p&gt;
&lt;p&gt;Приятного кодирования.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ignar/~4/Q9_k-yaYT8E" height="1" width="1"/&gt;</description>
          <pubDate>Fri, 02 Jul 2010 13:04:38 GMT</pubDate>
          <guid isPermaLink="false">http://ignar.name/articles/2010/07/02/mutual-relationship/</guid>
          <link>http://feedproxy.google.com/~r/ignar/~3/Q9_k-yaYT8E/</link>
          <author>Artem Melnikov</author>
        <feedburner:origLink>http://ignar.name/articles/2010/07/02/mutual-relationship/</feedburner:origLink></item>
    
    
  </channel>
</rss>

