ぱいぱいにっき

Pythonが好きすぎるけれど、今からPerlを好きになりますにっき

#yokohamapm は明日ですよというリマインドと

ども、マコピーです。Yokohama.pm 副リーダーをやっております。

Yokohama.pm #11 : ATND

リマインドですけれど、明日なんでね、皆さん要チェケラです。
補欠だった方も何人か繰り上がっているので確認しておいて損はないと思います。

以下余談。
あと以下の記述は僕の所属している団体には全く関係ございませんので、ご了承ください。僕自身の考えです。

今、pmがアツイという話。

Gotanda.pm #1 告知までにやったこと - 時計を壊せ

というエントリを見ての便乗エントリです。
Gotanda.pmもそうですが、Yokohama.pm、人数が溢れております。まあそれだけニーズが有るということなのかなと思っており、こういうイベントは皆さんガンガン開催しても損はないと思います。
Perlコミュニティに元からいるからその宣伝効果でしょう?」みたいなことを思われる方もいるかと思います。でも開催したいという方は僕に相談してください。宣伝しますし、行きますし、人も呼びます。

Yokohama.pmをやるモチベーション

もともとYokohama.pmという勉強会があり、これはもともと1年に1回程度の頻度で行われていたのと、@yusukebeさんが引き継いで、さらに僕もそこに乗っかることで3ヶ月に1度にやるみたいな感じに今はなっております。というか明日やって初めてその3ヶ月ごとになったって言える感じですね。

で、これはよく聞かれるんですが、「なんでお金ももらえないのに勉強会の開催なんてするのか」という質問の回答です。

正直に言うと半分弱は会社の宣伝です。今僕が働いている会社は面白法人とかいうやつで、今回ライブコーディングをやっていただく@songmuさんも同じ会社の先輩です。ですが、まあ以下のエントリのとおりです。
退職とFA宣言のお知らせ | おそらくはそれさえも平凡な日々
この記事に書かれている通り、弊社は絶賛サーバサイドエンジニアを募集しており、さらに今は横浜にオフィスがあるので、その近くで勉強会やったら興味持ってもらって〜っていう流れが作れるのかなとか思っております。
HTMLファイ部 新メンバー募集 | jsdo.it
こんなかんじでHTMLファイ部のメンバーも募集しているみたいですが、技術部も絶賛募集中でございます。毎日fujiwaramonitoring casualを体験したい方もぜひ。
fujiwaramonitoring 開催を希望する声 - Togetterまとめ

で、後の半分は雑多な何かです。内訳は、

  • ビール飲みたい
  • 司会業してみたい
  • 勉強会開催して持ち上げられたい
  • もっとPerlのことを知りたい
  • Perlのことを知ってもらいたい
  • 勉強会でいろいろ試行錯誤してみたい

という感じでございます。仕事上Perlをガッツリ書く人間ですので、飯のネタにもなって一石二鳥というわけです。学びがある。

趣向を毎回変える

「勉強会でいろいろ試行錯誤してみたい」というところに通じるのですが、前回は金曜日の夜にやったYokohama.pmですが今回は計画段階から土日にやりたいというのは決まっておりました。
Gotanda.pmは土日を避けると言われていますがあえて土日に今回やるのかという理由は「参加者層を変えるため」です。
世の中いろんな人がいて、その中には平日夜の勉強会に来れるけれど土日は無理という方やその逆の方もいます。
そんでもって僕はこの勉強会で何がしたいかというと、色んな種類、いろんな人としゃべくりたい、コミュニケーションとりたいので、そこは万遍なく行こうという感じです。
なので、テーマや形式(LTとかそういうの)も固定化せず結構流動的にやっていきたいです。

このあたりはhachioji.pmに影響されたところがでかいです。というのもHachioji.pmに行くと「固定メンバー+初めての人」という人数構成が大体あって、固定メンバーで安定感を出しつつかというって初めての人が来れるコミュニティみたいな流動性もあって、そういうのいいよな〜って思っています。
Yokohama.pmの今回の参加者リスト見ると内輪感高いみたいなのを思われるかもしれません。でも、そんなことはなくて、なんでかというと内輪感高い人達はたいていHachioji.pmの人だからです。
あと、運営としては内輪的なのをガンガンぶっ壊していくという感じです。前回、IRKitの@maaashさんに喋っていただいたのも結構そういう部分がでかいです。
もちろんいつも来ている人も重要なので「いつも行っているから今回は遠慮しようかな」という考えは決して起こさないでくださいw ガンガン来てください。ガンガン来てしゃべくってください。各位よろしくお願いします。

