RubyWorldConferenceに参加した(2日目)

2016年11月3日〜4日に開催されたRubyWorld Conference 2016に参加してきた。その3。イベント自体の様子は少なめです。

http://repl.info/2016/11/07/rubyworldconference_1/

2016-11-04 (2日目)

前日早めに退散したので起床に成功。スポンサーセッションで話すことになっていたので、PCとの接続チェックなどのために早めに向かう必要があった。

こういう場で話すのは久しぶりで、かつ会社としてオフィシャルな立場で話すのは初めてだったので結構緊張した。とはいえ10分だし、会社紹介がメインだったので早口になって時間が余る、ということもなく終了。後から撮っていただいた写真を見たところ、下を向き気味かつ姿勢がちょっと悪いのが気になった。練習不足ですね。

img_4933
くにびきメッセ

 

img_4943
ステッカーなど

2日目のお弁当。なかなか美味しかった。松江らしくシジミが乗っていますね。今回の旅行で1年分くらいシジミ食べた気がする。1日目に引き続きお茶・菓子もあり、Rubyをイメージしたお菓子をいただいた。

img_4941
2日目のお弁当

 

 

img_4945
Rubyをイメージしたお菓子だそう!

ところでこれは松江堀川地ビール館です。非公式イベントで行ったのだけど、とてもよかった。島根のクラフトビールであるびあヘルンを醸造していて、併設しているカウンターやレストランで飲める。何がすごかったって、クラフトビールがピッチャーで出てくる。こんなのはじめてみた…焼き肉とビール飲み放題で、疲れた体によく効きます。その後は一度ホテルに戻って荷物を置いて、散策しつつ見つけた日本酒バーで飲んだりして終了。

img_4948
醸造所併設です

 

img_4951
クラフトビールがピッチャーで出てくるのを初めて見た

 

img_4956
日本酒バーで飲んだ

https://repl.info/2016/11/12/rubyworldconference_3/

パーソナルトレーニング4回目

実際は11/8にやっている。本当は先週の予定だったけど、その前の週末に風邪をひいてしまい、しかも水曜から出張だったので延期してもらっていた。

しばらく自宅でもできていなかったので、若干リハビリっぽく進めてもらった。

回復してきたのでまた自宅でもやるぞ〜。

RubyWorldConferenceに参加した(1日目)

2016年11月3日〜4日に開催されたRubyWorld Conference 2016に参加してきた。その2。イベント自体の様子は少なめです。

http://repl.info/2016/11/06/rubyworldconference_0/

2016-11-03 (1日目)

さて、メインイベントのRubyWorldConference1日目である。前日うろうろしたが無事に起床し、会場へ向かうことができた。くにびきメッセまでの途中、何かの穴にコケや草が生えていてすごく綺麗でテンションが上がる。スマホしか持ってきていなかったのが悔やまれる。

img_4890
ホテルと会場の間で発見。カメラ持ってきておけば良かった…

ホテルと会場までの間には橋がかかっているのだけど、そこにRWCの宣伝旗がたくさんあった。記念に撮っておいた。会場ではもっと怠惰になろう、という話を聞いたりデプロイに必要な時間が13秒という話を聞いたりしてなかなか熱い感じだった。もっとコンピュータに仕事をさせたいというのは完全に同意で、まだまだ働き過ぎだなあと思う。デプロイ時間をもっと短くしたいというのは時々話していて、10秒とか20秒というのを達成しようとするとアーキテクチャから変えないといけないなあと再度どうやるか考えたり。

RWCとは関係ないのだけど、くにびきメッセの別会場で「世界の書籍展」というのを開催していたので軽く覗いたりもした。豆本と世界最大の鳥類図鑑の展示がおもしろい。特に、絵が描かれていたけど、そこに写真をプリントするとすごいだろうなあ。印画紙でも普通だと売ってないサイズだ。で、ちょっと検索してみるとギネス認定の世界最大の本「Bhutan」、Amazon.comで販売中 というのがあった。これはでかいね。実物を見てみたい。

img_4893
橋に旗が!

 

img_4906
くにびきメッセ、渡り廊下から

