makotoiの日記:from London RSSフィード

2012-01-08 2011年の結果と2012年の目標 このエントリーを含むブックマーク このエントリーのブックマークコメント

昨年の年初に「今年一年の目標をたてる」とブログに書いたままほとんど更新していませんでした

「結果と目標」シリーズは自分の記録用に書いているものなので、だらだらとした文になってしまいますが、興味あるかたはご覧ください。

まずは昨年の結果の総まとめ

2011年の結果

Rails Hub」での連載

あまり思ったほどの頻度で書くことはできませんでしたが、それでも8本ほど書きました。

せっかくなので自分にしかかけないことを書こうと思いました。自分がRailsをどのように学んできたか、そしてRails Hub担当の西村さんのアプリのコードレビューことをすることで初心者の人(西村さんごめんなさい)がRailsを学ぶ際のコツみたいなものをお伝えできればと思いました。実際にどれくらいの人が読んで下さったかはわかりませんが、RubyKaigiの際に「連載読んでます」と声をかけて下さった方がいて、大変うれしかったです。できればあと3本ぐらい書ければ良いのですが。

dRuby本の英訳」

去年一番時間を費やしたのがこれです。

英語ネイティブでない私の英訳がどれくらい英語圏の方々に届くかわかりませんが、新章を追加した際にその草案の構想に自分も少し加わるなど、付加価値を付け加えたことができたのではとちょっと自負しています。

もともと飽きっぽく新しいことを初めてもなかなか3ヶ月以上もたない性格なのでちゃんとできるか不安でした。2010年の11月頃にお話をいただいてから、結局翻訳に1年近くかかりましたがなんとか翻訳完成。

原作者の咳さんには翻訳中にわからないことを何度も何度もメールで問い合わせたのに、嫌な顔一つせず(実際の表情は拝見していませんが)丁寧な返答をたくさんいただきました。あとオーム社の森田さん、RubyKaigiの角谷さんにはPragmatic社との橋渡しをしていただいただけでなく、翻訳期間中の長きにわたって継続的なサポートをいただきました。そしてレオさんをはじめとする多くの方々からレビューもいただきました(ものすごい数の文法ミスを指摘していただきました。もっと英語がんばります)。こんなブログ読んでないと思いますが、この場を借りてお礼申し上げます。

「もう翻訳なんて当分いいや」という気もするのですが、もう一冊ぜひ訳したい本があるので現在交渉中。

Crisis Camp, sinsai.infoのお手伝い

いわずとしれた3月の大震災。当初はロンドンからただただネットの情報経由で傍観するしかなかったのですが、アメリカ人の友人が「Crisis Campで日本語しゃべれる人を探している」とツイートしたので「じゃあなんか出来ることがあれば」と手を挙げてみました。「国連が日本に介入するのに必要な情報収集wikiの作成」がもともとの任務だったのですが、結局国連は救援活動に参加しないことになったため途中で手持ち無沙汰になり、「Ushahidiというクライシスマッピングサイトのマニュアルの和訳が必要」といわれて翻訳などしているうちに、日本でUshahidiを立ち上げたsinsai.infoにも加入することになりました。sinsai.infoのサイトやブログの英訳、またはsinsai.infoの活動状況を英語でプレゼンするなどして海外情報発信につとめたつもりです。

震災活動を「結果」と言うべきかどうか微妙ですが、三ヶ月近く時間を費やしたので載せておきました。「翻訳班のチームリーダー」という大役を仰せつかったにもかかわらず、あまりインパクトを出すことが出来なかったのが心残りです。

また「実際に被災者の役に翻訳でどれだけ役にたつことができたか?」といわれると答えに窮してしまいますが、少しでも海外の方まで届いているとよいなと思います。

Mozilla Festival でStorify Human API役をつとめる+プログラミング101の授業を行う

知り合いがカリフォルニアで立ち上げたhttp://storify.com/をお手伝いする機会があり、ログ解析などの分野で少しお手伝いしていたのですが、「ロンドンカンファレンスに出典したいのだけれど、わざわざアメリカから参加できないから代わりにでて」と言われてOKしたところ「Human API」という大層な名前をいただき、APIエキスパートとしてStorifyの啓蒙活動に参加しました。

Mozilla Media FestivalというのはMozillaヨーロッパ各地を持ち回りで開催するイベントなのですが、今回はジャーナリズムをテーマとしたイベントでした。そこでジャーナリスト向けソーシャルメディアまとめサイトであるStorifyも参加の声がかかったのでしょう。

正直いってStorifyのAPIはひどくシンプルで、開発者のかただとドキュメント見なくてもわかるレベル。「それじゃあエキスパートとか意味ないよね」と考えていたところを「逆に開発者でないジャーナリスト向けに初級プログラミングコースを開催し、その教材としてStorify APIを使おう」と思い立ちました。

開催期間中に思いつき、急ぎで用意したので荒いのですが、「Storifyが提供するAPIから自分の欲しいデータを抽出、加工してビジュアライズする」ということをテーマに90分近く話しました。

でも初心者にプログラミングを教えるって難しいですね。「分からなさ」のレベルもまちまちなので、全ての人の興味を持続させるのは大変です。逆に上級者がいるのも利用して、クラス内でお互いに教え合えることのできるインタラクティブなコースになったのではないかと自分では思っています。

2012年の目標

昨年は2010年と比べて発表の回数は減りましたが、執筆、翻訳系を多くこなしました。発表が短い時間に集中してするスプリントだとすると、「書く」という作業は長距離走のように忍耐力を要求される作業だなと思いました。非常に持久力がついたのは良かったのですが、逆にプライベートでコードを書く時間があまりとれなかったのが心残りです。

