2013-12-06: じゅうにがつむいか: #makimoto

PC069076.jpg

Ruby 開発者会議だった。あと、まきもと Ruby 会議 でした。

まきもとRuby会議には途中からまざったのだけど、彼のメガネが @tagomoris の手によってビールにつっこまれているところとかを眺めていました。

PC069131.jpg

↑犯行の様子です。

PC069139.jpg

そのたの写真: http://www.flickr.com/photos/sora_h/sets/72157638420369493/with/11241957706/


git-new-workdir, 大きいトピックブランチにコミット後、master の working copy で先に cherry-pick とかできて便利。 コミットオブジェクトが共有されてるから、複数のブランチの working copy をつくっておいて、別のところで cherry-pick なりなんなりできるというわけ。


おまけ。

PC069087.jpg

Published at 2013-12-06 23:50:00 +0900

2013-12-05: じゅうにがついつか: Ruby 開発者会議

Ruby 開発者会議だった。明日もあるよ。

通訳のまつもとさんと、ピザ切り係のまつもとさんだった。

あとやっぱり英語が下手だなあ私、とおもいました! (またいってる)


Rails 3.2.16, 4.0.2 の TranslationHelper#.translate:raise を渡したときの regression を見つけていて、修正がマージされた。マージされたのは初。

https://github.com/rails/rails/pull/13183

(パッチは過去に一度出してるけど、別のパッチで解決されてたのでマージはされてない。)

Rails Contributors 乗った。 http://contributors.rubyonrails.org/contributors/shota-fukumori-sora_h/commits


性別誤認事案が増えてきています。asakusa.rb とかいくとき客引き寄せつけなくて便利という事に(言われてみて)きづいた。


日本で働く githubber が。 https://github.com/blog/1702-christopher-frederick-is-a-githubber


どこでもはてなスター対応させました http://s.hatena.ne.jp/siteconfig?host=diary.sorah.jp

Published at 2013-12-05 23:00:00 +0900

2013-11-30: じゅういちがつさんじゅうにち: #techlion, #asonama

PB308942.jpg

TechLion にいってきました。ただ、その後にまたasonamaに会いに行ったりしたのでLT前に離脱しました。(無念) 久々に sinsai.info の時にかかわった人とか、ほかにもいろいろ会えたのでそれだけでだいぶ良かった。

http://www.flickr.com/photos/sora_h/sets/72157638214121506/


PB309034.jpg

というわけでまた asonama にあったのと、mactkg に数ヶ月ぶりにあった。 ほっこりする。

PB309014.jpg


S3とかにどんどんいろいろ投げるようにしてたらなんか回線の調子が…あれぇ…

Published at 2013-11-30 23:50:00 +0900

2013-11-23: じゅういちがつにじゅうさんにち #ぶつかり稽古

PB238839.jpg

ぶつかり稽古に行ってきた。もうちょっと稽古長かったほうがよかったのではとおもえる程あっという間だった。

vim であんちぽさんが ^Z でバックグラウンドにまわしていたため kan さんが swp ファイルに苦戦したりとかしていたのを眺めてた。


https://github.com/sorah/akane

8 時間くらいでそれなりにテスト書いてよさげなクラス設計でそれなりのプロダクト動くところに到達できて満足した。

単体テストで他クラスは全部mockなりでガリガリTDDして、最後にいざ動くかテスト〜ってやって、まあダメだったけど10分くらいの修正で動くところに到達できたので自己満足度高い。

Published at 2013-11-23 23:30:00 +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-11-03: じゅういちがつみっか: 工陵祭+unsigned2013

PB038435.jpg

久しぶりに湘南新宿ラインと快速ラビットにのりました。

で、小山高専工陵祭 の一企画である unsigned2013 にいった。たのしかった!

PB038489.jpg PB038414.jpg PB038418.jpg PB038439.jpg

PB038501.jpg

るーくちゃん の様子です。

音研のアルバムもらったので明日の夜にでも rip しますかね。


ララスクエア宇都宮、ダイソーと同じフロアに CD ショップ移動してたし、本屋のフロアからは CD ショップが消えて xebio とアウトドア用品店が入っていていろいろかわってた。

また漫画買ってる。クズが…

ホリミヤ(3) (Gファンタジーコミックス)
HERO 萩原 ダイスケ
スクウェア・エニックス (2013-04-27)
ホリミヤ (4) (Gファンタジーコミックス)
HERO 萩原 ダイスケ
スクウェア・エニックス (2013-10-26)

Web にある原作も読んだりしたけどやっぱりこういうほわほわするの好きだなーと思う。


Ted (映画の方) があったので見てた。クマ風情が。ほんと酷いこれ。

しかし聞いてた通り 本当にくまモンでてきた。クマ風情よりくまモン。

映画の内容的に苦手なのは分かっているのだけれど、この字幕を見たいがために見た(事前に知ってた)感じ。


Atom の netbook に Gentoo をセットアップするのはビルド時間的に心が折れそう。distcc 先のホストは今手元にない。

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

2013-10-31: じゅうがつさんじゅういちにち: Kuniaki.rb #1

10月ももう終わりかー。

Kuniaki.rb #1 でした。ゆるりとしていた。スマートニュースのオフィス広かった。 (小並感)


(追記)

gfx にまどマギの色紙がいらないらしいのでもらって、あけてみたらまどほむでした。ありがとう!

Untitled

Published at 2013-10-31 23:00:00 +0900

2013-10-26: じゅうがつにじゅうろくにち: #rakutentech 2013

楽天テクノロジーカンファレンスでしたが、寝坊したので @a_matsuda のトークから聞きにいった。

最後ゲストカードを回収するときに、その投函先でアンケートを行う試みは良かった。

PA268257

Beer Bash は食べ物のトングが紙の使い捨ての奴だった事はなんとかしたほうがいいのではと思った。

PA268253

おまけ。

PA268227 PA268231 PA268233 PA268234

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

2013-10-23: じゅうがつにじゅうさんにち

IMG_6735 IMG_6740 IMG_6741

Kawasaki.rb にいってきた。quine relay ほんとうにやばすぎる。100言語版がたのしみですね。

quine relay のなかで通過する、INTERCAL っていう esoteric language がおもしろかったので紹介:

if "PLEASE" does not appear often enough, the program is considered insufficiently polite, and the error message says this; if too often, the program could be rejected as excessively polite.

"PLEASE" が一定の頻度で出現しない場合、プログラムは失礼とみられエラーとなる。逆に、出現しすぎている場合も丁寧すぎるとエラーになる。

なので http://en.wikipedia.org/wiki/INTERCAL#Hello.2C_world にあるように一定頻度で PLEASE とお願いしないといけない。じわじわきた。PLEASE GIVE UP っていうのもすごくよい。


ハト が勧めてくる漫画が自分の好みにマッチしすぎていて大変に困る。

可愛くて身動きがとれない。

booklog 等から好み推察してるとのことです。

というわけで、下記、オススメです。まじかわいい。

煩悩寺 1 (MFコミックス フラッパーシリーズ)
秋★枝
メディアファクトリー (2010-08-23)
煩悩寺  2 (MFコミックス フラッパーシリーズ)
秋★枝
メディアファクトリー (2011-12-22)
煩悩寺 3 (フラッパーコミックス)
秋★枝
メディアファクトリー (2012-12-22)
Published at 2013-10-23 23:00: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