地味で地道なはてなブログ

ダイアリー「地味で地道な」から引っ越しました。

Webデベロッパの祭典in札幌 A-2 まつもとゆきひろ Rubyを語る

2009年のRuby

1.9.1 がリリースされる

今までひろく使われてきた1.8系の直系にあたる

現在の最新バージョン:1.8.7
通称「Matzのインタプリタ

去年の暮れ、1.9.0がリリース
(1.9系のテスト版)

1年ほどテストされてきた
安定版→1.9.1を近くリリース
2009年1〜2月リリースを予定

#今年のクリスマスに出したかったが、
#yuguriYuguiさんに「間に合わない」といわれたので来年1月を予定
#それでもまだ延期かかるかも

1.9.1の仕様について

仕様はほとんどかわらない

何が起きるか?
YARV
Yet
Another
Ruby
Virtual Machine
#参考:wikipedia:YARV,http://www.atdot.net/yarv/

仕様がややこしい
かんたんなVMはできるが、きちんと完成度高めるのがたいへん

→だいたいみんな作りこむ途中で挫折した
→唯一残ったものがこれ
だから"Yet Another"

特徴

高速VM

とはいっても

Web関係は、

  • ネットワークI/O
  • DBI/O

の2つでボトルネックになるので、VMが高速になってもあまりロジックコストはあまり関係ないといえばない

M17N

Multilingualization

言語化

Ruby・・・様々なエンコーディングを扱える

「文字」単位の処理ができる

複数エンコーディング対応
UTF-8,UTF-16,EUC-JP,S-JIS,Little Endian,Big Endian・・・

その他、全83エンコーディングに対応
インド、中国、ベトナムなど

文字コード変換なしで処理ができる

他の言語
読み込むときに変換を行う
Ruby1.9
そのまま処理できる

変換・・コストかかりまくり
正しく設定しないと化けまくる

ex."\"とバックスラッシュ*1
改行がどこだかわからなくなったりする

それらのストレスから解放される
単一エンコーディングであれば最強だけど、複数が混じりまくるとずたずた
S-JISUNICODES-JISとか

日本・・・たくさんの文字コードがある
それらの処理を行ってきて、経験を積んできている
欧米圏はそれをあまりやってきていない

CSI(文字集合独立)→Rubyはとうとう成功した

複数の文字コードUnicodeにして戻す
今までの文字コード変換のやりかたもできる

UCS(Universal Character)

スーパーセットにあたるので実現可能

encodingメソッド

自分自身に文字コードをもてる

文字列の属性・・・それぞれが持っている
それをもとにコード変換が可能

壊れたデータをちゃんと読むこともできる

EUC-JPなのに間違ってS-JISで読み込んで化けまくった
→正しく読めるようにできる

改行のOSによる体系の違い

UNIX
\n
Win
\r\n
Mac
\r

#いやがらせか?!

これらをどう処理するかも指定可能

Ruby Gemsが 標準添付される

RubyGem(通称gem):Rubyのライブラリを簡単にインストールするツール

Gemでパッケージにしてネットで配る
コンパイルまでやってくれる

Railsやその後継もGemで入れられる

"require"が不要になる

Fiber

新機能

スレッドに似た感じ

同期型並列実行

子ルーチン

スレッドより軽い

メモリも小さい

他への受け渡しも軽い

Fiber-Fiberという受け渡しができる

スレッド−並行実行して変になることがある
Fiber−明示的にタイミングをかける

ユーザレベルの実装
マルチコアでは活用できない→そういうものではない
扱いやすい
同時実行はしない

Merge Block

I/Oがはやくなる
ノンブロッキングI/O
ロジックがイベントドリブンになると書きにくくなる
中でFiber使ってくれる
→I/O性能向上 10倍ともいわれている

DBI/Oがとくによい

1.9.1:よりよいRuby
若干の非互換性はあるけど、よりよく安定している
下位バージョンのソースがちゃんとかいてあればたいていは大丈夫
tDiaryの1.9系への移行
→10000行以上の処理→130行くらいの修正でうごいた
#ただしその130行の内容がどんなだかは不明。とても濃いかもしれないし

複数実装

*2

JRuby

http://www.thinkit.co.jp/free/article/0709/4/1/
RubyJava実装
JVMのclassに変換してくれる

Sunがスポンサー

#Ruby1.8より遅かったらバグレポートあげていいといってる

Rubinius

C++コア
Smalltalk的アプローチ
大半がRuby自身で書かれている
コアの一部のみがC++

IronRuby

http://journal.mycom.co.jp/articles/2007/07/27/ironruby/index.html
Rubyの.NET実装
Micorsoftが開発しているオープンソース
.NET Frameworkにアクセスできる
複数実装のひとつの基準・・・Ruby on Railsが動くかどうか

IronRubyは動いた
1.9もうごく
しかもけっこういい

