Hatena::ブログ(Diary)

I am Cruby! RSSフィード Twitter

2013-12-09

パーフェクトなCRubyを目指して - 1行のバグ修正に潜む苦労 -

この記事はパーフェクトRuby Advent Calendar 2013 - Adventar の9日目です。
前の日のエントリーはパーフェクトRuby Advent Calendar 2013(8日目) Let's Sinatra Life - たちブログです。
まだ参加できますので、みなさまもぜひ。
パーフェクトRuby Advent Calendar 2013 - Adventar

パーフェクトRuby

Rubyの仕様に大変詳しい同僚への献本インターセプトして読ませていただきました。
さまざまな機能をまとめたとてもよい本だと思います。
著者のみなさまの苦労が偲ばれました。



はいっ。

今回は、パーフェクトなCRubyを目指すためGC周りのデバッグの話をします。

1行の修正

Ruby1.9.3に対するこんな感じのパッチを送りました。

diff --git a/object.c b/object.c
index 0a0b260..1ab28a3 100644
--- a/object.c
+++ b/object.c
@@ -285,7 +285,7 @@ rb_obj_clone(VALUE obj)
     }
     clone = rb_obj_alloc(rb_obj_class(obj));
     RBASIC(clone)->klass = rb_singleton_class_clone(obj);
-    RBASIC(clone)->flags = (RBASIC(obj)->flags | FL_TEST(clone, FL_TAINT) | FL_TEST(clone, FL_UNTRUSTED)) & ~(FL_FREEZE|FL_FINALIZE|FL_MARK);
+    RBASIC(clone)->flags = (RBASIC(obj)->flags | FL_TEST(clone, FL_TAINT) | FL_TEST(clone, FL_UNTRUSTED)) & ~(FL_FREEZE|FL_FINALIZE|FL_MARK) | (RBASIC(clone)->flags&FL_MARK);
     init_copy(clone, obj);
     rb_funcall(clone, id_init_clone, 1, obj);
     RBASIC(clone)->flags |= RBASIC(obj)->flags & FL_FREEZE;

これ見つけるの苦労したなぁという話です。
理由とかはツイッターの一連の議論でも…。
nari3 on Twitter: "@unak 一応ChangeLogの方にはもうちょっとだけ詳細に書いてます。 http://t.co/hXEtu3fQ17 rb_obj_alloc()で取れてきたcloneは関数の中でgcが起きてmarkが付いてる可能性があり、それがsweepされちゃいます。"

突然のSEGV

Ruby1.9.3+Sequel+mysql2付近を駆使したサーバを高負荷で回しまくったところ1日に1度ほどの頻度でSEGVするという事象が発生しました。
1日に1度だと原因特定がさすがにしんどいのでもう少し再現性の高いコードを作ることに。
Rubyレベルのバックトレースを見て、この辺かなぁというところのコードを抜き出してきて、100スレッドくらいでぶん回したところ10分くらいで再現するようになりました。
コアを吐くような設定をして、gdbでいろいろと確認します。

gdbで見てみる

gdbでコアをアタッチしてバックトレースを見てみましょう。

(gdb) bt
#0  0x00007f12f51fd8e5 in raise () from /lib64/libc.so.6
#1  0x00007f12f51ff0c5 in abort () from /lib64/libc.so.6
#2  0x000000000056add8 in rb_bug (fmt=0x5a4c8b "Segmentation fault") at error.c:284
#3  0x00000000004b09b8 in sigsegv (sig=<value optimized out>, info=<value optimized out>, ctx=<value optimized out>) at signal.c:609
#4  <signal handler called>
#5  st_lookup (table=0x0, key=35544, value=0x7f12baa62478) at st.c:330
#6  0x000000000050e917 in search_method (klass=18791440, id=35544) at vm_method.c:374
#7  rb_method_entry_get_without_cache (klass=18791440, id=35544) at vm_method.c:393
#8  rb_method_entry (klass=18791440, id=35544) at vm_method.c:426
#9  0x0000000000517f69 in vm_method_search (th=0x21a99f0, initial=<value optimized out>) at vm_insnhelper.c:1371
#10 vm_exec_core (th=0x21a99f0, initial=<value optimized out>) at insns.def:1017
....

あっれ〜、st_lookupに失敗してる。引数のtableを見ると0です。こりゃだめだ。
rb_method_entryとあるのでメソッドが引けてないみたいです。
なんとなくここのidを引いてメソッド名を特定してみましょう。

(gdb) p 35544%global_symbols.id_str->num_bins
643
(gdb) p *global_symbols.id_str->bins[643]->next->next->next->next
$36 = {hash = 35544, key = 35544, record = 28336720, ... }
(gdb) p *(struct RString *)$36->record
$40 = {basic = ... 0x1aa7190 "identifier_output_method", ... }

"identifier_output_method"というのがわかりました。
さて、賢いみなさまはRubyリポジトリにある.gdbinitのrb_id2nameというのを使いましょうね。

これはSequelの以下の部分のメソッド

#sequel/lib/sequel/adapters/mysql2.rb
      def fetch_rows(sql)
        execute(sql) do |r|
          if identifier_output_method
          # ....

あっれ〜、クラスが消えちゃうのなんでぇ〜、という話であります。
この時点のメソッドレシーバーを覗いてみましょうね。
(ここだとselfのメソッドを読んでるので、rb_psしてvm->cfp->selfで引けたりする)