実はsinsai.infoやstorifyに関わった経験からopen gov, data journalismといった分野でのデータ解析やビジュアライゼーションに興味をもつようになり、昨年の後半はいわゆる「ビッグデータ,NoSQL」と言われる技術(neo4j, mongodb)などもいじっていたので、もう少し詳しくなりたいなとも思いますが、今の職場はそういったのとはあまり関係ありません(厳密にいうと今までのプロジェクトは関係あったのですが、次に配属予定のプロジェクトはそういうのとあまり関係なさそう)。

さらに、もしもう一冊の本の翻訳話が決まれば、今年も自分の時間はほとんど翻訳に費やしてしまいそうです。

「もっと自分の興味ある分野に時間配分できるようになりたい」という気もムクムクわき上がってきます。 昨年なくなったスティーブ・ジョブズの語録にある「あなたの時間は限られている。だから他人の人生を生きたりして無駄に過ごしてはいけない」という言葉にウンウンうなずきつつも、海外で自分のしたいことだけやって食っていけるかまだちょっと不安です。今年の目標は暫定的ですが「独立、転職してもやっていける、と自信がつくような結果を残したい」です。 それにたいして具体的になにをすれば良いかは現在思案中。「こういうのいいのでは」といったアイデアなども募集中です。

あとテクノロジーとは関係ありませんが、今年は減量に励みたいです。結婚して早くも数年。これまでは2年で1キロのペースで増量していたのですがここ1年ほど体重の増え方があがったらしく、年末に日本に帰ったときにはみんなから「一回り体が大きくなった(特にお腹まわり)」と言われてしまいました。たしかにエンジニアとして生活すると運動量が絶対的に不足してきます。特に海外にいる身では医療制度とか不安なので、健康には人一倍気をつけなければ。

年末にタイに旅行したときに「ホットヨガ」と呼ばれるヨガを試してみてけっこう自分にあっていたので教室にでも通おうと思っています。これは40度ぐらいの温度の部屋でヨガをするもので汗をすごくかいて気持ちいいです。

そしてデータをウェブで管理できるハイテク万歩計も買ってみました。目指せ一日一万歩!!


予告通りだらだら書いていきましたが、今年もよろしくお願いします。

2011-08-10 London の暴動(私の体験) このエントリーを含むブックマーク このエントリーのブックマークコメント

Intro

ロンドン暴動に関してTwitterFacebookで皆さんから心配していただいているのですこし私の体験についてまとめてみたいと思います。ちなみに最初に言っておきますが、私は別に危ない目に会っていないのでご安心を。


ちなみに今回のブログで取り上げた地域の場所はグーグルマイプレースに全て登録しておきました。

8月8日(月曜)

前日のツイッターで「ロンドン北部のTotenhamの辺りで暴動が起きている」という話が流れてきました。でもロンドン郊外の話だったので全くの他人事で特にテレビもつけていない状態でした。

いつもより少し遅めに起床したため、家から会社まで直通の電車に乗り遅れてしまいました。そこでBrixtonという駅までOverground (地下鉄のUndergroundと対比した鉄道をそういいます)で行き、そこからUnderground(地下鉄)に乗り換えるルートをとる事ことにしました。

電車の中で「メトロ」という無料新聞にTotenhamの事件の情報収集していました。やはりその時も記事のほとんどはTotenhamの辺りのことばかりだったと思います。

鉄道の駅を降りて地下鉄の駅に向かおうと思ったら、駅の手前の道路が封鎖されていました。バリケードの手前までいくと、バス停のガラスが割られているのが見えます。バス停などの公共施設の破壊(Vandalism)は日常茶飯事な国なので「あ〜、Totenhamの件で警察も過敏になってるな〜」との印象でした。

Bus stop window smashed. Brixton tube and roads closed. Riot impact?less than a minute ago via Mobile Web Favorite Retweet Reply

さらなる迂回路を経て30分ほど遅れて出社。そこで会社の同僚とTotenhamの件について色々情報収集。ようやくその時になって実は日曜日の夜からTotenham以外にも飛び火していて、その一部がBrixtonだったということを知りました。

  • 夕方

その後は普通に仕事を続け、6時からLondon Ruby User Groupというイベントに出席。イベント会場まで向かう道すがら、Hackney (ロンドン北部。来年のオリンピック会場の近く)にすんでいる同僚は「なんか家の近辺に暴徒が集まってきているらしいから今日は早めに帰る」とのこと。イベント中も気になってインターネットで調べると、人ごとではなく私の家の隣の区であるLewishamでも暴動が起きつつあるとのこと。心配になってイベントの途中でかえる事にしました。

Just realised that still some riot near my area , so going back homeless than a minute ago via Mobile Web Favorite Retweet Reply

帰りはEast London Lineという線のCroydon行きの電車です。でもなぜか行き先がCroydonの一つ手前(ちなみに私の最寄り駅はCroydonの二つ手前)になっていました。 電車に載っている間に「Croydon駅の近辺でdisturbance(騒ぎ)があるとの報告を受けたのでCryodon駅にはとまりません」とのアナウンスがありました。

「暗くならないうちに早くなんとか家に着かなきゃ」と少しドキドキしながら家路に。

無事に家に着いた後はずっとテレビにかじりついていました。

ロンドンの警察署長が全ての親は子供にコンタクトするように警告。安否の確認ではなくて暴徒と化してないかの確認というのがすごいless than a minute ago via web Favorite Retweet Reply

BBCとかのニュース番組を見つつ、ツイッターで自分の町の名前を検索したり、知人の動向を観察したりしていました。