そんなわけで

たぶんイベント、結構テーマというか、モットーというか、信念を持ってやるというのがそこそこ重要で、Perlもそのモットー(TIMTOWTDI)があるからこそ、今までやってこれたわけで、そういうわけなので一応僕なりのモットーをここで披露しておくかという話でした。

以上です。

sublime text3の環境を整えた

はいそろそろ夏、マコピーです。

きっかけ

最近Golangを書くことがあって、それを普段使っているvimで書こうとするとなかなか重い(補完あたりが悪さをしているっぽい)ので、この際だし深追いせずにGoを書く時はSublime Text3にしようかなと思い立ちました。

あとここ1年ぐらいはMacVim-Kaoriyaを使っていてコンソールのvimを使っていなかったのでGUIしかないSublimeであっても違和感がないかなーっていうのも理由の一つ。

インストール

homebrew-caskで入れました

$ brew cask install sublime-text3

参考:
みんなhomebrew-caskって知ってるか? - Qiita
2013年度 MacbookAirクリーンインストール祭 - パルカワ2

ちなみにひさいちはさっきMacbook Airにビールを飲ませたらしく、環境構築に関してはこれあるから大丈夫そうだけれど、まあがんばってほしいと思いました。

まあTimeMachineのバックアップあるらしいけれど

Vim化する

Vim化するには以下の記事を参考にしました。
VimからSublime Text 3に移行してみた - norinyang メガ進化!
僕の使う大体の機能はだいたいこれでOK

あとOSのクリップボード共有なんですが、以下の設定で出来ました。

{
    	"vintage_use_clipboard": true,
	"vintageous_use_sys_clipboard": true
}

vintageousも使っているとvintageous_use_sys_clipboardも設定しないといけないので、vintage_use_clipboardだけやってなんで変わらないの????ってなってハマっていました。

よく使っているVimPluginの機能をSublimeでも使えるようにする

  • textobj-indent

textobj-indetはテキストオブジェクトを拡張してインデント単位でいろんなことを実行できるVimPluginです。
僕がよく使うのは"v"+"a"+"i"のストロークで同じインデント量の範囲を選択して、そのあと:を押して同じインデント料の範囲内だけで置換するとか、とか後述のtextmanipを使ってブロックを移動させたいとか、そういうときに使います。

で、sublimeでこれをどうやるかというといろいろ調べたんですけれど、Command+Shift+jでインデント単位で選択出来るらしく、
SublimeText2 - Sublime Text2 のショートカット一覧 - Qiita
これをKey Bindings - Userで調べると以下の様な感じで設定してありました。

{
    { "keys": ["super+shift+j"], "command": "expand_selection", "args": {"to": "indentation"} },
}

これをKey Bindings - Userの方にコピペして以下のように書き換えました。

{
    // textobj-indent.vim like selection
    {
        "keys": ["v", "a", "i"],
        "command": "expand_selection",
        "args": {"to": "indentation"},
    },
}

これでインデント単位の選択がv+a+iで出来るようになりました

  • textmanip.vim

僕はtextmanip.vimというプラグインを使っていて、特に選択範囲ごと上下左右に移動するという機能を使っています。
どういうプラグインかは以下の記事や上のツイートを見ていただければ。
Vim-users.jp - Hack #223: テキストを直感的に移動、複製する
僕は.vimrcに以下の様な設定を書いてtextmanipを利用しています。

xmap <C-j> <Plug>(textmanip-move-down)
xmap <C-k> <Plug>(textmanip-move-up)
xmap <C-h> <Plug>(textmanip-move-left)
xmap <C-l> <Plug>(textmanip-move-right)

で、選択範囲単位でどうやって移動するのかなと思って調べると、これもsublimeの機能として実現できるっぽいので、以下の様な設定をKey Bindingsに書きました。

{
    // textmanip.vim like
    {
        "keys": ["ctrl+k"],
        "command": "swap_line_up",
    },
    {
        "keys": ["ctrl+j"],
        "command": "swap_line_down",
    },
    {
        "keys": ["ctrl+h"],
        "command": "unindent",
    },
    {
        "keys": ["ctrl+l"],
        "command": "indent",
    },
}

左右移動は思えばただのインデントですね。こんなかんじです。

  • tagジャンプ

