2014-02-14: にがつじゅうよっか: Ruby 開発者会議, バレンタイン

雪の中、Ruby 開発者会議でした。夜は来日中の @kosaki55tea, @repeatedly, @tagomoris, nobu と鍋。

Ruby 開発者会議

  • https://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20140214Japan
  • zsh の <<< で行末までのヒアドキュメントになる (勉強になる!)
  • 昔の Ruby から今の Ruby までで全部実行して試すスクリプト便利そう
  • golfer 御用達の goruby には Symbol#call が prelude で追加されていて map(&:+.(2)) が実は使える (マジで!)
  • _ ではじまる変数って警告の対象にならないんですよ (あーそんなのもあったわー)

focuslight のコミッタになった

https://github.com/tagomoris/focuslight

Perl じゃはやんないから growthforecast をモリスさんが Ruby で実装しなおしたけど、Perl で実は困ってないからどうしようかまよっている、という話からなぜか気付いたらコミット権をもらっている。コミット権もらってからユーザーになるという流れ、自分の事だけどおもしろい…

できる範囲でなにかやります。@sonots さんもコミット権もらったみたい。

akane-imkayac

twitter の TL で mention 以外で言及された場合も以前は twitter irc gateway (atig) → tiarra (Auto::Notify) → im.kayac.com で拾っていたんだけど、atig がたまに不調だったりするので akane のプラグインを書いて akane → im.kayac.com と直接送るようにしました。

これで言及されていたことに気付かない事がへる…はず。あと、streaming api なのでラグが減った。

どうぞご利用ください。といっても、akane については、まだドキュメントを書いてないのと書くきがあまり起こらない…

(atig の方もちゃんと追いたいんだけど、時間がね…)

fluentd とかもそうだけど、gem の形でプラグインが配布されてるなら Gemfile にまとめて書いて、Gemfile だけをデプロイするようにしておくと便利です。fluentd の場合、私設インフラでは設定ファイルも含めてデプロイしてるけど。

Published at 2014-02-14 23:30:00 +0900

2014-02-11: にがつじゅういちにち

明日から平日だというのに 16 時起床。

xtrabackup

xtrabackup いじってた。で、cron 用のスクリプトを書いた。S3 に最終的に投げるようにするつもりだけど、とりあえずここまで。

連れ込まれる… xtrabackup をつかってみた理由は mysqldump はつかったことあるしこっちも使ってみてはどうだろうという気軽な気持ちでした。

レジストラ

twitter account @N が奪われた話 をみてから思っていた事。

If you are using your Google Apps email address to log into various websites, I strongly suggest you stop doing so. Use an @gmail.com for logins. You can use the nicer custom domain email for messaging purposes, I still do.

これの起因はそもそもメールアドレスにつかっていたドメインの権威 DNS サーバーを変更する権限が攻撃者の手元に渡った (ドメイン自体が奪われる、レジストラのアカウントが hack される、etc) ことにある。 それが何を意味するかというと、要するに MX レコードとか SPF/DKIM の TXT レコードとかをいじれちゃうわけですよね。

アカウントリカバリーにメールアドレスを要求してくるのであればそのアドレスへのメールを受信できてしまえば良い。独自ドメインであるなら DNS レコードをどうにかしていじって MX を自分のサーバーへ向ければ良いわけだ。

生活に打撃を与えそうな重要なアカウントについてはすぐに gmail 等といったアドレスに変えた。残りだけど、いちいち変えてまわるのも大変なので引続き自分のドメインで。また、MX 関係の TTL を上げた。

実際この事例の場合はレジストラである GoDaddy のサポートがダメでアカウントを攻撃者に簡単に渡してしまったことにある。どこを信頼すればいいのかねぇ。

com/net/org についてはいろいろと検討できそうだけど問題は .jp のレジストラである。どこなら大丈夫と思えるかなぁ。

実際に自分で忘れたと連絡して奪おうとしてみるという方法も教えてもらった。時間があれば試したい…

Published at 2014-02-11 21:00:00 +0900

2014-02-08: にがつようか: 誕生日祝い@幸せのはし

