Sapporo RubyKaigi 2012 スペシャルレポート

札幌Ruby会議2012,2日目レポート[更新終了]

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

宮川達彦さん「Ruby; Exported」

Perlプログラマとして知られ,YAPC::Asiaの開催にも関わっている宮川達彦さんの発表です(スライド等はこちら)⁠宮川さんは現在は現在サンフランシスコに在住で,アメリカのクックパッドに勤務しており,仕事ではRubyを使っているとのことです。また,Ruby会議への参加は今回がはじめてとのことでした。

このセッションではRubyがPerlから取り入れた機能や,逆にPerlがRubyから受けた影響,それぞれの文化の違いについて紹介しました。

PerlからRubyが取り入れたもの

はじめに宮川さんはRubyがPerlから取り入れた要素についての話をしました。宮川さんがRubyはPerlの良い所を残しつつ,より綺麗になっている言語という印象を持っているとのことです。これは宮川さんだけではないようで,以前宮川さんがPerlコミュニティの仲間にRubyの会社に転職したということを伝えた時にも,あまり驚かれなかったということがあったと言います。

RubyがPerlから取り入れた要素の例として,正規表現やARGF,%記法,特殊変数などを挙げていました。このなかには取り入れてよかったと言われているものが多数あった一方,特殊変数など取り入れなくてもよかったと言われているものもあると述べていました。

RubyがPerlに与えた影響

続いてRubyが他の言語に与えた影響の話をしました。影響が大きかったものとして真っ先にRailsとSinatraを挙げていました。例としてPerlのJiftyというサーバーはRailsのDRY,CoC(設定より規約)といった特徴に影響を受け,同じくPerlのDancerはSinatraに影響を受けていると紹介しました。

また,Rubyでよく使用されるDSLとメタプログラミングについても触れ,それぞれRubyとは切っても切れない関係であること,またそれと同じようなことをPerlで実現するライブラリもCPAN上に見つかるということを紹介していました。

Plack/PSGI,cpanm,Carton,Starman

宮川さん自身もRubyにはとても影響を受けているとのことで,宮川さんがRubyのプロダクトのコンセプトをPerlに移植したプログラムもあります。ここではそれらのうちPlack/PSGI,cpanm,Carton,Starmanを紹介しました。

Plack/PSGIは,RubyのRackとPythonのWSGIにインスパイアされて作成したものだと言います。コードはWSGIとよく似ており,ドキュメントはRackを参考にしたとのことです。

Plack/PSGI作成以前はPerlで使用されるサーバーとフレームワークの対応関係は複雑になっていて関係を把握するのが大変だったそうですが,Plack/PSGIが広まって以後はサーバーの部分とアプリケーションを綺麗に分離することができるようになったそうです。現在はCPAN上のフレームワークの8?9割がこれに対応しているとのことで,どれだけPerlのコミュニティで広く受け入れられたかが伺えます。

またWSGIとRackに比べてPlackは後発なのですが,後発の場合は他の実装を参考にすることができるという利点があるとし,⁠はじめるのに遅すぎることはない」と述べていました。

その他,RubyGemsにインスパイアされて作成したcpanm,Bundlerにインスパイアされて作成したCartonUnicornにインスパイアされて作成したStarmanといったプロダクトもPerlのコミュニティに好意的に受け入れられたと言及しました。これらのプロダクトがコミュニティに受け入れられるかはとても心配だったそうなのですが,好意的に受け入れられた上,twitter上で感謝の言葉を見かけるなど,すごく嬉しい反応があったそうです。

また,Starmanについては名前付けの裏話も披露しました。これは海外ではDavid Bowieの"Starman"という曲から名付けられたと思われているそうですが,実は宮川さんがファンであるというユニコーンの"スターな男"から名付けたとのことでした。

RubyとPerlの文化の違い

最後にプロダクトの名前付けとコミュニティの文化という側面からRubyとPerlの違いに触れました。

