<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>fxposter&#039;s wave &#187; Ruby</title>
	<atom:link href="http://blog.fxposter.org/tag/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fxposter.org</link>
	<description>Stories about Ruby, JavaScript, Objective-C and other cool tools</description>
	<lastBuildDate>Sun, 30 Oct 2011 20:00:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Установка gem-ов в пользовательскую директорию</title>
		<link>http://blog.fxposter.org/2010/07/07/install-gems-to-user-directory/</link>
		<comments>http://blog.fxposter.org/2010/07/07/install-gems-to-user-directory/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 20:15:19 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=808</guid>
		<description><![CDATA[Есть такая фича в Rubygems, как установка гем-ов в директорию пользователя ~/.gem, если gem install запускается без sudo и, соответственно, у пользователя нет разрешения установить что-либо в дефолтную директорию. В Rubygems до версии 1.3.6 это решалось просто - автоматически. Т.е. если вы вместо sudo gem install пишете gem install - вам выдается warning, но гем [...]]]></description>
			<content:encoded><![CDATA[<p>Есть такая фича в <a href="http://rubyforge.org/projects/rubygems/">Rubygems</a>, как установка гем-ов в директорию пользователя ~/.gem, если <code>gem install</code> запускается без sudo и, соответственно, у пользователя нет разрешения установить что-либо в дефолтную директорию.</p>
<p>В Rubygems до версии 1.3.6 это решалось просто - автоматически. Т.е. если вы вместо <code>sudo gem install</code> пишете <code>gem install</code> - вам выдается warning, но гем успешно устанавливается:</p>
<pre><code>[fxposter@kitty ~]$ gem install haml
WARNING:  Installing to ~/.gem since /usr/lib/ruby/gems/1.8 and
/usr/bin aren't both writable.
Successfully installed haml-3.0.13
1 gem installed
Installing ri documentation for haml-3.0.13...
Installing RDoc documentation for haml-3.0.13...</code></pre>
<p>Вроде бы всё замечательно. Но с версии 1.3.6 это дефолтное поведение изменилось, и при обновлении с помощью <code>gem update --system</code> об этом честно пишется:</p>
<blockquote><p>&#8211;user-install is no longer the default.  If you really liked it, see Gem::ConfigFile to learn how to set it by default.  (This change was made in 1.3.6)</p></blockquote>
<p>Но кто реально читают все эти тексты? Да и не все обновляют Rubygems таким образом. В нашем случае произошла смена сервера. Причем на старом сервере стояла старая версия <a href="http://www.rubyenterpriseedition.com/">Ruby Enterprise Edition</a> и дефолтные Rubygems 1.3.5. На новом же серваке наши бравые админы опять всё &#8220;покомпилили&#8221; и вместе с REE у нас там обновился и Rubygems - теперь там стояла версия 1.3.7. И&#8230; сначала отвалился деплой, т.к. по умолчанию rake gems:install у нас там не включен. Запустили rake gems:install - не работает. Запустили gem install - не работает. Всё просто замечательно.</p>
<p>Разбирались долго. Сначала думали на админов, которые в рельсах плохо шарят и думали, что они там &#8220;понастраивали&#8221;. Кстати, понастраивали они действительно знатно - скомпилированный REE почему-то стоит поверх стандартного Ruby 1.8.5 (у нас там CentOS 5, в ближайшем времени переезжаем на <a href="http://aws.amazon.com/ec2/">Amazon EC2</a> на Ubuntu). Но это неважно. После долгого разговора с админом и ковыряния серваков я чисто случайно обратил внимание на разные версии Rubygems. Заподозрил неладное. Обновил их на старом серваке на 1.3.7 и&#8230; получил сообщение, написанное выше. Отлично. Теперь осталось восстановить поведение старых Rubygems.</p>
<p>В итоге всё оказалось довольно просто. В файл ~/.gemrc нужно дописать следующую строку: <code>"install: --user-install"</code>. После чего мой .gemrc стал выглядеть так:</p>
<pre><code>[waysgo@web-waysgo ~]$ cat .gemrc
---
:benchmark: false
:update_sources: true
:sources:
- http://rubygems.org/
- http://gems.github.com/
:bulk_threshold: 1000
:verbose: true
:backtrace: false
install: --user-install</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2010/07/07/install-gems-to-user-directory/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MongoDB и MongoMapper &#8211; небольшой отчет об использовании</title>
		<link>http://blog.fxposter.org/2010/05/10/mongodb-and-mongomapper-small-usage-report/</link>
		<comments>http://blog.fxposter.org/2010/05/10/mongodb-and-mongomapper-small-usage-report/#comments</comments>
		<pubDate>Mon, 10 May 2010 20:19:20 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[MongoMapper]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby-On-Rails]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=775</guid>
		<description><![CDATA[Недавно писал проект на Rails 2.3 + MongoDB + MongoMapper. Не могу сказать, что все было хорошо - для того, чтобы существующие плагины для рельсов заработали с MongoMapper-ом пришлось немного повозиться, но в итоге все закончилось хорошо. :) А мой сегодняшний рассказ пойдет о некоторых особенностях MongoDB и MongoMapper-а, с которыми вы, скорее всего столкнетесь, [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно писал проект на <a href="http://rubyonrails.org/">Rails 2.3</a> + <a href="http://www.mongodb.org/">MongoDB</a> + <a href="http://github.com/jnunemaker/mongomapper">MongoMapper</a>. Не могу сказать, что все было хорошо - для того, чтобы существующие плагины для рельсов заработали с MongoMapper-ом пришлось немного повозиться, но в итоге все закончилось хорошо. :)</p>
<p>А мой сегодняшний рассказ пойдет о некоторых особенностях MongoDB и MongoMapper-а, с которыми вы, скорее всего столкнетесь, если будете использовать эти библиотеки.</p>
<p>Для начала поговорим немного о MongoDB. Что это такое?</p>
<blockquote cite="http://ru.wikipedia.org/wiki/MongoDB"><p>MongoDB — документо-ориентированная система управления базами данных (СУБД) с открытым исходным кодом, не требующая описания схемы таблиц. Написана на языке C++. СУБД управляет наборами JSON-подобных документов, хранимых в двоичном виде в формате BSON.</p></blockquote>
<p>Если попробовать вкратце охарактеризовать эту базу данных, то получится что-то вроде этого: аналог реляционной СУБД без join-ов и транзакций, зато с поддержкой структур данных (массивов, хешей).</p>
<p>MongoMapper - это &#8220;<a href="http://ru.wikipedia.org/wiki/ORM">ORM</a>&#8221; для MongoDB, написанный на руби. &#8220;ORM&#8221; в кавычках потому что сложно себе представить ORM для нереляционной базы данных. Я бы скорее назвал это высокоуровневой оберткой над API, которое предоставляет MongoDB, с поддержкой ассоциаций между записями и много чем еще.</p>
<p>Теперь, собственно, о &#8220;особенностях&#8221; MongoDB и MongoMapper-а.</p>
<h3>Вложенные документы</h3>
<p>Вложенные документы в понятии MongoMapper-а - это когда одни обьекты хранят внутри себя другие. Для примера, возьмем следующую модель:</p>
<pre><code class="ruby">class User
  include MongoMapper::Document

  key :login
  key :password
  key :salt

  many :posts
  many :addresses
end

class Post
  include MongoMapper::Document
  key :title, String
  key :body, String
  timestamps!
end

class Address
  include MongoMapper::EmbeddedDocument
  key :type, String
  key :country_id, ObjectId
  key :city_id, ObjectId
  key :city_address, String
end</code></pre>
<p>Чтобы понимать, что тут происходит нужно, во-первых знать <a href="http://www.ruby-lang.org/">Ruby</a> :) и во вторых - прочесть <a href="http://railstips.org/blog/archives/2009/06/27/mongomapper-the-rad-mongo-wrapper/">пост</a> John Nunemaker (даже не знаю, как правильно перевести :)) о MongoMapper-е. Вот <a href="http://railstips.org/2009/12/18/why-i-think-mongo-is-to-databases-what-rails-was-to-frameworks/">еще один</a>, кстати, тоже интересный.</p>
<p>Таким образом имеем модель пользователя, которая хранить набор постов, написанных этим пользователем и набор адресов пользователя (домашний, рабочий, etc).</p>
<p>Особенности работы со встроенными документами легче показать на примере:</p>
<pre><code class="ruby">user = User.first
user.posts</code></pre>
<p>Последняя комманда вернет &#8220;scope&#8221;/&#8221;relation&#8221;, а не просто массив элементов (люди, знакомые с named_scope в ActiveRecord версии &lt; 3 поймут).<br />
Соответственно, можно дродолжить эту комманду, например, так:</p>
<pre><code class="ruby">user.posts.all(:conditions =&gt; { :created_at =&gt; { "$gt" =&gt; (Date.today - 10.days) } })</code></pre>
<p>В то время как</p>
<pre><code class="ruby">user.addresses</code></pre>
<p>вернет массив и всю дополнительную фильтрацию прийдется производить с помощью Ruby.</p>
<h3>Манипуляции со вложенными документами</h3>
<p>У EmbeddedDocument нет понятия &#8220;id&#8221;, т.е. отличать обьекты Address один от другого можно только по их индексу в массиве user.addresses либо вводя &#8220;свои&#8221; идентификаторы. Но даже в этом случае выбирать соответствующий обьект прийдется &#8220;вручную&#8221;:</p>
<pre><code class="ruby">user.addresses.detect { |address| address.identifier == params[:address_identifier] }</code></pre>
<p class="offtopic">PS. Для тех, кто в танке: detect - это аналог select { |address| &#8230; }.first.</p>
<p>Соответственно - вложенные обьекты легко добавлять, выбирать всю связь полностью, но с ними становится &#8220;сложно&#8221; работать, как с отдельными обьектами. В частности - неудобно обновлять из-за проблем с выборкой отдельного элемента и неудобно удалять.</p>
<p>С удалением вообще интересная история. Удалить обьект имея только ссылку на него - нельзя, нужна еще и ссылка на массив, в котором он хранится:</p>
<pre><code class="ruby">user.addresses.first.delete/destroy</code></pre>
<p>не работает, т.к. таких методов у вложенных обьектов нет. Нужно делать так:</p>
<pre><code class="ruby">user.addresses.delete_at(address_index)</code></pre>
<p>если вы знаете индекс в массиве адресов, либо</p>
<pre><code class="ruby">user.addresses.delete_if { |address| address.identifier == address_identifier }</code></pre>
<p>если знаете идентификатор или удаляете по какому-либо другому полю.</p>
<p>Несложно, но проблемы на первых порах с этим бывают.</p>
<h3>&#8220;идентификаторы&#8221; обьектов MongoDB</h3>
<p>Каждому обьекту в бд MongoDB присваивает свой идентификатор. Как он по умолчанию строится можно посмотреть <a href="http://www.mongodb.org/display/DOCS/Object+IDs">здесь</a>. Обычно эти идентификаторы совсем не мешают, но иногда хочется просто засунуть вместо них какие-нибудь данные.</p>
<p>Например, вместо такой модели:</p>
<pre><code class="ruby">class Tag
  include MongoMapper::Document
  key :name, String
end</code></pre>
<p>иметь такую</p>
<pre><code class="ruby">class Tag
  include MongoMapper::Document
  # id-шник явно никогда не прописывается
end</code></pre>
<p>И создавать обьект так:</p>
<pre><code class="ruby">Tag.create(:_id =&gt; "ruby on rails")</code></pre>
<p>MongoDB это позволяет делать. Более того - драйвер Ruby для MongoDB это тоже может делать. Проблема в том, что это не умеет делать MongoMapper. Совершенно. Как обойти эту проблему я на данный момент не знаю (я в итоге сделал модель первого типа и забил), есди кто знает решение - напишите, будет интересно.</p>
<p>И напоследок поговорим о</p>
<h3>Has And Belongs To Many в MongoDB</h3>
<p>&#8230; или <a href="http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#M001836">habtm</a>, знакомый многим по ActiveRecord.</p>
<p>Приведу пример из моего проекта: есть домены, есть их модераторы, связть many-to-many. Для каждого домена хочется видеть список модераторов и для каждого модератора хочется видеть список доменов, которые он модерирует.</p>
<p>Честно говоря, задача поставила меня в тупик. Т.е. как все мы решаем эти задачи с помощью RDBMS? Правильно - связующей таблицей. Так же можно было поступить и здесь, но&#8230; Как-то это было некрасиво, на мой взгляд, использовать этот подход вв документоориентированной базе данных.</p>
<p>Первое решение, которое мне пришло в голову - хранить массив id-шников доменов для каждого пользователя и хранить массив id-шников пользователей для каждого домена и синхронизировать их.</p>
<p>Последние два слова очень смущали - синхронизация вносила излишнюю сложность. Т.е. реализовать-то её можно, но очень не хотелось.</p>
<p>Собственно, обратился за помощью к знакомым и вышел на одного человека (ник - Necromant, сайта его я не знаю :) ), который помог решить мне эту проблему.</p>
<p>Итак, решение - хранить только один список id-шников (или в юзерах или в доменах) и сделать по нему индекс, соответственно, вывод как доменов по юзеру так и юзеров по домену будет достаточно быстрый.</p>
<p>Я хранил массив юзеров для домена, т.к. если бы я сделал иначе, то при удалении домена пришлось бы пройтись по всем юзерам и удалить все связи на домен, а в выбранном варианте этого делать не нужно (а удаление юзеров - это пока что вообще не существующее событие для моего проекта):</p>
<pre><code class="ruby">class Domain
  include MongoMapper::Document
  # ...
  key :moderator_ids, Array, :index =&gt; true
  def moderators
    User.find moderator_ids
  end