「先ほどイベントにいっしょにいった同僚はちゃんと帰れたかな?」と思ってかれのツイートをちょくちょく観察したら、10時ぐらいには家に着いていたようです。でも彼の窓の外の風景はまさに修羅場だったらしく「foodie(フードを被った輩)が家の外をうろちょろしている」「あ、ようやく武装警官が到着」「トルコ人の店主達が集まって暴徒から店を守ってる」と実況中継していたのをずっと見守っていました。


私の家のまわりはものすごく静かで、たまにかすかにサイレンの音が聞こえる程度でした。

ツイッターでは私の近所(といっても1キロ以上はなれていますが)のスーパーに火の手があがったかあがってないかを噂するツイートがずっと流れていましたが結局は何もなかったようです。

8月9日(火曜)

昨晩はかなりの駅が閉鎖されていたのですが、今朝は全駅開いているようなのでいつも通り出社しました。自分の最寄りの駅に行く途中に公園の中とか通りましたが特に荒らされた形跡もなかったようです。

職場ではまた同僚達と情報交換。昨晩実況中継していた同僚は現場が危ないため出社してきませんでしたが、やはり暴動の部隊となったClapham Junctionにすんでいる友人は「駅の周りはほんとメチャクチャだった、あと昨日の夜彼女が家に帰ろうとしてもテムズ川より南にバスが怖がって行かず途中でおろされた」と言っていました。

(Clapham Junctionでの略奪の様子。撮影者が「こんなことして自慢できるの?なんでこんなことするの?」と聞くと略奪者から「払った税金取り返してるの」との返事。でも仕事してないから払ったのって消費税分ぐらいじゃない?)


ロンドン鉄道はゾーン制といって1から5まで分かれているのですが、中心部の1ではあまり騒動は起きていなかったので、私の職場(Islington)の辺りは特に何もなかったようです。ただパトカーのサイレンの音は断続的に続いていたため、なんか嫌な気分でした。

昨日は2000人ぐらいの警官が出動していたらしいですが、今日は10倍の1万7000人ちかく動員されているそうです。同僚はみんな口々に「駅のまわりは警官だらけ」と言っていました。

昼間になると今度は荒らされた町をきれいにしよう、という呼びかけが#riotscleanupのハッシュタグとともに飛び交うようになってきました。

(昨夜の略奪のビデオの舞台となったClaphamでこんどはモップを手に立ち上がる市民)

なんかツイッターを見ていると「近所の公園にギャング達が集結中」みたいなデマが出回っているようですが、まだ何がおこるか分からない状態なので、5時には会社を出て帰宅する事にしました。

近所の駅に降り立ったときは、明るいうちからビールを飲みながらたむろしている若者組5人ぐらいがいましたが付近は閑散としてて別に暴動が起きそうな雰囲気ではなかったです。あと帰り道の店はだいたいシャッター落としていました。

近年の暴動

なんか日本や米国ではあんまり話題になっていないと聞きました。ロンドンの北部(Einfield)にあるソニーの倉庫が焼き討ちにあったニュースが流れている程度らしいですね。実はイギリス暴動って近年にもいくつかありました。


確か2008~9年に金融危機で国が銀行を国有化で救済した時にはcityでデモがあり、それと鎮圧隊の間で小競り合いがありました。あと昨年の末は大学学費値上げを受けて、デモがありました。あの時は結構あれたのを覚えています。

でも今回は何が違うかというと完璧な愉快犯なんですよね。事の始めは黒人青年を警官が射殺したことに対するプロテストから始まったのですが、途中からは完全な便乗です。

上は略奪者(18歳の女子二人)へのインタビューですが、その内容を要約するとこんな感じです。

暴動でみんなメチャクチャしてる。いいことだけどね。今ロゼワイン飲んでる途中。夜遅くまでよっぱらっちゃうよ。なんかただでいろいろゲットできたし。これって政府のせいだよね。保守党悪い。でもあたし達は警察達に自分たちがどこまでできるか見せつけてるのよ。今夜も続くといいよね。なんで地元で暴れているかって?金持ちが気に食わないからだよ。彼らはなんでも欲しいもの手に入るじゃん」

はっきり言って支離滅裂ですよね。略奪しているのは全然金持ちでもない地元の商店街とか、ただ自分たちの欲しいものがたくさんあるスポーツ店とかですし。

BBCかなにかを見ていた時に略奪者(中学生ぐらい)が「じゃあ次は時計をゲットしようか」という会話が映っていたのをみてぞっとしました。

なんかイラン政府が「警察は暴動者と対立するのではなく会話を」とアドバイスしているようですが、いわゆる中東とかで起きてる民主化の波とはまったく異質なものといってよいと思います。

I've seen protests & civil unrest before. but this casualness of destruction, the absence of motivating anger, are new to me.less than a minute ago via TweetDeck Favorite Retweet Reply

(知り合いのツイート:「暴動プロテストは以前も見て来た。でもこの破壊へのカジュアルさと怒りといった動機のなさは初めての体験だ」)

2005年のテロの時はロンドン中心部からでれば関係ないと思ったけれど、今回はどこからわき上がるか分からないし、いつまで続くかも分からないという不安感がある。less than a minute ago via web Favorite Retweet Reply


あと時期も悪かったです。英Guardian誌によるとBirmingham でつかまった138人のうち98人が90年生まれ、ほぼ10代とみていいでしょう。しかも映像とかを見る限り中高生ぐらいの年代です。彼らは今夏休みなので平日もおかまいなしで暴れる事が出来るんですよね。


逆にこの緊急時を取り仕切るはずのロンドン市長も首相も休暇で海外にでたままで、暴動発生3日たってようやく戻ってきました。市長にいたっては最初は「警察に全幅の信頼をおいているから私が直接指揮をとる必要はない」とかまで言っていましたし。

