<?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"?><!-- generator="wordpress/2.3.3" --><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">

<channel>
	<title>Blog</title>
	<link>http://smartviolet.com/blog</link>
	<description>Smartviolet Blog</description>
	<pubDate>Fri, 21 Aug 2009 13:10:18 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.3</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/SmartvioletBlog" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>SQLite + RoR + Ubuntu</title>
		<link>http://smartviolet.com/blog/2009/08/21/sqlite-ror-ubuntu/</link>
		<comments>http://smartviolet.com/blog/2009/08/21/sqlite-ror-ubuntu/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 13:10:18 +0000</pubDate>
		<dc:creator>Спок</dc:creator>
		
		<category><![CDATA[rails]]></category>

		<category><![CDATA[RoR]]></category>

		<category><![CDATA[SQLite]]></category>

		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://smartviolet.com/blog/2009/08/21/sqlite-ror-ubuntu/</guid>
		<description><![CDATA[Записываю, чтобы не забыть.
Ставим:
 sudo apt-get install sqlite3 libsqlite3-dev
 sudo gem install sqlite3-ruby
И все!
]]></description>
			<content:encoded><![CDATA[<p>Записываю, чтобы не забыть.</p>
<p>Ставим:</p>
<pre> sudo apt-get install sqlite3 libsqlite3-dev</pre>
<pre> sudo gem install sqlite3-ruby</pre>
<pre>И все!</pre>
]]></content:encoded>
			<wfw:commentRss>http://smartviolet.com/blog/2009/08/21/sqlite-ror-ubuntu/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Linux tips: job running time</title>
		<link>http://smartviolet.com/blog/2009/07/13/linux-tips-job-running-time/</link>
		<comments>http://smartviolet.com/blog/2009/07/13/linux-tips-job-running-time/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 07:50:39 +0000</pubDate>
		<dc:creator>Спок</dc:creator>
		
		<category><![CDATA[tips]]></category>

		<category><![CDATA[Linux tips]]></category>

		<guid isPermaLink="false">http://smartviolet.com/blog/2009/07/13/linux-tips-job-running-time/</guid>
		<description><![CDATA[Для того чтобы узнать сколько в Linux выполняется та или иная команда достаточно набрать:
time cmd
Примеры:
time rake db:migrate
Покажет сколько времени проходила миграция, это может быть полезным если вы производите в миграции конвертирование данных а не только изменение схемы.
]]></description>
			<content:encoded><![CDATA[<p>Для того чтобы узнать сколько в Linux выполняется та или иная команда достаточно набрать:</p>
<pre>time cmd</pre>
<p>Примеры:</p>
<pre>time rake db:migrate</pre>
<p>Покажет сколько времени проходила миграция, это может быть полезным если вы производите в миграции конвертирование данных а не только изменение схемы.</p>
]]></content:encoded>
			<wfw:commentRss>http://smartviolet.com/blog/2009/07/13/linux-tips-job-running-time/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MySQL tips: optimize tables</title>
		<link>http://smartviolet.com/blog/2009/06/03/mysql-tips-optimize-tables/</link>
		<comments>http://smartviolet.com/blog/2009/06/03/mysql-tips-optimize-tables/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 06:20:57 +0000</pubDate>
		<dc:creator>Спок</dc:creator>
		
		<category><![CDATA[Новости]]></category>

		<category><![CDATA[MySQL tips]]></category>

		<guid isPermaLink="false">http://smartviolet.com/blog/2009/06/03/mysql-tips-optimize-tables/</guid>
		<description><![CDATA[Задача: оптимизировать все таблицы в базе.
Решение:
mysql -u user -ppassword database -e "show tables"\
   &#124; grep -v Tables_in &#124; grep -v "+" \
   &#124; gawk '{print "OPTIMIZE TABLE  " $1 ";" }' \
   &#124; mysql -u user -ppassword database
]]></description>
			<content:encoded><![CDATA[<p>Задача: оптимизировать все таблицы в базе.</p>
<p>Решение:</p>
<pre>mysql -u user -ppassword database -e "show tables"\
   | grep -v Tables_in | grep -v "+" \
   | gawk '{print "OPTIMIZE TABLE  " $1 ";" }' \
   | mysql -u user -ppassword database</pre>
]]></content:encoded>
			<wfw:commentRss>http://smartviolet.com/blog/2009/06/03/mysql-tips-optimize-tables/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MySQL tips: change all tables engine for database</title>
		<link>http://smartviolet.com/blog/2009/05/26/mysql-tips-change-all-tables-engine-for-database/</link>
		<comments>http://smartviolet.com/blog/2009/05/26/mysql-tips-change-all-tables-engine-for-database/#comments</comments>
		<pubDate>Tue, 26 May 2009 19:11:12 +0000</pubDate>
		<dc:creator>Спок</dc:creator>
		
		<category><![CDATA[Новости]]></category>

		<category><![CDATA[MySQL tips]]></category>

		<guid isPermaLink="false">http://smartviolet.com/blog/2009/05/26/mysql-tips-change-all-tables-engine-for-database/</guid>
		<description><![CDATA[Задача: Конвертнуть одним махом все таблицы из MyISAM в InnoDB
Решение:
mysql -u user -ppassword database -e "show tables"\
  &#124; grep -v Tables_in &#124; grep -v "+" \
  &#124; gawk '{print "ALTER TABLE " $1 " ENGINE = InnoDB;"}' \
  &#124; mysql -u user -ppassword database
]]></description>
			<content:encoded><![CDATA[<p>Задача: Конвертнуть одним махом все таблицы из MyISAM в InnoDB</p>
<p>Решение:</p>
<pre>mysql -u user -ppassword database -e "show tables"\</pre>
<pre>  | grep -v Tables_in | grep -v "+" \</pre>
<pre>  | gawk '{print "ALTER TABLE " $1 " ENGINE = InnoDB;"}' \</pre>
<pre>  | mysql -u user -ppassword database</pre>
]]></content:encoded>
			<wfw:commentRss>http://smartviolet.com/blog/2009/05/26/mysql-tips-change-all-tables-engine-for-database/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Factory girl: extract_factories</title>
		<link>http://smartviolet.com/blog/2009/05/19/factory-girl-extract_factories/</link>
		<comments>http://smartviolet.com/blog/2009/05/19/factory-girl-extract_factories/#comments</comments>
		<pubDate>Tue, 19 May 2009 10:48:08 +0000</pubDate>
		<dc:creator>Спок</dc:creator>
		
		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[Factory]]></category>

		<category><![CDATA[snippets]]></category>

		<guid isPermaLink="false">http://smartviolet.com/blog/2009/05/19/factory-girl-extract_factories/</guid>
		<description><![CDATA[Все наверное слышали о фабиках от Thoughtbots, а кто не слышал услыште.
Ставим все очень просто:
 gem install thoughtbot-factory_girl --source http://gems.github.com
А дальше курим доку и радуемся жизни.
О птичках, наваял тут скриптец для построения фабрик, который достаточно скопировать себе в директорию lib/tasks/
Использовать:
rake db:extract_fixtures
Генерит туповато но иногда полезно, особенно когда большой список аттрибутов у модели.
]]></description>
			<content:encoded><![CDATA[<p>Все наверное слышали о <a href="http://dev.thoughtbot.com/factory_girl/">фабиках</a> от <a href="http://thoughtbot.com/">Thoughtbots</a>, а кто не слышал услыште.</p>
<p>Ставим все очень просто:</p>
<pre> gem install thoughtbot-factory_girl --source http://gems.github.com</pre>
<p>А дальше курим доку и радуемся жизни.</p>
<p>О птичках, наваял тут <a href="http://gist.github.com/114038" target="_blank">скриптец</a> для построения фабрик, который достаточно скопировать себе в директорию lib/tasks/</p>
<p>Использовать:</p>
<pre>rake db:extract_fixtures</pre>
<p>Генерит туповато но иногда полезно, особенно когда большой список аттрибутов у модели.</p>
]]></content:encoded>
			<wfw:commentRss>http://smartviolet.com/blog/2009/05/19/factory-girl-extract_factories/feed/</wfw:commentRss>
		</item>
		<item>
		<title>shoulda: running concrete context</title>
		<link>http://smartviolet.com/blog/2009/05/05/shoulda-running-concrete-context/</link>
		<comments>http://smartviolet.com/blog/2009/05/05/shoulda-running-concrete-context/#comments</comments>
		<pubDate>Tue, 05 May 2009 06:36:08 +0000</pubDate>
		<dc:creator>Спок</dc:creator>
		
		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[BDD]]></category>

		<category><![CDATA[shoulda]]></category>

		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://smartviolet.com/blog/2009/05/05/shoulda-running-concrete-context/</guid>
		<description><![CDATA[Многие Rails разработчики уже используют shoulda - замечтельный  BDD фреймворк от команды thoughtbot, как альтернативу rspec, например.
Сам фреймворк - это надстройка над UnitTests.
При разработке с  UnitTests часто возникает необходимость запустить отдельный тест и посмотреть результаты. Но как быть с shoulda - ведь названия тестов здесь это обычные текстовые предложения, которые формируются с учетом контекста теста [...]]]></description>
			<content:encoded><![CDATA[<p>Многие Rails разработчики уже используют <a href="http://thoughtbot.com/projects/shoulda/">shoulda</a> - замечтельный  BDD фреймворк от команды <a href="http://thoughtbot.com/">thoughtbot</a>, как альтернативу rspec, например.</p>
<p>Сам фреймворк - это надстройка над UnitTests.</p>
<p>При разработке с  UnitTests часто возникает необходимость запустить отдельный тест и посмотреть результаты. Но как быть с <a href="http://thoughtbot.com/projects/shoulda/">shoulda</a> - ведь названия тестов здесь это обычные текстовые предложения, которые формируются с учетом контекста теста и контекстов в котором тест находится. Например:</p>
<pre>require File.dirname(__FILE__) + '/../test_helper'
require 'shoulda'

class ArticleTest &lt; Test::Unit::TestCase
  fixtures :all
  context "On create" do</pre>
<pre>    should "create article if all params ok" do
      article = Article.new( :title =&gt; "shoulda rocks", :body =&gt; "Try it")
    end
    should "require title" do
      article = Article.new(:body =&gt; "That article wouldn't be published")
    end
    should "require body" do
      article = Article.new(:title =&gt; "Where is my body?")
    end
  end
end</pre>
<p>В таком случае shoulda сгенерит следующие тесты:</p>
<pre>test: On create should create article if all params ok
test: On create should require title
test: On create should require body</pre>
<p>Пока у нас не много тестов все ок. Но если у нас большое количество контекстов, например, On Create, On  Update, On Destroy и т.д.? И мы хотим выполнить определенный контекст для того чтобы понять где именно проблема.</p>
<p>Для этого воспользуемся возможностью UnitTests запускать отдельные тесты с ключем -n</p>
<pre>Test::Unit automatic runner.
Usage: test/unit/shop_test.rb [options] [-- untouched arguments]

    -r, --runner=RUNNER          Use the given RUNNER
                                 (c[onsole], f[ox], g[tk], g[tk]2, t[k])</pre>
<pre>    -n, --name=NAME              Runs tests matching NAME.
                                 (patterns may be used).</pre>
<pre>    -t, --testcase=TESTCASE      Runs tests in TestCases matching
                                 TESTCASE. (patterns may be used).</pre>
<pre>    -I, --load-path=DIR[:DIR...] Appends directory list to $LOAD_PATH.</pre>
<pre>    -v, --verbose=[LEVEL]        Set the output level (default
                                 is verbose). (s[ilent],
                                 p[rogress], n[ormal],v[erbose])</pre>
<pre>        --                       Stop processing options so that the
                                 remaining options will be passed to the
                                 test.</pre>
<pre>    -h, --help                   Display this help.</pre>
<pre>
Deprecated options:</pre>
<pre>        --console                Console runner (use --runner).</pre>
<pre>        --gtk                    GTK runner (use --runner).</pre>
<pre>        --fox                    Fox runner (use --runner).</pre>
<p>Как показывает нам справка, параметром ключа -n может быть любое регулярное выражение. Например, команда:</p>
<pre>ruby test/unit/article_test.rb --name="/test:(.*)On create(.*)/"</pre>
<p>запустит на выполнение только тесты из контекста On create.</p>
<p>Вот так вот.</p>
]]></content:encoded>
			<wfw:commentRss>http://smartviolet.com/blog/2009/05/05/shoulda-running-concrete-context/feed/</wfw:commentRss>
		</item>
		<item>
		<title>rake gems:install</title>
		<link>http://smartviolet.com/blog/2009/05/03/rake-gemsinstall/</link>
		<comments>http://smartviolet.com/blog/2009/05/03/rake-gemsinstall/#comments</comments>
		<pubDate>Sun, 03 May 2009 10:10:58 +0000</pubDate>
		<dc:creator>Спок</dc:creator>
		
		<category><![CDATA[Новости]]></category>

		<category><![CDATA[gem]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[rake]]></category>

		<category><![CDATA[rake gems:install]]></category>

		<guid isPermaLink="false">http://smartviolet.com/blog/2009/05/03/rake-gemsinstall/</guid>
		<description><![CDATA[В версию rails 2 была добавлена интересная возможность установки зависимых gem библиотек используя только 1 команду. Для этого Вам необходимо вписать в environment.rb следующие строки, например для установки will_paginate:
    config.gem 'mislav-will_paginate', :version =&#62; '~&#62; 2.3.8',
      :lib =&#62; 'will_paginate',
      :source =&#62; 'http://gems.github.com'
После этого [...]]]></description>
			<content:encoded><![CDATA[<p>В версию rails 2 <a href="http://ryandaigle.com/articles/2008/4/1/what-s-new-in-edge-rails-gem-dependencies">была добавлена</a> интересная возможность установки зависимых gem библиотек используя только 1 команду. Для этого Вам необходимо вписать в environment.rb следующие строки, например для установки will_paginate:</p>
<pre>    config.gem 'mislav-will_paginate', :version =&gt; '~&gt; 2.3.8',
      :lib =&gt; 'will_paginate',
      :source =&gt; 'http://gems.github.com'</pre>
<p>После этого в командной строке нужно набрать rake gems:install. Но не все так просто.</p>
<p>Если у Вас есть rake task в котором Вы, например включаете  environment.rb то Вы получите интересное сообщение, примерно такое:</p>
<pre>sudo rake gems:install
(in /home/cthulhu/development/blog)
Missing these required gems:
  mislav-will_paginate  ~&gt; 2.3.8

You're running:
  ruby 1.8.6.111 at /usr/bin/ruby1.8
  rubygems 1.3.2 at /home/cthulhu/.gem/ruby/1.8, /usr/lib/ruby/gems/1.8

Run `rake gems:install` to install the missing gems.</pre>
<p>ИМХО это еще хуже чем драйвера для вашего CD на CD.</p>
<p>Существует пара хаков против такого поведения.</p>
<p>Плохой, ИМХО, - <a href="http://michaelliberty.vox.com/library/post/rails-rake-gemsinstall.html">подхачить rail</a>. Для этого в файле  rails/lib/gems.rake в блоке:</p>
<pre>namespace :gems do
  task :base do
    $gems_rake_task = true
    require 'rubygems'
    require 'rubygems/gem_runner'
    begin
      Rake::Task[:environment].invoke
    rescue
    end
  end
  ...
end</pre>
<p>Нужно заменить:</p>
<pre> Rake::Task[:environment].invoke</pre>
<p>на</p>
<pre>begin</pre>
<pre>  Rake::Task[:environment].invoke</pre>
<pre> rescue</pre>
<pre>end</pre>
<p>Не очень хорошо, так как при этом модифицируется код библиотеки и его нужно будет тягать со своим проектом, а в случае если Вы захотите обновиться и забудете о хаке, у Вас будут очередные проблемы.</p>
<p>Второй вариант, более преемлемый - дописать в  environment.rb небольшой хак вида:</p>
<pre>if $rails_gem_installer
  class Rails::Initializer
    def load_application_initializers; end
  end
  config.gem 'mislav-will_paginate',
    :version =&gt; '~&gt; 2.3.8', :lib =&gt; 'will_paginate',
    :source =&gt; 'http://gems.github.com'
end</pre>
<p>Переменная $rails_gem_installer будет установлена когда Вы будете вызывать рейк таски из семейства установки гемов.</p>
<p>Так вот.</p>
<p>Может кто знает более правильные способы решения этой проблемы?</p>
]]></content:encoded>
			<wfw:commentRss>http://smartviolet.com/blog/2009/05/03/rake-gemsinstall/feed/</wfw:commentRss>
		</item>
		<item>
		<title>TDD mantra RED/GREEN/REFACTOR in tha Rails</title>
		<link>http://smartviolet.com/blog/2009/04/30/tdd-mantra-redgreenrefactor-in-tha-rails/</link>
		<comments>http://smartviolet.com/blog/2009/04/30/tdd-mantra-redgreenrefactor-in-tha-rails/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 10:50:47 +0000</pubDate>
		<dc:creator>Спок</dc:creator>
		
		<category><![CDATA[rails]]></category>

		<category><![CDATA[autotest]]></category>

		<category><![CDATA[redgreen]]></category>

		<guid isPermaLink="false">http://smartviolet.com/blog/2009/04/30/tdd-mantra-redgreenrefactor-in-tha-rails/</guid>
		<description><![CDATA[Все слышали о TDD мантре красный, зеленый, реорганизация. Чтобы все было именно так, в рельсах нужно 2 вещи autotest и плагин redgreen.
Создаем в корне прожекта файлик .autotest и пишем в него 1 строчку require &#8216;redgreen/autotest&#8217;. Далее стартуем как обычно:
autotest -rails
И вуаля, консоль с тестами красно/зеленая.
]]></description>
			<content:encoded><![CDATA[<p>Все слышали о TDD мантре красный, зеленый, реорганизация. Чтобы все было именно так, в рельсах нужно 2 вещи autotest и плагин redgreen.</p>
<p>Создаем в корне прожекта файлик .autotest и пишем в него 1 строчку require &#8216;redgreen/autotest&#8217;. Далее стартуем как обычно:</p>
<p>autotest -rails</p>
<p>И вуаля, консоль с тестами красно/зеленая.</p>
]]></content:encoded>
			<wfw:commentRss>http://smartviolet.com/blog/2009/04/30/tdd-mantra-redgreenrefactor-in-tha-rails/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MySQL tips: drop all tables from database</title>
		<link>http://smartviolet.com/blog/2009/04/29/mysql-tips-drop-all-tables-from-database/</link>
		<comments>http://smartviolet.com/blog/2009/04/29/mysql-tips-drop-all-tables-from-database/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 10:22:08 +0000</pubDate>
		<dc:creator>Спок</dc:creator>
		
		<category><![CDATA[Новости]]></category>

		<category><![CDATA[MySQL tips]]></category>

		<guid isPermaLink="false">http://smartviolet.com/blog/2009/04/29/mysql-tips-drop-all-tables-from-database/</guid>
		<description><![CDATA[Маленький скриптец для удаления всех таблиц из БД:
mysql -u user -ppassword db_name -e "show tables"\
  &#124; grep -v Tables_in &#124; grep -v "+" \
  &#124; gawk '{print "drop table " $1 ";"}' \
  &#124; mysql -u user -ppassword db_name
Еще можно написать хранимую процедуру для этого, примерно так:
delimiter $$
DROP PROCEDURE IF exist drop_tables();
create [...]]]></description>
			<content:encoded><![CDATA[<p>Маленький скриптец для удаления всех таблиц из БД:</p>
<pre>mysql -u user -ppassword db_name -e "show tables"\</pre>
<pre>  | grep -v Tables_in | grep -v "+" \</pre>
<pre>  | gawk '{print "drop table " $1 ";"}' \</pre>
<pre>  | mysql -u user -ppassword db_name</pre>
<p>Еще можно написать хранимую процедуру для этого, примерно <a href="http://gist.github.com/114109">так</a>:</p>
<pre>delimiter $$</pre>
<pre>DROP PROCEDURE IF exist drop_tables();</pre>
<pre>create procedure drop_tables()</pre>
<pre>begin</pre>
<pre>  SELECT</pre>
<pre>    @drop_sql:=concat('DROP TABLE IF EXISTS ', group_concat(table_name))</pre>
<pre>    drop_statement</pre>
<pre>  FROM information_schema.tables</pre>
<pre>  WHERE table_schema=database();</pre>
<pre>
  IF (@drop_sql IS NOT NULL) THEN</pre>
<pre>    PREPARE stmt from @drop_sql;</pre>
<pre>    EXECUTE stmt;</pre>
<pre>    DROP PREPARE stmt;</pre>
<pre>  END IF;</pre>
<pre>end$$</pre>
<pre>delimiter ;</pre>
<p>Вот так вот.</p>
]]></content:encoded>
			<wfw:commentRss>http://smartviolet.com/blog/2009/04/29/mysql-tips-drop-all-tables-from-database/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MySQL MyISAM + rails tests = bugs</title>
		<link>http://smartviolet.com/blog/2009/04/29/mysql-myisam-rails-tests-bugs/</link>
		<comments>http://smartviolet.com/blog/2009/04/29/mysql-myisam-rails-tests-bugs/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 06:53:35 +0000</pubDate>
		<dc:creator>Спок</dc:creator>
		
		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[bugs]]></category>

		<category><![CDATA[InnoDB]]></category>

		<category><![CDATA[MyISAM]]></category>

		<category><![CDATA[mysql]]></category>

		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://smartviolet.com/blog/2009/04/29/mysql-myisam-rails-tests-bugs/</guid>
		<description><![CDATA[Пришлось мне на днях потюнить MySQL. Решил попробовать разные конфигурации на предмет максимальной производительности по моим задачам. Нарыл ряд статей по  улучшению производительности. Лучше всего ИМХО написано было сдесь.
Пред история. Сразу скажу что запросы у меня простые и короткие. Пара селектов по индесированым полям + инсерт + апдейт. Ничего сложного. Но! В один прекрасный момент [...]]]></description>
			<content:encoded><![CDATA[<p>Пришлось мне на днях потюнить MySQL. Решил попробовать разные конфигурации на предмет максимальной производительности по моим задачам. Нарыл ряд статей по  улучшению производительности. Лучше всего ИМХО написано было <a href="http://blog.evanweaver.com/articles/2007/04/30/top-secret-tuned-mysql-configurations-for-rails/">сдесь</a>.</p>
<p>Пред история. Сразу скажу что запросы у меня простые и короткие. Пара селектов по индесированым полям + инсерт + апдейт. Ничего сложного. Но! В один прекрасный момент СУБД просто брала и начинала жрать все ресурсы процессора как локально так и на продакшин сервере. Однодневный инвестигейт показал интересную вещь. После инсерта происходит перестрой индексов данной таблицы, что само по себе требует ресурсов процессорного времени и это время прямо пропорционально количеству записей в таблице. Таким образом, если мне нужно много циклов записей/селектов подряд то время каждого цикла начинает расти. И у меня оно дошло до 1го цикла в секунду. Это при том что мне нужно это сделать 300к-500к раз. Посчитав примерно во что мне это обойдется вышло что весь цикл будет длиться с недельку. Это естественно ни в какие рамки не лезет.</p>
<p>Посему начал рыть. Сначала в сторону тюнинга СУБД. В целом добился прироста производительности гдето на 10%. Но проблема как обычно была не в СУБД. Т.е. как-бы в СУБД но не в СУБД. В общем это не самое интересное.</p>
<p>Самое интересно это то, что вовремя тюнинга я настроил все базы на использования движка MyISAM. И тут начались спец-эффекты. Упало ряд тестов. Анализ кода ничего не показал. Анализ фикстур, откаты изменений (я работаю в команде посему начал грешить на последние комиты) все это ни к чему не привело.</p>
<p>Начал думать (гуглом). <a href="http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting">Как оказалось</a> тесты в рельсах работают (в основном) в режиме транзакций. Т.е. каждый тестовый случаю выполняется как транзакция, которая потом (после выполнения тестового случая) откатывается. Теперь о MyISAM, как извесно этот движек не поддерживает транзакций, поэтому ряд тестов модифицируют данные необратимо. С этим и были связаны глюки. Кроме того, глюки будут также если у вас есть модифицирующие хранимые процедуры.</p>
<p>Вердикт. Для тех кто использует MySQL в тестовых версиях используйте движек InnoDB, иначе могут выпасть очень даже интересные глюки. Или используйте PostgreSQL.</p>
]]></content:encoded>
			<wfw:commentRss>http://smartviolet.com/blog/2009/04/29/mysql-myisam-rails-tests-bugs/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