(gdb) up 10
# vm_exec_coreのところへ
(gdb) p *(struct RVALUE *)recv
$80 = {as = {free = {flags = 0, next = 0x11ebc10},  ...

こいつ死んでるんだぜ…。ということでこのオブジェクトは死んだ後にGCに回収されてfreelistに繋がれたみたいですね。
ほいでクラスを引くときはここのnext(klass)を引いてしまうので、klassが生きてないのは当然だと。
じゃあなんでこのレシーバーオブジェクトが死ぬのか…、ということが問題になってきます。

疑うフェーズと試すフェーズ

いろいろと疑います。
まずはこのオブジェクトがルートから辿れていないケース。VMのcfpに入ってたらマークされるはずだけどなぁ…とか、考えたり。
あとはmysql2のC拡張ライブラリのRB_GC_GUARD漏れか、とも思ってアセンブラ化して読んだりしたのですが、こちらは大丈夫そう…。

試しにいろんなRubyで試す。

  • 1.9.3のGC.stress(SEGVでない) : ガード漏れじゃない??
  • 1.9.3の最適化オフ(SEGV発生) : ご褒美です!
  • 1.9.3のLazySweepオフ(SEGVでない) : あるぇ〜 ( ・´ー・`)

ということでどうやらLazySweepが怪しいぞ…ということに。なんだろう…。

gdbで試しまくる

幸運なことに5〜10分程度再現するのでgdbで再現コードを回しまくって、メモリ位置の傾向とかを見ていきます。
ちなみに最近のgdbはメモリのランダマイゼーションがデフォルトでオフになるそうなので便利です。
GDB Command Reference - set disable-randomization command

GC回数の傾向と問題のオブジェクトのアドレスを見るとなぜかアドレス的にヒープの一番最初のオブジェクトが死んでしまうことに気付きました(でも位置はバラバラなので結構ツライ)。
なので以下のパッチを当てて、問題のオブジェクトの候補をprintfで出力。

diff --git a/gc.c b/gc.c
index 2b833da..151ccd5 100644
--- a/gc.c
+++ b/gc.c
@@ -2043,6 +2043,8 @@ add_freelist(rb_objspace_t *objspace, RVALUE *p)
 {
     VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
     p->as.free.flags = 0;
+    if (objspace->heap.sorted[0].start <= p && objspace->heap.sorted[0].start+80 > p)
+        fprintf(stderr, "free: obj = %p, count = %d\n", p, objspace->count);
     p->as.free.next = freelist;
     freelist = p;
 }

何度か実行させてSEGVの状況を照らし合わせます。

1回目:
free: obj = 0x8403c8, count = 1711
2回目:
free: obj = 0x8405f8, count = 333
3回目:
free: obj = 0x8405f8, count = 222
4回目:
free: obj = 0x840698, count = 241
5回目:
free: obj = 0x8405f8, count = 695
6回目:
free: obj = 0x840558, count = 282
7回目:
free: obj = 0x8405f8, count = 237

うっわー、バラバラ…。でもGCの回数は200回に近い…かも…?

どのタイミングで発生したGCで、オブジェクトが回収されているのか見てみたいですね。
ってことで以下のパッチを当ててGCのタイミングでバックトレースを吐くようにしてみます。
GCのタイミングでバックトレース吐く奴。Ruby1.9.3用。
で、これ後から振り返ると失敗でした。ホントはgc_marksのところに貼らないといけないっすね〜。チョンボチョンボ

あとはGC.countが200回付近で止まるようなbreakpointをgdbに仕込み、そこで表示された候補のオブジェクトのflags(マークビットがあるとこ)に対してwatchpointを張ります。
そうしてやって回していくと…!

Old value = 0
New value = 1
0x000000000044ef6d in rb_class_allocate_instance (klass=23316200) at object.c:1621
1621        OBJSETUP(obj, klass, T_OBJECT);
(gdb)
Continuing.
Hardware watchpoint 2: $29->as.free.flags

...

Old value = 1
New value = 33
gc_mark (objspace=0x83b8a0, th=0x1f9fad0) at gc.c:1756
1756        objspace->heap.live_num++;
(gdb)
Continuing.
Hardware watchpoint 2: $29->as.free.flags

Old value = 33
New value = 1
rb_obj_clone (obj=8668880) at object.c:289
289         init_copy(clone, obj);
(gdb)
Continuing.
Hardware watchpoint 2: $29->as.free.flags

おおっ、途中でマークが付いたのに消されてるところがあるぞ! ということがわかりました!
マークを消したところを確認して、さっきのパッチを作った、という感じです。
同じようにtrunkのバグも見つけたので、そっちもなおしておきました。

答え合わせ

さて何個かの疑問に理屈を付けていくフェーズです。

LazySweepオフにしたら再現しなかったのはなぜか?

LazySweepオンではmarkの状態が付いたままGCを抜けることがあるからですね。
LazySweepオフだとGCを抜けたときにはmarkがついていないキレイなオブジェクトの状態なので、上記のようにマークが途中で消されてしまうということは起こりえません。

再現しづらいのはなぜか?

オブジェクトが生成されてからマークを意図せず消してしまうまでの時間が短いからです。
針を通すようなタイミングでgc_marksが起きないとこの問題は再現しません。
そのためのGC.stress=trueではあるのですが、これだとLazySweepオフ状態になってしまうので再現しないんですよねぇ。
ということで今後のためにLazySweepストレス的なパッチを作ってみたのですけども、あんまり効果なく、パッチ袋にそっとしまいました。
この辺はもうちょっとやらないとなぁ…、といいつつやらないパターン。

必ず先頭のオブジェクトが不正に回収されていたのはなぜか?

これはfreelistの一番最後にいるのがコイツであることが多いからです。

  1. オブジェクト欲しい(問題のオブジェクト
  2. はいどーぞ。あっfreelistの末尾だった(先頭のオブジェクト
  3. もう一個オブジェクト欲しい
  4. freelist空じゃん……、よしGCだ!
  5. gc_marks()
  6. 問題のオブジェクトにマークビット付く
  7. バグによってマークビット消される
  8. そのうちLazySweepでオブジェクトが回収される
  9. >SEGV<

となります。おそろしや。

最後に

さいきん「GCデバッグってどうやるんですか?」と聞かれたので書いてみました。おそらく理解できた人は少ないと思いますが、私の備忘録も兼ねていますのでこれくらいで…。
この記事を読んでもわかるようにコツは結局『気合』と『諦めの悪さ』ですかね。shihさんのおっしゃるように

ちなみにこれのデバッグやってるときに何度も挫けそうになりました。簡単そうに書いてますけど1週間くらい悩んでいたので…。そのぶんVMとか多少詳しくなれて…ラッキィ…。

思ったのは、ある問題について一番時間を割いたのが自分だったら、自分が世界で一番詳しくなるのは当然で。これはもう自分で解くしかないんですよね…。
人がなんとかしてくれるだろう、と諦めるのはものすごい簡単で、なんどもそっちにいきたくなるわけなんですけども、なんとか今回は踏ん張れました。

っていう老害みたいなコメントで締めたいと思います。バーチャ楽しいです。

2013-11-25

プレゼンテーションのこつぅ?( ・´ー・`)

「俺の発表、自分でもスゴイとたまに思うことあるのに誰も褒めねぇ…」
っていう自画自賛ツイートで(/ω・\)チラッしていたところ、私の発表を褒めていただくことが多くなりました。
f:id:authorNari:20131125115656j:image

そこで私がプレゼンをするときに気をつけていることを列挙してみます。

  • 序盤は「アイスブレイク」。笑いをとって聴衆を和やかにさせる
    • 手を上げてもらうのもいいかもしれませんねぇ
  • プレゼンの基本的な構成は…
    • 問題点見つけた
    • 実はこういう解決方法があるらしい
    • 実際に試行錯誤
    • 結果はこうなったようだ
    • これについてオレはこう思った
  • この説明の中でもたまに笑いが取れるとなお良いと思う
    • ※「笑い」は大事ですがそれがすべてではありません
      • 「テーマ」をスムーズに伝えるひとつの手段
  • テーマの選定基準は自分が「面白いなぁ」と思うこと
    • 自分が「これ面白い」と思ってないと不思議なことに相手にも伝わりません
      • 『異常に興奮して』伝えるといいかもしれない
  • なのでプレゼンの時に頑張ればいいのじゃなくて『日頃のおこない』が大事です
    • 大江戸Ruby会議では『生活発表会』とおっしゃってました)
    • 「僕もなんか発表したいです!」って人は『日頃のおこない』を見直しましょう
      • そこで何かテーマが見つかればそれを出せばいい
  • テーマの着想は長くて数ヶ月かける
    • 『頭の中の掲示板』にポイって貼り出しておく期間
      • ネタを何枚か張って思い出したようにあれこれ考える
      • 『日頃のおこない』がダイジィ〜
  • 当日までに資料は最低限80%まで完成させておく。基本は100%。
    • 書き足しはOK
  • 資料ができたら一度は練習する
    • 黙読でOK

「RubyConfの技術系プレゼン群がつまらなかったのなんでかなぁ」と考えてみると、基本的な構成があんまりできていないような気がしました。
「問題点見つけた」「実はこういう解決方法があるらしい」というところで止まってしまって、いやそこから先が聞きたいんだけどね……というプレゼンが多かったです。

偉そうに書きましたが僕も全部できていないことが多いです…いつもホームラン打てるわけじゃないですし…。

2013-11-14

RubyConf2013参戦記

今回は日本Rubyの会の「RubyConf2013参加支援」を受けての参加となりました。
Rubyconf2013supportprogram ? ruby-no-kai/official Wiki ? GitHub
日本Rubyの会のみなさま、ありがとうございます。
行きたい人はもっと積極的に応募したらいいよ。

1日目(移動日)

松江->米子->羽田->サンフランシスコ->マイアミの旅程。
羽田から国際線に乗るのは初めてだったので国際線ターミナルの行き方がわからずウロウロ。
警備員のおじさんに聞いたら「バスがでてるよー」とのこと。歩いていけるようにしたらよかったのに…。
航空券を発券してもらうも1枚しかでてこない。「あれ?もう一枚は向こうで手続きですか?」って聞いたら「実は出てました。てへぺろ(・ω<)」される。かわいい。

サンフランシスコまでは卜部さんと同じ飛行機で心強い。これ以降、日本人と同じ飛行機に乗ることはなかったのだった。
隣の席が空席で快適な空の旅。横になって眠れるのは嬉しい。
機内では「ウルヴァリン:サムライ」「スター・トレック イントゥダークネス」を鑑賞。ウルヴァリンの方がはちゃめちゃな感じで面白かった。間違った日本人感との絶妙なバランスといいますか、とても笑えた。
スター・トレックの方は普通に面白かった。

サンフランシスコでは乗り換え時間をゆったりめに設定。入国審査も問題なくパス。
ここで卜部さんとはお別れ。空港ではフリーのWifiがあってモクモクとツイッターできた。
小腹が空いたのでハンバーガーを頼むも、小腹以上を満たす結果となった。とくにイモがツライ。
http://farm8.staticflickr.com/7448/10845732595_6679a5ee4e.jpg
バーガー類を頼むと「ピクルスとかトマトとか全部入れてもいい?」みたいなことを聞かれることが多かった。まあ聞き取れないんだけど。

マイアミへ。国内線で5時間は大変ツライということがわかった。今度からはやめよう。

2日目

マイアミへ着くもまだ朝の5時。空港のベンチでもくもくと作業。
9時くらいに移動開始。マイアミムーバーに乗ってから、メトロバスに乗ってみるという挑戦。
http://farm8.staticflickr.com/7405/10846064493_facf48744d.jpg
http://farm8.staticflickr.com/7334/10845731445_3795002cb6.jpg
http://farm6.staticflickr.com/5537/10846064293_ebeedb5e78.jpg
http://farm6.staticflickr.com/5510/10845730765_6572fe9142.jpg
あとから聞いた話ではバスは旅行者にとってはあんまり安全ではないということらしい。お金を持ってない人の移動手段だからだということで、なるほど。乗ってる感じでは他の旅行者もいたし大丈夫な感じではあったんだけども時間帯にもよりそう。

ホテルに着くも「3時からチェックインだよー」と言われ、荷物を置いてビーチ方面へ。
http://farm8.staticflickr.com/7378/10845877934_0bf43a1f95.jpg
途中で野生のまつもとさんに遭遇し、朝ごはんを買ってまつもとさんの部屋にお邪魔になる。今回はスイートルームじゃないそうな。
http://farm8.staticflickr.com/7298/10846063083_eb3d95243c.jpg
映画談義などしていたら、ささださんたちとも合流。LTでやるPerfumeダンスの話をすると「じゃあそれウチのセッションでもやってよ」とささださん。ありがたや。
ザクさんも一緒にいた。年齢を聞いてみると26歳とのこと。ザクさん年下なんや!ビビる!
まえのりして観光していた弊社同僚チームとも合流。だいぶん日に焼けている。
お昼はキューバ料理のお店へ。キューバビールが美味しかった。
http://farm8.staticflickr.com/7424/10846062523_131c7f5803.jpg

ホテルにチェックイン後、ビーチを散策
http://farm3.staticflickr.com/2889/10845793236_5570a60f40.jpg
ちなみにささださんのキャップはテレンス(Heroku社員)へのリスペクトによるものだと、松田さんが主張していた。
その後はまたまつもとさんの部屋でゴロゴロしていると、角谷さんたちとも合流できた。
みんなで晩御飯。『スシサンバ』という間違った日本感を突き進めた異次元の料理を堪能する。ビールに合うスシというコンセプトでもう少し洗練させれば、日本への逆輸入ワンチャンあるで、これは。

あとは寝るだけ( ˘ω˘)。久々のベッド…。

3日目

http://farm4.staticflickr.com/3755/10845728625_233ebea0eb.jpg
角谷さん、takkanmさん、sada4さんと一緒に朝飯。うまかったです。店員さんがドラマ版ホームズ(新しいやつ)のホームズ役に似てた。

http://farm3.staticflickr.com/2875/10845792876_ac53edeb79.jpg
RubyConf初日。今年も無限スターバックスがあって嬉しい。
まつもとさんのキーノート、についてはみんな書いてる通り素晴らしかったデス。
他のセッションはぱっとしなかったデス。オワリ。
ささださんのセッションで少しだけ友情出演させてもらう。緊張しましたけど、フォローされまくって助かりました…。

晩御飯。バーガー屋さんだったかなぁ。お腹が一杯過ぎて気持ち悪くなってしまった…。
ここでマーカンドレとチャリサムとお話する。
マーカンドレはApple2からプログラミングをはじめて、それ以来はアップル製品しか使っていないそうな。Rubyの前は(ぼくたちが)聞いたこともない言語を触っていた、とかとか。ものすごい陽気で良いパパという感じの人だった。
チャリサムは早口な感じ。「おれが最年少のコミッタだったこともあったんだぞう〜?( ・´ー・`)」と先輩風吹かせたかったけど、そんな英語力はなかった。「16の時からC拡張ライブラリ使ってて、それ読み始めて、そっからRubyコアの方へ」という馬力のある感じ。こういうバンバン実装していく馬力のある人たちっているんですよねぇ。僕はそういうのになれないので、とても尊敬しております。
早めに宿へ。寝る。

4日目

ホテルのロビーで朝食。がちゃぴん先生のMacBookProが/(^o^)\状態になっていた。LTできない〜と嘆いてらっしゃった。

体調が悪かったので午前中はホテルでゴロゴロ。RubyConf2日目。特にないなぁ。
Jim Weirichの話はUMLのやつだったんだけど僕にとってはけっこう楽しかった。実例とかもでてきたし、そんなに悪い話じゃなかったと思う。周りの評判はよくなかったけどw
PatGCの話。そんなふうに説明するのねぇ〜という感じ。楽しいですけど、しってる内容なので…。
「New Ruby 2.1 Awesomeness」。ささださんが作った機能に対するセッションが何個もあって素晴らしい。今年のRubyConfはささださんスゴイの回だったんじゃないの!?

LT。ひさびさにえらく緊張しました。
LTの内容ですがけどまあこれがすごいウケてたよね。すべてのLTの中でおれが一番ウケたよね。すごいよね。おれの発表力すごいよね。誰も褒めないけど!

日本人のLTに関してはですね、もう少しゆっくりはっきり英語喋ったほうがいいですよ。日本語の調子で内容を詰め込みすぎると、日本人でも理解できない早口英語になったりしてしまってよくないです。はい、僕もなんですが…。お互い頑張りましょう…。

小崎さんのるびまHotlinksインタビューへなだれ込む。肝心の内容はHotlinksで!

そのあとはささださん、小崎さんとご飯。ここにはかけないような話をしましたが、大変楽しかったです。こういうのが海外カンファレンスの醍醐味!日本でもできるけど(あ!)

5日目

同室の同僚と朝ご飯へ。フレンチトーストおいしかったれす(^p^)yelp便利。
http://farm6.staticflickr.com/5524/10845879304_4bd812fac0.jpg

RubyConf最終日。キーノートはよかったなぁ。いや、内容的には別に普通のことだけど、こういう少しテクニカルな話をみんなにわかりやすく、エンターテイメントとして話せるというのはスゴイ難しいんですよ、という意味で素晴らしかったと思います。

Opalの話。これ動画のせれるのかなwスターウォーズの有名なシーンでレイラ姫がハンソロに告白して、ハンソロが「I know」というのがあって、これ日本語だと「おで、知ってた!」みたいなスゲーアホな印象を受けるんですけど、英語だともう少しいい感じのニュアンスっていう例のやつがあって、それのパロディをしてました。いや、いろいろOpal自体の話もしてて面白かったです。Smalltalkに影響を受けてのinspect〜みたいなのとか。

Ruby-core dilemmas」は観客参加型で面白かったです。
これが一番だったかもしれないですね。日本でもやってほしいなあ。きてくれないかなぁ。

ホテルに返ってバタリ。

まつもとさんが迫り来る英語話者をバッサバッサと切り捨てるQ&Aコーナー。いろいろとお話をされていましたが、日本でも聞けるので…。
『RubiniusXの話』っていう鋭い質問を松田さんがしてたので、動画が公開されたら見るといいかも。

それからは小崎さんのインタビュー後編。肝心の内容はHotlinksで!
そのあとでまきもとさんたちと合流して、二手に別れてご飯へ向かう。
まきもとさんがあたりを付けていた中華へ。アメリカナイズされたケチャップ味の麻婆豆腐などをいただく。まずいですね。
http://farm3.staticflickr.com/2866/10846059883_2c407320d9.jpg
ビール頼んだら、くっそでかいビールが届く。もうなんすか…。

店を出る間際に「まきもとさんバッグ紛失事件 in マイアミ」が発覚。その流れはtogetterで確認できる。
マイアミビーチで makimoto さんバッグ行方不明事件 (解決) - Togetterまとめ
まあ日本とだいぶ温度差があって、われわれは本気で焦ってたということですねw
ささださんたちが来た時にはみんなそれぞれ自分のバックをぎゅっと握りしめて「もうお前のこと離さない」っていう、生き別れの兄弟みたいな感じだったもん。

なんやかんやで3次会まで。まきもとさんも楽しそうでした。
http://farm6.staticflickr.com/5487/10845726565_b2544e8de3.jpg
Herokuのリチャードとかと楽しくお話。スゲーいいやつだった!ここが一番楽しかったかもしれないですね。
帰ったあとも小崎さんともう少し飲もうかとおもったけど、ザクさんと女性の参加者の方が二人になってなんかいい感じだったので、シングル同士すこし気をきかせて会場をあとにしたのでした。

6日目

小崎さんのレンタカーで松田さんと一緒に観光へ。ノープラン軍団として大変助かりました…。アメリカ在住の小崎さんさすが!カコイイ!
ご好意に甘えて高橋さんの部屋に荷物を預けて会場ホテルから移動。
移動するタクシーで、レンタカー屋までの地図を見せると「それマップじゃん!アドレス教えてよ。マップじゃいけね〜」みたいな頭悪いドライバーで困った。こいつどうやって仕事してんの。

レンタカー屋は「工事してるやつ途中で死んだの?」みたいな感じの内装で面白かった。
http://farm3.staticflickr.com/2816/10845875754_8d6cdd7c10.jpg
そしてビーチ。
http://farm8.staticflickr.com/7371/10845786436_53fafccd2c.jpg
ダウンタウンのレストランへ。ここの飯が一番うまかったし、安かったです。
http://farm3.staticflickr.com/2823/10845785506_67f25a44c1.jpg

フリーダムタワーの近くで車を降ろしてもらって別行動。
近くの観光地を松田さんとめぐるも大変つまらないスポットばかりでげんなりした。
一番面白かったのはフリーダムタワーの近くに非常に不自由な銅像が立っていたこと。なんだよこの状態!理不尽すぎるだろ!
http://farm8.staticflickr.com/7408/10845872464_aed2aaa87b.jpg

楽しくお話していると、アメリカ的理不尽によりフェリーに乗りそびれた小崎さんと再度合流。ビーチ方面へ。
ザクさんらと食事。ここにきてどっと旅の疲れが…。小崎さんと一緒に無言で空港近くのホテルへ帰還、からの爆睡。

7日目(移動日)

ここで小崎さんとのお別れ。お世話になりました。

シャトルバスに乗るもドライバーがすげー感じ悪くてげんなりした。なんか声でかくて頭悪い感じのやつ多い。
空港でチェックイン。ここの人はすごい感じよくてホッとした。

マイアミ->シカゴ
寝てたら着いた。

シカゴ->成田
空港では角谷さんからオススメされたシカゴスタイルのホットドックを食ってみる。
http://farm3.staticflickr.com/2880/10845783136_614e2c0007.jpg
素材の味を生かしすぎというか、こんど頼むときはピクルスを抜こうと決心した。
13時間の長旅。アメリカン航空だったのでエンタメ機器がいろいろヘボかったのが残念。今度からはよく調べよう…。
今回も隣が空席だったので横になって就寝。6時間以上寝たような…。
機内では「中学生円山」「グランドイリュージョン」「スティーブジョブス」を途中まで。
中学生円山」は面白かったんだけど映画としてのまとまりはどうかなぁって。いろいろ惜しいと思う。
「グランドイリュージョン」。吹き替えの声優さんが大根役者すぎて正しく評価できない。プロメテウス効果を肌で感じた。たぶん日本公開までにはちゃんとするんでしょうけれど。ゾンビランドのあいつらだったので期待していたのですが。
「スティーブジョブス」。途中までだったけど評判ほど悪い映画でもないんじゃない?という印象。

成田->羽田->米子->松江
しんどい

まとめ

RubyConfってイベントは動画で観る価値ってあんまりないんじゃないかなぁ。空気代とおっしゃっていたけれど実際に現地に行くのが大事なイベントなのではないかと私は再認識しました。

英語周りでは前回より自分が成長しているのを実感できたですね。特に「英語できなくても堂々とできるツラの厚さ」みたいな部分が成長していました。「日本語できないおまえらがダメなんじゃねぇ? ( ・´ー・`)」的なマインドですよ。これは海外留学のおかげかなぁと思いますね。

おしまい。

2013-09-03

マインクラフトはいろいろ面白い

(TL;DR マイクラはおもしろすぎるから最初からやるな)
http://minecraft.net/images/animals.png
えー、いまさらではありますが、マインクラフトってゲームが面白いので最近ハマってやっていました。
Minecraft
ゲームの内容以上に私が面白いなと思ったのはマインクラフト周りのコミュニティとか、エコシステム辺りの話です。
(ゲーム的な面白さの説明は他のサイトに任せます…)

クローズドソースであってクローズドでない

マインクラフトJavaで書かれておりjarの形で配布されてます。
そしてマインクラフトオープンソースなプロジェクトではありません。
(ただし販売数が落ち込んだらコードを公開すると公式サイトに以前は書いてあったけど、その時が来るのは随分先のことであろう)

のだけど、コンピュータゲームには古くからMOD(modificatoin)という文化がありまして。
これはゲームを改良・拡張するパッチを有志が作って、それを一般ユーザが当てて愉しむっていう、一口で言うとそんな感じのものです。
そして、マインクラフトもご多分に漏れずMODの文化があるわけなんですね。
マインクラフトMOD作成に拍車を掛けたのがソースコードデコンパイルしてMODを作りやすくしたMCPMinecraft Coder Pack)というものです。
MCP Website - Mod Coder Pack Homepage