More anger was directed at London Mayor Boris Johnson, who initially refused to return to the capital from his own holiday. He eventually announced he would be back in his office on Tuesday morning.

「怒りはさらに当初は休暇から戻るのを拒否していたボリスジョンソン市長にも向けられた。市長は最終的に火曜日に帰ってくる事を表明」

( http://www.itn.co.uk/home/26145/August+8+The+night+London+burned より)





ちなみにいまアマゾンのスポーツ部門の売り上げナンバーワンはベースボールバットと警官がもってるトンファらしいです。+5000% up って勘弁してほしいです。

f:id:makotoi:20110809225149p:image:large]


情報収集

家にいる時はテレビのニュースですが、特に特番くんでいるわけでもないので、映像以外はあんまり役立つ情報はないです。

ツイッターも家の近辺の情報収集に使っていますが、基本的に裏付けのないものはデマと割り切った方がいいみたいですね。あとは以下が役に立っています。

  • 英Guardian誌のブログ = ブログだけど1分おきに自動更新してくれていました。一番の信頼できる情報源だったと思います。
  • クライムマップ = 各地の被害をマッピング。ほんと見境なしという感じですね。
  • 鉄道のニュースページ = どの駅が閉鎖されているかでどのエリアが物騒か大体想像できます。今はもう閉鎖されているところはないようですが、一時20駅以上は閉鎖の表示が出ていいました。

みえこみえこ 2011/08/10 09:26 昨日から日本でも大きく報道されています。略奪や暴動など起きない日本から見ると、「壊して、その後どうなるの?」ろくに教育を受けていない若者の鬱憤はらしとしか見えません。危ないところへは近ずかないようにしましょう。

2011-01-18 12月の成果と1月の目標 このエントリーを含むブックマーク このエントリーのブックマークコメント

12月の成果と1月の目標

もう1月も半分経ってしまいましたが先月の成果と今月の目標です。

成果

先月の目標としていたLRUGでの発表、無事に終了いたしました。スライドはここで、ビデオはここです。あと英語ですがまとめ記事をRuby Advent Calendarの一環として公開しました。


  • Rails Hub」での連載開始

Railsで目指せ、情熱エンジニア」という題でRails Hubで連載することになりました。タイトルはもちろんChad Fowlerの「情熱エンジニア」のぱくりです。WebSocketに関する連載を記事を3回ほど書いたのですが、今度はそれより長めの連載を依頼していただきました。こういったチャンスはそんなにしょっちゅうくるものではないので、大事にしていきたいです。

ちょうどこの日記を書き始めたのは、Award On Railsというプログラミングコンテストの経過報告のためでした。それがきっかけでRuby On Railsにのめり込み、退社、起業(すぐポシャりましたが)、Ruby On Railsエンジニアとしてかれこれ3年ほど経ちました。この日記の始めの方を読み返すと、当時の興奮や悩んだことが色々書かれているので、当時の自分の気持ちを思い出しながら書いていこうと思います。

  • 「Seven Languages in Seven Weeks」読了

先日読書感想文を書きました。この本を翻訳とかしたら楽しそうですが、7つの言語の全てを監訳するのは大変かもしれません。

この本のおかげもあって昨年は10もの言語(Lua, Golang, C++, C,Scala, IO, Prolog, Erlang,Clojure, Haskell)を学ぶ事ができました。それぞれの言語にそれぞれの良さがあって、これまでRuby一色でやってきた私の視野を大きく広げてくれたと思います。そしてこれらを学ぶ過程で分かったのは自分のRuby力もまだまだだなと思いました。本を読んでいる時に「この言語のこの機能がすごい」とかツイートしたら「いや、それRubyでもできるんですけれど」と返事が返って来た事もありますし。それだけRubyの底は深いんだなと思いました。

逆にたくさんの言語を学びすぎた弊害ですが、どの言語もまともに使えこなせていないことでしょう。ほとんどの言語は練習問題を解いたり、サンプルを書いた程度で終わってしまいました。唯一の例外はGolangですこしライブラリーみたいなものも書きかけていたのですが、それも中途半端に終わってしまいました。

できれば今年はRuby, Javascriptにつづく「題3の言語」を習得したいなと思います。本来はそれがGolangになる予定だったのですが、結局途中で断念してしまいました。本当はWebSocketのベンチマーク用のスクリプトを作りたかったのですが、プロトコルが固まらないままずるずるきているため「ドラフトが固まったらまた再開しよう」のままになっています。あとGolangはまわりにやっている人が少なすぎるのもちょっと問題です。7月にGoogleで勉強会を開いた時は内部のGooglerの人ですら「いや〜Golangに興味があって参加しました」みたいな感じでした。今は状況はちがうかもしれませんが。

自分のRuby力が足りないという以上に、自分のJavascript力も足りないなと思い知らされる今日このごろです。スキルアップの一番の近道は自分でなにか作ることなので、一つつくってみました。

英語では「Needle in a haystack」ということわざがあるそうです。訳すと「むしろの中の針をさがす」といったところでしょうか。

最近Ajaxなどで以下のように外部のAPIからのデータの受け渡しが多くなっています。

    var json = [
      {a:"A"},
      {b:"B"},
      {c:{
        name:"bob",
        age:10
      }},
      {d:{
        name:"mark",
        age:10,
        alphabet:"a",
        hage: true
      }}
    ];

ものすごく階層化されたJSONとかから自分の気になるキーや値をさがすのはブラウザーのInspectorのオブジェクトツリーを何度もクリックするのがめんどくさかったりするのですが、そんなときにhaystack. 詳しくはREADMEを読んでいただきたいのですが、通常はBookmarkletとして登録しておき、こんな感じで使います。

    hs = new Haystack(json)

