ぱいぱいにっき

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

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忘年会でまた会いましょう。

Arduinoをはじめる的なメモ(ハードウェア編)

どうもマコピーです。Perlの人かと思われているかもしれませんが、最近はArduinoPythonいじってます。ハイ。

そんなわけでメモ。

いろいろあるArduino

ArduinoってのはUSBを差してプログラムをかき込んだり、制御したり出来るボード。
むしろArduino IDEとかライブラリとか全部含めたシステムとしてのArduinoって言う意味もあるかも。
用途としてはプロが使うというよりは、ホビーで電子工作やってる人たちが使う感じ。あとアート作品とか作る人が使っているのも見かける。もちろんプロの人達がプロトタイピング用に使うのもある。
いろいろ種類がある。

  • Arduino Uno R3
  • Arduino Duemilanove
    • 私の手持ちのArduino。Unoよりちょっと古い。回路構成が違うけれど同じコードが動く。
  • Arduino Leonardo
    • メインのマイコンチップが平べったいArduino。ワンチップになってる。上の二つがでかい時のPS3で今のLeonardo氏は今のPS3だと思えばOK。一部の仕様が違っててコードがそのまま動かないことがある。あとUSB機能がプログラムで制御できるのでマウスとかキーボード代わりに使うことが出来るっぽい。
  • Arduino Mega
    • Mega氏。ピンがめっちゃ多い。基本的に機能一緒でコードも同じのが動くけれど、なんか同じ機能のやつが2倍使える。意味分かんないと思うのであとで説明。
  • Arduino Due
    • 普通、ArduinoってAVRっていうマイコンがメインのチップなんですけれど、こいつはARMが入っている。その分高いけれどいろいろ機能が豊富だったり、そもそもARMなので計算が速い。
  • Arduino Nano
    • 今まで紹介していたArduinoは後述するシールドっていうコンポーネントを使うため、ボードのサイズがある程度一緒だけれど、Nanoはちがって小さい。ブレッドボードに直接挿して使う用っぽい。ピン数がちがったりとかはするけれど、Unoとかのコードはそのまま動く。あと高い。つらい。
  • Arduino Micro
    • Nano氏ぐらいのサイズでLeonardo氏互換。そこそこ安いし、今度はこっち使おうかな。
  • Arduino Pro mini
    • 最近結構使っている。こいつはNanoよりも小さい。けれどUSBが直接刺さらない。USBが直接刺さらないのでプログラムを書き込むのに書き込み器とか必要。その代わりに安い。あと基板に直接ハンダ付けとか出来るので良い。そんな感じで機器に組み込むようの「プロ用」らしいです。
  • Arduino Pro
    • シールドが使えるサイズのArduino Pro mini。USBが刺さらないUnoとも。

その他FioとかYUNとかあるけれど、使ったことないし、YUNとか技適通ってないから日本で使うメリットないけれど。。。ってなるのでいいかなって思います。
とりあえず初めての方はUNOを買いましょう!

【永久保証付き】Arduino Uno

【永久保証付き】Arduino Uno

その他必要なもの

  • ブレッドボードとジャンパワイヤ
    • ブレッドボードっていうのは穴がボコボコ開いていてそこにジャンパワイヤっていう先っちょだけ硬い線がむき出しの線を挿して、その端っこを別の穴に挿すかArduinoの穴に挿すといろいろ出来るっていうやつです。ちなみにたいていは縦4つがつながっていて横にはつながっていない。ので、分岐が出来る。ハンダ付けとか怖いのでって言う人にはおすすめのデバイスです。出来るだけ大きいのがオススメです。2列とかあるやつ。

  • テスター
    • デジタルテスターオススメです。アナログテスターを読むのは職人芸。本職の人はアナログ好きだけれど。電圧・電流・抵抗値が読めるテスターを買いましょう。抵抗値は必須です。回路を電源に繋ぐ前に電源ピン2つ(VCCとGND)を繋げてゼロだったら危ない! ショートって意味です。リアル炎上しますよ。

  • LEDいっぱい
    • やっぱり何をするにもLEDは便利です。例えば電源付いているか?とかプログラム走ってるか?とかって確認するときに光らせると目で見えて便利。Arduinoみたいな組み込みはプリントデバッグがなかなか出来ない(なにせモニタがない!!!!)ので代わりにLEDを使うのです。Hello WorldもLEDチカチカだしね。

NO.6 高輝度LED(赤色・5mm)

NO.6 高輝度LED(赤色・5mm)

  • 1kΩの抵抗いっぱい
    • LEDって詳しくは説明しないんですけれど、そのまま電源と直結させると壊れます。電流が流れすぎるので、それを制限するのに電流制限抵抗っていうのがいります。とりあえず1kΩ買っとけばOK。


↑1袋100個入り800円は高いな……。秋月で同じのが100円で売ってます。

こんなかんじですかね。あと液晶で何か表示させたい!とかモーターグルグルさせたい!とかあればシールドを買いましょう。

シールド

シールドってのはArduinoの上にバカって載せると簡単にArduinoの機能を増やせるお手軽基板です。LANケーブルを挿せるようになる(=インターネットに繋げられるようになる)イーサネットシールドとかテキストが表示できる液晶が載ってるLCDシールドとかあります。あとモーターを動かすのにはArduinoのピンから出てる電気じゃ足りないので増幅する必要があり、モーターシールドっていうのも売っていますね。USBの電気でも足りないのでDCジャックに電源挿す必要がありそうだけれど。
シールドはたいていライブラリがあるのでArduinoのプログラムの中から超お手軽に制御することが出来ます。便利。