マインクラフトは素直にJavaコンパイルしたものが配布されているのでわりと簡単にデコンパイル可能で、MCPはさらにデコンパイルしたものに色々パッチを当ててMODを作りやすくしています。
具体的にはヘルパ的なメソッドを入れたり、デコンパイル後の訳がわからないメソッド名を読みやすくしたり(たぶん)、とかですね。

マインクラフト作者でもあるNotchはMODについてどう考えてるのかって言うと、
Notch: ‘Minecraft mod used to threaten my vision’ – Minecraft creator speaks | VG247
最初は嫌だったけどMODの大事さは俺も分かってるから、まあ自然に任せるよ、的なことを言っておりまして。
作者に止められることもなく、MinecraftMODがどんどん作られ、配布される状況になっており、そのことでさらに多くのユーザを獲得してるという状況です。

MCP登場から時は少し流れて、現在ではMinecraftforgeというのが登場し、更にMODを導入・作成するのが簡単になっています。
Rubygemsみたいなのがでてくるのも時間の問題かもしれませんねえ。

MOD作り

私も練習がてら何個かMOD作ってみたのですが、これは結構面白いですね。
コードを読まないとMOD作れないので読んでみましたが、3Dゲームってこうやって作るんだなぁと思いました。クラス設計とか結構キレイで感心します。
Minecraft MOD作り入門」みたいな本があると良さそうだなというアイデアはありますが、まあちょっと色々とグレイな感じが…。
しかし、初心者がプログラミングを覚えるという観点でいくと、けっこう面白いと思います、MODづくりは。

