RubyKaigi2011 スペシャルレポート

日本Ruby会議2011 2日目レポート[更新終了]

この記事を読むのに必要な時間:およそ 18 分

7月16日(土)から18日(月)までの3日間にわたり,練馬文化センターにて日本Ruby会議2011(略称:RubyKaigi2011)が開催されています。本ページでは,2日目の模様を随時レポートしていきます。

今回,Rubyistが集まっているRubyKaigiなのに1人ぼっちで昼食を食べることになりそうな人のために,何人かのグループになって昼食を食べに行くための斡旋エコシステム「Anti-Bocchi Lunch」が行われています。興味のある方は,お昼(前)に2Fジュンク堂書店RubyKaigi店横のボードの場所に向かってみましょう。

画像

また,参加者の人がつくっていくアンカンファレンス!RubyKaigi(NotRubyKaigi)2011開催のための会場が3Fに用意されます。興味のある方は,スタッフの方に尋ねてみましょう。

西山和広さん「安全なプログラムの作り方」

@znzこと西山さんの発表です。歴史を振り返りながら,セキュリティの意識や,そこからでてきた脆弱性を話しました。

背景

JavaScriptもなかったころ,CGIで作された掲示板がありました。その掲示板は投稿されたメッセージから, HTMLのタグを解析して必要なAタグやBタグ等はそのまま通し,BODYやHTMLタグなどをエスケープしていました。しかし,これはHTMLの構造が崩れてるのを避けるための対応で,セキュリティのためではありませんでしたと振り返ります。

しかし,ブラウザが高機能化した結果,JavaScriptが普及していき,onclick属性やjavascript:なスキーマをケアする必要がでてきたと言います。アプリケーション自体には何も変更しておらず,何も問題がなかったはずなのに,脆弱性のあるものになってしまったそうです。

このことから,永遠に安全なアプリケーションを作るのは困難であることを述べました。

具体例

一般的な話として,入力はきちんとチェックを行い,出力はエスケープを行うという基本を抑えるとともに,ブラウザを始めとする,外部環境の変化にも注意するべきだと言及しました。

また,具体的な避けるべきコーディングとして,いくつか例を挙げました。「/tmp」を直接使用する場合,固定のファイル名を使ってしまうと特に危険で,symlink attack を狙われる可能性や,Windowsに移植したときに困ってしまうことを紹介しました。そのため,Ruby on Railsを使っているならばRails.root + "tmp"のようのようなパスを使用するか,tmpdirやtempfileのような標準添付ライブラリを使用したほうが良いとアドバイスしました。

次に,正規表現による脆弱性として,\A \Z の組み合わせと ^ $ の組み合わせの動作についてを紹介しました。 Rubyの場合, /^マッチする文字列$/ のような正規表現の場合 "任意\nマッチする文字列\n文字列"にもマッチしてしまうため,文字列の先頭・末尾を使う場合は \A 等を使うべきと説明しました。

その他には,system関数を使用する場合は,実行するコマンドの引数の数だけ, system関数の引数も増やす使い方をすることで各パラメータを正しく展開されるそうです。このような場合のチェックポイントとして,ファイル名に空白が入っている場合やnull文字が入っていても問題がないか,という点について気をつけると良いことを紹介しました。

画像

画像

Elise Huardさん「Actors on stage」

ベルギーから来たElise Huardさんによる,Actorモデルに関する発表です。発表の取っ掛かりとして,「Actor」「俳優」にひっかけて並列性について話がありました。曰く,映画の撮影ではアクターも複数人が別々の場所でロケを並行して撮る,音楽なんかも並行で作成し,映画監督が最後にMapReduceのように一つにまとめて出力する,と。

かように人間の活動はそもそも並列的です。そしてプログラムも,元々はシングルプロセスによる逐次処理が多かったのですが,近年になってマルチプロセスが増えてきたため,並行性を考えなければならなくなったと語ります。しかし,並行処理をプログラミングすることは難しく,VMとOSそれぞれでプロセス/スレッド管理があったり,状態の共有と変更が時に非決定的になったりすると述べました。

そこでActorモデル