Arduino イーサネットシールド

Arduino イーサネットシールド

よく使うショップ

  • 秋月電子通商 - 電子部品・半導体 【通販・販売】
    • Web1.0感ありますが結構繁盛していると思う(実店舗行くといつもめっちゃ混んでる)お店。定番のやつからなんかよくわからないキットまで売ってるし、なにより安い。さっき調べたら無線モジュールのXbeeが秋月でも売られていて、しかも僕が今まで買っていた千石電商とかストロベリーリナックスよりも安いので、価格戦争や!!!って思って今度からこっちで買おうと思います。
  • せんごくネット通販
    • 秋月よりはゲテモノ少ない代わりに普通の部品を幅広いラインナップで扱っているイメージ。例えば標準ロジックICとか、秋月だとあんまりないんですけれど、こっちだと多い。ただし秋月よりも高めかな(秋月がおかしい)
  • スイッチサイエンス - トップページ
    • Arduino系で強いところ。Arduino本体とかシールドとか売ってます。あとSparkFunっていう海外のサイトのモジュールも扱っていたりして、英語読める人はSparkFunの部品使った作例とかを探してきて使うのも一興では。
  • ストロベリー・リナックス - Exciting Electronics
    • ここもスイッチサイエンスと同じ感じのお店。加速度モジュールとかXbeeとか売ってます。

スイッチサイエンスとストロベリーリナックスは実店舗はないっぽいけれど秋葉原の千石電商で扱っているのでそこで買えます。

  • aitendo
    • キレイ目サイトですがどこから発掘してきたんだって言う小さい液晶とか売ってる少し怪しいお店です。液晶関連は強い。

そんな感じです。ブクマついていたらソフトウェア編とか書きますね。

#isucon 予選でとりあえず10位だった

どうもマコピーです。

詳細 ISUCON公式Blog
結果 オンライン予選 二日目の結果 & 暫定版の本選出場チーム発表 : ISUCON公式Blog
のチームぽわわ2のメンバーです。

昨年のチームぽわわのメンバーのうちkenjiskywalkerおじさんは335さんチームで、acidlemonさんにいたっては出題側に回ってしまったのでぐぬぬと言いつつ、「誰か出ませんか〜誰か出ませんか〜」と言ってたら@さんと@氏が一緒に出ようと言ってくれたので参加できました。めっちゃありがたい!! そしてうれしい!!!!!!!!!!

で、そんな感じでうろおぼえながらなにやったかをツラツラを書いていきます。

担当

  • 僕はDevOpsで言うOpsな部分を担当。インフラ周りとかミドルウェア入れ替えとか。あと計測
  • shogo82148氏はredisとか主にアプリとかを見てもらいました
  • 9reさんの担当は前半はMySQL周りで後半はいろいろ隠し球を用意していましたが今回は炸裂しませんでした。次の秘密兵器なので秘密です!!!

最終的な構成

  • ベースはPerlのものを使用
  • 元々はApache + Starman + MySQLの構成だったのをNginx + Monoceros + Redis + MySQL構成に
  • 一部クエリのRedis化とテーブル非正規化、インデックス張ったりとか、そういう系のこと。
  • Markdownとかは予めレンダリングしたものをRedisに入れるだったかな。
  • markdownが外部になっているの、なんかコスト高そうだったので、Text::Markdown::Discountに置き換えた。でも@氏によるとText::Markdown::Hoedownのほうが速いらしい。マジか。
  • 後述のように僕はコード殆ど見てないので@氏、解説お願いします。あと氏のRedis::Fastが炸裂した。1000ぐらい上がったような
  • ベンチのworkloadは4でMonocerosはmax-workerが16ぐらい。nginxがworkerが32っていうめっちゃ多い数で安定するというよくわかんない感じだったので、要検証。午後はこの辺りをひたすらやってた

僕の方針と役回り

  • あまりコードは見ない
  • ベンチ回してDevel::KYTProfとかhtopとかdstat見てどこがネックになってるか探して叫ぶ。すると直る。すごい

なので元々僕はDev側の人間なのですが他の二人が遥かに実装力があるので僕は下回りに注力という感じです。あと決める人。方針とかはヒアリングしながら決めていった気がする。あとデプロイする人という感じですね。

見なかったもの、気付かなかったもの

  • /etc/my.cnf 全く手を付けなかったウケる
  • 不要なクエリ類、一部残っている
  • memcachedのようなものは完全放置。書き換えたから無くなったのではなく手を付けなかった。ポート番号からの先入観はいけないですね。htopでmemcachedがないのを変に思えばよかった。
  • フロントでキャッシュする系のやつは結局できなかった

開発の進め方

  • @氏のgithubのプライベートリポジトリを拝借してコードとか上げた
  • Redisブランチ炸裂時は一旦サーバ側でcheckoutしてテスト書けてベンチ書けていいねってなったらmasterにマージという感じ
  • いい具合に分担できてよかった
  • インスタンスガチャはやっていない

とまあこんなかんじでした。僕としては初めてのAWSでインスタンスの立ち上げ方とかめっちゃ勉強になりました。AWSめちゃくちゃ便利だ。すごい。

というわけで、たぶん大丈夫だとは思いますので、本選に向けてチームメンバーといろいろ作戦を練っていきたいと思います。