Wikiと掲示板の多用

MLとかあるのかもしれませんが、Minecraftのほとんどの情報は専用の掲示板とWiki上で交換されています。
交換されている情報はほんとうに様々で、基本的なMinecraftの操作方法から、自作MODの配布まで様々です。
日本にもかなり大きな掲示板(日本ユーザフォーラム)があったり、Wikiがあったりします。

フォーラムでは自作MODが配布されていて、このMOD製作者の間にもコミュニティがあったり。
またMOD紹介者というMODの紹介動画をyoutubeニコニコ動画に上げる人たちがいて、その人と視聴者の間でコミュニティがあったりと、なかなか熱い感じになっています。
MODとかも掲示板のコメントの添付ファイルという形で貼る感じで、ワイルドだぜぇ。

NBTという謎のフォーマット

こっからは完全に余談なんですけど、マインクラフトしてるとどこに何のブロックがあるのか知りたいことがよくあります。
で、そのワールドの地形データはNBTフォーマットという独自のバイナリ形式で保存されていまして、それをパースする必要があるんですね。

厳密に言えばそのNBTフォーマットの仕様や地形データの形式自体も公開されているわけではないんですが、仕様を書いたテキストファイルが公式サイト上のとあるURLにおかれていた時期があって(わざとかどうかはしらない)、それを参考にしたものと、あとはリバースエンジニアリングを駆使しまして、Wikiに詳細な仕様がまとめられています。

