2014年の抱負なんて糞食らえだ

明けましておめでとうございます。自分は公私に渡って昨年からの宿題が残っていてあんまりめでたくないですが。

さて、新年ということで過去のエントリを振り返ってみたんだけど、毎年新年に威勢の良い抱負エントリを書いては企画倒れに終わってる気がしてるので、今年はあえて何も目標は書かず、年末になって「達成したわー(ドヤァ」とドヤ顔をしてみようと思ってます。

というわけで、今年も宜しくお願いします。


ぶつかり稽古で壮絶に散ってきた話

というわけで、土曜日(22日)にぶつかり稽古に行って壮絶にかわいがられてきました。かわいがりの様子はこちらになります。


Video streaming by Ustream

そもそも、なんでこんなことになったのかと言うのはあんちぽさんのエントリに詳しいのですが、今年のYAPC::Asiaのカヤックさんの企画をみて「折角50円切手が貼ってあるくらいだし、無駄にするのも嫌だなあ」と思った瞬間、自分の中のゴーストが囁いたので「『あんちぽさん』と『ぶつかりげいこ』と書いて投函したのでした。ちなむと、投函前にfacebookに葉書を撮ってポストしたところ、mizzyさんから「採用」とコメント頂いた時点でもう少し覚悟しておくべきだったと今になって思います。

当日は会場のセッティングがばっちり & 中継と録画もしていることを知って緊張が高まってきたのですが、前半に行なわれたトークがまた非常に濃くてどんどん後半のハードルが上がっていき、ぶっちゃけ逃げ出したくなってきました。(ちなみに、後半との間の休憩時間(謎動画が流れてたとき)に、あんちぽさんが中座したまま後半開始ギリギリまで戻ってこなくて、まさかぶつかり稽古どころか一人相撲か、と思った時が緊張のピークでした)

ペパボさんの準備が良過ぎてなんと力士風のヅラまで用意して頂いたので、一番それっぽい奴を被っていったのですが、結果的に顔と視界を圧迫されて非常にコーディングに集中し辛い状態になりましたw(自業自得)。ぶつかり稽古自体は、あんちぽさんの発案による「テストを書いて無茶ぶりするあんちぽ関」vs「それを糞コードで実装していく俺」という稽古っぽい構図になりました。最初は全然テストがこけないので「これはエンターテイメントとして大丈夫なのか?」と焦り、最後のほうは焦りから逆にテスト失敗を繰り返して涙目でしたが、感想などを読んでみるとそれなりにエンターテイメントとして成立したように見えるのでほっとしています。

そんなわけで半ば事故みたいな感じではあったんですが、今回やった「テスト書く側とコード書く側がやりとりしながらライブコーディングする」というスタイルは是非とも新しいライブコーディングスタイルとして流行らせて、来年には国内外のカンファレンスやIT企業の社内イベントの定番として定着し、wikipediaに「Butsukari-Geiko」ってページが出来るくらいなったら恥をかいた甲斐がありそうだなと思いました。

最後になりますが、そもそもの企画をされたカヤック様、自分の悪乗りに120%応えて素晴しいイベントをセッティングされたpaperboy & co様、何も悪くないのに巻き込まれたあんちぽ関とスピーカーの皆様、そして告知ページを見てもいまいち意味が分からないにも関わらず休日にお越し下さった参加者の皆様、本当にありがとうございました。

それでは、初場所でまたお会いしましょう。

<追記>

何の意味があるかは分かりませんが、当日使用したリポジトリを公開しました


あんちぽさんとスピーカーの方々のまとめ等


ぶつかり稽古に出場(?)することになりました

秋のエンジニアぶつかり稽古2013というイベントで、あんちぽさんこと@kentaroさんとペアプログラミングという名のぶつかり稽古をすることになりました。

もともと、今年のYAPC::Asia2013で配られた名札の裏がハガキになっていて、「願いを書き込んで送ると叶う(かもしれない)」と書かれていたので、「あんちぽさんとぶつかり稽古したい」と思わず書いて paperboy&co. さんに送ったところ、何とペアプログラミングという形で実現してしまったという……。

リンク先を見て頂ければ分かるんですが、「俺の本気を見せてやる」というテーマのプレゼンタイムという凄い面白そうなものがあったりして、自分がこの場でペアプロをやる価値はあるのか不安になってきますが、何故か告知当日に70人の募集枠が埋まるという事態になってしまったため、既に後には引けない感じです。

今のところどんなことをやるのかは調整中ですが、ペアプロでぶつかり稽古ということなので、恐らく俺が何度もコードを書いては、あんちぽさんに「あー、駄目だね、全然なってないね」と言われてコードを全消しされて、泣きながら書き直すのを延々繰り返す感じになるのはないかと予想しています。

既に募集枠が埋まってしまったので「興味のある方は是非ご参加ください」と書けないのが残念ですが、応募された方は私が土俵に投げ捨てられて泥に塗れる様を楽しみに、23日をお待ち下さい。


ISUCON3 本戦に参加してきた

前のエントリに書いた予選から1ヶ月、Isucon3の本戦が開催されたので、無事予選を通過した身として参加してきました。

結論から言うと惨敗でしたw 1分計測で60000点近いスコアを出していた優勝チームに及ばないばかりか、3000未満のスコアしか出せない体たらくでした。

今回のお題は画像しか投稿できないtwitterっぽいものを作る、というお題。とりあえずサーバーに入ってgitリポジトリにつっこんだりしつつコードリーディング。去年は片っぱしから手をつけてって駄目だったので、今回はまずしっかりアプリを読んで問題点を列挙してから対応してこうということで、コード読んだり他のサーバへシステムコピーしたりとやってたんですが、ぶっちゃけ振り返ってみるとここをのんびりやり過ぎたw

ベンチツールも走らせてみつつ、やっぱり画像返すたんびに変換してるのがどう考えても遅いということで、まずは変換結果をいちいち消してるのをやめて、再利用するように。更に画像をPOSTされた時にも先に変換しておくようにして、サーバー1台、ベンチツールのworkload=2の設定で2500ちょいのスコアを出しましたが、終ってみればこれが一日の最大スコアでした……。

その後は、やはり横にスケールさせないと駄目だよねーということで、複数サーバで動かせるように修正。当然、POSTしたサーバーとGETされるサーバーが違う場合を吸収しないといけないんですが、ここでDBに保存したサーバーを書いておく、という方法をとってしまう……。後の感想戦でIDの末尾をみて振り分ける(逆に保存する時にID末尾にサーバー番号をのせる)というのを聞いて、「ああ。その手があったか……」と。無駄にDBアクセスが増えたり、デフォルトで用意されてる画像の保存場所を1サーバーに指定したせいでそこへのリダイレクトが集中したりでスコアはむしろ下がり、終了30分前でその事態に気付き、慌てて保存場所を分散するスクリプトを書いて実行し終わったあたりでタイムアップでした(そんな状態なので案の定最終計測はFAIL)。

過去のIsuconもそうだったけど、今回は特に終了後の懇親会で他チームの人と手法について色々と話せたのが楽しかったです。もしベンチツールが公開されたら、その辺りで思いついたこと(riakだのS3だのをバックエンドとしてつかって放り込むとか)を試してみたいですね。

Isucon3運営された皆さんお疲れさまでした。楽しい大会をありがとうございました。


ISUCON3 予選に参加してきた

週末に土日の2日に分けてリモートでの予選が開催されたisucon3に、去年と同じ、myfinderさん、bonnuさん、自分の「team 50ms or die」で参加してきました。

自分達の参加は2日目の日曜で、前日組のスコアが1位が3万超えててどういうことなの状態になる中でのスタートでしたが、とりあえず自分が起きたのは9:55でした(※ISUCON3予選の開始は10:00です)

チーム連絡用に用意してあったSkypeチャンネルに向かって全力で土下座しつつ準備して作業場所へ(この時点で1時間ロス)。

今回の予選はAMIが公開されるので、各自EC2のインスタンスを立ち上げて動かしてスコアも送信する、というものだったんですが、同じ会社の別チームで参加していたyuryuさんが自分のチームの分と一緒に我々チームのインスタンスも用意してくれました。

自分が到着した時点で、既にチームの2人はベンチを動かしたりしつつアプリの読み込みを始めていたので、自分も若干ベンチアプリがtestモードで動かすのにもAPI keyが必須な仕様とかに苦戦しつつもぼちぼち解析を開始。あ、去年の反省を生かして最初から自分のdotfilesをつっこんだので、ほぼ普段通りの環境で作業できたのは個人的に大きかった。

そのあたりで既にmyfinderさんが不要なUPDATE文を見つけてさくっと削除したり、ベンチツールのinitスクリプトでテーブルにINDEX貼ったりSELECTして温めたりして1400くらいのスコアを出した模様(skypeログ調べ)。

そしてbonnuさんがnginxに差し替えて2700に。myfinderさんがベンチの結果を見ながらnginxの設定を詰めていく。

一応、そういったお二人の活躍を口を開けて見ていたわけではなく、ひとまずファイルに書いてコマンド叩くという見るからに怪しいことしてるmarkdown変換部分をText::Markdown::Discountに差し替え。ただ、この時点でもスコア的には数百程度の影響な上に、後半でキャッシュが進んだことにより殆んど影響なくなってますw

このあたりでお昼。10位ちょい上をうろうろの図。

午後からはDBぶん回してるところを中心にキャッシュしていく方向。自分とmyfinderさんが並行して試してたんですが、myfinderさんのほうはパラメータ系もチューニングしつつで一部上手く動いてなかったようなので、とりあえずテストの通る自分の実装のほうをベースにマージしてもらうことに。この辺(14:00)でgithubのプライベートリポジトリを作ってコード共有することに。webapp/perlディレクトリだけ入れたんだけど、後々考えるとまるっとwebapp全部入れたほうが良かったかも。

myfinderさんとbonnuさんの環境で自分のコードベースのを動かすのにちょっと時間がかかった(carton installとdiscountのmake install)ものの、14:40頃にベンチ送信して、この時点で3900くらい。

で、いまいちスコアが伸びてないので検証したところ、この前後でmemosの取得データをキャッシュしてたはずが、キャッシュに乗ってないことが判明。あれこれやっていたら

[2013/10/06 14:51:24] ふしはらかん: ぎゃー
[2013/10/06 14:51:31] ふしはらかん: memdが11212でたってるー
[2013/10/06 14:51:38] どるぁ✌(╹◡╹✘)✌: e
[2013/10/06 14:51:42] Satoshi Ohkubo: ですよね
[2013/10/06 14:51:53] どるぁ✌(╹◡╹✘)✌: うわほんとだ

てなわけで、ここでようやくMySQLのmemcached pluginの罠に気付きましたw 詳しく検証してないのでアレですが、恐らくデータサイズが一定以上だとキャッシュされない等の制約があったぽい?

ようやくちゃんと手元でもキャッシュされるのを確認できるようになったので、まだキャッシュしてなかったところ(memos1つずつusername引いてるとことか)を全部対応して、ようやくスコアが4000を突破。

更に、bonnuさんがmemdに入れるまでもないデータをオンメモリにつっこんだり、公開memoのトータル件数取得処理をキャッシュして4500。

bonnuさんがinitスクリプトを整理したりして、5500までスコアが伸びます(この時点で15時過ぎ)。

その後は、render結果自体をキャッシュしたり、memoの詳細ページをキャッシュしたりするものの、render結果のキャッシュはベンチツールがエラーになるため上手くいかず、断念。代わりに、topページ向けのmemosのキャッシュを、POST時に破棄せずに、キャッシュ内容を更新するように変更しました。

キャッシュ化はだいぶ進んだんですが、ベンチで複数回こないページは恩恵が小さいということで、myfinderさんがinitスクリプト中でrecentページにcurlでアクセスする処理を追加。これで遅いrecentページへのアクセスが改善して一気に6000超えへ。

その後も各自色々と工夫する中、myfinderさんがデフォルトで上がっていたmemcachedのメモリ割り当てが64MBなのを発見、8000MB割り当てて実行したところ(恐らく)サイズ不足で溢れていたキャッシュが全部乗るようになって7900までスコアが上昇。

この辺で残り1時間。10位以内には入ってるけど、スコア的に本戦出場は危ないよね(結果的に実際このままだと無理だった)、ということで試行錯誤、ちなむとこの辺りでHTMLをいじり過ぎた結果、ベンチツールが死んでgoのスタックトレースが出てきて「あ、goだったんだw」ということに気付いたりしてます。

その10分後、ここまで何回か着実にDevel::NYTProfでプロファイリングしていたbonnuさんが、テンプレート中でuri_forが何度も呼ばれて、その度にURIモジュールをnewしてるコストが馬鹿にならないことを発見して使い回すように修正。これで一気にスコアが10000を超えました(たぶん17:20あたり)。

残り30分になったので、更なる高速化を目指して各自作業。自分は何度か失敗したrender結果自体のキャッシュに挑戦し、残り10分くらいでベンチがFAILしないようにすることに成功したんですが、結局この修正は間に合わず、スコア10745でfinishしました。

当日のランキング(5位まで)には及ばないし、これは駄目だったかなあと思ったんですが、各日の5位以外のチームで4位に入り、暫定ながら本戦出場できそうな感じになりました。

Skypeのログとgitのログ(開催中privateにしてましたが、折角なのでpublicにしてみました)と記憶を頼りに文に起こしてみましたが、案外施策とスコアの関連が怪しくなってますね……。可能ならpushする度にベンチ自動実行、結果をbotがpost、とか出来ると良かったのかも。あと、自分のやった作業があんまりスコアに貢献してない感がある……。

無事に本戦に出られたら、もっと問題発見と修正に貢献したいですね。……あ、その前に次は遅刻しないようにたいと思います。


YAPC::Asia 2013に参加してきました

YAPC::Asia2013に参加してきました。

今年はYAPC後にも私事で色々あるという事情と、直前に体調を崩したのもあって、前夜祭・後夜祭不参加、1日目の懇親会後の飲みも挨拶もそこそこに早めに帰るという省エネ参加でしたが、帰ってブログに書くまでがYAPCということで、熱いうちにまとめておこうかと。

ここ数年、YAPCドリブンで直前に慌てて開発してLTでお茶を濁すというループになっていましたが、今年は既に作ってあったある程度自信のあるモジュールを紹介できて良かったです。

目指せ、テストカバレッジ100% from kan

coveralls-perlはnaoyaさんにも紹介してもらえて、大分buzってるつもりでしたが、twitterのTLでの反応等見ていると結構新鮮なものも多かったので、やっぱりこういうのは地道に紹介を続けていくのが大事だなあと思った次第です。

あと、今回の会場は空調も良い感じで、殆どの席で電源が取れたり、公式無線LANも2日共安定して提供されていて素晴らしかったです。スタッフのみなさんお疲れ様でした。

P.S. 応募してみようと思います


フリークアウトに入社して1年が過ぎました

DSC_0094

去年の9月12日が入社日なので、気がついたら入社一年が経過していました。

この一年間はプライベートのほうでも色々あったり激動だったんですが、チームのほうも自分が入社した頃と比べて倍くらいの人数に増えたり、会社全体のスピードも変わらずというか、当時以上に加速してる感もあり、負けてられないなと思います。

入社前に自分でも不安だった健康面ですが、1年かけてぼちぼち改善は出来てきました。2年目はコンスタントに成果を出せるよう心がけつつ、技術的なチャレンジもしていきたいですね。

今週末はYAPC::Asia2013ですが、フリークアウトから3名のスピーカーが登壇されるようです(宣伝)。是非ご聴講下さい。

自分も小ネタでLTに応募してるので、もし採用してもらえたら張り切って発表しようと思います(チラッチラッ


coverallsをperlなprojectで使えるようにしてみた

先週末に開催された Perl QA Hackathon 2013 Satellite Tokyo に参加してきた。会場が所属先だったんですが、普段仕事してるところに perl mongerな方々がいる光景はちょっと面白かったw

Perl QA Hackathonということで、それぞれcartonやcapnmやminillaやTest周りのモジュールを色々と触っていたんだけど、自分は http://coveralls.io/ という、githubやtravisを使ってるprojectが、簡単にテストのカバレッジを記録できるサイトの perl版を作ってみたいと思っていたので、それに着手。最初はサービスそのものを作ろうかと思ってたんだけど、よく調べてみたらcoverallsにはAPIがあって、それを利用した3rd partyのpythonやnodeのライブラリがあった(後で調べたらPHP版もある模様)ので、perlもAPI叩きさえすれば動くんじゃね? ということで、Devel::CoverのReporterとして作ってみた。

https://github.com/kan/coveralls-perl

既に Devel::Cover::Report::Coveralls としてCPANにも公開済みなので、SYNOPSISとかSmart::Optionsの設定を見て使って戴ければ幸い。

うまく動くとSmart::Optionsの例のごとく表示されます

久々にHackathonに参加したけど、やっぱり集中してもりもりコード書くのは楽しい(まあ最近は仕事も概ねそういう状態なんだけどもw)。今月はちょっと予定が被っちゃって泣くなくキャンセルしたんだけど、来月はHachiouji.pmとhackathonに参加してみたいなあ。


Acme::PrettyCure 0.1

出ました。

https://metacpan.org/module/Acme::PrettyCure

このモジュールをCPANに上げて以来の目標だった「新シリーズ開始日の更新」を達成できて満足。例年、「まだ全員揃ってないし、揃ってから出そう」→「あれ、もう夏(秋)だ」というパターンだったので……。

ドキドキ!プリキュア対応以外にも、このバージョンからAny::Mooseを使うのをやめてMooを使うように。Any::MooseのPODに「もうオワコンだからMoo使えMoo(意訳)」って書いてあるの知らなかったよ……。Mooへの移行は殆ど手間なく完了。Roleとかもそのまま使える。自分がつまづいたのは

  • isaの指定が文字列(StrとかInt)からチェック用サブルーチンを渡すようになったこと
  • overrideが無くなったこと(MooのPODには「overrideとかsuperはbad ideaだった。arround使え」とある)

くらいかなあ。

プリキュアも10年目になることだし、今年はTODOになってる機能も全部実装して1.0を出して、YAPCでLTして顰蹙を買うのが大目標です。


1 2 3 4 5