Eliseさんはその難しさに対して「Why Bother(だからなんだっていうの?)」という言葉を掲げます。「アプリケーション開発者レベルで並行性を考えるか?」「それとも,サーバなど下のレイヤーに任せるか?」という問いがあるのなら,プログラマとして並行性を考慮していきたいと言及しました。

そんなEliseさんが注目するのが,Actorモデルです。Actorモデルには明示的なグローバル状態がなく,アクターと呼ばれる要素同士が非同期にメッセージのやりとりをして処理をこなしていきます。基本的に非同期なので,実行順序を決めたいときはそれに参加するアクター達だけで指定し合うことで解決。また,可変な状態はそのアクター内にのみ限定され,アクターが状態遷移器になっているとのことです。こういった特徴たちが,並行性に向いたプログラミングモデルを提供してくれるというわけですね。

そして,EliseさんはRubyで実装されたActorモデルを紹介しました。@mentalguyのRubinius Actors。スレッドベースではなくイベントベースである@basculaのRevactor。そして@basculaはCelluloidというライブラリも作っており,Eliseさんはこれに一番期待しているとして,Celluloidを利用して"Sleeping barber problem"という並列処理における典型的な問題を解くコードも披露しました。Rubyでは通常mutexを使うところを,Celluloidに用意されたモジュールをincludeすることでクラスをアクター化して解いていくと述べました。

他の言語を経由した利用

Actorモデルは,むしろRuby以外の言語で普及していると言います。商用言語としては初めてActorを本格的に採用したErlang。Erlangは関数型言語でもあり,コードには馴染みのない人が多いかもしれません。そこで,RailsコアチームのJose Valimが作ったElixirというものがあり,これはErlangVM上にRubyっぽい文法を構築したもの。ElixirならRubyistは馴染みのあるコードでErlangのActorを体験することができるとのことです。

また,Scalaでは標準ライブラリにActorライブラリが含まれていますが,それではなくAkkaというフレームワークが人気だそうです。Akkaの人気の一端としてはソフトウェアトランザクショナルメモリが実装されていることや,実際にEliseさんの知人の方もAkkaを使って大規模システムを運用しているといった話を挙げていました。そして,JRubyならばAkkaを使うことができる,という「裏道」を紹介しました。

銀の弾丸はない

以上のように並行性に対する強みを発揮するActorモデルですが,Eliseさんは「銀の弾丸はない」という注意も促しました。確かに,Actorモデルは「簡単に理解でき」,きちんとした研究と検証をくぐり抜けた「本物」のモデルであり,これを使えば「高度に分散化」されたソフトウェアをつくることができます。 しかし,Actorモデルだけではシリアルな処理が必要な時には役立たずだし,依然デッドロックだって起こりうる。とはいえ,一度経験してみて損はない興味深いモデルの紹介だったのではないでしょうか。

最後に「並列プログラムを書くときは並列プリミティブを理解した方が良い」として,並列に相性の良いプリミティブをRubyの標準ライブラリにぜひ入れて欲しい,と提案して発表を終えました。

画像

画像

小川伸一郎さん「jpmobileのベストプラクティス」

RubyKaigi2010でも発表した,jpmobileメイン開発者である小川さんによるjpmobileの解説です。小川さんは,Tokyu.rbというコミュニティに参加しており,TokyuRubyKaigi04というイベントを10/29(土)に開催することを告知しました。

jpmobileには,メンテナンスのみ行なわれているRails2.3.X向けのバージョンと,現在のメインであるRails3.0.X向けのバージョン1.Xがあること。また,Rails3.1.X向けのバージョンとしてバージョン2.Xを出したいと述べました。今回は,jpmobile1.X系の機能を紹介しました。

jpmobileの機能の一つとして,まずキャリアごとに違う文字コードを自動で振り分けてくれる機能があります。jpcmobileではデータベースに文字列を格納する際にUTF-8に変換します。格納された文字列は,表示される際にそれぞれのキャリアが期待する文字コードに変換されます。また,携帯特有の絵文字に関しては,数値参照でViewに絵文字を埋め込むことによって,各キャリア向けの絵文字に変換して表示されると述べました。