お昼はお弁当をお願いしていて、これは1日目のもの。美味しかったです。会場ではお茶と菓子も振る舞われていて、そちらもとても美味しい。休憩時間が結構とられているのがありがたい。1日目の終わりにはRuby Prizeの発表もあったが、尊敬しかなく、自分は何をやってきたんだろうと思ってしまった…こつこつ進むしかないですね。

img_4911
お昼のお弁当

 

img_4912
お茶とお菓子もあるよ

さて、1日目にはレセプションがあったが、最高なので行ったことがない人は行くといいです。結構写真を撮ったけど、だんだん適当になっているのがよくわかる。ちょうどRWC2日目の11/4(金)にカニの水揚げが解禁らしかったが、今回は食べられなかった。次回だな。

img_4914
カニ

お造りはすぐなくなった。このサイズのものは見るのも初めてでインパクトがある。そして撮ったときは気づかなかったけど、写真左下の緑の俵状のものはワサビか。これもすごいな。写真は載せていないけど、ローストポークなんかもあって普通に美味いです。

img_4917
お造り。

 

img_4921
お造りに群がるRubyistの様子です

ウェルカムパーティで存在だけ確認して食べられなかったのが、この松江おでん。なんでも最近売り出し中らしい。後ろの方に写真を載せているけど、日本酒とセットで最高です。KAKEYAと豊の秋が好み。後半になると体が少し冷えてきて、しじみ汁が最高だった。ホテルのバイキングでも用意してあって、呑兵衛にはありがたいことです。

img_4919
松江おでん

 

img_4924
李白

 

img_4925
豊の秋

 

img_4927
KAKEYA

 

img_4928
開春

レセプションの後は公式2次会があった(非公式3次会もあったそうな)が、自分は申し込み忘れていた翌日の早朝に打ち合わせがあるので参加せず、ホテルに戻って寝ることにしたのであった。というわけで1日目終わり。

img_4932
松江の夜

http://repl.info/2016/11/09/rubyworldconferenceに参加した2日目/

RubyWorldConferenceに参加した(0日目)

2016年11月3日〜4日に開催されたRubyWorld Conference 2016に参加してきた。写真が多めなので、分けて書くよ。

2016-11-02

昼頃の便で米子空港に、その後バスで松江駅まで向かう。空港から江島大橋(ベタ踏み坂)に進み、その後338号線で北に行き、431号線で松江まで。338号線、なんでこんな人工的な道?があるのかと不思議に思っていたのだけど、もともと干拓するために作られたけど中止になり、この道だけが残ったという経緯らしい。ところで地図を見ていたら「サルガ鼻洞窟住居跡」というのがあるいけどこれ気になるな…

特にトラブルもなく松江駅に到着し、駅近くのホテルにチェックイン。今回は基本デイバッグで来てみた。衣類の圧縮袋が便利。

img_4850

少し仕事をしたり、カンファレンス二日目のスポンサーセッションの発表練習をするなどした。夕方から関係者やスピーカー、スポンサー向けのウェルカムパーティに参加する予定だったので散策しつつ向かう。かなり冷え込んでいたので、途中でカフェに入って休憩するなどしていた。かなりいい感じの店でした。

img_4870

ウェルカムパーティは写真がほとんどない…名刺交換したり話したりしていた。料理美味しかったです。パーティの後はクラフトビールの店に行っていた。ゼウスビターはアメリカン・ゴールデンエールという感じで飲みやすい。BrewDogのエルビス・ジュースはグレープフルーツピールも原料になっていて、ビールの柑橘風味だけじゃないフルーティーさがよかった。店のスタッフと話していて、岩見麦酒 という新しい醸造所ができていることを教えてもらった。商品を見る限りかなり好みなんだけど、今回は買えなかった。セゾンが気になる。東京にないかな…その後はホテルに戻る途中でもう1件寄って、島根のおもしろおすすめ店情報を聞いたりしていた。これも来年チャンスがあれば行きたい。

img_4876
ビアへるんのゼウスビター
img_4877
BrewDogのエルビス・ジュース

前日はここまで。

http://repl.info/2016/11/07/rubyworldconference_1/

RailsアプリのCIがランダムに失敗して治安が悪化していたのを回復した話