ctagsのtagファイルを使ったタグジャンプも頻繁に使っています。
Vim でタグジャンプを使ってみる - Archiva
これはSublime Text3からの機能らしいgoto_definitionで実現できそうです。

    // vim ctags jump like
    { "keys": ["ctrl+]"], "command": "goto_definition" },
    { "keys": ["ctrl+t"], "command": "jump_back" },

だいたいこの2つしか使っていないのでこれで大丈夫っぽいです。

今のところやったのはこのぐらいです。
あとはGoSublimeを入れて終わりかなという感じです。
DisposaBoy/GoSublime · GitHub

ためしに仕事のPerlのプロジェクトを開いてみてタグジャンプなどをしてみたところ思いのほか便利で、Perlのほうでも乗り換えられるのでは??という気分がしております。僕がそんなにVimを使いこなしていないせいもあるかもしれませんが……。

とりあえずこれでGolangを書いてみたいと思います。

追記: ctrl + aで数値インクリメント/ctrl + xでデクリメント

vimにあるctrl+aでインクリメントするやつ出来ないの?と言われて確かに使うなーって思って調べて設定してみました。
以下のプラグインを使えば出来そうです。
rmaksim/Sublime-Text-2-Inc-Dec-Value · GitHub
Package ControlでInc-Dec-Valueで出てくるので選択してインストール。
同じキーバインドにするには以下を設定する。

    // vim like inc/dec
    { "keys": ["ctrl+a"], "command": "inc_dec_value", "args": { "action": "inc_min" } },
    { "keys": ["ctrl+x"], "command": "inc_dec_value", "args": { "action": "dec_min" } },

これでOK

追記: alignをやる

今までvimで変数代入とかの整形(=alignment)をalignta.vimというプラグインでやっていました。どういうふうにやっていたかというと、exコマンドで:Align =とかいちいちやっていて、Perlのハッシュの整形は頻繁にやるので上のtextobj-indentと組み合わせて,(カンマ)+a+iで同じインデント量を選択して=>でalignというショートカットを作っていました。
sublimeだと以下のプラグインを使うと良さそうです。
Sublime Alignment – a Sublime Text Package by wbond
これもInc-Dec-Valueと同様Package ControlでAlignmentで出てくるのでそれでインストール。
vintageousのexモードで何かを実行するというのはよくわからなかったのでctrl+iに以下のように割り当てました。デフォルトのcommand+ctrl+aは指がツライので。

    // alighment
    { "keys": ["ctrl+i"], "command": "alignment" },

あとUser Prereferenceにも以下を設定。

	"alignment_chars": [
            ":",  "=", "=>"
        ],
	"alignment_space_chars": [
            "=", "=>"
        ],

追記その2:
alignment_space_charsなるオプションもあり、コレに入れとかないと=>とかが前のスペース無しでalignされてしまう。のでこれも入れておくことにしました。
カンマは誤爆がウザすぎるのでなくした。

vultrで立ち上げて3秒で公開鍵流し込みスクリプト作った

どうもマコピーです。春ですね。釣りタイトルです。3秒とか無理。

ところでvultrというVPSのサービスがあります。何が特徴かというとクレカ番号かPaypalで金を振り込んでポチるとすぐにヴァーチャルなプライベートサーバが立ってくれます。
これだけだとDigitalOceanと変わんないんですが、DigitalOceanにはないTokyoリージョンがあるので、SSHで遅延していらいらすることもない感じです。スバラシイ!
ただ、DigitalOceanと違ってサーバ建てるAPIがなく、Vagrantとかでカジュアルにサーバ買って即sshみたいなのは出来ないのでコマンド一発で公開鍵を流しこむスクリプトを作りました。

こちらです

vultr-add-rsa-key.pl

vultrでサーバ立ち上げた後に対象サーバのIPアドレスとあとgithubのアカウント名、それからhttps://my.vultr.com/settings/にあるAPIキーを指定すると公開鍵を流し込みます。
なんでgithubのアカウントかというとgithubで使う公開鍵、簡単に取れるんでそれ利用しています。ので接続する時は対応する秘密鍵を使ってね。ユーザ名もgithubのを使います。
あと最後にssh_configっぽいのを出力するので

$ perl vultr-add-ssh-key.pl --api_key=xxxx --ip=xx.xx.xx.xx --user=mackee >> ~/.ssh/config