連絡ですが、月曜休暇なので 4 連休 1 日目です。コードをかいたり貰った本を読む休みにしたい。

誕生日祝い@幸せのはし

P2080805.export

幸せのはし@asonas, @namamana, @mactkg に誕生日祝ってもらった。あそまなお二人にはプレゼントもいただいた。ありがとうございました。 (前回日記 2013/12/13)

雪が凄かった

玄関につもってて ドアあけたらこうなる し、エレベーターは↓表示で動こうとする意思を見せてくれたけど数分たっても動かないので階段にいったら階段もこんな様子 だし災難だった。帰宅してもエレベータ直ってなかった…

家でた直後は iPhone 5s のカメラで捉えられる程の吹雪だった。うーん、明日からは地面凍ってるんだろうなあ…雪、冷たい雨よりマシとはいえ、やだなー。

Zabbix 2.2 に上げたりいろいろ

PHP のバージョンがそろってないのであげたい → ついでに zabbix 2.2 にしよう → ついでに mysql とか nginx の監視も zabbix に整えよう、みたいな感じで zabbix 2.2 にあげたりした。

「Zabbix 2.2 にしたら housekeeper カスタマイズできるようになってるんだけどこれがアップグレード後のデフォルトがオフなんだよ気をつけてね」と前にどこかで聞いた覚えがあるので忘れずに入れた。データベースのマイグレーションというかアップグレード処理は zabbix-server 立ち上げたら勝手にはじまってくれた。

ついでに mysql の監視とかもととのえました。 あと nginx プロセス監視は proc.num[nginx] で item 登録して trigger セットした終わり。nginx の stub_status ごにょごにょするのも用意したい。

conoha 障害

16 時くらいに急に疎通しなくなってアラートがきた。DoSつらい… しかし、conoha のサーバーにも tiarra 置いて普段みないチャンネルの op 維持 + op 配布 bot としてつかってたんだよな…失なった…

OP ロスト + DoS といえば ircnet のここ最近の DDoS でいくつかのチャンネルの OP を失なった状態でつらいです。どうにかなんないんですかね…


明日は夕方バルト9 にアイマス見に行きます (3 回目)。

あと、2014/2/16 (日) 13:55 @ バルト 9 の舞台挨拶も当選しました。なので平日どっかで一回みにいくと思う。(前売り券残り 2)


以下おまけ

P2080748.export

P2080685.export

P2080807.export

P2080809.export

P2080739.export P2080713.export

P2080724.export P2080802 (2).export

P2080684.export P2080675.export

P2080712.export P2080759.export

Published at 2014-02-08 23:30:00 +0900

2014-02-02: にがつふつか: アイマス映画(2回目)+舞台挨拶, Maze party

朝は 10 時半頃に起きて @giginet を送りだした。

tl;dr 2/4 誕生日なので何かください http://amzn.to/sora_h よろしくお願いします

porticron の導入

porticron を導入した。便利便利。 これで security update を逃さない。

アイマス映画「輝きの向こう側へ!」 (2回目) 舞台挨拶

THE IDOLM@STER MOVIE 輝きの向こう側へ! 2 回目を見てきた。 (日記: 1 回目 01/25)

TOHO シネマズ渋谷 18:35- の舞台挨拶つきの回でした。あずみんと若林さんとあっきーとばねP。 前から3列目くらいで良かった。「泣いちゃえよ〜」「泣きませんよ!」のくだり良かった。みなさんかわいい。あと、ばねPすごいなあ。いろんな意味で。

あずみんの「アイマスですよ、アイマス!」もよかった。

映画本編は前回とはちがってさすがにずっと涙目とかではなかったけど、やっぱり終盤で春香のセリフにやられ涙腺が崩壊したのと、やっぱりライブシーンでも涙腺崩壊しました。ライブシーン、繰り返し見たい。雪歩かわいいし星梨花ちゃんかわいいしみんなかわいいし、いおりんすごく良い子だし、やっぱり良かった。

前回見逃した響が遠くでおいしそうにごはんを食べてる表情もみた。後はやっぱりはるちは食傷気味な気がする。