// キーで検索

    hs.key("a")              // ["["0"]["a"]"]

// 値で検索

    hs.val(10)               // ['["2"]["c"]["age"]', '["3"]["d"]["age"]']

// 両方で検索

    hs.all("a")              // ["["0"]["a"]", "["3"]["d"]["alphabet"]"]

// 両方で検索(正規表現)

    hs.reg(/b/i)              // ["["1"]["b"]", "["3"]["d"]["alphabet"]"]

毎回「new」とするのがめんどくさいというフィードバックがあり、ショートカットも用意しました。

H(json).val(10) // ['["2"]["c"]["age"]', '["3"]["d"]["age"]']

やっていることはただ単に木構造を全部探っていき(最近つくるものが全て木構造にからんでいるような気がします)、該当するキーや値を返すだけの50行程度のシンプルなものです。

ただ関数渡しをAPIとして提供、再帰の多用、変数を上書きしないスタイルなどは最近よんだ「Seven Languages in Seven Weeks」の関数型言語の影響を受けたような気もします。非常に簡単なツールですが一度試していただけるとうれしいです。。

目標

  • さらなる執筆、翻訳活動

連載なのでこれからも地道に続けていこうと思います。

  • 今年の目標を考える

本当はこういうのは去年の年末に考えておくべきなのですが、まだ決めかねています。決めなければいけない事は

  • 今後3年間の方向性(中期目標)?
  • 中期目標を達成するために今年は何を軸におけばよいか
  • そのために何をやって、何をやらないか

とくに「何をやらないか」というのは大切だと思います。去年はいろいろな事に手を回しすぎた間があります。勉強とかしていると楽しいのでなんか前進している気になりますが、自己満足だけに終わってしまう可能性も大です。

あと具体的に決めたい事としてこんなのがあります。

できれば複数の行っている事が互いに相乗効果のあるような形にして行きたいです。ベタな言い方ですが「シナジー」大切ですね。

  • Eurukoのトークプロポーザルを考える

私は毎年Scottish Ruby Confに行っているのですが、最近カンファレンスの値段が高くなったのと、まだEurukoに行ったことがないので、今年は5月にベルリンで開かれるEurukoに行ってみたいです。でもただ行くだけではつまらないので、あたってくだけろでトークプロポーザルも考えたいです。昨年はNoSQL(Tokyo Cabinet)とWebSocketでいろいろ話す機会がありましたが、最近はどちらもあまりやっていないので、新しいテーマを探したいです。できれば今年の目標とマッチする分野で。

2011-01-16 「Seven Languages in Seven Weeks」読了

[]「Seven Languages in Seven Weeks」読了 05:03 「Seven Languages in Seven Weeks」読了を含むブックマーク 「Seven Languages in Seven Weeks」読了のブックマークコメント



11月から読み始めて10週間ほどかかってしまいましたがなんとか読了しました。長い時間かけて読むだけの価値は十分あったと思います。もともとHaskellに興味があって、最終章から読み始めたのですが、普通の方は第一章から読み始める事をお勧めします。Ruby -> IO -> Prolog -> Scala -> Erlang -> Clojure -> Haskellの順番なのですが、かなり考えぬかれた順番になっていると思います。

最初のRubyは一番既存のOO言語の王道的なものですが、そこからプロトタイプベースのIOに移り、「ロジックベース」のPrologへと移っていきます。Rubyはどの人が始めてもとっつきやすいものですが、そこから2つのマイナー言語(失礼)に移る事で、読者に「今までのプログラミング考え方を変えなきゃいけないよ」と揺さぶりをかけているような印象を受けました。

後半の最初はScalaから始めるのですが、Rubyを読んだ後だと比較的分かりやすいのではないでしょうか。個人的には「静的型のRuby」という印象を受けます。次のErlangですが、ErlangはもともとPrologをベースに作られた言語というのを今回初めて知りました。「文法がいけていない」とよく批判されるErlangですがPrologを先に学習した後だと案外すんなり学習できました。ここからLispJVM上の方言であるClojureと「純粋関数言語」であるHaskellに移るのですが、それまでに習った言語に既に重複したコンセプトがあるので、結構すんなり理解できるのではないでしょうか。その点私はそういった下積みなしにいきなりHaskellから始めたのでかなりつらかったです。

以下にそれぞれの章の主な感想を連ねてゆきます。ちなみにサンプルのほとんどはこの本からです。

日頃から使っている言語なので、特に目新しいものはなかったのですが、それでも「Rubyのメッソドは全て返り値を返す」というのが特徴といわれ、そういえばそうだなあと思いました。最近以下のようなスタイルで書く事が増えてきたのですが、これなんかも「全て返り値を返す」に通ずるものがありますね。


a = if true 
  "foo"
else
  "bar"
end

あと例題として木構造を扱う例や、act_as_csvといったクラスマクロを作成する例題などはけっこう楽しめました。そういえばこの時にforestとか作りましたが、これの影響でしょうか。

  • IO

javascriptの同じプロトタイプベースの言語なのですが、いちばんぶっ飛んでいるのが「予約語0」という点です。while, if, loopといったコントロールフローもただの関数ですし、&, |, orなどといったオペレータもOperatorTableというメタテーブルに入っているだけなので、自由に新たな語を追加したり、既存のものを変更することが出来ます。

Io> OperatorTable
==> OperatorTable_0x1002745f0:
Operators
  0   ? @ @@
  1   **
  2   % * /
  3   + -
  4   << >>
  5   < <= > >=
  6   != ==
  7   &
  8   ^
  9   |
  10  && and
  11  or ||
  12  ..
  13  %= &= *= += -= /= <<= >>= ^= |=
  14  return