ロシア。でもこのおかげでRubyパースするプログラムは簡単にかけたりしたので、まあゴニョゴニョ…

異文化楽しい

長文を書いてきたんですけど、何が面白かったかって、オープンソースじゃないのにかなりしっかりとしたエコシステムができてるんだな〜ということですね。
あまりにもユーザが多いと、どんな障壁や障害もへし折り、ぶち倒していくんですね。
そのパワーというか、そういうのスゴイなあと思いました。

Notchが言うとおり「It all kind of emerged organically(これらはすべて有機的に現れてきたものなんだ)」という感じでしょうか。
こういうことって過去にもあるんでしょうけれど、私はゲーム界隈のコミュニティについて詳しくないので色々と新鮮でした。

マインクラフトも元々は1人のコンピュータオタクJavaで創り上げた3Dゲームなんですよね。
それがここまでのユーザを獲得して、しっかりコミュニティが育って、それぞれ独自に進んで行っていると。
以前、高橋会長がRWCで「人がやりたいと思ったことの邪魔はしないようにする」みたいなことを言ってましたが、ある程度大きなコミュニティ群ができると、作者としてはそういうことが大事なことなのかもしれないですね。

長文失礼しました。私もそんな暇じゃないんで、マイクラに戻ります。じゃあ。

2013-08-21

ネットで評判知って買って良かったもの・悪かったもの

最近引っ越してわかったもの、まとめ。※効果には個人差があります

悪かったもの

Panasonic ドルツ・ジェットウォッシャー 白 EW1250P-W

Panasonic ドルツ・ジェットウォッシャー 白 EW1250P-W

歯磨きをしっかりするのでこれ使ってもあんまり意味がなかった。一人暮らしの1Kだと置き場所にもちょっと困る(コンセントが必要なので)し、起動が面倒で続かない。
まったく使わず物置の奥へ。

自分が納得するくらい綺麗に歯磨きするためには手でやるよりかなり時間がかかる。磨き方が悪いのかなあと思って動画みたりするけどダメ。
これでやるくらいだったら歯ブラシを毎月変えた方がよっぽど効果的だと思う。

【PM2.5対応】SHARP プラズマクラスター搭載 加湿空気清浄機 ホワイト系 KC-A50-W

【PM2.5対応】SHARP プラズマクラスター搭載 加湿空気清浄機 ホワイト系 KC-A50-W

ハウスダストなどもろももろのアレルギー体質なのだけど、あってもあんまり意味ない。
値段には見あってないかなあ。メンテも面倒。

良かったもの

iRobot Roomba 自動掃除機 ルンバ 770

iRobot Roomba 自動掃除機 ルンバ 770

これはほんとうに良いものだった。掃除機不要だし、物を床に置かなくなる(ハウスダスト対策にもいい)。
それになんかカワイくて愛着が湧く。

[asin:B00DIBEDZQ:detail]
乗るだけでOKの体重計。乗ると体重・体脂肪データを無線LANを通じて専用のサービスへアップロードしてくれる。体重推移のグラフとかもWebやスマホから見れて良い。
データはCSVが出力できるので移行も安心。

IHクッキングヒーターはとても掃除がしやすい。綺麗に保てるのはいい。ガスコンロだとなかなかこうはいかない。

東芝 温水洗浄便座 クリーンウォッシュ パステルアイボリー SCS-T160

東芝 温水洗浄便座 クリーンウォッシュ パステルアイボリー SCS-T160

正直ウォシュレットがない生活など考えられない。物件選ぶときはウォシュレット付きの物件に住むか、買って取り替えたほうがいい。

株主様ご優待情報 | 株主様ご優待制度 | 株式情報 | 株主・投資家情報 | 株式会社ゲオホールディングス
GEO株主優待やばい。最近はマンガを借りて、返す日にまた借りて、返す日にまた借りて…、ループに陥ってる。
無人島GEOがあれば生きていける。

テレビ持ってなくてもPS3があればもういい気がする。ゲームアーカイブスもあるし、Huluが見れる。

BenQ 27型 LCDワイドモニタ EW2730V

BenQ 27型 LCDワイドモニタ EW2730V

テレビなくてディスプレイだけ持っている。DisplayPort->HDMIに変換して利用しているけどPCの音もディスプレイから出力できて大変に便利。PS3の出力先としても利用中。

テレビ局の各種オンデマンドサービス
テレビなくてもオンデマンドで話題のドラマだけ見ればいいかなと思う。NHK契約するよりは安上がりで時間の節約にもなる。

バブ ひのきの香り 20錠入

バブ ひのきの香り 20錠入

入浴剤を入れない風呂は風呂ではない。ただのお湯だ(バーン!)。