CPANに登録されているプロダクトは,例えば「HTTP::Server::Simple」のように長い名前が付けられることが多いそうです。これは一見しただけで機能が分かりやすいという反面,把握しづらくタイピングするのも大変というデメリットがあるとのことです。

Perlのあまり個性がない名前に対し,Rubyは「Psych」⁠Unicorn」など"キラキラした名前"が多いと言っていました。Rubyの名前づけに全面的に賛成ではないものの,Perlでもサーバーやよく使用されるような便利なコマンドラインツールでは個性的な名前をつけるのも良いかもしれないと思っているとのことでした。

コミュニティの文化という面ではPerlは柔軟なコミュニティで,他の言語の良い所をオープンに受け入れて行っていると言います。宮川さんがアメリカで開催されたYAPC::NAというPerlのイベントで"Ruby is not the enemy. They are neighbors."というメッセージを伝えた時にはよく受け入れられていたそうです。

PerlとRubyのコミュニティではお互いにリスペクトしあって,良い所を取り入れていけば良いと考えているそうです。宮川さんは9月27日から29日の3日間に開催されるYAPC::Asia Tokyoでは今度はRubyの話をしてくるとのことです。

セッションの中で紹介していたPSGI/Plackについては宮川さん自身がこちらhttp://gihyo.jp/dev/serial/01/perl-hackers-hub/000101の記事で,Cartonについては昨年のYAPC::Asia2011での宮川さんの発表スライド:で詳しく紹介されているので興味のある方は読んでみてはいかがでしょうか。

画像

画像

アンドリューグリムさん「Japanese - a programmer's language」

オーストラリアから札幌Ruby会議2012へ参戦したAndrew Grimmさんの発表です(スライド等はこちら)⁠Andrewさんは,冒頭で「日本語について英語で話すことにします」と本セッションを紹介しました。

Andrewさんから見た日本語

まずAndrewさんは,日本語は文法が簡単であるといいます。その理由として,次の3つを挙げました。

  • 英語のように名詞に性別がない
  • 名詞に複数形もない
  • 性別も,複数形も,一人称,二人称,三人称も残りの文と関係がない(例:英語の場合I amとYou areでbe動詞が変わる)

これは英語には無い日本語の簡単さであるとのことです。

また日本語は,⁠自然言語のProlog」だとし,文章を質問するのに言葉の順番を変えなくても良いことが理由だそうです。例えば,日本語での質問文は

  • これはペンです。
  • これはペンですか?

となるものが,英語では以下のようになります。

  • This is a pen.
  • Is this a pen?

そして,日本語には書くための文字が4種類「漢字」⁠ひらがな」⁠カタカナ」⁠ローマ字」が存在し,昔日本には文字がなかったこと,中国から漢字を取り入れ日本に文字が生まれたと話しました。

ひらがなはモンキーパッチ

Rubyやプログラミング言語の話は出てこないのかな?と思っていたところで,⁠モンキーパッチ」の話になりました。モンキーパッチとは,オリジナルのソースコードを改変することなく,動的に実行時拡張,変更する方法です。

Andrewさんは日本語の「ひらがな」はモンキーパッチだと思うと言及しました。例えば,⁠行きます」をひらがなでモンキーパッチをすることで,⁠行きませんでした」という否定文にすることができるとしました。

和製英語と敬語

次にAndrewさんが面白いと思った日本語が2つあります。それは和製英語と敬語です。和製英語では,Salaryman, Office ladyを例として挙げました。敬語では,人名の後ろに「~さん」とつけると思いますが,この「~さん」という言葉には性別が存在しないのが面白いとこのことでした。そのほか敬語には,⁠お」をつける文化もあり,⁠お寺」など畏敬の念を抱くものはもちろん,⁠お手洗い」など汚いものにもつけることで,柔らかい言葉にする意味があると説明しました。

魔法の言葉

Andrewさんは,日本に来るときに使える「魔法の言葉」を説明しました。それらは次の文であり,これらがあればどうにかなるとのことでした。

  • サンドイッチください
  • これをください
  • はい!
  • なに?
  • すみません。