次回以降はいよいよ前売券の消化に入ります (残 3 枚)。平日とかにいくと思う。

Maze party @ 渋谷 OTO

に 16-18 時頃いた。Qrion さんのまで見たかったんだけど、前述のアイマス舞台挨拶とかぶっていたので断念…

なにも考えずにみなさんの事をフォローしていたら Qrion さんからフォローバック飛んできて名前も呼ばれたのでびっくりしてしまった。

インターネットすごい! (こわい)

渋谷からの帰りなんか視界が霞んでみえる、霧か、気の所為だろ、と思ってたら濃霧注意報出てたらしい。めずらしい…

2/4 誕生日です

というわけで wishlist はこちらです。よろしくお願いします。 http://amzn.to/sora_h

Kindle 本などはギフトできないので Amazon ギフト券 (メールタイプ) でもらえるとよろこびます。 gift -at- sorah _dot_ jp までよろしくお願いします。

iTunes Gift もうけつけております。

SSL 証明書をかった

sorah.jp の MX が今 1 台に減ってしまっていてやばいなーと思ったので別サーバーに postfix をつっこんでいた。といっても puppet module を include するだけで DKIM と SASL までちゃんと設定してくれて過去の私偉い! なんだけど、SSL 証明書が…

今迄、俗にいうオレオレ証明書でだましだましつかってたんだけど、もう一方のサーバーの証明書も切れてたしこれを気に SSL 証明書を注文してみた。CA.pl よくわからないし諦めた。

本当はワイルドカード証明書が欲しい。

Published at 2014-02-02 23:00:00 +0900

2014-02-01: にがつついたち

人を泊めたことも重なって速く寝たので10時には起きていた。

私設インフラ業

日中は個人インフラで諸々いじっていた。value-domain の DNS から脱却するため残っていたDDNSの部分を r53 api でできるようにおきかえたり。awscli 便利だなぁ。

Docker

Docker もポピュラーな distro を VM にいれて試したりはして見たんだけど、がっつり使って見てなかったので普通に常時動かしている Gentoo server に突っ込んで puppet manifest も作った。

諸々自分のための Gentoo イメージを作ろうとして力が尽きた。

デプロイ周りもすでに普通にcapでやっていたりとそんな困ってないので積極的に Docker に移行する必要はないかなぁ。確かにすぐに他のホストに動かせたりして便利そうだけど、今もpuppet manifest適用してデプロイし直すだけで動くし。捨てるかもしれない変更を試す時には便利かもしれない。

ツールを実装してる言語の作法から切り離して配布したい/してほしい

ただツールをインストールして使いたいだけなのに、それが ruby なり perl なり python なりといった LL で実装されているとその言語の環境を用意しないといけないの、めんどうくささとだるさがある。導入のハードルが上がる。

例えばawscliって今pipでいれるようになっているけど、万人に使って欲しいツールはそれぞれのLL言語の作法というか文化というか、パッケージマネージャなりbundler/carton/virtualenvみたいなものに依存しないで配布した方が色々楽だなーと思った。

ただツールを使いたいだけなのに、自分で使うわけでもない言語の環境整備からはじめないといけないのはハードルが高いしだるさになる。自分は Ruby には慣れてるから gem install / bundle install して使うツールは楽だけど、みんながそうなわけではない。

他にも Distro のパッケージマネージャーが変にその言語の環境、パッケージマネージャーと無理矢理気味に連携していることもあるので、変にそういうところで罠を踏みたくなくて結局1からいろいろ入れて行くみたいな感じになる。だるい。やるけど。

例えばtd-agentはRubyインタプリタごと含めてパッケージになっているけど、そこまでしなくてもいいので必要な依存パッケージを全部くるめたtarball/各distro用パッケージを簡単に用意できるといいなぁ。そういうツールを作るといいのだろうか。

後、そういう意味では go lang は強くて、バイナリパッケージにすぐできるからいいですね。ビルドも手軽そうだし。

クラッシュバンディクー(初代) をプレイした

こないだクラッシュバンディクー(初代)に言及したのもあって(また)やりたくなっていたので PS アーカイブで購入して遊んだ。8pm-2am で "クールなピンストライプ" までやった。3つ目の島まで突入してるから2/3くらいかな。