スタバで買えるインスタントコーヒーを常備するようになった。普通のインスタントコーヒーに比べたらそれなりにおいしい(コンビニレベル)。

ジレット フュージョン プログライド パワーホルダー 替刃1個付

ジレット フュージョン プログライド パワーホルダー 替刃1個付

電気シェーバーよりも楽だし、深剃りできる。今までのひげ剃りはひげ剃りではなかった。ツルツルになって剃った後が爽快。ミスして肌を切ることもない。

Panasonic エチケットカッター 【鼻毛カッター】 グレー ER-GN50-H

Panasonic エチケットカッター 【鼻毛カッター】 グレー ER-GN50-H

普通によいものだった。

耳かきが大嫌いという特殊(?)な体質。お風呂上りに綿棒で耳を定期的に掃除するのがヘタな耳かきよりもいいみたい。

TODO:思い出したら追記する

2013-08-12

ICFPC2013参戦記

ひとりで参加して、ひとりで打ち上げまでしてしまい、ひとりで二日酔いになっているのであんまり日記を書く元気もないんですが…、でもやるんだよ。

1日目

ざっとルールを読んで昼過ぎには\BV処理系が動くようになったっぽい。
肝心のソルバ部分はまずは全ケース総当たりで書いて見ることにする。
(こういうのがサックリ書けないのがやっぱダメなとこだと思う…)
そうするとサイズ5以下くらいはいけるようになった。
tfoldは確定部分が多いので10以下くらいまで倒せるっぽいことが判明。

各オペレータの重複可能数を割り出すというのをなんとなく書いてみたら、なんとなく当たっているようで嬉しかった。
こういうの本当は証明した方がいいんだろうなぁって。

この辺で深夜になってしまった。
震えながらオペレータ1つ、サイズ3くらいのものを本番で解いて見ることに。
そしたらソルバがバグっていて解けず、慌てて手で解いてはじめての'win'を得ることとなった…。
( ˘ω˘)スヤァ

2日目

肝心のソルバ部分がまったく思いつかない、というポンコツぐあいだったので、小銭稼ぎ用のWebサーバsinatraで作ることにする。
この辺でAPI周りも作ったんだったかな。
解けそうなsize数は色を変えて、とか、sortとか、いろいろいじくって終盤まで使うことになった。
ICFPC2013/server.rb at master ? authorNari/ICFPC2013 ? GitHub

夕方になってニヤニヤしながら小銭稼いで行く業に勤しむ。楽しい…。
けどこれ自動でやったほうがいいよね、ということでスクリプトを作る。
あとは全ケースとその入力・出力の組みをあらかじめ計算しておいて…というソルバも考えたのだけど、あんまり戦えなかったり、シンプルに書きなおしたら逆に遅くなったり、とこの辺りの動きは大分無駄が多かったですな。

そう思ったら実は最初かいたコードにバグがあって、それを取り除くとsize:10くらいまでは倒せるようになる。強めのゴブリンくらいはいけるな、と思いつつ、自動スクリプト走らせながら「アウトレイジ・ビヨンド」を視聴。
( ˘ω˘)スヤァ

3日目

いろいろバグとか取ったりしつつ、ソルバについて思いを巡らせる。
もういいや〜、と思ってLIBERTAに行って、『バンビーノ』読みながら問題のこと…は考えずに『バンビーノ』の展開にただただ舌を巻きつつ、スパゲティも巻いたりして、コーヒーをのむ
落ち着いてコーヒー飲んでいると、ようやく解き方がわかって「アーッ」って感じだったので、それを紙に書いて、急いで帰宅。
たぶんこれは初日に気づくべきだとおもうけど…

if0はコンディションの中身はどうでもよくって結局0,1,xになることが多いなあと思った。
if0は運がよければ定期的にプログラムの真ん中とか先頭に入ってくるので、そこまでの組み合わせで解けばいいのか、と。
大きめのサイズの入力・出力、そして問題を読んでいけば大体気づけたと思う。早めにやればよかった。
候補のオペレータをテキトーに入力値入れてに計算していって、こいつは0,1,aのどれか返すはずみたいな感じで、総当りのケースを小さくしていって、という風に解く。
ほいで、書いてる途中でif0の戻りは固定じゃなくて入力値によって変わるじゃん…とか気付き、それに対応する元気もなく終了。
size:20くらいはギリギリ解ける奴ができました。

fold,tfold周りが入ってくるとまた難しいのだろうな、とか。
bonusとか無理だわ、とかありましたけど、そこの辺はやれませんでしたねえ。

自動スクリプトを回しながら『高地戦』を視聴しながらの打ち上げ。氷結ストロング、マジストロング…。
( ˘ω˘)スヤァ

感想

今回の問題はsizeが大きくなるに連れて新しい手法が必要になったりしてたのしかったですねえ。
ルールがシンプルとか、問題がPDF配布じゃないとかもよかった。
リーダーボードは欲しかったかもしれない。

初の1人参加でしたけどこれはこれで楽しいもんですな。でもやっぱチームでやったほうが楽しいかなあ。
お盆だったのでいつものNaClメンバーが休みだったんですよねえ。
次回はお盆を避けていただきたい( ー`дー´)キリッ

コード: authorNari/ICFPC2013 ? GitHub
スコア:

"contestScore":381,
"lightningScore":1,
"trainingScore":32,
"mismatches":248,
"numRequests":1803,
"cpuTotalTime":1669.137

2013-07-31

Firefox拡張で外部コマンド叩きたいやつのときどうするか

日ごろ便利に使わせてもらってる、とあるFirefox拡張に外部コマンドを叩くようなのがありまして、でもwindows版・mac版はあるのにlinux版はない、けれどぼくはプログラミングができると。
じゃあ作ったろうじゃないですか、というのがことの発端です。

XPCOMという地雷

軽くググりますとXPCOMという技術があることに気付きます。
決まった形式でC++のコード書くとFirefoxjsからたたけるようになるよーん、みたいなものなんですね。
そうかそうか、C++でsystem()使って外部コマンド叩けばいいんじゃん?ということでコードをゴソゴソ書き始めたのですが、あらゆる場所にあるドキュメントがことごとく古いんですね。
(あっ、本記事の現在執筆時点での最新安定版は「xulrunner-22.0」です。恐らくこの記事の情報も古くなるでしょう)

一番良くまとまっていたのは恐らく須藤さん(なんでもやってる!)が書かれたドキュメントなのですが、これもいまではかなり古くなってしまってます。

特に大きくはまったのは「xpti.datとcompreq.datは現在は廃止されてる」ということですね。
おそらくみなさんのfirefoxのプロファイルディレクトリ(~/.mozilla/firefox/*.default/以下)にはxpti.datがご健在かもしれませんが、もうそれ使われてねーからm9(^Д^)プギャー
xptは動的に読みこむようになったみたいですね。ソースコード読むまでわからなかったぞ、このやろう。

またModuleの書き方なんかもかなり新しくなっています。
その辺は本家のサンプルを参考にしたほうがよさそうです。
というか本家のドキュメントもXPCOMに関しては悲惨な状態でどこに新しいものがあるのやら、という…。

あとはxpidlというコマンドの消失ですね。代わりにPythonプログラムが転がっております…。

このあたりはMakefileをはっつけておきますのでご参考になれば。

ということでなんとかビルドできたんですね。*.soができた、やったー、と。

Firefoxに認識されないという地獄

はてブのFirefox拡張なんかを参考にして、chrome.manifestをちゃんと書いて、よっしゃこれで動くぞ!と思ったのですが、Components.classesにさっきビルドした*.soが全然乗ってこないのね。
おk、じゃあエラーかなんかでてんのね、と思って、firefox -jconsoleでログを追ってみてもセガール級の沈黙だったよね。はあ?
エラーメッセージがないのは一番ツライということがよくわかった。正しいのか間違っているのか判断できないので…)

でもね、mozillafirefoxオープンソースなんすよ。コードが読めるじゃないですか、よっしゃー、と思って読んでみてもよく分からず、それなりにコードリーディングなんか楽しんじゃって、途中でパッチなんか書いたりして、あれ何やってたんだっけ、ああそうか。
とりあえずビルドしょ…あれ長いな…( ˘ω˘)スヤァ…( ノ゜Д゜)オハヨウ…(ノ`Д´)ノ彡┻オワッテネージャネーカ