end

class User
  include MongoMapper::Document
  # ...
  def moderator_of?(domain)
    domain.moderator_ids.include? id.to_s
  end

  def moderated_domains
    Domain.all :moderator_ids =&gt; id.to_s
  end
end</code></pre>
<p>Еще хочу рассказать о том, как подружить MongoMapper и <a href="http://github.com/thoughtbot/clearance">Clearance</a>, но пост вроде и так не маленький получился, так что ждите еще один пост о MongoMapper-е в ближайшие дни.</p>
<p><em><strong>PS</strong>. Совсем писать разучился&#8230; :(</em></p>
<p><em><strong>PPS</strong>. Если вам понравился этот пост, <a href="http://habrahabr.ru/blogs/ruby/93212/">проголосуйте</a> за него на Habrahabr-е. :)<br />
</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2010/05/10/mongodb-and-mongomapper-small-usage-report/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Ressurection</title>
		<link>http://blog.fxposter.org/2010/05/02/ressurection/</link>
		<comments>http://blog.fxposter.org/2010/05/02/ressurection/#comments</comments>
		<pubDate>Sun, 02 May 2010 00:04:15 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[macbook]]></category>
		<category><![CDATA[macosx]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=766</guid>
		<description><![CDATA[Настало время возродить этот блог. За более чем полугодие на нем не появилось ни одной статьи и я наконец-то намерен прекратить этот &#8220;застой&#8221;. Да, по сравнению с временами, которые были раньше у меня стало существенно меньше времени, чтобы писать что-то большое и серьезное - работа, университет (если быть точнее - то написание диплома) и еще [...]]]></description>
			<content:encoded><![CDATA[<p>Настало время возродить этот блог. За более чем полугодие на нем не появилось ни одной статьи и я наконец-то намерен прекратить этот &#8220;застой&#8221;. Да, по сравнению с временами, которые были раньше у меня стало существенно меньше времени, чтобы писать что-то большое и серьезное - работа, университет (если быть точнее - то написание диплома) и еще один &#8220;секретный сайд проект&#8221; о котором, возможно, я когда-нибудь всем расскажу.</p>
<p>Начну с глобальных изменений, которые произошли за последнее время в моей жизни и которые однозначно коснутся этого блога.</p>
<p>Ну, во-первых, я теперь не пишу на PHP. Вообще не пишу. И не очень сильно слежу за последними веяниями моды, связанными с этим языком. Да, я все равно иногда появляюсь в группе симфонистов (кому нужен доступ туда - пишите, там новичков любят и на многие нубские вопросы отвечают :) ). Да, я иногда посматриваю на фреймворки, которые сейчас являются популярными в сфере PHP - всякие Yii, ZF, etc. Посматриваю исключительно для того, чтобы быть в курсе происходящего. Учить их и писать на них в общем-то не очень хочется.</p>
<p>На что я променял PHP? Естественно на <a href="http://www.ruby-lang.org/">Ruby</a>. Я не восхищаюсь этим языком, не превозношу его над остальными, просто на работе я пишу на нем (кстати, я работаю над стартапом для бизнесов - <a href="http://waysgo.com/">WaysGo</a>, запуск будет, я надеюсь, очень скоро) и ни на чем другом желания писать особо не возникает - с точки зрения веб-разработки Ruby меня полностью устраивает. Этот язык удобен и достаточно экспрессивен. А <a href="http://rubyonrails.org/">Ruby On Rails</a> - отличное средство для тех, кто хочет писать веб-приложения. Ну, в общем, вы меня поняли. ;)</p>
<p>Кстати говоря, я немного соврал насчет того, что я пишу на Ruby на работе. С начала этой недели я пишу iPhone-приложение на <a href="http://ru.wikipedia.org/wiki/Objective-C">Objective-C</a> и, в связи с этим, шустренько осваиваю Mac, Xcode, сам Objective-C и всякую прочую фигню, которая нужна для разработки под iPhone. Определенного мнения по поводу мака я пока сказать не могу, а вот Objective-C с первого подхода отличается похожестью на руби с точки зрения вызовов методов у объектов и открытых классов, но в то же время отличается несколько некрасивым синтаксисом (квадратные скобки, рррррр). С другой стороны, к синтаксису Ruby у меня тоже изначально было плохое отношение. Это отношение, кстати, не изменилось - я по прежнему считаю, что Ruby - непонятный язык для новичка, и если код на, например, Python можно просто читать, то для того, чтобы почитать код на Ruby придется сначала посмотреть туториалы, или что-то в этом роде, потому что синтаксис кроме выразительности отличается еще и неочевидностью. После пары дней работы с Ruby проблемы отпадают сами собой, так что этот аспект меня уже не очень беспокоит. Собственно, я надеюсь, что рано или поздно я перестану замечать синтаксис Objective-C и буду просто писать код, который делает что мне нужно.</p>
<p>Вот, собственно, и все на сегодня. Вроде ничего не забыл. До скорого! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2010/05/02/ressurection/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Ruby And Rails Barcamp</title>
		<link>http://blog.fxposter.org/2009/09/04/ruby-and-rails-barcamp/</link>
		<comments>http://blog.fxposter.org/2009/09/04/ruby-and-rails-barcamp/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 21:24:44 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[BarCamp]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby-On-Rails]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=721</guid>
		<description><![CDATA[26-го сентября, в субботу, в Киеве будет проведен BarCamp на тему языка Ruby и фреймворка Ruby On Rails. Место проведения зависит от количества желающих посетить данное мероприятие и на данный момент уточняется. Если не произойдет ничего особенного - я туда скорее всего поеду. Буду рад увидеть там читателей своего блога. ;) Заходим, смотрим, регистрируемся.]]></description>
			<content:encoded><![CDATA[<p>26-го сентября, в субботу, в Киеве будет проведен <a href="http://ru.wikipedia.org/wiki/BarCamp">BarCamp</a> на тему языка Ruby и фреймворка Ruby On Rails. Место проведения зависит от количества желающих посетить данное мероприятие и на данный момент уточняется. Если не произойдет ничего особенного - я туда скорее всего поеду. Буду рад увидеть там читателей своего блога. ;)</p>
<p><a href="http://rubylang.org.ua/">Заходим</a>, смотрим, регистрируемся.<a href="http://rubylang.org.ua/"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2009/09/04/ruby-and-rails-barcamp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What Killed Smalltalk Could Kill Ruby, Too</title>
		<link>http://blog.fxposter.org/2009/05/09/what-killed-smalltalk-could-kill-ruby-too/</link>
		<comments>http://blog.fxposter.org/2009/05/09/what-killed-smalltalk-could-kill-ruby-too/#comments</comments>
		<pubDate>Sat, 09 May 2009 15:43:49 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Smalltalk]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=707</guid>
		<description><![CDATA[Еще одно, интересное на мой взгляд, видео. На этот раз - с RailsConf 2009. Выступает Роберт Мартин, известный в узких кругах под ником Uncle Bob (если вы еще не читаете блог его компании - начинайте, там пишут интересные вещи). Как можно догадаться из названия - доклад о том, что &#8220;убило&#8221; в своё время Smalltalk и [...]]]></description>
			<content:encoded><![CDATA[<p>Еще одно, интересное на мой взгляд, <a href="http://blip.tv/file/2089545">видео</a>. На этот раз - с <a href="http://en.oreilly.com/rails2009/">RailsConf 2009</a>. Выступает Роберт Мартин, известный в узких кругах под ником Uncle Bob (если вы еще не читаете <a href="http://blog.objectmentor.com/">блог его компании</a> - начинайте, там пишут интересные вещи). Как можно догадаться из названия - доклад о том, что &#8220;убило&#8221; в своё время Smalltalk и чего нужно опасаться тем людям, которые программируют на Ruby. Доклад интересный, смешной, Боб, оказывается, отлично умеет повеселить публику.</p>
<p>Вердикт - смотреть обязательно, хотя бы для поднятия настроения. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2009/05/09/what-killed-smalltalk-could-kill-ruby-too/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>What All Rubyist Should Know About Threads</title>
		<link>http://blog.fxposter.org/2009/02/09/what-all-rubyist-should-know-about-threads/</link>
		<comments>http://blog.fxposter.org/2009/02/09/what-all-rubyist-should-know-about-threads/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 17:15:33 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Threads]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=665</guid>
		<description><![CDATA[Смотрим, учимся и наслаждаемся. PS. Несмотря на название - полезно отнюдь не только для &#8220;рубистов&#8221; (интересно, как адептов ruby называют на русском?). PPS. Пора дизайн блога менять - видео не влазит. В FF3 смотреть можно, но если у вас с этим проблемы - идем на сайт RubyConf 2008 и смотрим видео там.]]></description>
			<content:encoded><![CDATA[<p><embed src='http://rubyconf2008.confreaks.com/player.swf' height='260' width='640' allowscriptaccess='always' allowfullscreen='true' flashvars='image=images%2Fwhat-all-rubyist-should-know-about-threads-preview.jpg&#038;file=http%3A%2F%2Frubyconf2008.confreaks.com%2Fvideos%2Fwhat-all-rubyist-should-know-about-threads-small.mp4&#038;plugins=viral-1'/></p>
<p>Смотрим, учимся и наслаждаемся.</p>
<p><em><strong>PS</strong>. Несмотря на название - полезно отнюдь не только для &#8220;рубистов&#8221; (интересно, как адептов ruby называют на русском?).</em><br />
<em><strong>PPS</strong>. Пора дизайн блога менять - видео не влазит. В FF3 смотреть можно, но если у вас с этим проблемы - идем на сайт <a href="http://rubyconf2008.confreaks.com/what-all-rubyist-should-know-about-threads.html">RubyConf 2008</a> и смотрим видео там.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2009/02/09/what-all-rubyist-should-know-about-threads/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shootout: Ruby</title>
		<link>http://blog.fxposter.org/2008/06/21/shootout-ruby/</link>
		<comments>http://blog.fxposter.org/2008/06/21/shootout-ruby/#comments</comments>
		<pubDate>Sat, 21 Jun 2008 20:38:17 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Shootout]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=449</guid>
		<description><![CDATA[Думаю, все знакомы с сайтом, предоставляющим возможность сравнить реализации различных языков программирования по скорости и потреблению памяти - Computer Language Benchmarks Game. Зашел я туда сегодня&#8230; Почему - уже не помню, и обнаружил такую вот картину, которая меня довольно сильно удивила: Руби на последнем месте&#8230; Раньше всё вроде было немного по-другому. Радует, что 1.9.0 будет [...]]]></description>
			<content:encoded><![CDATA[<p>Думаю, все знакомы с сайтом, предоставляющим возможность сравнить реализации различных языков программирования по скорости и потреблению памяти - <a href="http://shootout.alioth.debian.org/">Computer Language Benchmarks Game</a>.</p>
<p>Зашел я туда сегодня&#8230; Почему - уже не помню, и обнаружил такую вот картину, которая меня довольно сильно удивила:</p>
<p><a href="http://b23.ru/hvc"><img class="aligncenter size-medium wp-image-450" title="Shootout: Ruby" src="http://blog.fxposter.org/wp-content/uploads/2008/06/shootout.png" alt="Shootout: Ruby" /></a></p>
<p>Руби на последнем месте&#8230; Раньше всё вроде было немного по-другому. Радует, что 1.9.0 будет &#8220;немного&#8221; быстрее. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/06/21/shootout-ruby/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Ruby on Rails 2.1 &#8211; What’s new</title>
		<link>http://blog.fxposter.org/2008/06/11/ruby-on-rails-21-whats-new/</link>
		<comments>http://blog.fxposter.org/2008/06/11/ruby-on-rails-21-whats-new/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 08:01:33 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby-On-Rails]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=441</guid>
		<description><![CDATA[Нет, я не собираюсь перечислять нововведения в новой версии ROR, это уже сделали другие, а я лишь представлю вам их наработки. Встречаем очередную бесплатную книгу по рельсам - &#8220;Ruby on Rails 2.1 - What’s new&#8221;. В ней, как можно догадаться из названия, описываются (главные?) нововведения в последней версии фреймворка. Почитать о книге и скачать её [...]]]></description>
			<content:encoded><![CDATA[<p>Нет, я не собираюсь перечислять нововведения в новой версии ROR, это уже сделали другие, а я лишь представлю вам их наработки. Встречаем очередную бесплатную книгу по рельсам - &#8220;Ruby on Rails 2.1 - What’s new&#8221;. В ней, как можно догадаться из названия, описываются (главные?) нововведения в последней версии фреймворка.</p>
<p>Почитать о книге и скачать её можно <a href="http://www.nomedojogo.com/2008/06/09/new-free-book-ruby-on-rails-21-whats-new/">здесь</a>.</p>
<p><em><strong>PS</strong>. Сам книгу посмотрел&#8230; Могу сказать, что тем, кто рельсами не занимается, она будет довольно непонятной. Прочтите что-нибудь другое, например, Agile Development With Rails.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/06/11/ruby-on-rails-21-whats-new/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Road to Ruby</title>
		<link>http://blog.fxposter.org/2008/05/27/road-to-ruby/</link>
		<comments>http://blog.fxposter.org/2008/05/27/road-to-ruby/#comments</comments>
		<pubDate>Tue, 27 May 2008 00:25:43 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=431</guid>
		<description><![CDATA[Доступна для свободного скачивания книга &#8220;Road To Ruby&#8221;, предназначенная преимущественно для тех, кто имеет опыт программирования на C#, Java и C++. Подробности и ссылку для скачивания можно получить здесь (для скачивания нужно будет зарегистрироваться на сайте internet.com). Кто не хочет регистрироваться - может скачать книгу у меня.]]></description>
			<content:encoded><![CDATA[<p>Доступна для свободного скачивания книга &#8220;Road To Ruby&#8221;, предназначенная преимущественно для тех, кто имеет опыт программирования на C#, Java и C++. Подробности и ссылку для скачивания можно получить <a href="http://www.devx.com/ebook/Article/38003">здесь</a> (для скачивания нужно будет зарегистрироваться на сайте <a href="http://www.internet.com/">internet.com</a>).</p>
<p>Кто не хочет регистрироваться - может скачать книгу <a href="http://fxposter.biz.ua/books/ruby/Road%20To%20Ruby.pdf">у меня</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/05/27/road-to-ruby/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Exception #07 &#8211; как это было</title>
		<link>http://blog.fxposter.org/2008/03/18/exception-07-after-all/</link>
		<comments>http://blog.fxposter.org/2008/03/18/exception-07-after-all/#comments</comments>
		<pubDate>Tue, 18 Mar 2008 13:24:17 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Разное]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/2008/03/18/exception-07-after-all/</guid>
		<description><![CDATA[Собственно, побывал я на первой своей конференции, впечатления остались, в целом, положительные, но обо всём попорядку&#8230; Дорога в Киев &#8230; была полна всяческих неприятностей, самой главной из которых можно считать нашего соседа по купе. Мало того, что &#8220;гулял&#8221; до часу ночи по вагону, периодически заходя в купе, так еще и когда завалился спать - храпел [...]]]></description>
			<content:encoded><![CDATA[<p>Собственно, побывал я на первой своей конференции, впечатления остались, в целом, положительные, но обо всём попорядку&#8230;<br />
<span id="more-386"></span></p>
<h4>Дорога в Киев</h4>
<p>&#8230; была полна всяческих неприятностей, самой главной из которых можно считать нашего соседа по купе. Мало того, что &#8220;гулял&#8221; до часу ночи по вагону, периодически заходя в купе, так еще и когда завалился спать - храпел так, что заснуть было категорически невозможно. Растолкать его не получилось - он либо вообще не реагировал, либо что-то мычал. Проводница сказала, что ни его ни нас переложить некуда - все места в вагоне заняты&#8230; В общем, куковали мы с девушкой до четырех утра, после чего всё-таки заснули (привыкли уже к этому храпу)&#8230; Встали через полтора часа&#8230; В общем, в Киев приехали практически никакие - девушка моя еще нормально себя чувствовала (чему я, если честно, очень удивляюсь), а я бродя по Киеву утром зевал на всю&#8230; :(</p>
<h4>Киев</h4>
<p>До этого я в Киеве был 2 раза, и оба раза ничего толком посмотреть не удалось - один раз ехал из Польши в Днепропетровск (да, да, через Киев, не удивляйтесь) , второй раз - когда учавствовал в МАНе (Малой Академии Наук), тогда нас вообще никуда не пускали, только один раз вывезли куда-то (как я сейчас уже понял, тогда нас привезли к &#8220;Арке Дружбы Народов&#8221;) и всё&#8230; Так что в этот раз целью поездки была не только конференция, но и прогулка по Киеву.</p>
<p>Так, что приехав в Киев, мы первым делом отправились в метро и поехали на Хрещатик, а если быть точным - то на станцию &#8220;Театральная&#8221;, от которой мы пошли на Хрещатик, через &#8220;Майдан Незалежностi&#8221; до &#8220;Арки Дружбы Народов&#8221;. Погуляли мы там, попетляли в парке (как он там называется, я не помню уже), потом спустились на Подол, прокатились на фуникулёре, прошлись к &#8220;Золотым воротам&#8221; и поехали на конференцию.</p>
<blockquote><p>На самом деле для меня то, что я описал в одном абзаце превратилось в жуткие пытки, так как уже на майдане я начал просто засыпать на ходу&#8230;</p>
<p>Да, кстати, со всех мест, где мы побывали, есть фотки (сейчас они у моей девушки), которые я непременно выложу, но несколько позднее.</p></blockquote>
<h4>Конференция</h4>
<p>Пробежимся по докладам, на которых я был:</p>
<p>у, насчет докладов в отдельности я еще у себя отпишусь, хочется отметить другое: все доклады были очень разнородные в плане сложности.</p>
<p><span class="dquo">“</span><strong>Мастер класс по Python: Метаклассы + Дескрипторы</strong>” - тема сама по себе достаточно интересная, и для тех, кто имеет дело с динамическими языками программирования, должна быть лёгкая и понятная. Тем, кто пишет только на C++ и PHP прийдется долго вьезжать, что такое метаклассы и зачем они нужны. Про дескрипторы рассказал автор довольно мало, но, ИМХО, там особо и рассказывать не о чем - там проблемы появляются только когда начинаешь эту всю фигню использовать. Да, и докладчику хотелось бы пожелать быть несколько подготовленнее к самому докладу. :) Да, совсем забыл, доклад проводился в форме &#8220;я вам рассказываю и параллельно пишу в питоновской консоли&#8221;. :) Получилось довольно занятно, на мой взгляд.</p>
<p><span class="dquo">“</span><strong><span class="caps">PEAK</span>-Rules и PyProtocols</strong>” - жесткий такой доклад&#8230; докладище даже, я бы сказал. PyProtocols вообще не зацепили - ну адаптируем мы классы (протоколы) один к другому с помощью адаптеров&#8230; ну и что с того? (я не пользовался, я лишь сужу со слов докладчика). А вот <span class="caps">PEAK</span>-Rules - это нечто. Правда, когда докладчик начал рассказывать про Generic Functions, multiple dispatch и прочие непонятные слова и фразы -  стало понятно, что мне еще в программировании расти и расти, потому как доклад для меня потихоньку превращался в непонятную кашу. После того, как доклад закончился, у меня в голове всё как-то более-менее структурировалось и я вьехал, в то, что же это всё такое.</p>
<p>Если вкратце - представьте себе стандартную перегрузку функций - она осуществляется исходя из типов и количества аргументов. А теперь представьте себе, что вы можете вот таким образом перегружать функцию, но основываясь не только на типах аргументов, например, вызываем определенную функцию, если аргумент данной - строка длинной в 10 символов, или если у функции тип одного аргумента является подклассом типа другого аргумента (да, это питон, тут типы не указываются, не забываем об этом). В общем, технология - полный рулез, нужно будет почитать поподробнее.</p>
<p><span class="dquo">“</span><strong>Python и Django - платформа для фрилансера</strong>” - доклад <a href="http://webnewage.org/">Daevaorn&#8217;а</a>. На фоне предыдущих получился слишком простым, ИМХО, а также было очень мало конкретики (Саша, хочу конкретики!). Я на джанге не пишу, но мне она интересна и я про неё довольно много читал, и при этом, из доклада нового я узнал только то, что существуют кроме бранчей еще и патчи для джанги. Подозреваю, что занимающиеся питоном вплотную (а таких было абсолютное большинство на конференции) почерпнули для себя и того меньше. Зато доклад был прост и понятен новичкам, которые, возможно всё же присутствовали на конфе (ну, по крайней мере, один такой человек был так точно :)).</p>
<p><span class="dquo">“</span><strong>Как заставить свою лень работать</strong>” - прикольный доклад о том, насколько полезно быть лентяем. Особенно впечатлила раскладушка которую с собой принес докладчик. :)<span class="dquo"><br />
</span></p>
<p><span class="dquo">“</span><strong>StrokeDB: Yet Another Database (Ruby)</strong>” - хоть я в руби и не особо разбираюсь (если сказать точнее - вообще почти не шарю), но этот доклад я ждал, хотя про StrokeDB и раньше читал. Просто хотелось послушать обоих докладчиков, и, по-моему, я не прогадал - доклад был очень интересным (хотя кое-где из-за синтаксиса руби и не совсем понятным) и энергичным. По-моему <a href="http://rashkovskii.com/">Юра</a> и <a href="http://www.novemberain.com/">Олег</a> лучше всего подготовились к докладу - мне даже спать расхотелось, когда они выступали - вот просто было очень интересно их слушать и смотреть на то, что они представляют. Про StrokeDB рассказывать не хочу - про неё можно почитать на <a href="http://rashkovskii.com/">сайте одного из  докладчиков</a>.</p>
<p><span class="dquo"></span><strong>“Twisted”</strong> - собственно, доклад про систему асинхронного и параллельного программирования. Сам доклад для меня был достаточно сложен и, поэтому, не сильно интересен - я не понимаю, как можно реализовать асинхронную работу с данными в одном потоке&#8230; Да, Twisted - это система, которая как раз таки и предназначена, чтобы всю низкоуровневую работу оставлять ей, но&#8230; всё же для понимания хотелось бы знать основы. Посоветуйте, кстати, где можно почитать про асинхронное программирование (<a href="http://piranha.org.ua/">piranha</a>, твою ссылку еще не прочитал, каюсь :)).</p>
<p>Ну, и последний доклад, на котором я был - это доклад про <span class="dquo">“</span><strong>использование IronPython и IronRuby в приложениях Silverlight</strong><strong>”</strong> - доклад к своему названию имел не сильно большое отношение - много рассказывалось про Microsoft и их планы, много рассказывалось про Silverlight (1.0, 2.0), много было скептичных вопросов из зала относительно политики MS (да, докладчик был из Microsoft), но в целом, рассказал достаточно понятно всё и для начинающих в Silverlight - довольно интересно. Кстати, судя по вопросам из зала - Silverlight всё же может отвоевать долю рынка у Flash, а судя по тому, что при разработке можно использовать не один язык, а много - возможно, и немаленькую долю.</p>
<h4>Киев</h4>
<p>После конференции мы еще &#8220;немного&#8221; побродили по Киеву - поднялись вверх по Андреевскому спуску&#8230; Хотели там посмотреть чашку девушке&#8230; Но было уже, судя по всему, слишком поздно, и мы никого не нашли&#8230; Зато пока поднялись - устали до чертиков. :) После этого был соверешен марш-бросок опять на майдан, где мы еще побродили и пофоткались и отправились на метро обратно к вокзалу. В поезде в этот раз доехали нормально.</p>
<p>На этом всё. До новых встреч.</p>
<p><em><strong>PS</strong>. Да, фотки скоро будут!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/03/18/exception-07-after-all/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced

Served from: blog.fxposter.org @ 2012-02-10 05:18:12 -->