遊んでて思ったのはこのゲーム、2からは解消しているものの初代はレベルデザインがやっぱりおかしい、難易度高すぎる… でも、慣れてくるから人間すごい。

まずセーブがステージ中にアイテム三つ揃えてボーナスステージをクリアする(チャンスは一回)必要があって、これにこけるとゲームオーバー時にだいぶ前まで引き戻されてしんどいはめになる。"トカゲでだいジャンプ" はそれで何度もプレイしたけど、最後はノーミスあるいは1ミスくらいでクリアできるまで慣れてしまった。人間すごい。

しかし数年おきにこれを一からプレイしている気がするけど、今回が一番進めている気がする。ペースも。

あとは奥スクロール、ちょっと時代を間違えているような気もする。3DSでやりたいですね。

Published at 2014-02-01 23:30:00 +0900

2014-01-28: いちがつにじゅうはちにち: Asakusa.rb #245

Asakusa.rb #245

海外ゲストが来ていた。途中から絵馬亭 へ。

  • heroku の www.ruby-lang.org のやつってほとんど static file なので実は rack app ほとんど仕事してなくて heroku router で全部さばいてるんじゃないって気がしている

    • dyno 0 にしてもうごくんですかね、やってみよう
    • だめでした
  • Apache Cassandra Evangelist! ほうほう

  • わたしは retrobot をいじってました (後述)

英語しゃべれなくてつらい思いをした。精進したい(といってる内はなにも進歩しないのだろう)

retrobot

tl;dr retrobot@sorah_retro で動かしはじめました

retrobot とは

retrobot という物がある。これについては 1年前の自分と暮らす - 昼メシ物語 をみてもらうとして、ようするに tweets.csv から 1 年前の tweet をツイートしてくれる bot script。

もともと @mirakui_retro からはじまり @ryopeko_retro, @negipo_retro だけだったのかここ数日で(mirakuiのブログが影響なんだろうけど)増えてたので流れにのった。というより、1年前のツイートをざっとみた結果まあ耐えられるだろうという感じで。(ちょっと前は無理だった)

(1週間前から黒歴史、わかる)

観測できている retro bot たちはこのリストでまとめています。suggestions are welcomed. https://twitter.com/sora_h/retrospective

パッチもおくった

というわけで動かそうと思ったんだけど、その前にうごかそうとしてうーんめんどいとなった理由がいくつかあって:

  • gem になってないのでデプロイがめんどうくさい

    • gem になってると Gemfile に retrobot と capistrano を入れて Capfile 書いてデプロイどーん (ちゃんとデプロイスクリプトもアプリケーションと分けたリポジトリで git 管理できる!) ができる。サーバー運用上きもちわるくならない
  • 設定が環境変数あるいは dotenv 経由なのでいやだ

    • ENV は時によって insecure だし設定ファイルと dotenv 何がちがうのかよくわからない

とおもって放置してたんだけど、このたび重い腰をあげてパッチを書くことにして、書いた: https://github.com/mirakui/retrobot/pull/5

わりと大規模改修なので事前に確認をとって go ahead 言われたというのが一番やるモチベーション上げたかもしれない。大規模な改修になるから元のコードスタイルを尊重したつもりができてないこともあって、心象が悪くなるかもしれないとか思っていたりした。が、方向として ok がでれば reject される心配はなさそうだった、という具合。

うごいています

というわけで、うごいてます: https://twitter.com/sorah_retro

アイコンは今 @sora_h のアイコンと同じ人にかいてもらっていて、当時(数年前)もう1枚描いてもらったやつ。

デプロイ先はさくらの VPS です。

CD / iTS

M@STERPIECE、発売日当日配信、カラオケも当日配信っていう気の入りよう… (アイマス曲の当日・先行配信はぷちますの twelve seasons 以来 1 年ぶりじゃない?)

いやしかし M@STERPIECE なんか聞いた瞬間に何かぐっとくるものがあって、映画の印象が強すぎるなぁと思った。とても良いです。はやくききたかったので先行配信から買ってしまった。CD はそのうちくると思う。