携帯サイトでは,携帯電話がcookieに対応していないことがあります。そのような端末に対して,jpmobileでは自動でPOSTやGETのパラメーターに_session_idというパラメータを付与しSessionIDを付けてくれます。これは,Cookieが使えない端末かどうかを判定してくれ,使える端末ではCookieを使用してくれると述べました。

次にViewSelectorという機能を紹介しました。ViewSelectorでは,Viewファイル名のsuffixによって表示するViewを切り替えてくれる機能です。例えば,docomoの機種からリクエストがあった場合,以下のようなファイル名の順でファイルが存在するかを確認し,表示してくれるそうです。

  • index_mobile_docomo.html.erb
  • index_mobile.html.erb
  • index_mobile.html.erb

また,jpmobileでは携帯メールへの送信に対応していることを言及しました。Rails3のActionMailer::Baseを継承したJpmobile::Mail::Baseを使用することで,送信するメールアドレスにあわせた文字コードでメールを送信できるとのこと。

jpmobileではViewのテストのために,requiest.mobile?やassert_templateというメッソドを用意してると指摘します。これらのメソッドを使うことでFunctionalTestがしやすくなるということです。また,テストの手法によってjpmobileの返す文字コードが変わってくるそうです。

FunctionalTest
UTF-8
IntegrationTest
それぞれのキャリアの文字コード
MailerTest
UTF-8

最後に,現在わかっているjpmobileの既知の問題点等が述べられました。UTF-8をShift_JISに変換した後に,再度Shift_JISからUTF-8に変換するとき,きちんと元に戻らない文字があるとのこと。jpmobileでは波ダッシュや全角チルダなど,問題がありそうだとわかっている文字については自動的に変換されるようになっているそうです。 URIのパラメーターに日本語を使う場合や,メールを受信したときの文字コードなどは,まだjpmobileで自動的にできないため,それぞれ機種を判定して変換する必要があることを説明しました。

画像

画像

著者プロフィール

KaigiFreaks レポート班

KaigiFreaksとは,会場に来れなかった人にも,雰囲気や内容を楽しんでもらえるように動画収録や配信を行うことをミッションに,RubyKaigi2008で結成された特別編成チーム。

RubyKaigi2009からはgihyo.jpを中心にテキストと写真で現場の様子を伝えるレポート班が加わり,現在のKaigiFreaksは配信班とレポート班の2班編成。


三村益隆(みむらみつたか)

(株)永和システムマネジメントサービスプロバイディング事業部所属。Asakusa.rb & Rails勉強会@tokyo。このところRailsのお仕事をしています。言語好き。

blog:http://d.hatena.ne.jp/takkan_m
twitter:http://twitter.com/takkanm


すがわらまさのり

ハンドルネームはsugamasao。

Mitaka.rb や 若手IT勉強会に参加しています。仕事では自社プロダクトのデーモンの開発あたりでRubyを使ったりしています。伊坂幸太郎さんと荒木飛呂彦さんが好きです。

blog:http://d.hatena.ne.jp/seiunsky/
twitter:https://twitter.com/sugamasao


小松崎典之(こまつざきのりゆき)

ハンドルネームはO-Show。

RubyKaigi2010に参加したことで触発されRubyistを自称するようになる。ブログでRubyやGit関連記事の翻訳をあげています。もっとRubyとGitの情報の流通増えろ!と願ってやまない。

blog:http://keijinsonyaban.blogspot.com/
twitter:http://twitter.com/oshow


菅井祐太朗(すがいゆうたろう)

仕事でも Ruby を使えたらいいなぁと考えている新社会人LOCAL 所属。この春からAsakusa.rbにjoin。

twitter:http://twitter.com/hokkai7go


赤松祐希(あかまつゆうき)

2010年よりRuby on RailsでのWebアプリケーションの開発を中心にフリーランスのRubyプログラマとして活動中。最近はHaskellに興味を持ち出し、勉強しはじめている。

blog:http://ukstudio.jp/
twitter:http://twitter.com/ukstudio

コメント

  • 画像が表示されないような?

    貴重なレポートありがとうございます。
    私の環境では画像が表示されないようなのですが、なんとかなりませんかね?
    1日目と3日目は表示されます。

    Commented : #1  satoshi (2011/07/18, 21:07)

コメントの記入