Maglev

http://www.infoq.com/jp/news/2008/06/MagLevAtRailsConf
"magnetic levitation"(リニアモーターカーのこと)

"Rails"でなくて浮いているという意味合い
SmalltalkVM上のRuby実装
とにかく速い

GemStone

http://www.infoq.com/jp/news/2008/05/maglev-gemstone-builds-ruby
商用提供
社名でありシステム名
分散オブジェクトデータベースつき
60倍高速とかいう噂
C++とあまりかわらないとも

ただし、
オープンソースではない

完成度もまだ低い

→完成度があがってきたらどうなるか。今後の展開に注目

Ruby Enterprise Edition

http://journal.mycom.co.jp/news/2008/12/09/019/index.html
Web上へ最適化する

Malloc

Phusion Passenger向け
http://journal.mycom.co.jp/news/2008/08/19/034/index.html
カスタムメモリ管理

ではベンチマークは?

Ruby1.8.7(from source)が基準の1
数値が多ければよく、少なければ悪い

名前 数値 備考
Ruby 1.8.7(from source) 1.0 基準値
Ruby 1.8.6(Windows Vista) 0.5前後 RubyはWinと相性が悪いため値もよくない
Rubinius 0.7前後
JRuby 1.1.6 RC1 1.9前後
Ruby Enterprice edhition 1.0
Ruby 1.9.1 2.5 ※最速#公称
Ruby 1.8.7(apt-get) 0.5

これをSunで何百人がかりでやってる
JVMをいかにうまく動かすか

実際には、前述のとおり、ネットワークやDBのI/Oでめちゃくちゃひっぱられるので、ここまで極端な差にはならない

Ruby on Rails

keyword:Ruby on Rails

Version 2.2

スレッドセーフ
JRuby→スレッド性能いい
Railsと組むといろいろよい

I18N(Internationalization)

国際化

国によってアプリが異なる

  • メッセージ言語の切り替え
  • 通貨、カレンダーの記述、カンマとピリオド等のロケールの問題

などなど。

I18Nはメッセージ変換が主
今まではプラグインだった
→標準対応されるようになった

1.9 Ready

アプリサーバ

Webrick

http://www.webrick.org/
keyword:Webrick
もともと使ってきた
Rubyのhttpサーバ
全部Rubyなので遅い

Mongrel

keyword:Mongrel

プロトコルパージング
Cでかいてある

Phusion Passenger

http://www.infoq.com/jp/news/2008/05/phusion-passenger-mod-rails-gc
オランダのOSS
Apacheモジュール
別プロセスとして扱っている
海外では評価が高い

Glassfish+JRuby

http://www.sophia-it.com/content/GlassFish
※事例*3
Oracleが作ったSNSアプリ
マーティン・ファウラーの会社でRRで6週間で作った
→あろうことかデータセンターがreject
Rubyなんてもんで作ったもんのせられるか」
JRuby使ってのっけた
#えー

ポストRails

他言語でもばりばり意識している
Railsであるだけで優位性を保てる時代は終わった
リフレクション機能使いまくり

Merb

http://www.itmedia.co.jp/enterprise/articles/0810/15/news106.html
パブリックAPIとか検討している

規模は小さい
性能が高い
テンプレートエンジン
ORマッパさしかえる

#選択肢が多いとかえってお客さんは困っちゃうけど

Ramaze

keyword:Ramaze
http://mono.kmc.gr.jp/~yhara/ramaze/
Webアプリケーションフレームワーク
作った人・・・日本人じゃないけど日本にいる

Sinatra

http://www.infoq.com/jp/news/2007/11/forgotten-ruby-web-frameworks
分野限定の言語

Rails-Webアプリに特化

→それをさらにすすめて、もっと特化した
生産性はひじょうに高い

クラウドコンピューティング

コンピュータとネットワーク

集中<=>分散のいったりきたりの歴史
汎用機・・・集中
ネット・・・分散
ネットがある程度広まるとまた集中化
とか。

何万台ものマシンの管理をどうするか?

http://www.atmarkit.co.jp/news/200812/01/rakuten.html

Fairy

楽天のシステム
現在絶賛開発中
データマイニング
いちいち処理かいてられっか→Rubyでかいてばらまいて処理を分散する

Roma

RDBMSだとデータ保守がたいへん
→メモリにいれてしまえ という発想

何十台、何百台にいれてしまう

memキャッシュと違ってプロセスおちても大丈夫

Roma→システム運用中でも、マシン・ノードを追加するとすぐ認識する



オープンソース・・・話題性がなくなっちゃうと停滞して死んでしまう

参考
http://emasaka.blog65.fc2.com/blog-entry-412.html

*1:Winユーザのためバックスラッシュが打てません

*2:http://www.rubyist.net/~matz/20061208.html#p03

*3:そんな無茶な