<?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>Ruby on Rails c нуля!</title>
	<atom:link href="http://rubydev.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://rubydev.ru</link>
	<description>- блог изучающего Ruby, Ruby on Rails и другие технологии</description>
	<lastBuildDate>Fri, 27 Jan 2012 11:35: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>RDRubyTutorial: Случайные числа в Ruby</title>
		<link>http://rubydev.ru/2011/12/rubydev_ruby_tutorial_random_numbers/</link>
		<comments>http://rubydev.ru/2011/12/rubydev_ruby_tutorial_random_numbers/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 07:50:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Основы]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://rubydev.ru/?p=1424</guid>
		<description><![CDATA[В этой статье из цикла RubyDev Ruby Tutorial мы рассмотрим способы генерации случайного числа в Ruby 1.8.x и Ruby 1.9.x. Генерация случайного числа &#8212; достаточно тривиальная задача, особенно для Ruby однако некоторые новички даже здесь сталкиваются с проблемами. Кроме того, не все программисты знают о нововведениях в Ruby 1.9 связанных с генерацией случайных чисел. Самым [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><img class="alignleft size-thumbnail wp-image-1425" style="margin: 0 20px 0 0;" title="randome_lottery_lucky" src="http://rubydev.ru/wp-content/uploads/2011/12/a97101_g060_7-suzane2-150x150.jpg" alt="" width="150" height="150" /></p>
<p style="text-align: left;">В этой статье из цикла RubyDev Ruby Tutorial мы рассмотрим способы генерации случайного числа в Ruby 1.8.x и Ruby 1.9.x. Генерация случайного числа &#8212; достаточно тривиальная задача, особенно для Ruby однако некоторые новички даже здесь сталкиваются с проблемами. Кроме того, не все программисты знают о нововведениях в Ruby 1.9 связанных с генерацией случайных чисел.</p>
<p style="text-align: left;">Самым простым способом получить случайное число в Ruby является использование метода <strong>rand</strong>.</p>
<pre class="brush:ruby">
puts rand() #0.7063893161805139
puts rand() #0.5829631459496872
puts rand() #0.7625800525759028
</pre>
<p>Получение случайных чисел с плавающей точкой редко бывает полезным, чаще всего необходимо целове число.</p>
<pre class="brush:ruby">
puts rand(3) #0
puts rand(3) #1
puts rand(3) #1
puts rand(10) #3
puts rand(10) #7
puts rand(10) #8
</pre>
</p>
<p style="text-align: left;">Если методу rand передать в качестве аргумента целое число, то rand будет генерировать случайные числа в диапазоне от 0 до n-1.<br />
<span id="more-1424"></span><br />
Что делать, если необходимо сгенерировать число в диапазоне, где минимум не ноль? В Ruby 1.8 у нас есть только один выход:</p>
<pre class="brush:ruby">
puts rand(10) + 10 #15
puts rand(10) + 10 #12
puts rand(10) + 10 #10
</pre>
<p>В таком случае мы генерируем числа от 10 до 19 включительно.</p>
<p><strong>Ruby 1.9</strong> предоставляется другое решение &#8212; специальный класс <strong>Random</strong>:</p>
<pre class="brush:ruby">
Random.rand #0.5972754026687639
Random.rand(10) #9

rnd = Random.new
rnd.rand #0.9603713013025631
rnd.rand(10) #7
rnd.rand(10..100) #44
</pre>
<p>Передавая в качестве аргумента диапазон в метод Random#rand мы получаем случайное целое число из диапазона.</p>
<pre class="brush:ruby">
rnd.rand(0.0 .. 9.0) #6.569607064916773
</pre>
<p>Получение случайного элемента массива:</p>
<pre class="brush:ruby">
arr[rand(arr.size)] #3
arr[rand(arr.size)] #13
</pre>
<p>MonkeyPatching way:</p>
<pre class="brush:ruby">
class Array
  def rand_elem
    self[rand(size)]
  end
end

puts [1,1,2,3,5,7,11,13].rand_elem #11
</pre>
<p>Успехов вам в изучении программирования на Ruby!</p>
]]></content:encoded>
			<wfw:commentRss>http://rubydev.ru/2011/12/rubydev_ruby_tutorial_random_numbers/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Работа с MongoDB: Подробнее о языке запросов ч.1</title>
		<link>http://rubydev.ru/2011/12/mongodb_find_and_query_language/</link>
		<comments>http://rubydev.ru/2011/12/mongodb_find_and_query_language/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 07:38:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://rubydev.ru/?p=1419</guid>
		<description><![CDATA[В этой статье мы подробнее рассмотрим ранее описанные метод .find() и объекта запроса. Методы .find() и .findOne() используются соответственно для поиска всех документов и поиска первого документа, что соответствуют запросу. &#160; db.posts.find() /* { "_id" : ObjectId("4ef64c526e06ee4cec3dab4e"), "title" : "Title for post # 1", "content" : "Content for post # 1" } { "_id" : [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://rubydev.ru/wp-content/uploads/2011/03/logo-mongoDB.png"><img class="alignleft size-full wp-image-677" style="margin: 0pt 20px 0pt 0pt; background: none repeat scroll 0% 0% #554422;" title="logo-mongoDB" src="http://rubydev.ru/wp-content/uploads/2011/03/logo-mongoDB.png" alt="mongoDB" width="217" height="90" /></a>В этой статье мы подробнее рассмотрим ранее описанные метод .find() и объекта запроса.</p>
<p>Методы <span style="color: #333399;">.find()</span> и <span style="color: #333399;">.findOne()</span> используются соответственно для поиска всех документов и поиска первого документа, что соответствуют запросу.</p>
<p>&nbsp;</p>
<pre class="brush:javascript">

db.posts.find()
/*
{ "_id" : ObjectId("4ef64c526e06ee4cec3dab4e"), "title" : "Title for post # 1", "content" : "Content for post # 1" }
{ "_id" : ObjectId("4ef64c526e06ee4cec3dab4f"), "title" : "Title for post # 2", "content" : "Content for post # 2" }
...
{ "_id" : ObjectId("4ef714746dca6d809b6f4cdd"), "title" : "Title #9", "content" : "Content #9" }
{ "_id" : ObjectId("4ef714746dca6d809b6f4cde"), "title" : "Title #10", "content" : "Content #10" }
*/

db.posts.find().count() //20
</pre>
<p><span id="more-1419"></span></p>
<pre class="brush:javascript">
db.posts.find({ title : "Title #2" }).count() //1

db.posts.find({ title : "Title #2" })
/*
{ "_id" : ObjectId("4ef714746dca6d809b6f4cd6"), "title" : "Title #2", "content" : "Content #2" }
*/

db.posts.find({ title : "Title #2", content : "Content #2" })
/*
{ "_id" : ObjectId("4ef714746dca6d809b6f4cd6"), "title" : "Title #2", "content" : "Content #2" }
*/

db.posts.find().sort({ title : 1 })
/*
{ "_id" : ObjectId("4ef714746dca6d809b6f4cd4"), "title" : "Title #0", "content" : "Content #0" }
{ "_id" : ObjectId("4ef714746dca6d809b6f4cd5"), "title" : "Title #1", "content" : "Content #1" }
{ "_id" : ObjectId("4ef714746dca6d809b6f4cde"), "title" : "Title #10", "content" : "Content #10" }
...
{ "_id" : ObjectId("4ef64c526e06ee4cec3dab4e"), "title" : "Title for post # 1", "content" : "Content for post # 1" }
{ "_id" : ObjectId("4ef64c526e06ee4cec3dab57"), "title" : "Title for post # 10", "content" : "Content for post # 10" }
...
{ "_id" : ObjectId("4ef64c526e06ee4cec3dab56"), "title" : "Title for post # 9", "content" : "Content for post # 9" }
*/

db.posts.find().sort({ title : 1 }).limit(3)
/*
{ "_id" : ObjectId("4ef714746dca6d809b6f4cd4"), "title" : "Title #0", "content" : "Content #0" }
{ "_id" : ObjectId("4ef714746dca6d809b6f4cd5"), "title" : "Title #1", "content" : "Content #1" }
{ "_id" : ObjectId("4ef714746dca6d809b6f4cde"), "title" : "Title #10", "content" : "Content #10" }
*/
</pre>
<p>Метод <span style="color: #333399;">.find()</span> принимает в качестве аргумента json объект и ищет в коллекции соответствующие запросу документы, в примерах выше, это например документ у которого свойство title хранит строку &#171;Title #2&#8243;, а свойство content &#8212; строку &#171;Content #2&#8243; (<span style="color: #008000;">{ title : &#171;Title #2&#8243;, content : &#171;Content #2&#8243; }</span>). Методы <span style="color: #333399;">.sort()</span> и <span style="color: #333399;">.limit()</span> являются синтаксическим сахаром, что добавляется командной строкой MongoDB и MongoDB драйверами, внутри такие &#171;сахарные&#187; запросы превращаются в следующее:</p>
<pre class="brush:javascript">

//из такого:
db.posts.find({title : /1/ }).sort({ content : 1 })

//в такой:
db.posts.find({ $query: { title : /1/ }, $orderby : { content : 1 }})
</pre>
<p>Самое важное здесь понять и запомнить, что запросы в MongoDB &#8212; это также JSON объекты, как собственно и документы (документы хранятся в формате BSON, а представляются в формате JSON).</p>
<p>Еще интересным моментом в примере выше является то, как легко делать выборку из коллекции по соответствию регулярному выражению. Вы просто пишите имя свойства документа и регулярное выражение внутри двух слешей и MongoDB выполняет по нему поиск.</p>
<p><span style="color: #333399;">.find()</span> по истине универсальный метод выборки, например, нам неоюходимо сделать выборку всех товаров, у которых цена меньше определенной суммы, для этого нам нужно написать совсем простой запрос:</p>
<pre class="brush:javascript">

db.products.find({ prise: { $lt : 30}});
/*
{ "_id" : ObjectId("4efac0450f837edc0e9db40f"), "prise" : 10, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db410"), "prise" : 20, "name" : "product", "desc" : "Description ..." }
*/
</pre>
<p>А если больше, то такой:</p>
<pre class="brush:javascript">
db.products.find({ prise: { $gt : 200}});
/*
{ "_id" : ObjectId("4efac0450f837edc0e9db423"), "prise" : 210, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db424"), "prise" : 220, "name" : "product", "desc" : "Description ..." }
*/
</pre>
<p>Использование свойств <span style="color: #333399;">$gt</span> и <span style="color: #333399;">$lt</span> объекта запроса аналогичны использованию &gt; и &lt; в SQL запросах. Это может казаться не так удобно, но в перспективе работая с MongoDB используя драйвер под Ruby мы этого совсем не заметим. В качестве замены для операторов &gt;= и &lt;= в в объекте запроса также существуют специальные свойства: <span style="color: #333399;">$gte</span> и <span style="color: #333399;">$lte</span>:</p>
<pre class="brush:javascript">
db.products.find({ prise: { $gte : 200}});
/*
{ "_id" : ObjectId("4efac0450f837edc0e9db422"), "prise" : 200, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db423"), "prise" : 210, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db424"), "prise" : 220, "name" : "product", "desc" : "Description ..." }
*/
</pre>
<p>Запомнить, что каждое свойство запроса означает очень просто (хотя их названия в принципе и не новы):</p>
<p><span style="color: #333399;">$gt</span> &#8212; greater than&#8230; &#8212; больше, чем&#8230;<br />
<span style="color: #333399;">$lt</span> &#8212; less than&#8230; &#8212; меньше, чем&#8230;<br />
<span style="color: #333399;">$gte</span> &#8212; great than or equal&#8230; &#8212; больше, чем &#8230;, или равно<br />
<span style="color: #333399;">$lte</span> &#8212; less than or equal&#8230; &#8212; меньше, чем &#8230;, или равно</p>
<p>Еще один крайне полезным свойством JSON-объекта запросов является свойство $in, оно позволяет делать выборку только тех документов у которых определенное свойство имеет значение из списка допустимых. Пример:</p>
<pre class="brush:javascript">
db.products.find({ prise: { $in : [10, 50, 100]}});
/*
{ "_id" : ObjectId("4efac0450f837edc0e9db40f"), "prise" : 10, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db413"), "prise" : 50, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db418"), "prise" : 100, "name" : "product", "desc" : "Description ..." }
*/
</pre>
<p>Антиподом $in является свойство $nin, которае наоборот позволяет выбрать объекты определенное свойство которых не содержит значения из списка. Пример:</p>
<pre class="brush:javascript">
db.products.find({ prise: { $nin : [10, 50, 100, 200, 210, 220]}});
/*
{ "_id" : ObjectId("4efac0450f837edc0e9db410"), "prise" : 20, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db411"), "prise" : 30, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db412"), "prise" : 40, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db414"), "prise" : 60, "name" : "product", "desc" : "Description ..." }
//...
{ "_id" : ObjectId("4efac0450f837edc0e9db421"), "prise" : 190, "name" : "product", "desc" : "Description ..." }
*/
</pre>
<p>В следующей статье мы познакомимся с языком запросов MongoDB еще более подробно.</p>
]]></content:encoded>
			<wfw:commentRss>http://rubydev.ru/2011/12/mongodb_find_and_query_language/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Работа с MongoDB: Структура БД и основы языка запросов</title>
		<link>http://rubydev.ru/2011/12/mongodb_structure_and_quering/</link>
		<comments>http://rubydev.ru/2011/12/mongodb_structure_and_quering/#comments</comments>
		<pubDate>Sun, 25 Dec 2011 00:08:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://rubydev.ru/?p=1416</guid>
		<description><![CDATA[Работая с MongoDB у нас имеется базовый объект &#8212; db, который представляет собой саму базу данных, точнее является ссылкой на одну из имеющихся баз данных (по умолчанию, запуская консоль это база данных с именем test). Далелее идут коллекции документов, использую dot-нотацию получаем доступ к коллекции следующим образом: &#62; db.collection_name Коллекции представляют собой наборы документов или [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://rubydev.ru/wp-content/uploads/2011/03/logo-mongoDB.png"><img class="alignleft size-full wp-image-677" style="margin: 0pt 20px 0pt 0pt; background: none repeat scroll 0% 0% #554422;" title="logo-mongoDB" src="http://rubydev.ru/wp-content/uploads/2011/03/logo-mongoDB.png" alt="mongoDB" width="217" height="90" /></a>Работая с MongoDB у нас имеется базовый объект &#8212; db, который представляет собой саму базу данных, точнее является ссылкой на одну из имеющихся баз данных (по умолчанию, запуская консоль это база данных с именем test). Далелее идут коллекции документов, использую dot-нотацию получаем доступ к коллекции следующим образом:</p>
<p><span style="color: #008000;">&gt; db.collection_name</span></p>
<p>Коллекции представляют собой наборы документов или вложенных коллекций. Обратиться к документу можно используя различные запросы.<br />
<span id="more-1416"></span><br />
Для дальнейшего ознакомления с работой с MongoDB давайте запустим mongod и консоль mongo и создадим коллекцию.</p>
<pre class="brush:javascript">
db
//test

db.posts
//test.posts

for(x = 1;x &lt;= 10; x ++ ){
  post = {"title":"Title for post # " + x,
  "content":"Content for post # " + x }
  db.posts.insert(post);
}

db.post.insert(post);

b.posts.findOne();
/*{
"_id" : ObjectId("4ef64c526e06ee4cec3dab4e"),
"title" : "Title for post # 1",
"content" : "Content for post # 1"
}*/

db.posts.find({title:"Title for post # 10"});
//{ "_id" : ObjectId("4ef64c526e06ee4cec3dab57"), "title" : "Title for post # 10", "content" : "Content for post # 10" }
</pre>
<p>Не сложно догадаться, что в цикле мы создаем уникальные документы и затем используя метод<span style="color: #333399;"> .insert()</span> записываем их в коллекцию posts. Метод <span style="color: #333399;">.findOne()</span> используется для поиска одного единственного документа, если условие поиска не передано, то возвращается первый документ, а если условию соответствует несколько документов, то мы получаем только первый из них. Метод <span style="color: #333399;">.find()</span> используется для поиска всех документов, что соответствуют условию поиска. Если условие поиска не задано, то <span style="color: #333399;">.find()</span> возвратит все документы, что содержатся в коллекции.</p>
<p>Интересным моментов в работе с MongoDB являются индексы документов. Видите ли, инденксы в MongoDB не похожи на индексы в резяционных базах данных, точнее в большинстве случаев не похожи. В реляционных БД мы используем чаще всего целочисленные индексы в десятичной системе, которые ничего не означают, кроме того, какая запись за какой идет, чем запись новее &#8212; тем больше ее индекс. В MongoDB индексы несут значительно большую информацию о документе, чем иденксы в реляционных БД о записях. Стандартный ID в MongoDB является объектом особого типа &#8212; ObjectId и представляет из себя 12-байтное число в шестнадцатиричной системе исчисления, в котором закодированы:</p>
<p>0-3 байты &#8212; временная метка (когда объект был создан).</p>
<p>4-6 байты &#8212; идентификатор машины на котором запущена MongoDB (необходимо того, когда ваша БД разбита на нескольких машинах и ID документов на всех машинах должны быть уникальны).</p>
<p>7-8 байты &#8212; ID процесса</p>
<p>9-11 байты &#8212; счетчик (у каждого следующего документа здесь записывается число на 1 больше, чем у предыдущего).</p>
<p>Таким образом 12-байтный ключ дает 100% гарантию, что в БД не будет двух документов с одинаковым ID даже при большой скорости поступления новых данных, когда документы могут создаваться одновременно и на большом количестве серверов.</p>
<p>Если вам понадобится обновить определенный документ, то для этого существует специальный метод .update():</p>
<pre class="brush:javascript">
db.posts.findOne({ title: "Title for post # 6" })
//{ "_id" : ObjectId("4ef64c526e06ee4cec3dab53"), "title" : "Title for post # 6", "content" : "Content for post # 6" }

db.posts.update({ title: "Title for post # 6" }, {title:"New title"});

db.posts.findOne({ title: "New title" });
//{ "_id" : ObjectId("4ef64c526e06ee4cec3dab53"), "title" : "New title" }

Как видите,<span style="color: #333399;"> .update()</span> делает не совсем то, что нам нужно, он не заменил значение ключа title документа, но полностью переписал документ. Для того, чтобы заменить конкретный ключ документа, но и оставить остальные мы можем делать так:

post = db.posts.findOne({ title: "New title" });
//{ "_id" : ObjectId("4ef64c526e06ee4cec3dab53"), "title" : "New title" }

post.title
/*New title*/

post.content = "Lorem ipsum ..."
//Lodem ipsum ...

post
/*{
"_id" : ObjectId("4ef64c526e06ee4cec3dab53"),
"title" : "New title",
"content" : "Lorem ipsum ..."
}*/

db.posts.update({ title: "New title" }, post);

db.posts.findOne({ title: "New title" });
/*{
"_id" : ObjectId("4ef64c526e06ee4cec3dab53"),
"title" : "New title",
"content" : "Lodem ipsum ..."
}*/
</pre>
<p>Чтобы удалить документ из коллекции необходимо использовать метод <span style="color: #333399;">.remove()</span>:</p>
<pre class="brush:javascript">
db.posts.remove({title:"New title"});
</pre>
<p>Работа в консоли с MongoDB очень проста, если вы хоть немного знаете JavaScript.</p>
<p><strong>CRUD</strong><br />
Закрепляем материал.</p>
<pre class="brush:javascript">
// Create
blog = { "url" : "http://rubydev.ru", "name" : "RubyDev" }
db.sites.insert(blog);

// Read
db.sites.findOne({name:"RubyDev"})
/*{
"_id" : ObjectId("4ef663856e06ee4cec3dab59"),
"url" : "http://rubydev.ru",
"name" : "RubyDev"
}*/

// Update
blog.description = "Изучаем Ruby и Rails вместе!"
//Изучаем Ruby и Rails вместе!
db.sites.update({name:"RubyDev"}, blog);

// Delete
db.sites.remove({name:"RubyDev"});
</pre>
<p>Успехов вам в разработке!</p>
]]></content:encoded>
			<wfw:commentRss>http://rubydev.ru/2011/12/mongodb_structure_and_quering/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