Assign Operators
  ::= newSlot
  :=  setSlot
  =   updateSlot

To add a new operator: OperatorTable addOperator("+", 4) and implement the + message.
To add a new assign operator: OperatorTable addAssignOperator("=", "updateSlot") and implement the updateSlot message.

「オレオレ言語を作ろう」と思ったらIOを使えばなんでも出来るんではと思いました。japanizeという日本語インタープリターをRubyでつくりましたが、IOでもいけるかもしれませんね。あとは並列を意識したアクターモデル(coroutine, actore, future)とかもこの後のScala, Erlangで出てきますが、IOでもサポートされています。

今回読んだなかで一番ぶっ飛んだ言語だと思いました。なにしろifやloopといったコントロールフローが潜在せず、「これこれに該当するもの」というルールを定義する事で回答を導き出してくれるというものです。最初学び出した時はSQLに似ていると思いましたが、それよりももっと柔軟にデータ検出のルールを定義できるなと思いました。

ちなみに一例ですが、「アメリカの5つの州を描いた白地図がありますが。隣接する州と重複しない」というルールはこう書きます。

different(red, green). 
different(red, blue). 
different(green, red). 
different(green, blue). 
different(blue, red). 
different(blue, green).
coloring(Alabama, Mississippi, Georgia, Tennessee, Florida) :- 
  different(Mississippi, Tennessee), 
  different(Mississippi, Alabama), 
  different(Alabama, Tennessee),
  different(Alabama, Mississippi), 
  different(Alabama, Georgia), 
  different(Alabama, Florida), 
  different(Georgia, Florida), 
  different(Georgia, Tennessee).

そして以下のような感じで回答を導き出してくれます。

| ?- ['map.pl']
.
map.pl for byte code...
map.pl compiled, 14 lines read - 1769 bytes written, 17 ms

(1 ms) yes
| ?- coloring(Alabama, Mississippi, Georgia, Tennessee, Florida).

Alabama = blue
Florida = green
Georgia = red
Mississippi = red
Tennessee = green ? 

なんかすごいです。ちなみにこの「ルールにマッチするものを抜き出しなさい」というのをパターンマッチングと呼びますが、これ以降の関数型言語でもたびたび出てきます。

Scalaは以前自分で勉強したことがあったのであまり驚きはなかったと思います。

http://d.hatena.ne.jp/makotoi/20100614

Scalaにもパターンマッチングはあります。階乗は以下のように表します。

def factorial(n: Int): Int = n match {
  case 0 => 1
  case x if x > 0 => factorial(n - 1) * n
}

あとアクターモデルを使った並列処理もサポートしています。

import scala.actors._
import scala.actors.Actor._

case object Poke
case object Feed

class Kid() extends Actor {
  def act() = {
    loop{
      react{
        case Poke => {
          println("Ow...")
          println("Quit it...")
        }
        case Feed => {
          println("Gurgle....")
          println("Burp...")
        }
      }
    }
  }
}

val bart = new Kid().start
val lisa = new Kid().start
println("Ready to poke and feed...")
bart ! Poke
lisa ! Poke
bart ! Feed
lisa ! Feed

「!」 で 非同期に実行するのをしているところはgolang「go」と似ていますね。

http://d.hatena.ne.jp/makotoi/20100628


各章は「Day1」「Day2」「Day3」と3日で読める構成なのですが、Day1を読み終わった時の感想は「Prologとほぼいっしょ」という感じでした。ただPrologとちがって少しですがif文ありますし、Pythonなどでおなじみ(ScalaHaskellにもありのですが)のList Comprehensionもあります。以下のようなかんじです。

double_all([]) -> [];
double_all([First|Rest]) -> [First + First| double_all(Rest)].

たぶんErlangで一躍有名になったであろうアクターモデルは以下のように書きます。

loop() ->
  process_flag(trap_exit, true),
  receive
    {monitor, Process} ->
      link(Process),
      io:format("Monitoring process.~n"),
      loop();
    
    {'EXIT', From, Reason} ->
      io:format("The shooter ~p died with reason ~p.", [From, Reason]),
        io:format("Start another one. ~n"),
      loop()
    end.

Scalaと同じく「!」で呼び出します。ただScalaとの違いとして(たぶん)「node@server!message」みたいな指定をすることでプロセス/マシーン間を超えた通信ができますし、"EXIT"を補足する事で、死んだプロセス再起動とかできます。あと本書では詳しくは説明されていませんでしたがコードをホットスワップとか可能です。

Scala, と並びJVMで走る新しい言語の筆頭、「より良きLisp」とも呼ばれています。「コードはデータ」を標榜するLispでは関数もデータもコントロールフローも全て同列に扱われています。そういう意味では「予約語0」のIOと少し通じるところがあるかなと思いました。そのぶん括弧ですべてを表現する事になるのですが、色々なシンタックスシュガーがあるので本来のLisp (Common Lisp, Schema)などに比べて読みやすいそうです。でもこういうのを読みやすいかといわれるとちょっと微妙です。

(defn put
  ([cache value-map]
    (swap! cache merge value-map))
  ([cache key value]
    (swap! cache assoc key value)))

(take 5 ( drop 2 ( cycle [:a :b :c])))

は[a b c]の配列を永久に循環(cycle)し、その最初の2つを落として、その後の最初の5つをとってくるという意味で激しく括弧がつきますが

 (->> [:a :b :c](cycle) (drop 2) (take 5))

というシンタックスシュガーで左から右へ読むスタイルに変更可能です

