#ISUCON 5予選惨敗記
せっかく参加したので死亡診断書として書いておく。
まとめ
準備不足。 爆死するにしても死に方が悪過ぎた。
MySQLもっと触る。アンケートにはPostgreSQLもよろしくとは書いておいた。
経緯
最初はエンジニアの人と出ようとして人探しをしていた。しかし、応募締め切り間際に身内の不幸があり、出られなくなったら迷惑をかけるので、非エンジニアの弟を数合わせで調達。
作業は自分1人ですることにして、来年のための布石として参加。
経験
- Java
- PostgreSQL
- アプリケーションエンジニア
メンバー
- 弟(非エンジニア)
事前準備
当日
- 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
調べたリンク
- http://dev.classmethod.jp/cloud/aws/service-control-use-systemd/
- http://news.mynavi.jp/news/2010/03/31/045/
- http://www.atmarkit.co.jp/ait/articles/1407/24/news003_3.html
- https://wiki.archlinux.org/index.php/Nginx#Alternative_script_for_systemd
- http://qiita.com/hito3/items/0e539e82ee3c410cccf1
- http://dev.classmethod.jp/server-side/java/db-access-in-spring-jdbctemplate/
- http://linuxserver.jp/%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89/db/mysql/%E3%82%B9%E3%83%AD%E3%83%BC%E3%82%AF%E3%82%A8%E3%83%AA%E3%83%AD%E3%82%B0
- http://server-setting.info/centos/mysql-log-type.html#mysql_5
- http://d.hatena.ne.jp/sho-yamasaki/20120405/1333640589
- http://yuk.hatenablog.com/entry/2014/07/21/221425
- http://phpspot.net/php/pgmysqldump%E3%81%A7%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%EF%BC%86%E5%BE%A9%E5%85%83.html
- https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=mysqldump%20%E9%81%85%E3%81%84
- http://windware.com/ja/blog/2012-05-21/mysql%E3%81%A7%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A8%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E5%8A%B9%E7%8E%87%E3%82%88%E3%81%8F%E8%A1%8C%E3%81%86%E3%80%80
- http://www.thymeleaf.org/doc/articles/standardurlsyntax.html
- http://thinkit.co.jp/free/article/0608/1/3/
- http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231161/
- http://risin.jp/blog/2011/02/28/mysql_/
- http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html#日付
- http://kray.jp/blog/wordpress-tuning/
- http://d.hatena.ne.jp/yk5656/20140506/1400878224
- http://dev.mysql.com/doc/refman/5.6/ja/query-log.html
- http://www.bunkei-programmer.net/entry/2013/02/10/my.conf%E3%81%AE%E5%A4%89%E6%9B%B4%E7%82%B9%E3%81%AE%E3%81%9B%E3%81%84%E3%81%A7%E3%81%AA%E3%81%8B%E3%81%AA%E3%81%8BMySQL5.6%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%AA%E3%81%84%E4%BB%B6
- http://qiita.com/ryurock/items/73df4ab45c96092b63b8
- http://kiyotakakubo.hatenablog.com/entry/20101117/1289952549
- http://d.hatena.ne.jp/yk5656/20140506/1400878224
実家の自室から参加 #ISUCON
— 無罪のスプレッドシート (@eiryu) 2015, 9月 27
活性炭的なやつがこぼれたからまず掃除だ…
— 無罪のスプレッドシート (@eiryu) 2015, 9月 27
— 無罪のスプレッドシート (@eiryu) 2015, 9月 27
スコアが出るようにはなった #isucon
— 無罪のスプレッドシート (@eiryu) 2015, 9月 27
抜け穴探し出した #isucon
— 無罪のスプレッドシート (@eiryu) 2015, 9月 27
— 無罪のスプレッドシート (@eiryu) 2015, 9月 27
— 無罪のスプレッドシート (@eiryu) 2015, 9月 27
既に横になってる #isucon
— 無罪のスプレッドシート (@eiryu) 2015, 9月 27
— 無罪のスプレッドシート (@eiryu) 2015, 9月 27
WebのUIのプロトタイプを作るのはJSFiddleが楽で良い
今更感満載だが、JSFiddle便利。サインアップしなくても使えるし。
html、JavaScript、CSSが1画面で書けてすぐ実行することが出来る。尚、CSSとしてSCSS、JavaScriptとしてCoffeeScript、Babelを指定することも出来る。
SAVEすれば一意のURLが発行され継続して編集出来る。
自分はjQueryを使いたかったので以下のように指定して開始。
作っていた物は以下。
ただ画面をスクロールするだけでも、要素の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つだけ残念だったのは、初めてなので入館の際に受付のお姉ちゃんに色々質問した時に、お姉ちゃんが途中からめんどくさそうになっていたこと。俺は気分が顔に出やすい分、他人のそれも敏感に感じ取ることが出来るのだ!
とはいえ、総じて満足なので皆行った方が良い。
歌舞伎町になんか入浴施設出来てたな。銭湯じゃないけど
— eiryu (@eiryu) 2015, 9月 12
テルマー油?だっけか
— eiryu (@eiryu) 2015, 9月 12
テルマー湯見に行ってみよう
— eiryu (@eiryu) 2015, 9月 12
テルマー湯入ってみた pic.twitter.com/qvYwl4q3cV
— eiryu (@eiryu) 2015, 9月 12
スムージーんまい #テルマー湯 pic.twitter.com/26Etqx9qiU
— eiryu (@eiryu) 2015, 9月 12
飯も色々ある #テルマー湯
— eiryu (@eiryu) 2015, 9月 12
#Jenkins が死亡したので運用について考えてみた
何もしてないのにJenkins死亡した pic.twitter.com/r1cdAjgBg9
— シャック (@eiryu) August 14, 2015
@eiryu ディスクFULLとのこと pic.twitter.com/TiM9CDcNJX
— シャック (@eiryu) August 14, 2015
ディスクFULLでJenkinsが死亡した。別の記事でJenkinsが死亡することがあるのは知っていたが、ディスクFULLでも死亡扱いになるらしい。
こういうのを防ぐにはまず監視するべきなんだろうが、Jenkinsが増えてくるとそれぞれ監視する必要が出てきてどんどんつらくなってくる。
なので、以下の方針でJenkinsを運用するべきなのではと思った。
- 活発なプロジェクトについてはそれぞれJenkinsを用意して監視
- あまり活発ではないプロジェクトについては、1つまたは処理的にまかなえる台数のJenkinsに集約。ビューを分けることによりジョブの閲覧性を確保
まあ単純に監視台数は最少にという方針。
CircleCIとか使うとこういうことそもそも考えなくて済むのだろうか。
参考
YAPC::Asia TOKYO 2015に行ってきた #yapcasia
行ってきた。
募集開始後ダラダラしていたら売り切れてしまって、早く買っておけばよかったなあと後悔していたところ、先週入場のみの追加販売が残っているのを発見し滑り込み購入。
1日目、2日目の参加。 2日目は、朝に洗濯機が完全に壊れて手間取ったがなんとか参加することが出来た。
聞いたセッション(ラリーとか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日目
感想
同時通訳が各自に手渡されるイヤホン付き端末から流れるのだが、率直にすごかった。自分は英語も聞きたかったので左耳だけにイヤホンを入れて音量はあまり大きくなり過ぎないようにして利用。
この方式だと英語だけ聞きたい人は使わなければいいわけだから便利。同時文章通訳だとそれを見る必要があるし、2カ国語が同時にスピーカーから出ていると訳が分からなくなるし。
以下、雑多な感想。
- ちょっとよく分からないけど偽ラリーが色んな人と写真撮っててウケた。尚、本人なしでも撮影OKとのことで、自分が書いたボードを持ってもらって撮影。TeraTailのお姉さん美人で良い
- CoreOSの人がロボットレストラン推しててウケた
- ひとでくん、負債に苦しめられ手であることが分かったけど、着々と改善していっているようで楽しそうで良かった。やたら本買わせようとしてたのが気にはなる
- やはり自分でもっとWebサービスなりガンガン作っていかないとダメだと感じた。esaの中の人が言った「リンクを持つまでやる」というのが秀逸だった。尚、esaまだ使っていないけどとりT(スプラトゥーンのいかTに対抗してesaの人が作ったやつ)着ていたらesaの人に発見されて話す機会があったので良かった
- データ分析基盤がどう変遷してきたかを知ることが出来て良かった。運用が大変だからなるべく自分で用意しないで利用した方が良いとのこと。確かにHadoopとか運用するより本業のことを解決することに経営資源を使いたいしね。ここら辺は、データ分析基盤に限らず、最近割りと共通している考え方だと思う
- 現在担当しているサービスがIDCで運用していて、AWS移行に若干関わりそうなので拝聴。1ヶ月とかで移行していると聞いたので参考にしたい。古いPostgreSQLを使っていてデータ量が多いのが悩みの種。pg_dumpで22GBくらいダンプしたところでエラーで落ちる現象知っている人いたら連絡ください
- 新しいことをやるときの抵抗勢力についてセッション終了後に質問してみたところ、若手の人が多いとのことだった。自分が相手にするのは年上で中年の人が多いので、すんなり参考にはならなさそう
スピーカーの皆さん、スタッフの皆さん、来場者の皆さん、俺、お疲れ様でした。
— シャック (@eiryu) 2015, 8月 21
同時通訳ヘッドフォン凄い #yapcasia
— シャック (@eiryu) 2015, 8月 21
多くのオーク #yapcasia
— シャック (@eiryu) 2015, 8月 21
— シャック (@eiryu) 2015, 8月 21
しかしラリー良い声 #yapcasia
— シャック (@eiryu) 2015, 8月 21
いきなりのロボットレストラン推しw #yapcasia
— シャック (@eiryu) 2015, 8月 21
この時にロボットレストラン行ったのかw #yapcasia https://t.co/cvocwmJy9q
— シャック (@eiryu) 2015, 8月 22
"うまく進捗していることを確認します" じわったw #yapcasia #yapcasiaA
— シャック (@eiryu) 2015, 8月 21
k8sはステートレスアプリケーション #yapcasia #yapcasiaA
— シャック (@eiryu) 2015, 8月 21
"動画変換で家が建つ" #yapcasia #yapsasiaE
— シャック (@eiryu) 2015, 8月 21
ひとでくん、結構負債に苦しめられ手だな #yapcasia #yapcasiaE
— シャック (@eiryu) 2015, 8月 21
JavaだとDTOとEntityは普段から考えること多いな #yapcasia #yapcasiaE
— シャック (@eiryu) 2015, 8月 21
やっぱソース読まなくても動かせる環境重要だよなあ。ある種、参入障壁に近い #yapcasia #yapcasiaE
— シャック (@eiryu) 2015, 8月 21
新手YouTuberのセッション来た #yapcasia #yapcasiaA pic.twitter.com/yMXGZW0loF
— シャック (@eiryu) 2015, 8月 21
公開してURLを持つところまでやる #yapcasia #yapcasiaA #esa
— シャック (@eiryu) 2015, 8月 21
とりT着てたら #esa の人に発見されてステッカーもらえて便利 #yapcasia
— シャック (@eiryu) 2015, 8月 21
懇親会難民は日比谷のhubにいる #yapcasia pic.twitter.com/D0b4dkHfvF
— シャック (@eiryu) 2015, 8月 21
醤油豚骨 #yapcramen https://t.co/TvmSB131jZ
— シャック (@eiryu) 2015, 8月 21
#yapcice https://t.co/LzywAfVlvw
— シャック (@eiryu) 2015, 8月 21
洗濯機がドカーンつって動かなくなった
— シャック (@eiryu) 2015, 8月 22
— シャック (@eiryu) 2015, 8月 22
本人なしでも良いとのこと #yapcasia pic.twitter.com/Jiri9hy7cm
— シャック (@eiryu) 2015, 8月 22
AWSへ移行した過ぎるので来た #yapcasiaE #yapcasia
— シャック (@eiryu) 2015, 8月 22
— シャック (@eiryu) 2015, 8月 22
#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
尚、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
して回避
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
Mavenはbrewで、Javaはbrew caskで入れるのだが、この逆の依存関係になっているものもあったら嫌だなあと思い、brewとbrew 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の方がインストールの依存関係に悩まされないということと、現在インストールされているものを出力出来てそのままプロビジョニングの元ネタとして使えるのでよいと思う。
おまけ
brew、brew caskのインストール済みのものを削除する。
for i in `brew cask list`; do brew cask uninstall $i; done for i in `brew list`; do brew uninstall $i; done