頑張って(Components.classesの中を)探しました。でも、見つかりませんでした。
ダメだ、XPCOMってこれやっちゃダメなやつだなと気づきました。
結局上記の問題は解決出来なかったので、だれか詳しい人、教えてください…。

ctypes.jsmという選択肢

実はもうちょっと直接的な雰囲気で*.soを叩けるやつが最近はあるんですね。

他のxpiを覗いてみたらバッチリこれ使ってましたね。
うん、もう少しはやめに他の方のxpiを覗くべきでした。最初にググったのがまずかった。
firefoxは頻繁にバージョン更新するようになったので、そのために毎回sdkダウンロードして…とかやってらんないのかもしれないですね。

外部コマンド叩くだけならnsIProcessが使える

そもそもの目的はなんだっけ、そうだ外部コマンドを叩きたかったのです。
でもそれだけだったらnsIProcessで十分だってことに気づくんですよね。今頃かよ…。

本当は標準入力とかも与えたかったんだけど、その辺の具体的な方法は試してないです。
一応それらしいページは調べたけど、どう使うとかは不明。

とりえあず言いたいことは「xpcomを書くか!」となったら落ち着いて以下のページでも見ながら、jsだけで書けないか考えることですね。

おしまい…

2013-06-18

セブ島で1ヶ月英語留学してみましたよの件とその後

ご存じの方もいらっしゃるかとは思いますが、4月から5月中旬くらいまでフィリピンセブ島まで英語留学をしてきました。
「一回行ってみるとどんなもんかな〜」くらいの気持ちで行ってみたのですが「どんなもんかな〜」がなんとなく分かったのでここにご報告いたします。
http://farm6.staticflickr.com/5339/8835287149_78750a2b16_n.jpg

カリキュラム

初日になんかテストみたいなのやったあとで、それからそれぞれの目的や現在のスキルにあったカリキュラムを設定してくれました。
9時〜12時、13時〜18時、45分単位でマンツーマンの授業があり、あらかじめ教材が用意されていて、まあそれにしたがって会話したりする感じ。
この辺はまあSkypeでもいいんじゃねえのと思うね。

参加自由のグループレッスンが7時から2コマ。私はTOEIC対策のレッスンだけ受けてました。
これは文法とかも覚えられてなかなかよかったですね。

4週間たったらペラペラになるかなあ、とも思ったのですが、無理ですね。
先生も簡単な英語を喋ってくれてるときはいいんですけど、本気だされるともうアレですね。ダメです。
ただ英語を喋るときの恥ずかしさはほぼ無くなるし、「喋れなくても意味は通じるじゃん」的なゴリ押しマインドを培えるという意味でまあいいのかな。

先生の英語の訛り的なものはさほど気にならないですね。
ものすごい発音の綺麗な人もいれば、けっこうなまってる人もいたりしました。

費用

早めに飛行機を取れば、航空券は大体5万円台で取得できます。
学費がトータルで14,5万くらいだったから、生活費も合わせても25万あれば余裕という感じでしょうか。
食事は寮みたいなところで毎日三食でたので、基本的には食費0円でいけるっちゃいけるんですけど、飽きるので…。
私なんかは外食ばっかしてたんですが、物価がかなり安いので月1万もいってなかったですね。
http://farm8.staticflickr.com/7314/8835945786_857f74f717_n.jpg

生活スタイル

ほんとにやることがない(し、寮のネットがえらく遅かった)ので、帰ってからも大体勉強していました。
数えると百数十時間は英語を勉強していたわけで、これで上達しなかったらなんなのだという話ではあります。
もし行く人は日本から教材を持っていったほうがいいでしょうねえ。私はDuoを暗記しました。

DUO 3.0

DUO 3.0

あっ、あと携帯ウォシュレット!向こうはトイレで紙が流せないのでこれはマストアイテム。

TOTO 【いつでもどこでも】携帯ウォシュレット YEW350

TOTO 【いつでもどこでも】携帯ウォシュレット YEW350

週に1日だけは息抜きと称して、いろんなところに遊びに行ってました(ひとりでな!)。
移動手段はもっぱらタクシーですね。30分くらい乗っても数百円だし、タクシーが腐るほど道を通ってるのでかなりつかえます。
だいたいモールとか観光地とかビーチいってたら1ヶ月終わってましたねえ。
http://farm9.staticflickr.com/8134/8836039804_741dd73371_n.jpg

タクシーに乗ってる時、いきなり道端に止まってドライバーが外に出たので「えっなにごと!」とか思ったら、その〜道端で用を足してましてね。
あらかじめなんか言って欲しいですよね。

あと寮ね、これは相当つらかったです。もう1ヶ月が我慢の限界でしたね。
シャワーの水はけがわるくって、いろいろとびちゃびちゃなんすよ。
あああ、思い出さないでおこう……。
住まいは結構ツライところが多いと思うので、ある程度は覚悟しておいたほうがいいですね。

どんな生徒がいるか

真面目な人もいれば、自分探し君も多いです。
学校言った後にワーキングホリデーとか世界一周とか、そういう感じですね。
なのでそれほど真面目に勉強しないというか「おれはここにぃ〜出会いをぉ〜求めてるんでぇ〜」みたいな感じ? 「人生は一度きりだぁ〜」みたいな。
今後もがんばっていただきたいですね。

あとは年金を貰われてる方ですね。老後の楽しみなう、ですね。
ますますのご発展をお祈りしております。

あとは期間ですが、みなさん大体3ヶ月くらい居ます。
個人的には3ヶ月は長すぎるように思いました。
1ヶ月くらいの方が集中できていいんじゃないかなあ。ダラダラ勉強してもねえ。

成果

そのー、最後に英語でスピーチみたいなのするわけですが、私は真面目だし、いろいろ考えて3分くらい笑いの要素も盛り込みつつちゃーんと喋ったわけです。
でも、すべったよね。おすべりさまだったよね。
みんなのあの冷たい眼を想像すると死にたくなるよね。