CIが落ちるんですよ。自分のPRとは関係ないところで。で、たまに落ちるやつかー、って再度CIを流す。ランダムにコケるので、まぁ次は通ったりするんだけど、これってあまりよい状態ではない。「またここで落ちた」みたいなのが出てきて、クラス名とかであれか、というのがわかってしまう。

そういうのが複数でてくると、再度CIを流しても別のテストでコケてしまい、テストが永遠に通らない…となる。というわけで少し前に一念発起して直してみた。

今回直したテストは合計3つで、内1つはrspecのbefore/afterでskip_callback/set_callbackしたことによって挙動が変わっていたのが原因。残り1つはArray#indexとacts_as_list#insert_atのpositionが0始まりか1始まりかの違いが原因だった。

rspecのbefore/afterでskip_callback/set_callbackしているパターン

このテストではこのcallbackは動かないようにしたい、という理由でテスト前にスキップするようにして、テスト後に再度セットしていたのだが、これがよくなかった。元々のcallbackは実行条件があったのだが、テスト後の再セットではその条件をつけずにセットしていた。こうなると、実行順序によってはどんな条件でもcallbackが走り、意図しない挙動となる。

たとえば、こういうクラスがある。nameが’taroだったらbefore_createのタイミングで例外を出す。そんなところでraiseはあまりしないと思うが、サンプルなので仕方がない。

このとき、次のようなテストを書いて、テストの実行順序がランダムだと順序によっては失敗する。test1は、単純に作成したユーザの名前が指定した物かどうかをテストしている。test2は、名前が「taro」の場合例外が起こり、そうでない場合は起こらないことをテストする。ここで、test1ではnameとして「taro」を指定しているので、callbackが走るとテストできない。というわけで、テストの前後にskip/setを追加した。ここのset_callbackで、「name == ‘taro’」の条件が抜けているので、これ以降のテストではcallbackの実行条件が変わってしまう。

test2=>test1の場合は問題ないが…

test1=>test2の場合は失敗する。

afterでset_callbackする時に条件をちゃんと指定すればよいのだけど、そもそも他のテストに影響を与える処理をbefore/afterで動かすのはよくなさそう。というわけで、同僚からもアドバイスをもらい、こうした。

set/skipのかわりにallow_any_instance_ofでモック化すれば例外も起きない。

添字が0始まりか1始まりかで違うパターン

これはテストの実行順序ではなく、単体で発生していた。acts_as_list というライブラリのinsert_atメソッドを使っていたのだけど、どうもこのライブラリでは添字が1始まりになっているようで、Arrayとずれていた。そのため、Array#shuffleで生成したテスト用の値によっては意図通りに動かずに失敗するということだった。

Array#index

これは当然…

act_as_listのtop_of_list

insert_atはデフォルトだとacts_as_list_top [link]

acts_as_list_topはconfiguration[:top_of_list]らしい [link]

configurationを見るとtop_of_listのデフォルト値は1 [link]

そこがずれていたかー、という感想でした。

ランダムに失敗するテストとどう戦うか

callbackによる挙動の変化の場合は失敗したテストのログを眺めて、影響を与えていそうなテストの当たりをつけた。

この記事を書いている時に調べていて知ったのだけど、実行順序についてはSeed値を指定することで再現させることができるらしい。これを修正している時に知りたかった。次からは活用したい。

http://ikm.hatenablog.jp/entry/2013/03/26/003838

添字の開始値の場合は実行順序は関係がなかったので、何回もテストを実行して失敗するケースの共通点を探すところから行った。テストに限った話ではないけど、再現条件を調べてそこから原因を考えるというのは結構難しいと思う。今回は小さなテストだったので見る範囲も少なくて住んだけど、これがコード以外の要因(ミドルウェアやネットワークなど)も絡んでくると大変だ。

後は、放置せずに直そう、という反省を得た。CIに10分とか20分とかかかっている場合、こういうランダムな失敗でCIがコケるのはもったいない。今回は短期間で割と一気に直したけど疲れるし、CIが落ちにくくなって良いことなんだけど、悪くなっていたのが元に戻っただけともいえる。

%e6%b2%bb%e5%ae%89%e5%a4%a7%e5%9b%9e%e5%be%a9
バグが減って治安がよくなりました