とかすればssh vultrで即入れるので便利だと思います。ただし秘密鍵が~/.ssh/id_rsaに限る。試してはいない。

あとPerlです。たぶん誰かGo版とか作ってくれるはず。App::FatpackすればワンファイルになってSystemPerlでも動いてハッピーかもしれないがそこまではやっていない。
まあなんか、cpanmでLWP::UserAgentとかString::RandomとかNet::OpenSSHとか、実行して怒られたらIO::Ptyとか入れてください。

参考:
新しいVPSのVULTR、東京リージョンはじまった - uzullaがブログ

レコードなかったらINSERTして返すみたいなのする時に先にSELECTするとよく分かんない感じになる件について

相変わらずよくわかんないタイトルです。どうもマコピーです。

レコードがなかったらINSERTして返すみたいなのを確実にやる | おそらくはそれさえも平凡な日々
という記事があるのですが、INSERTする前にトランザクション内で先に読むとよく分かんない感じになって困るみたいな話をさせていただきます。

トランザクション分離レベルはREPEATABLE-READです。
トランザクション内で以下の手順でなかったらINSERTするみたいな処理があったとして

  1. SELECTする。あったらそのまま返す。
  2. 空だったらINSERTする。
  3. INSERTしたやつをSELECTする。

これが並列で走った時にどうなるか。それが以下の感じです。(最後にexit連発するのがダサい……)

上段が一番初めになかったらINSERTする的なことをやっていて、中段も同様の処理。下段がINSERTする前にSELECTするのをやめたバージョンです。

  1. BEGINは3つ同時に開始。
  2. 上段がINSERTする前に中段がSELECTして当然ですけれど無い。
  3. 上段がINSERTしてCOMMIT。
  4. 中段がもう一回SELECTしてみる。無い
  5. 無いのでINSERTしてみる。Duplicate。裏でコミットされているので
  6. 例えば上の記事のようにDuplicateをキャプチャしてSELECTする。でも無い。困る

一方一番初めのSELECTを抜かした下段はどうかというとSELECTでちゃんと引っ張ってこれます。
結局のところトランザクション始めたあとにSELECTしちゃダメで、なんか結局初回以外は常にDuplicateする前提で先にINSERTすればいいのでは?ということになったのですが、気持ち悪い感じです。

どうすればいいのか、イケている方法ないでしょうか。

今年の予定

目標とか抱負とか書くとなんか重いのでそこは控えめに、予定的につらつらと書いていきたいと思います。
どうもマコピーです。

去年やったこと

さて仕事で去年やったことといえば、一昨年から担当していたサービス運用を最適化したりちょこちょこ新機能入れたりして、二週間ぐらいのイベントを中一日ぐらいでひっきりなしに延々と続けることをやっていたんですけれど、それもサービスクローズで終わって、そこで書いたコードはバイバイなわけです。
それと後半はハードウェア的なことも仕事やっていました。具体的にはヘリのアレですね。ArduinoとRaspberryPiを使っていろんなノウハウを生み出しているわけですがニッチ過ぎるし誰にも伝わらないので寂しい限りです。これを散逸させずにどうにかしたいと思っている所存です。

今年やりたいこと

とりま仕事は落ち着かせて、そんでもって次に待っているお仕事に突っ込んでいくわけですがこれはまあ良い。なるようになる。やってればなんとかなる。あとからついてくるし、三ヶ月単位でコロコロ変わると思うので、そのときに考えよう。

じゃあ何をやるのか。それは去年やってなかったこと、やりきれなかったことをやりたい。

やりたいやりたいって言ってて、結局でもやれてなくて、完璧にやれてなくて、でもやりたいので、ここに書くことにする。

もっとまじめに、同人誌を書く

大晦日にちょうど自分で書いた本を売っていたので、そういう決意にもなったのだけれど、やっぱり上から下まで全部自分でやれるというのは気持ちが良い。
同人誌というフォーマットはそこが優れていると思う。
ゼロからイチまで立ち上げる段階も僕一人だし、そこから育てて、さらにみなさんが読めるパッケージにするために装丁して、製本して、会場まで運んで、さらにそこから設営までして宣伝も自分で全部やって、足を止めた人に言葉を投げかけ、手にとってもらって、手でお金を受け取って、自分の手で渡す。ここまで全部できる。

