#ISUCON 5予選惨敗記

せっかく参加したので死亡診断書として書いておく。

まとめ

準備不足。 爆死するにしても死に方が悪過ぎた。
MySQLもっと触る。アンケートにはPostgreSQLもよろしくとは書いておいた。

経緯

最初はエンジニアの人と出ようとして人探しをしていた。しかし、応募締め切り間際に身内の不幸があり、出られなくなったら迷惑をかけるので、非エンジニアの弟を数合わせで調達。
作業は自分1人ですることにして、来年のための布石として参加。

経験

メンバー

  • 弟(非エンジニア)

事前準備

当日

  • 1人で作業
  • 12時になんとかJavaでアプリを動かすことに成功する(スコア500台
    • ローカルで試すテストデータはtargetディレクトリにあったものを利用。しかしログイン出来ないデータだったため、実際のアプリをつついて挙動を試す羽目に
  • MySQLのスロークエリログを出そうとするが出ず。。
  • LIMIT絞ったらスコア改善したが800台。。
  • 発狂して終了

来年勝つためにやること

  • 出題者と飲む
  • 決勝出場者と飲む

ダイイングメッセージ

メモ

mysql> select * from users limit 1\G
*************************** 1. row ***************************
          id: 1
account_name: eliza_lindgren1
   nick_name: セイヤ
       email: eliza_lindgren1@isucon.net
    passhash: 37a6375e08f13093eb35fa17c49410f4e5766213a91c4364d49b1bbc1af65c34504148a6ed64c0d8ac5a34690bff67e96ad4618ce85f05cf91aecff9db7f40e2
1 row in set (0.00 sec)


+------------+------+
| table_name | size |
+------------+------+
| comments   |  589 |
| entries    | 2225 |
| footprints |   28 |
| profiles   |    0 |
| relations  |   52 |
| salts      |    0 |
| users      |    1 |
+------------+------+
7 rows in set (0.00 sec)


mysql> select table_schema, sum(data_length+index_length) /1024 /1024 as MB from information_schema.tables  group by table_schema order by sum(data_length+index_length) desc;
+--------------------+---------------+
| table_schema       | MB            |
+--------------------+---------------+
| isucon5q           | 2898.68750000 |
| mysql              |    0.84579945 |
| information_schema |    0.00976563 |
| performance_schema |    0.00000000 |
+--------------------+---------------+
4 rows in set (0.21 sec)



root@q:~# time mysql isucon5q_2 < dump.sql

real    2m12.185s
user    0m8.440s
sys 0m1.280s

調べたリンク

WebのUIのプロトタイプを作るのはJSFiddleが楽で良い

今更感満載だが、JSFiddle便利。サインアップしなくても使えるし。
html、JavaScriptCSSが1画面で書けてすぐ実行することが出来る。尚、CSSとしてSCSS、JavaScriptとしてCoffeeScript、Babelを指定することも出来る。
SAVEすれば一意のURLが発行され継続して編集出来る。

f:id:eiryu9:20150913161812p:plain

自分はjQueryを使いたかったので以下のように指定して開始。

f:id:eiryu9:20150913161032p:plain

作っていた物は以下。

jsfiddle.net

ただ画面をスクロールするだけでも、要素のslideが終わってからでないと位置がずれたりするのでDeferredを使うのを試していた。

最近流行のReact.jsとかもここらへんは同じようにDeferred的な物で頑張るしかないのだろうか?jQueryよりここらへん簡単に出来るならさっさと移行したい。個人的にはマイナー指向なのでMithrilが気になっているのだが。

#テルマー湯 に行ってきた

行ってきた。場所は歌舞伎町のゴールデン街の隣。現在は11月30日(月)までのキャンペーン中で入館料が少し安くなっていた。

土曜日の18時くらいに入ったのだが、それほど混んでおらず、浴室も広くて快適。種類も多かった。

  • 白湯
  • 炭酸湯
  • シルク湯
  • ジェット
  • 寝湯
  • 露天寝湯
  • 露天白湯
  • サウナ
  • スチームサウナ

館内には料理屋もあって、和食と中華があり、その他にカフェやバーもある。なかなか美味いが料金はそれなりに高めか。 支払いは退館時に払う仕組みで、それまでは腕に付けた端末をリーダーにタッチして課金していく。
館内では無料のWi-Fiも提供されている。SSIDをIPとか書いちゃってたけど。。

自分の行動としては、まず湯に入り、その後、リクライニングのある休憩エリアでリクライニング備え付けTVで男子バレーを少し見た後、カフェで電子書籍を読んだり、jQueryをいじったりしていた。jQueryおじさんなので。(https://jsfiddle.net/zjLtmx1n/8/
21時くらいになったら再度湯に入った後、和食屋で天ぷら御膳カスタムを食べてみた。カスタムしたのはご飯をプラス500円でいくらご飯に変えたこと。なんでもオープンしたてなのである程度柔軟に変更出来るとのこと。

1つだけ残念だったのは、初めてなので入館の際に受付のお姉ちゃんに色々質問した時に、お姉ちゃんが途中からめんどくさそうになっていたこと。俺は気分が顔に出やすい分、他人のそれも敏感に感じ取ることが出来るのだ!

とはいえ、総じて満足なので皆行った方が良い。

♨︎

天ぷら膳カスタム(いくらご飯

#Jenkins が死亡したので運用について考えてみた

ディスクFULLでJenkinsが死亡した。別の記事でJenkinsが死亡することがあるのは知っていたが、ディスクFULLでも死亡扱いになるらしい。

こういうのを防ぐにはまず監視するべきなんだろうが、Jenkinsが増えてくるとそれぞれ監視する必要が出てきてどんどんつらくなってくる。

なので、以下の方針でJenkinsを運用するべきなのではと思った。

  • 活発なプロジェクトについてはそれぞれJenkinsを用意して監視
  • あまり活発ではないプロジェクトについては、1つまたは処理的にまかなえる台数のJenkinsに集約。ビューを分けることによりジョブの閲覧性を確保

まあ単純に監視台数は最少にという方針。

CircleCIとか使うとこういうことそもそも考えなくて済むのだろうか。

参考

YAPC::Asia TOKYO 2015に行ってきた #yapcasia

行ってきた。
募集開始後ダラダラしていたら売り切れてしまって、早く買っておけばよかったなあと後悔していたところ、先週入場のみの追加販売が残っているのを発見し滑り込み購入。
1日目、2日目の参加。 2日目は、朝に洗濯機が完全に壊れて手間取ったがなんとか参加することが出来た。

yapcasia.org

聞いたセッション(ラリーとかLTは省略)

1日目

  • Managing Containers at Scale with CoreOS and Kubernetes
  • Consulと自作OSSを活用した100台規模のWebサービス運用
  • Perlの上にも三年 〜 ずっとイケてるサービスを作り続ける技術 〜
  • Electron: Building desktop apps with web technologies
  • esa.io - 趣味から育てたWebサービスで生きていく

2日目

  • データ分析基盤を支える技術
  • ソーシャルゲームにおける AWS 移行事例
  • 辛いことをやめる!から始まる業務改善とInfrastructure as Code

感想

同時通訳が各自に手渡されるイヤホン付き端末から流れるのだが、率直にすごかった。自分は英語も聞きたかったので左耳だけにイヤホンを入れて音量はあまり大きくなり過ぎないようにして利用。
この方式だと英語だけ聞きたい人は使わなければいいわけだから便利。同時文章通訳だとそれを見る必要があるし、2カ国語が同時にスピーカーから出ていると訳が分からなくなるし。

以下、雑多な感想。

  • ちょっとよく分からないけど偽ラリーが色んな人と写真撮っててウケた。尚、本人なしでも撮影OKとのことで、自分が書いたボードを持ってもらって撮影。TeraTailのお姉さん美人で良い
  • CoreOSの人がロボットレストラン推しててウケた
  • ひとでくん、負債に苦しめられ手であることが分かったけど、着々と改善していっているようで楽しそうで良かった。やたら本買わせようとしてたのが気にはなる
  • やはり自分でもっとWebサービスなりガンガン作っていかないとダメだと感じた。esaの中の人が言った「リンクを持つまでやる」というのが秀逸だった。尚、esaまだ使っていないけどとりT(スプラトゥーンのいかTに対抗してesaの人が作ったやつ)着ていたらesaの人に発見されて話す機会があったので良かった
  • データ分析基盤がどう変遷してきたかを知ることが出来て良かった。運用が大変だからなるべく自分で用意しないで利用した方が良いとのこと。確かにHadoopとか運用するより本業のことを解決することに経営資源を使いたいしね。ここら辺は、データ分析基盤に限らず、最近割りと共通している考え方だと思う
  • 現在担当しているサービスがIDCで運用していて、AWS移行に若干関わりそうなので拝聴。1ヶ月とかで移行していると聞いたので参考にしたい。古いPostgreSQLを使っていてデータ量が多いのが悩みの種。pg_dumpで22GBくらいダンプしたところでエラーで落ちる現象知っている人いたら連絡ください
  • 新しいことをやるときの抵抗勢力についてセッション終了後に質問してみたところ、若手の人が多いとのことだった。自分が相手にするのは年上で中年の人が多いので、すんなり参考にはならなさそう

スピーカーの皆さん、スタッフの皆さん、来場者の皆さん、俺、お疲れ様でした。

#TwFavView をアップデートした

今見ているページをTwitterのお気に入りにする機能を追加。お気に入りにするために事前にツイートも行う。

TwFavViewにログインした状態で、以下のブックマークレットを実行する。

javascript:(function(e){window.open("http://apps.eiryu.com/twfavview/tweetAndFav?url=%22+e(location.href)+%22&title=%22+e(document.title),null,%22width=480,height=240%22);})(encodeURIComponent);

普段使っているみてるなうを参考にさせていただいた。

eiryu梅雨のプロビジョニング祭りやってみた

以前やると言っていたやつ。以下の2つについて実施。

  • Ansible
  • Brewfile

github.com

尚、ServerKitでもやろうとしたのだが、なぜかしょっぱなからエラーが出て動かないため断念。

https://github.com/serverkit/serverkit/issues/9

共通点

クリーンインストール状態からprovision.shを実行してプロビジョニングする。

手順

Ansible

基本的にt-wadaさんのもの踏襲。

http://t-wada.hatenablog.jp/entry/mac-provisioning-by-ansible

  • hostファイルを実行可能にしていたらエラーになった
ERROR: The file hosts is marked as executable, but failed to execute correctly. If this is not supposed to be an executable script, correct this with `chmod -x hosts`.

言われるままchmod -xして回避

  • Mavenを入れる際にJavaがないとエラーになった
PLAY [localhost] ************************************************************** 

TASK: [homebrew の tap リポジトリを追加] ***************************** 
<localhost> REMOTE_MODULE homebrew_tap tap=caskroom/cask state=present
changed: [localhost] => (item=caskroom/cask) => {"changed": true, "item": "caskroom/cask", "msg": "added: 1, unchanged: 0"}

TASK: [homebrew をアップデート] **************************************** 
<localhost> REMOTE_MODULE homebrew update_homebrew=yes
ok: [localhost] => {"changed": false, "msg": "Homebrew already up-to-date."}

TASK: [brew パッケージをインストール] ***************************** 
<localhost> REMOTE_MODULE homebrew name=git state=latest install_options=
changed: [localhost] => (item={'name': 'git'}) => {"changed": true, "item": {"name": "git"}, "msg": "Package upgraded: git"}
<localhost> REMOTE_MODULE homebrew name=maven state=latest install_options=
failed: [localhost] => (item={'name': 'maven'}) => {"failed": true, "item": {"name": "maven"}}
msg: Error: An unsatisfied requirement failed this build.
<localhost> REMOTE_MODULE homebrew name=tig state=latest install_options=
changed: [localhost] => (item={'name': 'tig'}) => {"changed": true, "item": {"name": "tig"}, "msg": "Package upgraded: tig"}

FATAL: all hosts have already failed -- aborting

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/Users/eiryu/localhost.retry

localhost                  : ok=2    changed=1    unreachable=0    failed=1   

Mavenbrewで、Javabrew caskで入れるのだが、この逆の依存関係になっているものもあったら嫌だなあと思い、brewbrew caskそれぞれを実行するtaskを分離した。

自分のパターンは、brew caskをしてからbrewするようにするだけで解決出来たと思われるが、タスクを別ファイルに分割する際にAnsibleについて少し手を動かすことが出来たのでよしとする。変数のデバッグ便利。- debug: var=packages

Brewfile

以下を参考に作業。

http://rcmdnk.github.io/blog/2015/03/24/computer-mac/

brew file dumpで/usr/local/Library/Brewfileに現在インストールされているものが出力される。

その出力されたファイルはbrew file installでそのまま使える。ここがすごく便利。

Ansibleと違い、BrewfileはJavaの前にMavenを書いてもエラーにならなかった。裏側でその部分についてはよしなにやってくれている?

まとめ

Brewfileの方がインストールの依存関係に悩まされないということと、現在インストールされているものを出力出来てそのままプロビジョニングの元ネタとして使えるのでよいと思う。

おまけ

brewbrew caskのインストール済みのものを削除する。

for i in `brew cask list`; do brew cask uninstall $i; done
for i in `brew list`; do brew uninstall $i; done