その他の「魔法の言葉」についても,5分でわかる日本語と題して,次の言葉を紹介しました。

  • すみません
  • ください
  • どうぞ
  • ありがとう
  • おはようございます
  • こんにちは
  • こんばんは
  • じゃ,また
  • ばいばい

まとめとしてAndrewさんは,日本語では「丁寧に話すことが大切」だと話します。⁠Rubyと雪が好きな人は連絡ください」と,来年の2月20~22日にオーストラリアで開催されるRubyカンファレンス,[[Ruby Conf Australia 2013 |http://www.rubyconf.org.au/]] を紹介してセッションを締めくくりました。

画像

画像

松田明(+豪華ゲスト陣)さん「Rails3レシピブック外伝」

松田明さんによる「Rails3レシピブック外伝」です(スライド等はこちら)⁠松田さんは地域コミュニティ「Asakura.rb」の発起人であり,日本におけるRailsの第一人者でもあります。また本セッションでは,ゲストとして諸橋さん,高橋さん,Aaronさんにもお話しいただき豪華なセッションとなりました。

今回はRails3レシピブックで載せきれなかった,または新しく追加された様々なレシピの発表しました。

まずはレシピ000として「Railsレシピブックを購入する」というレシピを紹介しました。こちらは電子書籍版もあるとのことです。

レシピ001:"Entry"というモデル名を避ける(松田さん)

「これは良くない例なのでまねしないでください」という一言とともに紹介されたレシピは,⁠Entry」という名前のモデルを使わないことでした。これは,AssociationProxyの影響で意図しない挙動を起こすことが原因です。これは書籍の執筆中に気づいたものの,サンプルコードはすべて動作しますし,影響範囲が大きすぎて修正を断念してしまったとのことで,⁠Rails4レシピブック」を執筆することになったら対応するとのことです。

他にも避けたほうが良い"危ない名前"をいくつか紹介しました。typeという名前のカラムがポリモルフィックスと干渉したり,Taskという名前のモデルがRakeのTaskと干渉するなど,松田さんが身を以て体験した事例を取り上げました。最近では,求人サイトで応募を表す「Application」から「ApplicationsController」というコントローラを作ると干渉してしまうので「Applikation」という名前にしたというエピソードも挙げていました。またgemの名前とModelの名前が同じだと干渉してしまうこともあるようで,gemにキラキラしたネームが多いのはそういった背景もあるそうです。

レシピ002:AssociationProxyを使う(松田さん)

AR::Associationとは,モデル間の「関連」を抽象化したものです。Associationは結果をキャッシュしており,関連に対してproxy_associationメソッドを呼び出すと,実態を取り出すことができ,実はArrayではないということが分かったりします。また,関連に対してメソッドを定義することも可能です。

レシピ003:ポリモルフィックスアソシエーションのN+1問題を回避する(諸橋さん)

前述で取り上げたAssociationProxyですが,⁠N+1」問題が発生することがしばしば起こりえます。ポリモルフィックアソシエーションは,N個の通常の関連にも分解できるので,通常の関連にしてからeager loadで予め取得したものを使うことで発行クエリ回数を抑えることができるとのことです。また,それを簡便に実現するライブラリを作成したとのことで,⁠東京に戻ったらgem化します」とのことでした。

レシピ004:AR::Relation#mergeを使い倒す(松田さん)

AR::Relation#mergeを用いて,RelationっぽいものをいろいろMergeするレシピの紹介です。scopeとmergeするとビジネスロジックをモデルに取り込めて簡潔に書けるというレシピを書籍で取り上げましたが,このレシピではAssociationともmergeすることができること,whereにRelationを食わせてサブクエリとして利用できることなどを紹介しました。

レシピ005:notやlikeのクエリをRubyishに記述する(松田さん)

ActiveRecordではRubyのHashを使ってwhereを綺麗に記述できますが,NOTやLIKEを使うとSQLライクな書き方をせざるを得ない状態です。Jeremy Kemperが4ヶ月程前に新しい記述方式をgithub上で提案しており,notやlikeをチェーンで記述することができるようになっていました。松田さんが実装担当として名乗り出たのですがpull requestがまだ行われていない状態のようです。gem化は完了していてeverywhereというgemを使うことで一足先に試すことが可能とのことでした。

レシピ:"Special" Twisting SQLite3(Aaron先生)

松田さんが紹介したような便利なレシピではなく,面白いレシピと前置きしてからレシピを紹介しました。rbファイルの最後にSQLiteのデータベース情報を組み込むというネタで,IOをフックして仮想ファイルシステムを用いて,実行スクリプトに記述してある「__END__」の後にデータを置くようにするデモが披露されました。

レシピ006:Rails consoleの隠しコマンドたち(松田さん)

Rails consoleには便利なコマンドがありますが,レシピブックに書き忘れたものがいくつかあったとのことで,appメソッドからパスを取得できること,helperと書くとActionViewのヘルパーを呼べること,reload!メソッドを紹介していました。

レシピ007:不要なRackミドルウェアを削ってレスポンスを速くする(松田さん)

Rack::middlewareにはいくつか搭載されていますが,いくつかのmiddlewareを無効にすることで高速化するレシピです。Rake::Cacheはリクエストがある毎にmemcachedを参照しますが,大規模サイトのような大量のWebサーバと,その裏でmemcachedが動いているような環境ではそこがボトルネックになってしまうとのことです。これを無効化するだけで1.5倍早くなったという事例がありました。

レシピ008:隠しRakeタスクを全部知りたい(松田さん)

実行可能なRakeタスクを表示するには基本的には「rake -T」というコマンドで確認可能なのですが,膨大になってしまっているので表示しないように変更されています。すべてのコマンドを確認するには「rake t」で確認できるとのことでした。

レシピ009:migrationをGUIで実行する(松田さん)

migrationを毎度コマンド叩いて実行するのは面倒なので,GUIで使うmigrationのgemを作ったそうです。erdというgemを追加してRackサーバを起動し,http://localhost:3000/erdとアクセスするだけで使えるとのことです。まだフロントエンドが充実していないので,フロントエンドのブラッシュアップをこれから行いたいとのことでした。

レシピ010:helperをオブジェクト指向っぽく書く(松田さん)

Railsのhelperは関数ベースのため,メソッド名や引数について,userの関数なのに引数にuserが必要だったりと非常にダサいと言います。そこでactive_decoratorというプラグインを開発されたとのことです。このプラグインを使うことでこの問題が解決されます。このプラグインを導入すると,ModelオブジェクトがControllerからViewに渡されるときに,自動的にヘルパーメソッドに相当するメソッドが追加されます。

レシピ011:ArelのオブジェクトをRubyのコードに変換する(松田さん)

ネタとのことで, タイトル通りARelオブジェクトからRubyコードに変換する方法を示していました。

レシピ333:Railsレシピブックを更新する(高橋さん)

初代RailsレシピブックからRails3版を作成された時に,初代Railsレシピブックの版下のPDFからコピペしながら作られたそうですが,Mac OS Xだとutf-8に関連した問題で濁点や半濁点が別の文字となってしまう問題がありました。UTF-8 MACで読み込んだテキストデータをうまく加工してUTF-8に書き換えるrubyスクリプトを紹介しました。

レシピ012:Engineを使う(松田さん)

Rails Engineを使ったり,作ったり,テストしたりするレシピを紹介しました。Rails EngineとはRailsのアプリケーションのようなもので,RailsアプリケーションもEngineの一種とのことです。Rails::Engineを使うと,他のRailsアプリケーションとして作成したものを呼び出したりすることができます。実例としてはDevisekaminariなどがEngineで,実はPlug-inがEngineだったりすることもあります。

最後に非常にマニアックな話題として,Engineの上にEngineを載せたくなった時に通常はgemを分けるのですが,gemspecに「require_path」を設定することで実現可能とのことでした。興味がある方はこちらのgemがそのような作りになっているので,ご覧くださいと述べていました。

画像

画像

著者プロフィール

KaigiFreaks レポート班

KaigiFreaksとは,会場に来れなかった人にも雰囲気や内容を楽しんでもらえることをミッションとする特別編成チーム。配信班とレポート班の2班で構成される。レポート班の作業はエクストリームスポーツとして知られていたが,今回はその評判を覆すべく史上最大規模の編成で臨む。


前鼻毅(まえはなつよし)

Ruby札幌,アジャイル札幌,CLR/Hなど札幌のコミュニティで活動中。RICOH IT SOLUTIONSにてRubyやObjective-Cのコードを書いている。

twitter:http://twitter.com/sandinist


にく

北海道出身で沖縄や東京に住んだ後,今は札幌在住のプログラマ。コンサドーレ札幌が好き。Ruby,Emacsが心のメインツール。最近はHaskellを試している。

twitter:https://twitter.com/niku_name
blog:http://niku.name/


小野寺大地(おのでらだいち)

北海道大学大学院,一般社団法人LOCAL,Ruby札幌あたりで活動中。普段は複雑ネットワークの研究をしていて,肉チャーと二郎系ラーメンをこよなく愛している。

twitter:http://twitter.com/onodes
facebook:https://facebook.com/onodes


H.Hiro

北海道大学大学院在籍。Ruby札幌,札幌C++勉強会などで活動中。コレクションの要素数を数えるのに便利なライブラリ「multiset」などを作っている。Rubyで好きなものは「ブロック付きメソッド呼び出し」「Domain-Specific Languageの文化」。

twitter:http://twitter.com/h_hiro_


小玉直樹(こだまなおき)

生まれも育ちも札幌のプログラマ。RubyにハマってからはWebアプリを作るのが楽しくて日課になっている。1年ほど前からコミュニティ活動にも参加を開始し,素敵な技術者と出会える日々に感謝。

twitter:https://twitter.com/volpe_hd28v
blog:http://d.hatena.ne.jp/koda_hd28v/


うさみけんた

いまをときめく自宅警備員…だったのですが,Ruby会議の半月前に退職して東京に移住しました。Python札幌などでも活動。セキュリティ&プログラミングキャンプ2011言語クラスチューター。函数型言語の浅瀬で溺れる。

twitter:http://twitter.com/zonu_exe
blog:http://d.hatena.ne.jp/zonu_exe


すずきゆうすけ

札幌市に隣接する風の街・江別市で働く自営業。Ruby札幌にときどき顔を出す。Garage Labsにもときどき出没。プリキュアと朝ドラをこよなく愛し,日々変動する体重に怯えるごくごく普通のアラフォー。

twitter:https://twitter.com/yuskesuzki


みぃお

一般社団法人LOCALで主に活動中。お家でRubyをちょくちょく書いている。男の娘。お仕事はPHPでソーシャルゲームを作っている。

twitter:https://twitter.com/ayako119
homepage:http://miio.info/


永沼智比呂(ながぬまちひろ)

首の長いプログラマー。達人プログラマー読書会を主催したりしていた。Ruby札幌やSapporo.js,アジャイル札幌に参加。Ruby界隈の文化って面白い!

twitter:https://twitter.com/onjiro_mohyahya
blog:http://onjiro.blogspot.jp/


わたなべしゅうじ

札幌在住のプログラマ。札幌Javaコミュニティ代表。Java,Ruby,Python,JavaScriptなどを扱い,ユニットテストが好物。

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


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

北海道から上京して一年。ようやく仕事でRubyを使えそう。Ruby札幌,Asakusa.rb,Yokohama.rbなどに顔を出している。

twitter:https://twitter.com/hokkai7go
blog:http://d.hatena.ne.jp/lncr_ct9a