帰ってきてからTOEICを受けてみたんですけど、500点台から600点台に100点くらいアップしてました。
リスニングリーディング、まんべんなく上がった感じですが、特にリスニングはだいぶん上達したかなあとは思いますね。
http://farm4.staticflickr.com/3792/8836083430_782b644a32_n.jpg
セブ島で見つけたgemの本だよ〜(∩´∀`)∩ワーイ)

陽気ではないフィリピン

フィリピン人というと全員陽気なイメージが勝手にあったのですが、まったくそんなことないですね。きっちり暗い人もいましたよ。
ただ底抜けに陽気なやつがいるのでそこは注意しないといけないですね。
まあ呑んでいるぶんには楽しいじゃんすか?(誰とも呑んでないけどな!)

最後に

会社からは1ヶ月の(GWもあったので15日くらい?)有給休暇をいただきました。
どうもありがとうございます。

別に英語留学を勧めるわけでもないですけど、本記事が興味のある方にとってなにかしら参考になれば幸いです。
勉強方法なんて人それぞれだし、英語というのは長く付き合っていかなければならないものです。
勉強と堅苦しく考えずに日々の生活で意識して英語を使うようにしたいですね(たとえば、こういう記事を英語で書くとかな!)。

ということで、おしまい。なんかあんまりまとまらなかったですね。
まあ海外長かったからしょうがないか〜海外〜。

2013-06-10

RubyKaigi2013の動画を勝手にオススメ #rubykaigi

会議中に自分が聞けなかった講演、気分が悪くて(二日酔い)まともに聞けなかった講演を動画でみた。
もちろん会議中に自分が聞いた講演は大体オススメなのでそっちの感想はここの方で確認して欲しい。

Viemoの方にはまだちょっとしか上がってないので、それまではyharaさんのまとめからustの動画を見るのがよいでしょう。
List of ustream recordings and slides of RubyKaigi 2013 talks. (Videos will officially uploaded to vimeo)

追記: Viemoの方にも上がったようです

scheduleの方から動画を見るのがよさそうですね。

えーっと、以下は単純に観た順です。コメントの興奮度で勝手にランキングしてください。
(ランキング付けして自由を感じなさい(この言葉、好きすぎて困る))

  • 'Ruby Archaeology'- Keiju Ishitsuka
    • Rubyが生まれる辺りの歴史の話。
    • 今現在、広く使われている言語がどのように誕生して、少年時代を迎えるか、というあたりの話は貴重だと思う
    • 石塚さんという客観的な視点から観た話なのがまたいいと思う。
      • ちょう楽しかったので見るべき。

  • 'The Future of JRuby?' - Thomas E. Enebo, Charles O. Nutter
    • いつものJVM速さ自慢が最小限に抑えられてて個人的にはたのしかった
    • 次のバージョン番号の話はウケた。バージョン9000になるんだってww
    • いままでASTだったんだけど、なんとIRを作って直接バイトコード吐いたりするのを作るんだそうな(カワイイLLVMみたいな感じ?)
      • アウトプットにひっそりとDalvikバイトコードと書いてあって、JRubyでAndroidアプリを書ける日もあと数年で訪れるだろうのか?
    • JRubyの起動遅い問題にどうやって立ち向かうか、という話もあって胸熱

  • 'Ruby 'root'' - SHIBATA Hiroshi
    • hsbtさんの超偉い話
    • hsbtさんパワーでRubyの見える部分、(そしてこれは超大事な)色んな見えない部分が改善していることがわかる
  • '`bundle install` Y U SO SLOW: Server Edition' - Terence
    • bundle installがなぜ遅いのか?という話
    • 以前はrubygemsの全体のspecデータをぶんどってきてたから遅かったけど、サーバ側のAPIを変えてdependencyだけ取ってくるようにしたから速くなるよ、という話が前半の話(だとおもう)
    • もうrubygemsAPI使うのも限界なんで、bundler APIというものを用意。こっちがわでbundlerに特化したデータを返せるようにするのだとか
      • って、すごいふつうのはなしーーー!ズコーッ!

  • 'krypt. semper pi.' - Martin Bosslet
    • 暗号とかつまんないと思うから敬遠している人こそ見るべき(Martinも最初に「暗号は難しい」と言っている。そのためのソリューションがkryptなのである)
    • これはプロダクトのデザインの話が絡んでいてとても面白かった。で、説明を聞いていると、おお、使いてえ、みたいな感じがする。
  • 'Ruby on Your Rails' - Akira Matsuda
    • 前フリがやけに長い。資料づくりに困ったのかな…。
    • Railsのこれはちょっとダサい」といいつつ新しいデザインを提供していく話
    • ずっとこんなこと考えてるんだろうなあ、松田さんは。
    • 私なんかはあるものでだいぶ満足してしまうというか、これもっとかっこ良く書けるよね的なことはあまり想像できない。0から1は難しいのです。
    • ということで当然見ておくべき(前半は飛ばしても構わない)
      • 追記: 特筆すべきことを忘れていた。松田さんは全編英語でトークした唯一の日本人でした。偉業!!

  • 'Concerning `Applications'' - moro, Kyosuke MOROHASHI
    • Concern周りの話もかなり参考になる
    • 個人的にはRefinementsの使い方に痺れた。
      • これはmoroさんの新しい発見の話だと思う。見ておくべき。

  • 'Refactoring Fat Models with Patterns' - Bryan Helmkamp
    • 終わった後に人だかりができてた理由がわかったわ〜。よくできた構成で面白かった。
    • 何が面白いって実際のRailsコードでよくありそうなコードを見せつつ、それオレいつも綺麗に書けない奴…的な思いをさせ、ポンポンとそれらしいリファクタリングをしていく
    • しかもそのパターンの名前が一貫性があって(オブジェクトというくくり)になっている。よくできた話や〜。

  • 'Async programming is all about programming synchronously ' - Masatoshi SEKI
    • 当然見ておくべき、で終わらせたいけどちょっと説明しておく。
    • まず「非同期呼び出され」やタイトルの「非同期って同期を書くこと」という名前がとてもわかりやすくて素晴らしい
      • 「非同期呼び出され」の結果を知るときに同期が必要になって実はこれがめんどいんだよね、という話だったと思う
    • 即時復帰でもやはり「結果が気になる」というので「待つ」という話になる。
      • 二種類待ちたいときにどうするか(たとえばサーバ)。一度に待たないとだめだよね、みたいな。
      • それでselect属(これもいい名前ですね)を使う、と。
    • とても面白かったです。咳さんはこんなことをいつも考えてらっしゃるのだろうか。

  • 'Casual Log Collection and Querying with fluent-plugin-riak' - Kota Uenishi
    • MapReduceSQLであつかっちゃおうという自作プロダクトの話
    • Riakの話しもかなりRiakの話は7DB本で読んだので楽しめた。
    • Riak使ったら楽なプロダクトもあったのかなあと夢想した。

  • 'Complex Event Processing on Ruby and Fluentd' - tagomoris
    • Norikaというストリームでデータを受け取って集計し、その結果をどっかにアウトプットできる自作サーバの話。
    • これはスゴイ!と思いつつも、私とはあまりに関係のない分野過ぎてあまり凄さが実感できないので、まあ動画を見て判断してください。
    • Esperというのがあるんすね、Javaは裾野が広い(個人的にはEsperというのをもう少し説明して欲しかった)
    • こういう繋ぎっぱなしの用途だとGCは切りづらそう

  • 'Unfactoring' - Aaron Patterson
  • 'Contributing to Ruby' - Zachary Scott
    • Rubyへの貢献の仕方。具体的にはドキュメントが足りないところがあるのでそれを書こうず、という話。
    • CRubyのChangeLogに名前を刻みたい方は見るべき動画
    • 30分書けて丁寧にわかりやすく説明してくれる。
      • 勉強会とかでこれを見たあとにRDoc書く、的なイベントがあってもいいくらい

  • Keynote 'Fight with Diversity' - Akiraakr” Tanaka
    • akrさんの苦闘の日々の話。でもなんか楽しそうだった。
    • これは謎の感動というか、見終わった後に「ふぅ、一息」みたいな感じというか。
    • なんだこれは、言語化できない。
    • 田中さんと苦闘が乗り移る感じで、なんか達成感がある。素晴らしい締めだったと思う。

上記以外にも面白かったトークがあれば@nari3まで。