iTS では以下。アルバムは今買うと給料日前しんどくなりそうなので一旦自重。

CD は以下。

THE IDOLM@STER LIVE THE@TER PERFORMANCE 10 アイドルマスター ミリオンライブ!
高坂海美(上田麗奈),徳川まつり(諏訪彩花),宮尾美也(桐谷蝶々) 四条貴音(原由実) 原由実 四条貴音(原由実) 徳川まつり(諏訪彩花) 高坂海美(上田麗奈) 宮尾美也(桐谷蝶々) 上田麗奈 諏訪彩花 桐谷蝶々
ランティス (2014-01-29)
売り上げランキング: 146

日記の行間幅を

この日記って游ゴシックつかえる人は游ゴシックで見えるようにしているんだけど、なんか行間が妙に広すぎるので line-height を指定してみました。一応ヒラギノ角ゴ (OS X, Chrome / Firefox) と Meiryo (Win 7, Chrome) でも問題なく表示されることを確認してあるけど、万全じゃないと思うので崩れていたらお知らせください。

Published at 2014-01-28 23:55:00 +0900

2013-12-03: じゅうにがつみっか: Asakusa.rb #239

Asakusa.rb #239 でした。英語力の無さを感じますね。ええ。


出社直前に家のネットワークが突如死んだので放置して出社した。