僕がプログラムを始めたのは、全て自分一人でとりあえずなんとかなるってところも多分にあるんだろうけれど、仕事ではそうも行かなくて、一人でサーバを建てることも出来なければ、ユーザが見るデザインやUI、フロントエンドのプログラムを書くこともままならない。これに関しては得意な人、好きな人、やりたい人に任せるほかない。
もちろんそれをやればいいんだろうけれど、仕事だしそうもいかない。

でも、趣味でやるぶんには一人でできるし、僕が好きで、そこそこ得意だと思っていて、やりたいと思っている小説っていう形をとって同人をやるっていうのは結構いいと思っている。もちろん絵師さんの協力も得ているので、そういう意味では全然一人じゃない。一人じゃないけれど、まだコントローラブル。今回はだいぶ絵師さんに頼っちゃったけれど……。

で、同人活動はコセキネームでやってないわけですけれど、いつかは結び付けたいし、なんとかしたい。今年、そういうチャンスが、決意が出来たらコセキネームと結びつけようと思う。ある意味それが結構目標です。

面白法人っていう看板って結構重荷に感じてきたけれど、最近なんかそうでもなくなってきたので、そろそろっていう気分でもあるのかもしれない。

僕なりの文章の書き方もあるし、書きたいこともあるし、市場のニーズもある。書き手の取り分と読み手の取り分、双方の落とし所を何とか探って、苦しんで、書いていきたいと思います。

SYNOPSISのコメントを使ってテストするTest::Synopsis::Expectation

この記事はPerl Advent Calendar 2013の16日目の記事です。

Test::Synopsis::Expectation

Perlのモジュールを作る際に便利そうな少し変わったモジュール、Test::Synopsis::Expectationを使ってみます。


その前にテスト対象のモジュールを作ります。ひな形作成に便利なMinillaを使ってスケルトンを作成します。

$ minil new AwesomeTarget

そこで出来たAwesomeTarget/lib/AwesomeTarget.pmを以下のようにいじります。

package AwesomeTarget;
use strict;
use warnings;

sub plusplus {
    my ($class, $num) = @_;

    return ++$num;
}

1;

なんのことはない、ただ++するだけのクラスメソッドですね。
さて、こいつのテストコードを書きます。
AwesomeTarget/t/01_basic.tに以下のように書きます。

use strict;
use warnings;

use Test::More;

use AwesomeTarget;

is (AwesomeTarget->plusplus(1), 2);

done_testing();

そんでもってproveで実行してみます。

$ prove -l
t/00_compile.t .. ok
t/01_basic.t .... ok
All tests successful.

んまあここまでは一緒。さてTest::Synopsis::Expectationを使っていきましょう。習うより慣れろです。なんかドキュメントちょっと分かりにくいんですけれど、つまりはSYNOPSISによしなにコメントを書くと勝手にテストしてくれるってことです!!!!!マジか!!!!!!!!!!!!!!!!

AwesomeTarget.pmにSYNOPSISを追加します。

=head1 SYNOPSIS

    use AwesomeTarget;
    AwesomeTarget->plusplus(1); # => 2

=cut

さらにt/99_test_synopsis_expectation.tを作って以下のように書いてみます。

use strict;
use warnings;

use Test::More;
use Test::Synopsis::Expectation;

synopsis_ok('lib/AwesomeTarget.pm');

done_testing();

これで、なんと、

$ prove -l t/99_test_synopsis_expectation.t
t/99_test_synopsis_expectation.t .. ok
All tests successful.

テストが走ります。

SYNOPSISの# => 2を# => 1に変えてあげると

$ prove -l t/99_test_synopsis_expectation.t                                                                                                                                                [master]
t/99_test_synopsis_expectation.t .. 1/?
#   Failed test at /Users/mackee/.plenv/versions/5.16.3/lib/perl5/site_perl/5.16.3/Test/Synopsis/Expectation.pm line 48.
#          got: '2'
#     expected: '1'
# Looks like you failed 1 test of 1.

ちゃんとコケてくれます。こんなかんじでSYNOPSISを書いて、さらにそこにコメントを付け足すだけでテストを書くことが出来るめちゃお手軽テストモジュールです。

なんや!!! どうなっとるんや!!

そんな感じで、僕が作ったわけではないのですが少しだけ解説してみます。
このモジュール、id:moznionっていう人が作ったやつです。僕のじゃないです。

