カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年
知り合いサイト: 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。
いつも使いたいときに名前が思い出せないのでメモしておきます。
WFetch は Microsoft の IIS 6.0 Resource Kit Tools のうちの一つ、ウェブサーバにリクエストを投げてレスポンスを確かめるためのツールです。
TRACE メソッドを無効にする設定をしたけどほんとに無効になってるのかブラウザじゃ分からない、特定のリクエストデータの時だけ起きるバグの条件絞込みをしたいが細かく値を変えて何度も試すので telnet じゃ面倒だしスクリプトを組むにもアドホック過ぎる、なんてときに重宝します。
(テストを書いて開発している場合、)トランザクションをサポートしていないデータベースを使うときには、test/test_helper.rb で、
self.use_transactional_fixtures = false
しましょう。
開発している Rails アプリに全文検索を実装するため、Tritonn を試していました。
全文検索対象のテーブルは InnoDB ではなく、MyISAM で作る必要があります。で、テーブルを作り直してテストを実行したところ失敗多数。
acts_as_tritonn を使っていたので、migration 周りのメソッドを再定義している部分が怪しいのかなと調べましたが空振り。テストの失敗の内容をよく読んでみると、どうやら他のテストの結果が影響しているような挙動をしていました。
teardown でデータベースの状態が元に戻ってないのだなと思いましたが、そもそも Rails はどうやってデータベースの状態をテストメソッドごとに戻しているのか疑問に思いました。調べてみたところ、teardown 時に rollback していることが分かりました。
以下がコードの該当箇所です。
# Rollback changes if a transaction is active. if use_transactional_fixtures? && Thread.current['open_transactions'] != 0 ActiveRecord::Base.connection.rollback_db_transaction Thread.current['open_transactions'] = 0 end
use_transactional_fixtures だったらロールバックしてるわけですね。ということで、use_transactional_fixtures を調べたらtest/test_helper.rb に記述されている設定項目でした。このトランザクションに対応してないデータベースでは、use_transactional_fixtures を false にすべしというのは、割と知られてる話のようで、不勉強なために時間を結構消費してしまいました。。。
use_transactional_fixtures を false にするとテストはちゃんと実行されるようになりましたが、どうもテストの実行速度が遅くなった気がします。fixture を毎回読み直すためかもしれません。
activerecord-2.0.2/lib/active_record/fixtures.rb の rdoc に以下のような一節があります。transactional fixtures を使わないのはどのような時かという説明で、その一はネストしたトランザクションを使っているとき、もう一つがデータベースがトランザクションをサポートしていないときです。
# 2. Your database does not support transactions. Every Active Record database supports transactions except MySQL MyISAM. # Use InnoDB, MaxDB, or NDB instead.
ということで、InnoDB などを使ってほしいみたいですね。
私は活動しなかったのですが、今年もうちの会社はスポンサーをやるようです。ということで行くことにしました。
10 時少し前から近くのローソンのロッピーに陣取って、「混み合っています。少し経ってからやり直してください」を繰り返すこと数度、10:12 ごろに買えました。
Ruby on Railsのスケーラビリティ強化製品、続々 − @ITという翻訳記事がありました。どうも雑多な記事ですがちょっと読んでみます。
その生産性に開発者から全幅の信頼を寄せられているRuby on Railsだが、人気の高いこのWebプラットフォームに対しては、高負荷に対応するスケーラビリティが低いという批判の声も多く出ている。そのような中で、単にRailsとも呼ばれるRuby on Railsの可用性を高めようと、一部の新興企業が事業を展開している。
Ruby on Railsのスケーラビリティ強化製品、続々 − @IT
ということで、Rails は生産性は高いがスケーラビリティが不足しているという問題があり、それを解決しようとするベンチャー企業が現れ始めているという内容です。
こと日本では「Rails はスケーラビリティが不足している」という認識はもっぱら twitter によってもたらされている気がしますが、
最近は多数のエンタープライズアプリケーションにも採用され始めた。だが、相応の成功を収めているにもかかわらず、Railsを使った開発プロジェクトはエンタープライズスケーラビリティの理想形を95%までは具現化できるのに、負荷の大きい環境でアプリケーションを使用するにはほかの言語の力を借りなければならないという苦言も、しばしば聞こえてくる。
Ruby on Railsのスケーラビリティ強化製品、続々 − @IT
ということで、エンタープライズ分野での採用も進んでおり、そこで問題となっているようです。とはいえ、昔 Martin Fowler が Martin Fowler's Bliki in Japanese - エンタープライズRails で言ってたように Rails の「コア機能」はエンタープライズ向けというわけではなくて、plugin など周辺で補おうという考えですから、一口で「エンタープライズアプリケーション」と言っても分野は限られていると思いますが。具体例がほしいですね。
負荷の大きい環境でアプリケーションを使用するにはほかの言語の力を借りなければならない
というのは、この間の「twitter が Rails 使うの止めるよ騒動」で Evan Williams が言った「twitter はすでに多くのコードがRailsではない」を思い起こさせます。
Ruby は、速度が要求される部分は C で書いて拡張ライブラリにしちゃえという技が比較的容易なので、ほかの言語の力を借り
て済むならそれでいいのではと思います。ただ、ボトルネックが Rails そのものにあった場合には、Rails のようなフルスタックのフレームワークのボトルネック部分だけ C で書き直すというのも現実的とはいえないですね。Ruby 処理系や Rails に手を入れられないという前提ならアプリのロジックやアプリケーションサーバ(apache/lighty/mongrel/thin)、物理サーバでパフォーマンスの確保やスケーリングさせないといけないことになります。
で、スケール問題に対するソリューションの一つ目として紹介されているのが New Relic です。
New Relicがサブスクリプション形式で販売するRailsパフォーマンス管理ソリューション「RPM」は、開発者によるリアルタイムでのアプリケーションパフォーマンス問題検出、診断、修復を迅速に、かつ低コストで実現すると、New Relicは説明している。同SaaS(Software as a Service)は現在、限定的な顧客にプライベートベータ版として配布されているが、間もなくRuby on Railsコミュニティ全体に向けた一般提供が始まる見込みだ。
Ruby on Railsのスケーラビリティ強化製品、続々 − @IT
ということですが、この説明ではよく分からないので、TechCrunch Japanese アーカイブ » New Relic、Ruby on Railsアプリのパフォーマンス・モニタ開発へを読むのがいいでしょう。
稼動中の Rails アプリのパフォーマンスモニタリングをして、ボトルネックを発見できるサービスですね。「Hoge コントローラの foo アクションが遅い」といったことが一目で分かるので、そういったボトルネックを解消していくことでパフォーマンスの問題を解決できると。まあ、「スケーラビリティ強化」に対する直球の回答ではないですけれども。
MySQL のエンタープライズ版は、MySQL Enterprize Monitor というツールが利用できます。MySQL サーバの稼動状況を多くの項目で網羅的に監視できたり、最適な設定を提案してくれたりします。
New Relic や(いずれ現れるかもしれない)その競合が育てば「Rails Enterprize Edition」のようなサポート付きのサービスというのも生まれるんじゃないかと思います。特に日本では金払ってサポートしてもらうのが好まれますけど、NaCl や CTC あたりがやったりしないですかね。
New Relicは、30〜60日以内に新製品をリリースするという。同社のプライベートベータプログラムには約50社の顧客が参加しており、各社は同製品を利用してRailsアプリケーションのスケーラビリティ向上に役立てている。同社はさらに、RPMの実働用バージョンを補完する開発者向けのソリューションを提供する予定
Ruby on Railsのスケーラビリティ強化製品、続々 − @IT
蓄積されるノウハウがコミュニティに還元されると嬉しいですね。Rails Conf でセッションするとかで。
さて次に紹介されているソリューション?はプラットフォームです。
Rails実装プラットフォームプロバイダのEngine Yardは4月29日、先日リリースされた、分散化バージョン管理システムの「GitHub」サービスと、人気の高いバグ追跡アプリケーション「Lighthouse」をサポートすることを明らかにした。Engine Yardのスケーラビリティの高いプラットフォーム上でGitHubおよびLighthouseをホスティングし、Rails開発者のソースコードとチケットトラッキングの両方を安全に使用できるようにすると、同社は述べている。
Ruby on Railsのスケーラビリティ強化製品、続々 − @IT
Engine Yard は Rails が稼動するサーバを提供するサービスをしているところです。詳細は例によって、TechCrunch Japanese アーカイブ » Benchmark、Ruby on Railsに賭ける―「Engine Yard」に$3.5Mを投資を参照ください。New Relic も Engine Yard も同じ Benchmark が投資しているんですね。Rails に期待しているのかな。しかし、Engine Yard は別に「スケーラビリティ強化製品」じゃあないですね。
続けて読んでいくと、
Engine Yardの最高技術責任者を務めるトム・モーニニ氏は、eWEEKに対し次のように語っている。
「Railsのスケーラビリティに根本的な問題はないと、われわれは考えている。それでもこの点を批判する人々は、効率性とスケーラビリティを混同しているのだろう。RubyとRailsは、ランタイムにおける効率性こそ従来のプラットフォームに劣るが、これはほかの新しい開発プラットフォームすべてに言えることだ。Javaも登場した当時はひどく遅く感じられたのを思い出してほしい。Rubiniusなどの新たなRubyランタイムは、ネイティブコード生成といった、Javaでも多用されているのと同じ最適化技術を採用しており、効率性の向上を実現してくれる。現在われわれは、一月あたり数百万人ものユニークビジターが使用するRailsアプリケーションを、わずか数台の最新サーバ上で運用しており、ビジター数が数千万人になっても、将来的に数億人になっても大丈夫だという自信を持っている」(モーニニ氏)
Ruby on Railsのスケーラビリティ強化製品、続々 − @IT
なんとスケーラビリティ問題はないということです。ただ、Java を引き合いに出している件を注意深く読むと、「問題はないが気にする人も今後はより良くなるので心配しなくて良い」という読み方と、「サービスを提供している以上問題があるとはいえないが、やはりこの辺が良くなってほしい」という穿った読み方がありそうです。どちらにしても改善すべき点は存在するわけですね。JVM の進化と同様の進化が Ruby にも必要ということなのでしょう。
Ruby1.9(YARV)、JRuby、Rubinius、MagLev と VM ベースの Ruby 処理系はいくつかありますが(MagLev はまだ実物ないですが)、VM の利点として捉えられているのはやはりパフォーマンスです(今のところ Rubinius はちょっと違いますけどね)。YARV の目的はパフォーマンス向上でしたし、JRuby の Charles Nutterが事あるごとに書いているのは、Java とのシナジー効果などというものではなくパフォーマンスです。MagLev もインタビュー記事ではスケーラブルというキーワードでパフォーマンスについて語っています。
Ruby 処理系のパフォーマンス競争で現時点で先頭にいるのは Ruby1.9 ですが JRuby が急速に迫りつつあります。将来的にはいずれかの処理系が、ハードウェア性能を勘案した相対的な速度では、現在の Java に追いつくかもしれません。でも、それまではやはりパフォーマンスが「問題」として取り上げられ続けるのでしょう。
元記事最後の DHH 御大の台詞については割愛。
ところで、Ruby on Railsのスケーラビリティ強化製品、続々 − @ITですが、結局「スケーラビリティ強化製品」なるものは、せいぜい New Relic の RPM くらいしか上げられてないですね。続々というのは一体なんだったのでしょう……原題は「Making Ruby on Rails Scale」なので単なる誤訳というのが結論?
ruby 1.8.7 pre2 で activerecord-2.0.2 のテストを実行すると割りと失敗してる件の続きです。
Edge Rails ならすでに 1.8.7 対応しているかもと思って試してみました。
1452 tests, 5139 assertions, 2 failures, 1 errors
1422 tests, 5086 assertions, 0 failures, 1 errors
1452 tests, 5139 assertions, 2 failures, 1 errors
1422 tests, 5086 assertions, 0 failures, 1 errors
失敗やエラーがあるのはまあ edge なのでしょうがないとして、1.8.6 でも 1.8.7 pre2 でも結果が変わりませんでした。もちろん以前の日記に書いたような 1.8.7 での仕様変更に伴うエラーもありません。
いまの Edge Rails は 2.1.0 になるのでしょうから、おそらく Ruby 1.8.7 は Rails 2.1.0 以上推奨ということになりますね。Rails ユーザが Ruby 1.8.7 にバージョンアップするのは Rails 2.1.0 がリリースされるまで待ち(どっちが先になりますかね)、既存の Rails アプリは Ruby 1.8.6 以下のままで動かすのが無難でしょう。
ついでに他のコンポーネントのテストも実行してみました。
ActionPack で落ちるのは[ruby-dev:34532] ruby_1_8でform_tagが動かないの件でしょうか。他は問題なさそうですね。
やはり、[ruby-dev:34532] ruby_1_8でform_tagが動かないの件でした。r15856 の変更を戻した ruby 1.8.7 pre2 で EdgeRails の ActionPack のテストを実行したところ、正常に終了しました。
1907 tests, 9146 assertions, 0 failures, 0 errors
[BUG] と出て落ちますし、ActionPack の修正で回避するよりも、Ruby 側を直した方がいいんじゃないですかね。
helper_method で定義されたヘルパーメソッドを呼ぶと落ちるみたいです。つまり、form_tag ではなくて、
% rails sample
% cd sample
% ruby18 ./script/generate controller sample index
% echo '<% protect_against_forgery? %>' >> app/views/sample/index.html.erb
% ruby -pi~ -e 'sub(/assert.*/){"get :index"}' test/functional/sample_controller_test.rb
% ruby18 test/functional/sample_controller_test.rb
で落ちます。protect_against_forgery? の代わりに form_authenticity_token でも同様。
しかし、これを最小コードに落とし込むのは結構面倒そうですね。。。
IPA の OSS iPedia で公開されています。
資料は、RubyCityMATSUE こと松江市の基幹業務システムの構築プロジェクトに関するものです。「Rubyの普及を目指した」と題されているように、Ruby による堅いシステムの構築の実績とノウハウを作るのがテーマだったのでしょう。項目としては、
でした。個人的には、
実運用に向けた考察 ・システム連携に関する考察 ・システム導入(調達)に関する考察
が気になります。既存システムとの連携やシステム調達で、Ruby を採用するとどのような制限が生じるのか。私はそういった制限の少ないウェブアプリしか作ったことがないので、想像しかできないところですから。
また、
人材育成を通じて作成した「Ruby コーディング規約」、「つまづき集」、セキュリティ検証を通じて作成した「ハーデニングガイドライン」といったドキュメントについても、今後RubyやOSS を活用した業務システム構築の際の参考になるものと期待している
とありますが、これは公開されるんでしょうかね。社内規定としてコーディング規約やセキュリティ規約を定めている会社は多いと思いますので、社内規定を作成する元ネタとして活用できるんじゃないでしょうか。
著者は東大大学院の准教授の方で、この本は東大教養学部の「翻訳論」の講義を基にしているとのこと。EXERCISE があったりするのが教科書的といえばそうですが、教科書に良く見られるような硬直した文章ではありませんので、翻訳術のあれこれについて楽しみながら読み進められます。
私がその目的で読んだのですが、原文で文学を読んでみたいという人も一読すると取っ掛かりになるかもしれません。
文芸作品の翻訳はどのように行うか。V・S・ナイポール、カズオ・イシグロ、ヴァージニア・ウルフ...など、英文学の名作に即して翻訳の技術を解説、語学学習や文化的側面の関わりからも論じる。豊富な練習問題をこなしながら、自然に理解が深まる入門書。
Amazon.co.jp: 翻訳の作法: 斎藤 兆史: 本
ちょっと気になったので sqlite3 で実行してみました。
$ ruby187 -I connections/native_sqlite3 -e 'Dir["**/*_test.rb"].each { |path| require path }'
(略)
1190 tests, 4149 assertions, 5 failures, 7 errors
ほとんど Enumerator 関係のエラーでした。ちなみに 1.8.6 では 0F0E です。
1) Failure:
test_has_many_and_belongs_to_many_callbacks_for_save_on_parent(AssociationCallbacksTest)
[./associations/callbacks_test.rb:131:in `test_has_many_and_belongs_to_many_callbacks_for_save_on_parent'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `__send__'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `run']:
<1> expected but was
<#<Enumerable::Enumerator:0xb755c348>>.
2) Failure:
test_except_attributes(BasicsTest)
[./base_test.rb:1685:in `test_except_attributes'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `__send__'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `run']:
<["author_name",
"type",
"id",
"approved",
"replies_count",
"bonus_time",
"written_on",
"content",
"author_email_address",
"parent_id",
"last_read"]> expected but was
<["author_name",
"id",
"approved",
"type",
"replies_count",
"bonus_time",
"parent_id",
"content",
"written_on",
"last_read",
"author_email_address"]>.
3) Failure:
test_include_attributes(BasicsTest)
[./base_test.rb:1697:in `test_include_attributes'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `__send__'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `run']:
<["title", "author_name", "type", "id", "approved"]> expected but was
<["title", "author_name", "id", "approved", "type"]>.
4) Failure:
test_quote_chars(BasicsTest)
[./base_test.rb:1238:in `test_quote_chars'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `__send__'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `run']:
<#<Enumerable::Enumerator:0xb620b398>>
expected to be kind_of?
<ActiveSupport::Multibyte::Chars> but was
<Enumerable::Enumerator>.
5) Error:
test_to_xml_including_has_many_association(BasicsTest):
NoMethodError: undefined method `[]' for #<Enumerable::Enumerator:0xb601e224>
/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/core_ext/string/access.rb:43:in `first'
./base_test.rb:1613:in `test_to_xml_including_has_many_association'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `__send__'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `run'
6) Error:
test_to_xml_including_methods(BasicsTest):
NoMethodError: undefined method `[]' for #<Enumerable::Enumerator:0xb60163bc>
/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/core_ext/string/access.rb:43:in `first'
./base_test.rb:1670:in `test_to_xml_including_methods'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `__send__'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `run'
7) Error:
test_to_xml_including_multiple_associations(BasicsTest):
NoMethodError: undefined method `[]' for #<Enumerable::Enumerator:0xb6009dec>
/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/core_ext/string/access.rb:43:in `first'
./base_test.rb:1652:in `test_to_xml_including_multiple_associations'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `__send__'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `run'
8) Error:
test_to_xml_including_multiple_associations_with_options(BasicsTest):
NoMethodError: undefined method `[]' for #<Enumerable::Enumerator:0xb6001d7c>
/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/core_ext/string/access.rb:43:in `first'
./base_test.rb:1663:in `test_to_xml_including_multiple_associations_with_options'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `__send__'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `run'
9) Error:
test_to_xml_skipping_attributes(BasicsTest):
NoMethodError: undefined method `[]' for #<Enumerable::Enumerator:0xb5ff8de4>
/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/core_ext/string/access.rb:43:in `first'
./base_test.rb:1602:in `test_to_xml_skipping_attributes'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `__send__'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `run'
10) Error:
test_to_xml_with_block(BasicsTest):
NoMethodError: undefined method `[]' for #<Enumerable::Enumerator:0xb5ff5a54>
/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/core_ext/string/access.rb:43:in `first'
./base_test.rb:1679:in `test_to_xml_with_block'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `__send__'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `run'
11) Error:
test_errors_to_xml(ValidationsTest):
NoMethodError: undefined method `[]' for #<Enumerable::Enumerator:0xb5eba02c>
/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/core_ext/string/access.rb:43:in `first'
./validations_test.rb:1234:in `test_errors_to_xml'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `__send__'
/usr/local/lib/ruby/gems/1.8/gems/mocha-0.5.5/lib/mocha/test_case_adapter.rb:19:in `run'
rails の ML は読んでないので分かりませんが、すでに 1.8.7 対応はチケット切られてるんでしょうかね。
最近のコメント:
RSS
![]()
This work is licensed under a
Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).