帰宅後に調査したんだけど、症状は:

  1. 外部に疎通できない (PPPoEセッション 2 つとも落として再接続にコケてる)
  2. 外部に疎通できなくなったと思ったらルータの管理画面に 80/tcp で到達できなくなった (curl でも Can't assign requested address, Chrome は ERR_INVALID_ADDRESS)
  3. でも Ethernet でつながってるマシンからは管理画面到達できるなぁ

この場合疑ったのは 4 つで、

  1. ルータの Wi-Fi 部が死亡
  2. ルータの WAN ポートが死亡
  3. VDSL モデムの不調
  4. VDSL←→ルータの接続がおかしい (ケーブル)

とかだった。とりあえず何度か VDSL モデムとルータを再起したりしたものの改善せず。

調査していて気付いたのは起動しっぱなしで転がってた MBA 11" から管理画面には疎通可能だったという事で、 どうやら偶然マシンも不調になっていたっぽい。ふしぎ。

なのでとりあえず Wi-Fi がおかしいという不安は解消されたし、実際当該マシンも再起動したらちゃんと直った。絶妙なタイミングかなんかキャッシュかなんかがおかしかったのかなあ(ネットワーキングは疎いのでわからない)

とりあえずだとすると残る問題は ルータから PPPoEセッションが貼れない問題なので、まずWANポートからケーブルをぬいて MBA に刺して直接 PPPoE を試みるもつながらない。うひー。

あまっていたイーサネットケーブルにおきかえてみたらつながった、が、これは短くてそのままルータまではもっていけなさそう。 うーん、買うかなあ、と思ったけど元のケーブルをVDSLモデムにさしなおしてみたら難無く接続された。なんだったんだ…

というわけで結論は 4 でした。解決してよかったですね。窒息死は免れそうです。


昼過ぎにヒカリエ倒壊の情報が流れてたけどこの件だったらしい。

公式でヒカリエが倒壊していませんと tweet されるの だいぶおもしろい状況 だと思う…


VAIO Pro 11 買った - shyouhei.tumblr.com を見て。

VAIO Pro 11, 素直に Linux が入ったらしいし普通に軽くて値段もそこそこなので興味がある。US 配列あるし…

実際確かに MBA 11" より軽かったけどまあ頑丈さには欠けそうな感じがした。 横幅は MBA 13" についているキーボード部分の溝とほぼ一緒だった。マシンの横幅がそれなのでそこからさらにキーボードの横幅がせばまるかんじですね。慣れなんかなあ。

いまのところ OS X で強く依存しているのは iTunes, YoruFukurou くらいなのでなんとかできる気もするけど…うーん。

冷静に考えて資金はないので夢物語ですね。

Published at 2013-12-03 23:30:00 +0900

2013-11-29: じゅういちがつにじゅうくにち: rbug#8872, 弐寺SP5級ほか

勤怠締めた。今月もお疲れさまでした。


rails/rails の方に segv 直したわーという pull request が飛んできていて何事かと思ったら regression が発生していたらしい。

どうやら Bug #8872 (commit: r42869) で case 文が === メソッドを呼ぶときに refinement を考慮してやる変更をした時に method_missing 含め、メソッドが存在していなかった時の事を考慮してなかった。

つまり === が未定義 (Proxy とかでつかう BasicObject を直接継承したクラスだとわりと有り得る) だと取得してきた method_entry が NULL で SEGV していた。

とりあえず r43913 で直したけど、そもそも r42869 自体どうなんだと今更つっこみがはいってきたりしている。どうなるのかなあ。


gdb が Xcode 5 で消えてしまったのでデバッグつらすぎる。make lldb できるようにするかなあ。


RubyForge が終わるそうです。


弐寺、SP 5 級到達した。なのでそろそろ☆ 5 に手を伸ばします。

最近 jubeat やってなかったから Lv10 で A とりにくくなっててウケる。

あっ PASELI… あっ


すいません、techlion はいつも通り格好でいきます。

Published at 2013-11-29 23:30:46 +0900

2013-11-09: #isucon 3 参加記

予選を通過した #isucon 3 に参加してきました。おつかれさまでした! (予選の様子はこちら)

PB098528.jpg

結果から言うと最終計測で fail してしまった。無念。人権がない。うまくいけば 20k くらいは乗れただろうけど fail したのでそんなのは関係がない。

以下、自分のチームが何をしたか等。

... Continue Reading...
Published at 2013-11-09 23:30:00 +0900

2013-10-12: "師弟登壇・新米サムライの集い 2013" に行った

各社いろいろと研修でフォーカスしている物・目指している物がちがっていて大変面白かった。 しかし Kayac の研修はだいぶ濃い感じだった… ペパボ社は毎日なにかしらの座学があったりとかしてボリュームあるなあ、とか。DeNA からは愛を感じましたね。

Published at 2013-10-12 21:00:00 +0900

2013-10-06: #isucon 3 予選まとめ

ISUCON 3 の予選、土曜の方に参加していました。 まず、とても楽しませていただきました。運営の方おつかれさまでした!

結果の方は、悔しいことに 1 日目 5 位以内には残れなかったのだけれど、 暫定予選通過チームを除いた 2 日通しのランキングで 3 位に残る事はできたので、 一応 (暫定) なんとか本戦には出場できる様子。

で、予選で何をしたかだけれど、問題については 公式の解説記事 を見てもらうとして以下に残します。

尚、使用言語は Ruby でした。スコアは 10813.4。

チーム “白金動物園”

  • mirakui, rosylilly, sorah
  • パンダ、ハト、(>ヮ<)/ ?
  • 白金台方面から参加
  • mirakuiと私がopsもしていた (記憶)

最終的に手を加えた事

middlewares, app

  • Ruby 2.1.0dev, redis が入った

httpd

  • Apache ではなく nginx をフロントにして unicorn にリバースプロキシするようにした
  • unicorn のワーカ数は 50 だったはず
  • static_gzip で css,js とかをさばくようにしたけど、同じマシンの上でベンチがはしるのでむしろ gzip きったほうがよかったみたい

app

  • ユーザの新規登録という機能が存在しないため、user_id→username の結び付けを記録したファイルを —init のスクリプトで生成、アプリ起動時に読み込んでメモリ上に保持
  • memcached もどきに private=0 なメモの総数をキャッシュさせた
  • memcached もどきに SELECT * FROM users WHERE id=? をキャッシュさせた
  • markdown のレンダリングを redcarpet にした
  • html カラムを memos に追加し、POST /memo で INSERT 時、あるいは GET /memo/:id で html カラムが null の場合 (初期データ) で書き込んだ。
  • ↑ /memo/:id の時は redis の publish でデータだけ別のプロセスに投げて、そのプロセスに UPDATE を発行させていた。
  • GET /, GET /recent/:page でリストの生成を app.rb でやらせた。(view で処理すると遅い)
  • あんま効果なかったけど session[token] を sha256 から md5 にしたりした。user_id をそのまま返そうと思ったけど悪魔っぽいからやめた。

MySQL

ALTER TABLE `memos` ADD COLUMN `html` text;
ALTER TABLE `memos` ADD INDEX `idx_1` (`user`,`is_private`,`created_at`);
ALTER TABLE `memos` ADD INDEX `idx_2` (`is_private`, `created_at`, `id`);

SQL

GET /

users へのクエリを消しました。それ以外は変化なし

GET /recent/:page

Before

SELECT * FROM memos WHERE is_private=0 ORDER BY created_at DESC, id DESC LIMIT 100 OFFSET #{page * 100}
SELECT username FROM users WHERE id=?

After

SELECT created_at FROM memos WHERE is_private=0 ORDER BY created_at DESC, id DESC LIMIT 1 OFFSET #{page * 100}
SELECT * FROM memos WHERE is_private=0 AND created_at <= ? ORDER BY created_at DESC, id DESC LIMIT 100
-- users へのクエリは消えた

GET /memo/:id

Before

SELECT id, user, content, is_private, created_at, updated_at FROM memos WHERE id=?
SELECT username FROM users WHERE id=?
SELECT * FROM memos WHERE user=? #{cond} ORDER BY created_at

After

SELECT id, user, content, html, is_private, created_at, updated_at FROM memos WHERE id=?
-- users へのクエリは消えた
SELECT * FROM memos WHERE user=? #{cond} ORDER BY created_at, id

POST /memo

Before

INSERT INTO memos (user, content, is_private, created_at) VALUES (?, ?, ?, ?)

After

INSERT INTO memos (user, content, html, is_private, created_at) VALUES (?, ?, ?, ?, ?)

Gemfile

gem 'rack-mini-profiler', '0.1.31'
gem 'redis'
gem 'redcarpet'

コミットログが 後半になるにつれ徐々に酷くなり焦りを感じているのがわかって おもしろかったですね。ええ。

反省

  • memcached が memcached じゃない事にきづかなかった。いろいろキャッシュさせようとして、Dalli がなんか marshal data too short っていってくるなーと思ったら、MySQL だったんですね… varcharとかの長さ不足だとしたらなっとくだわー。次回からは netstat -lp します。
  • Web アプリケーションにはビューっていうのがあるんですよ。。。なんでviewに手をいれるのが終了1時間前なの。
  • Redis とかのパフォーマンスチューニングの予習忘れてた。やっておこう
  • KLabの方と同じように、bin/markdown は普通にプロセス起動してるし重そうだなーと思っていたけど、HTML 構造変わりそうで夕方までさけてた。試すだけなら試せばいいのに… (それやっただけでスコアが跳ね上がった)

その他

  • memcached もどきへのキャッシュでうまくいかず、redis に変えたら redis 側がネックになったきがしたので多様しなかった。
  • 思えばキャッシュしたところは user_id→username の部分と total のカウントと SELECT * FROM users くらいだ。memcached もどきという事にきづいていろいろキャッシュさせたらさらにスコア上げられたのかも。
  • rosylilly が HTTP インタフェースをもったスキーマがハードコードされた go 製のシンプルな DB を書いていたけれど、エラーを潰しきれずあきらめた
  • ↑を書いてる途中で go 組込みライブラリのバグを踏んだらしくパッチができた。
  • Ruby 2.1.0dev にある ”f リテラルを使っても問題なさそうなところにひたすらつっこんでいったらスコアが若干落ちた。詳細は追ってない。ベンチツール公開された暁にでも。
  • ほんとどうでもいいけどベンチツールが go だってわたし気付いてたよ。

クックパッド株式会社ではエンジニア・デザイナーを積極採用しています

時系列での出来事一覧

どうでもいいけど changelog.vim と ChangeLog で行動ログとるのオススメです。

10:00

  • 「じゃー11時開始だし10時集合にしましょうか」…(翌日)…「ごめんなさい10時開始でした!」
  • AMI からインスタンスを用意、あらかじめ用意しておいた authorized_keys を投入して作業開始

10:30

  • htop とか ruby のビルドに必要な諸々を入れた
  • あらかじめrbenv入れてsvn coしてtrunkをビルドするスクリプトがあったので、とりあえずそれで Ruby 2.1.0dev を入れた。終盤投入してみたけどその結果は後述。
  • mirakui「今回 private フラグとかセッションがある!」
  • webapp ディレクトリをgit管理下にしたりした

10:40

  • コード読みながら SHOW CREATE TABLE したり EXPLAIN 叩いたり
  • GitHub wiki にまとめてた

11:00

Score: 2510.6

  • ほぼ初期のコードで, tcp/80 を nginx に切り替えて unicorn (UNIX socket domain) にリバースプロキシする構成にした状態のスコア

11:15

  • total カウントキャッシュできるんじゃないか、とおもってとりあえずmemcached(もどきだったけどね)に入れた
  • mirakui がベンチマークの傾向をさぐりつつ、rosylilly が rack-mini-profiler をいれたりしつつ、わたしはmarkdownのキャッシュにとりくんでた
  • 「セッションが2リクエストまでしか使いまわされないっぽい、うける」

11:24

  • rosylilly「やっぱ Go で DB かきなおせる気がしてきたわ」

11:35

  • last_access つかってんのかなーと思いながら放置

11:40

  • 「my.cnfがみあたらない」「えー」「locate cnf|grep $cnfしてさがすといいかも、よかったlocateうごいてて」

12:00

  • mysqlのquery,xqueryメソッドをモンキーパッチしてstdoutにクエリと時間を表示するように

12:15

  • 「user_id から username 引いてくるクエリが多すぎるしなんとかしたい」
  • 「新規登録という概念ないし、とりあえずファイルに落としておいてアプリで永遠に保持しとけばいいのでは」
  • やりました (CSVもどき吐いて起動直後からずっと保持)

12:19

  • 「おい今本番ぶっこわれてんぞ」「えっ」
  • 「あれーisucon3 benchでカラムとかindex消えるーー」
  • 「あっ —init で初期化後の処理決められるみたい、そこでやらないとだめそう」

12:20

  • get /memo/:id のよくわからないループとかなんだろう (SELECT * FROM memos WHERE user=? … ORDER BY created_at)
  • あーolder, newerメモのやつか、とりあえず to_aつかったり each_with_index いれて読みやすくした

13:00

  • rosylilly「goのDB実装だいたいできてきた、アイアムザヒーロー~」

13:10

  • mirakui が Cache-Control をいじるも既に Cache-Control をいじる実装がある事にきづいておらず、ベンチでエラーがでる

14:00

  • htmlカラムを追加、新規にweb app経由でポストされたデータについてはPOST時に、初期データについては最初にレンダリング走ったタイミングで redis.publish して別プロセスで mysql に UPDATE をかけるようにした
  • バックアップがわりのAMIつくるときにまちがえて reboot が走る事故
  • markdown 生成で一時ファイルをやめてパイプをつかうようにした

14:25

score: 5170.3 (fail 1)

14:45

  • mirakui が /recent のクエリ改善をする

14:55

score: 5438

15:47

score: 5368.5

16:10

  • sorah「うっ5位から漏れてる…」

16:25

  • get_user をキャッシュするように

17:00

Score: 8667.5

  • redcarpet を投入。KLabの方 と同じように, HTML 構造が変わってダメだと思いこんでやってなかった。やって戻せばいいだけなんだからさっさとやるべきだった。反省

17:10

Score: 8800

  • たしか Ruby 2.1 を投入
  • sorah「そういえば views 以下まったく見てないなあ」rosy「えっ…」sorah「Webアプリケーションにはviewってのがあったんだよなあ。はー」

17:30

  • GET /recent, GET / のリスト生成を app.rb 側でやる (view (erb, erubis) にやらせない)

17:45

  • セッションidを MD5 にして毎回乱数生成器を作るのをやめる

17:50

  • クエリ改善をする

18:00

Score: 10813.4

Published at 2013-10-06 23:26:00 +0900