で、PODの解析部分なんですが、Compiler::Lexerが使われています。このモジュールはPerlのコードを構文解析するモジュールなのですが、perlの内部をいじくりまわしてどうこうしているわけではなく、トーカナイザなどが独自実装されています。PPIというPerlで実装されたPerl構文解析器もあるのですが、そちらよりも速いのが特徴です。
まずPod::Simple::Methodyを継承したモジュールでSYNOPSIS部分を抜き出し、そのコードをCompiler::Lexerに食わせてトーカナイズしてevalしてテスト出来る形まで持ってきています。
Test::Synopsis::Expectation自体は短いしやっていることは単純なのでCompiler::Lexerの一つのユースケースとして見てみると良いかと思われます。

そんな感じで、なんか夢がひろがりんぐなモジュールの紹介でした。あとでmoznionって人にビールをおごります。

さて、明日は……あれ、誰もいない? 何か書きたい人募集しています!!!!!

追記(12/17): moznionさんがもっと詳しい話を書いたので、もっと深く知りたい人はこちらへどうぞ!!!!!
Test::Synopsis::Expectationというモジュールをリリースしました - その手の平は尻もつかめるさ

#isucon で fail して きました(チームぽわわ2)

どうもマコピーだよ。

そんなことはさておき前回の予選から引き続き本戦のISUCONに行ってきたので報告させていただきます。

チームぽわわ2のメンバー紹介

  • @shogo82148氏

我がチームのリーダー。主にアプリケーションを担当。Redis::Fastなどのモジュールを書くも今回の懇親会で「もうXSは嫌です〜」と言う。

彼の本戦の記事
ISUCON3の本戦に参加してきた - Shogo's Blog

  • @9re氏

今回はnginxを担当。普段はAndroidのアプリを書いているそうです。

  • ぼく( @mackee_w )

インフラ周りを担当。

時系列を追って説明

10時





http://instagram.com/p/gecpvcoD6f/
戦場にきた

35分ごろにヒカリエに到着。他の2人は来ていました。
45分になってISUCON恒例のストーリー仕立てのレギュレーション説明が開始。

今回は「サービス作ったら社長がプロモーション打つでっていきなり行ってきて、負荷に耐えられませんって言ったら、そんなこともあろうかと4台まっさらな2コア1GBメモリのVPSサーバをドヤ顔で渡して去っていった」っていう設定なので、去年のISUCONと違って実はミドルウェアの設定も特にされていないサーバを使っていろいろしなければなりません。

あと、そのサービスっていうのが画像版Twitterで公開範囲設定もあるっていうことなので体調悪くなっていたのがこの辺り。

11時

サーバ情報が書かれた封筒を開封して作業開始

  • 1台目の既にアプリが動いているサーバに入って他のサーバにssh isu[2-5]で入れるようにした。
  • その間にリーダーがgithubにリポジトリを作って既存アプリをコミット。
  • @9reさんがopenrestyをビルドして僕がsupervisorで起動させるようにしてベンチを動かす。だが通らず。このときは後ろ(=アプリ)がまだ詰まっている状態だからダメなのかな〜〜〜〜ってなって、結局またapacheに戻す。
  • ベンチ中のtopを見てたらconvertなるプログラムがめっちゃいっぱい動いていたので、「予選の時のmarkdownを外部プロセスとして立ち上げるやつか〜〜〜〜」ってなってコード見たらやっぱりそうだったのでリーダーにImagerあたりに書き換えるようにお願いした。あとcartonで落とされたモジュールもリポジトリに含めちゃっていて、それを含んだリポジトリをローカルにcloneしたらアンチウィルスがImagerのバイナリに反応しちゃって、それでImager使ってないけれど既に入ってるよってわかった。ウケる。

12時

  • 僕はnginxでうまくいかないの調べてた。JSで作られたフロントエンドでちゃんと画像とか表示されてなかったので予選の時のsrcの指定がおかしいことになっているのと同じにおいかなとか思って調べたらjQueryでそこらへん組まれてて涙目。結局リバースプロキシするときにちゃんとヘッダを設定していなかったのが原因だった
  • リーダーのImager書き換えが出来たっぽいのでベンチを通す。でも通らない。よく見たら画像差分の差分が発生しているよと言われているっぽい。「pngがうまく変換できないっぽいんです」と言われたのでそこで作業ストップしてもらった
  • ごはんは麻婆豆腐丼。あとリーダーがこのあと中華あんかけ定食みたいな弁当を5時間ぐらい書けて食べてた。
  • あとボクは去年のサバ弁当、好きだったです。