データ型はLists, Maps, Sets, Vectorsとあって豊富です。ArrayとHashしかつかわないRubyistとしては「なんでそんなにデータ型がいるの」と疑問に思ったりしますが、それは私が関数脳になりきれていない事でしょうか。ちなみにRubyではSetは標準関数としてついてきます。結構便利なのですが結局Hashで満足してしまう事が多いですね。

話がそれました。Lispの力といえば、言語そのものを変化させるマクロです。

rubyの「unless」をマクロで作成すると以下のようになります。

user=> (defmacro unless [test body]
        (list 'if (list 'not test) body))

コマンドプロンプトで実際に確認できます。

user=> (unless  false(println "this is false"))
this is false
nil

macroexpandというコマンドを使うと元の構文を確認することが出来ます。

#'user/unless
user=> (macroexpand '(unless condition body))
(if (not condition) body)

マクロって言語の文法そのものを正規表現のようなパターンマッチングで置き換えるものだとの理解で良いのでしょうか。

IO, Scala, Erlangの並列化はアクターモデルを使用したもので、どれもloopの中でパターンマッチングをしている感じです。golangやイベント駆動系のnode.js、event machineもちょっと似た感じです。Clojureの場合はそれらとは違いSoftware Transactional Memory(STM)というものを使います。データベーストランザクション処理に結構似ています。

3ヶ月近く前に読んだのですでに記憶が薄れかけていますが、がんばって思い出してみています。

関数言語は色々な種類があるのですが、それを統一しようとして委員会が発足してつくりあげたものだそうです。普通コンピュータ言語は少数の人(あるいは一人)によって作られる場合が多いので、結構異色ではないでしょうか。関数型言語に見られる以下の機能を備えています。

  • List, Tuples
  • list comprehension(リスト内包表記)
  • lazy evaluation (遅延評価
  • high order functions (高階関数)
  • anonymous functions(無名関数

本書に出てきた関数型言語とことなる機能としては「カリー化と部分適用」というものでしょうか。これは関数引数の一部のみを適用した関数をかえすことができると言う事です。「なんのこっちゃ」と思われる方に少し説明します。

以下はかけ算をする関数です。

Prelude> let prod x y = x * y
Prelude> prod 3 4
12

この内の引数の一部に2を入れた関数「double」、3を入れた関数「triple」を作りることも出来ます。

Prelude> let double = prod 2
Prelude> let triple = prod 3
Prelude> double 3
6
Prelude> triple 4
12

すごいですね、とおもったのですが、実はRuby1.9でもできます。

http://pragdave.blogs.pragprog.com/pragdave/2008/09/fun-with-procs.html

ruby-1.9.2-p0 > prod = proc {|a, b | a * b}
 => #<Proc:0x000001009434e0@(irb):43> 
ruby-1.9.2-p0 > curried_prod = prod.curry
 => #<Proc:0x000001009394b8> 
ruby-1.9.2-p0 > double = curried_prod[2]
 => #<Proc:0x00000100916e68> 
ruby-1.9.2-p0 > triple = curried_prod[3]
 => #<Proc:0x00000100862878> 
ruby-1.9.2-p0 > double
 => #<Proc:0x00000100916e68> 
ruby-1.9.2-p0 > double[2]
 => 4 
ruby-1.9.2-p0 > triple[2]
 => 6 

Haskellに比べると少し冗長な部分もありますがRuby関数力もあなどれません。

っでそもそもこの本を手に取るきっかけだった「モナドとはなんぞや」なんですが、正直この本を最初に読んだだけではチンプンカンプンでした。

今でもあまりわかっていないのですが、

http://d.hatena.ne.jp/kazu-yamamoto/20080208/1202456329

を読むと少し分かった気になります。もう一度機会があれば読み返したいです。

  • まとめ

「達人プログラマー」のDave Thomasは「年に一度は新しい言語を習得しましょう」と言っていますが、その7倍をたったの7週間で成し遂げてしまおうという意欲作です。

「新しい言語を学ぶ」というのはなかなか大変なことですが、各言語の特徴を映画のキャラクターに例えているところが面白いです(例えばScalaシザーハンズErlangはMatrixのエージェントスミスClojureStar WarsヨーダHaskellスタートレックのスポック)。

各章は3つに分かれており、週の間に1つ、週末に2つ読むと一週間で一言語に触れる事が出来ます。1つのセクションは10ページもないので2〜3時間もかからず読むことは出来ますが、要はセクションの終わりにあるエクササイズをやるかどうかにかかってくると思います。ただ本を読んだだけだとわかった気になりますが、実際に演習をやらないと身に付かないことは多いです(えらそうなことを言っていますが、だいたい私は各章の最初のセクションの演習しかやっていません)。すこし残念なのは演習の回答が載っていない事ですが、それが載っているとカンニングしてしまうおそれもあるので、あくまで自分でやりとげることに意味があるのでしょう。

今回読んだなかで一番の収穫はIOとPrologでしょうか。これらの言語は超マイナー、あるいは結構昔の言語なので、本書を手に取らなければまずトライしてみることはなかったと思います。でも実際に触れてみると自分の中のプログラミング言語に対する既成概念がくずされる思いがしました。

どの言語も「引き続き勉強してみたい」とは思うのですが、全部継続する気力はちょっとありません。関数言語を極めるという意味ではHaskellClojure、仕事で並列処理が必要な仕事に使えそうな言語としてはScalaErlang、趣味として楽しみたいけれど仕事で使う事はまずなさそうな言語としてはIOとPrologでしょうか。どれも捨てがたいです。

2010-11-29 9、10、11月の成果と12月の目標 このエントリーを含むブックマーク このエントリーのブックマークコメント

9、10、11月の成果と12月の目標

毎月日記を更新する事で自分のモチベーションを持続させようと思っていたのですが、前回は1ヶ月とばし、そして今回は2ヶ月も飛ばしてしまいました。すこし反省しています。

成果

  •  WebSocketでリアルタイムWeb!の連載

3回にわたるリアルタイムWebの連載が無事終了しました。

  1. node.jsの衝撃とWebSocketが拓く未来
  2. WebSocketの現状と技術的課題
  3. WebSocketでWebは変わる? 大胆予想!

今まで記事執筆なんてしてことなかったのでまともなもの書けるか心配でしたがなかなか好評なうちに終わったようです。

今まで自分の英語記事の反応などはツイッターキーワード検索やメンションなどではかっていましたが、今回ははてなブックマークが大変役に立ちました。

連載第一回はなんと800近く、そして第二回、三回も80〜100近いブックマークをいただきました。


内容もさることながら、単純に文章の異様な巧さと読みやすさに感動した。こういう文章を書きたい。

いろいろな反応があったなかで一番うれしかったのが上のコメントです。

もう日本を離れて6年近く経ち、「日本語を書く」という行為をしなくなってから久しかったため、自分の文章力にかなり不安があったのですが、こういったコメントに本当に勇気づけられました。ありがとうございます。

メタプログラミングRuby
Paolo Perrotta
アスキー・メディアワークス
売り上げランキング: 117401


RubyKaigiに行った時に著者のPaoloさんの講演がすばらしかったので会場で衝動買いし、Matzさんにサインまでしていただいた本がそのままになっていました。

コンパイラの本などをよんでいたのですが、難しくて現実逃避のために読んだのですが非常に面白く、5日ぐらいで一気に読み終わりました。翻訳も非常に平易にかかれておりおすすめです。

各所でいろいろ絶賛されているようですが、やはりこの本の功績は、Rubyの色々なメタプログラミングテクニックにパターン名を与えた事でしょう。

いままで「Railsでよく使われているなんか小難しい方法」が「ここはクラスマクロでこの部分は動的ディスパッチ」といった風に細かく分析できるようになったことで格段に理解度が向上しました。

また常にスコープを意識し「ここでのselfは何にあたるのだろう」と考える癖がつく事でclass_eval, instance_eval,extend,includeといったメソッドに対する理解度が深まりました。あとblockは以前から好きだったのですが、さらに好きになりました。

本当に私のRuby度が向上した一冊だと思います。


  •  小粒な作品作り

最近会社のプロダクトからは離れ、クライアント関係の仕事をするようなことが多いのですが、そういう仕事をする時はなるべく「保守的であまり冒険しない」方法を多くとりがちです。

具体的には、自分で車輪の再発名をするより、「いかに既存のライブラリプラグインを組み合わせる事ですばやく成果を出す」といったところでしょうか。

それはそれで良いのですが、そうすると少し冒険したくなってきます。また今までNoSQLやらモバイルやらWebSocketなどの最先端のテクノロジーを追ってばかりいたのですが、それに自分のプログラマーとしての力量が追いついていないような気がしてきました。

そこで新技術の情報収集に明け暮れるだけでなく、たいした事でなくとも、もっと自分の手を動かしてものを作る機会を増やしたいなと思うようになりました。

ということで以下の2作品です。

データベースの中には以外と気がつかないうちに木構造の情報が入っているものです。例えば「社員テーブルに上司IDコラムをわりあてる」といった構造は実は会社のハイラーキーを木構造で表しているのですが、SQLでは簡単に木構造を取り出しにくいものです。

そこで既存のrubytreeのラッパーなのですが、「木構造の深い順にトップ10を抜き出して」といったレポート情報をお手軽に取り出すことができるツールをつくってみました。

これを作った理由ですが、以前のプロジェクトで「どのユーザーがどのユーザの招待でサインアップしたか」みたいな情報があり、「この中から影響力のあるユーザーってだれだろう」と思ったことからです。

よく会社の人とかに「日本語でプログラミングできるの?」とか聞かれます。せっかくRuby実装の勉強とかしようと思っていたところだったので、

自分で作ってみる事にしました。といってもRubyコンパイラに手をいれたわけではなく、モジュールとして作りました。


ruby-1.9.2-p0 > require 'japanize'

ruby-1.9.2-p0 > 1に2をたして4を掛ける

=> 12

四則演算しかできませんが、irb上で日本語書いて動くのは結構感動的です。

これらは本当に小さなライブラリーだし、あまり実用性もないのですが、作って行く上で「ツリー構造」とか「逆ポーランド記法」とかコンピュータサイエンスの基本になるようなことを勉強できたような気がします。

目標

上のjapanizeをネタにLondon Ruby User Group で発表する予定です(というか発表のネタとしてつくったものです)。

  • Seven Languages in Seven Weeksを読み終える


Calling Methods on Potential Nil Objects in Rails」という記事でRailsの「try」というメソッドを拡張する記事があったのですが、

その時に「自分だったらこうする」みたいなのをgistでいくつか作成しました。

そうしたらツイッターで「その考え方って基本的にHaskellのMaybe Monadみたいなものだね」と言われました。

そこでHaskellの載った本書を最初に購入して、最終章のHaskellから読み始めました。現在はHaskell, Ruby, IO, と読んでPrologのところまできました。

毎章を読む度に既存のプログラミングに関する常識を打ち破られる気がします。非常におすすめです。

  • さらなる執筆、翻訳活動

今回のWebSocketの連載で「ものを書く」ということに自信がでてきたので、これからも続けていきたいです(この日記ももう少し更新頻度をあげたいですが)。一応いくつかプロジェクトが立ち上がりつつあるので、そのうちご報告したいです。