13時

  • nginxも使えないし、Imagerも使えないし、よくわかんないなーって思ってたらリーダーが「キャッシュしましょう」と言って一回変換した画像ファイルをローカルにファイルでキャッシュするみたいなの書きはじめた。
  • convertを置換できないならもう横に並べて数量勝負だなーって思ってNFSについて調べ始めた。
  • ちなみにこのあたりで前もってお願いしてたSQLをEXPLAINして見てもらうのを聞いたらそんなに重たいポイントないっぽいのでクエリ改善のお仕事はやらないと決めた。

14時

  • リーダーのキャッシュする奴が書き上がって何度か試行錯誤してベンチが通る。このときworkload=1の1台でスコア6000ぐらいだった。topみてmysqlがconvertの上に上がってくるのを見てDBサーバを他のサーバに任せるのを判断して2台目でMySQLサーバの構築を始めた。1台目以外を使い始めたのはこの辺りから。
  • 何故か5台目にNFSの構築を始める。その間にリーダーにキャッシュとか画像の向き先を変えられるようにしてってお願いしてた。
  • MySQLの向き先変えられるような設定探した。僕がアプリのコードを見たのはたしかこの時だけ。

15時

  • NFS化とMySQL外出しが出来たのでそれでベンチを通す。内部の場合workload=2で9000ぐらいで外の場合はworkload=2で8000ぐらいだったのでこりゃいけるなってなって、アプリを他のサーバでも動かせるようにし始めた。
  • rsyncめったに使わない情弱だったのでググってた。そんでもって配信。配信するのにスクリプトは作らなかった。。。

16時

  • 3台目と4台目にアプリのセットアップ完了。このとき全部apacheを表に立てて裏にstarletのサーバ立ててた。そういえば前回やったmax-workersチューニングは全くやってない。
  • ./benchmark -w 2 -t 1,3,4でベンチ。15000ぐらいいった。一瞬一位になった気がする。

  • でもこのあとにLINE選抜が確か4万とかいってぶっちぎって特別賞を持ち去っていった。社会は厳しい。
  • そんなところで「そろそろnginxのやつ上げる」って@9reさんが言ったのでそれの対応とかしてた。アイコンのキャッシュとかフロントでするやつっぽい。ここで1台だけnginx化してベンチが通る。1台でworkload=4で13000とかいった気がする。

17時

  • 3台目と4台目にnginxセットアップ
  • 30分ぐらいで3台目と4台目ありでworkload=4で27000ぐらい。
  • 5台目CPUあんま使ってないしアプリ動かすかーーーーってなっていや、再起動試験するかーーーって迷って「1位じゃないと意味が無いし!!!!!!」ってなってアプリセットアップ開始。完了したのが50分で、1回コケて直してもらって最後に./benchmark -w 5 1,3,4,5でベンチしたら32000行った。この時はカヤック選抜を抜かして何故かガッツポーズした。そこで時間切れ。

18時

  • 終わった直後にカヤック選抜の人たちに「勝ったで〜〜〜」って言いに行ったらスコア指さされて最後の最後に35000とか叩きだされたことを見せられて落胆。その後カヤック選抜の人たちと人間だめになる椅子が置いてあるスペースで魂の抜け殻になっていた。

ビーズクッション CUBE L ブラウン

ビーズクッション CUBE L ブラウン

↑こういうの

19時

  • 結果発表。fail 0点だった。心が震えた。はかない。社会は厳しい。
  • LINE選抜チームの方々、おめでとうございます!!!!

最終的な構成

f:id:mackee_w:20131111023835p:plain

反省点

来年はちゃんと再起動して動くかやろう。

最後に

  • @さん、@さん、@さんをはじめ運営のみなさま、ありがとうございます。問題を見た時は鬼かと思いましたが、たぶんめっちゃ苦労されたと思いますし、懇親会で実際に苦労したって言ってたので、お疲れ様でした。
  • @氏、@さん、一緒に戦ってくれて本当にありがとうございます!!
  • あと参加した皆様が予選のあとやこの本戦のあとの知見や感想など、本当に興味深くて勉強になります。ありがとうございます。一年に一回、こういう会があってそれを眺めるだけでも楽しいのに、実際に参加できてめちゃくちゃ経験になりました。

そんなわけで今年の僕たちの夏は終わりです。次は81忘年会でまた会いましょう。