ぱいぱいにっき

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

YAPC::Asia 2014に行ってきました&喋ってきました #yapcasia

はい、時間オーバーつらい、マコピーです。

さて、去年一昨年とYAPC::Asiaはこちらに来てからずっと行っていたのですが、今年も行ってきました。

あと喋ってきましたので、スライドは以下。

Perl meets Real World

Perl meets Real World 〜ハードウェアと恋に落ちるPerlの使い方〜 - YAPC::Asia Tokyo 2014

Perl meets Real World // Speaker Deck

  • 結構初歩的な内容とか入り口的な内容をメインにしてどちらかと言うと布教する感じでした
  • ネギ振り出来なかったので何らかの形で皆様にお見せしたい
  • GeekDojoも開いておりますので、興味がある方とかツッコミがある方はTwitterかこちらに是非
  • その他やらなかったネタ

趣味開発のためのVPS/クラウド活用術

趣味開発のためのクラウド/VPS活用術 - YAPC::Asia Tokyo 2014

趣味開発のためのVPS/クラウド活用術 // Speaker Deck

  • 圧倒的時間不足……!
  • この件に関してはいろいろ話し足りない!!!!!
  • yanchaとかに有識者集まって欲しい
  • 皆様VULTRに興味を持っていただけたでしょうか。使ってみたいというあなたにgo-vultrという便利なコマンドを用意したのでぜひお使いください

その他見たトークとか

ウェッブエンジニアのローレベルプログラミング - YAPC::Asia Tokyo 2014

衝撃的だった。
cho45さんは普段仕事ではいろんなCPANモジュールでお世話になっている方なんですけれど、このトークは潜り方が極端だった。
まずアセンブラに始まり、さらにAVRを使いこなして一旦解放されたかと思いきや、Raspberry Piをベアメタルで操作しマジかよと口を開きっぱなしにさせられた後に、アマチュア無線始めました宣言で、「か、勝てねえ……」という思いに至った。
で、その後べろべろに酔ったcho45さんとHUBで初めてお会いした。そんでもって土下座しあったり一緒に飛び跳ねて、
お前は敵だ〜〜〜〜〜〜〜〜〜〜
などと言い合うなどした。非常に興味深い体験でありますが、cho45さんは覚えていらっしゃいますでしょうか。
ともあれ来年もハードウェアでがんばるぞい!という感じになりました。
来年は俺も潜るぞ。

DBIx::Class - what is it and what is it good for? - YAPC::Asia Tokyo 2014

今の仕事ではDBIx::Classを使っていて、なんとこれは5年選手の既存サービスのメンテ業などではなくまだリリースしていない新規サービスなわけでございますが、DBICというものは素晴らしいプロダクトでございます。
ただ重いとかそういうデメリットも有るわけですが、それを補う素晴らしい機能などを知れたのがこのトーク。
DBICのメンテナであるribasushiさんとは2日目の後にtagomorisさんやcharsbarさん、papixなどと一緒に朝まで居酒屋で飲むという貴重な体験をした。
僕は英語が読めず書けず喋れずだったんですけれど、なんかpapixと一緒に艦これをribasushiさんに紹介したり、そういう異文化交流をしていました。ビスマルクの画像見せて「Approve!」と言われたことは一生の思い出になりそうです。
なんか思ったんですけれど、やっぱり英語の、それもすごいプロダクトのメンテナと喋る機会なんてそうそうないわけで、喋らないにしても隣にいるだけでマジかよとかそういう驚き体験など出来るわけで皆もっとやるべきだし、凸するべきだと思う。もちろん迷惑かけたり不快にさせないことは前提として。
xtetsujiさんはすごくてHUBで筆談してた。ああいう方法もあるんだと思った。
YAPC::Asia Tokyo 2014 に参加してきました #yapcasia | #interest_ae
それから、海外スピーカーの方々はツイッター見てももっと日本人と話したかったというふうなことを言っていたようなので、せっかく日本に来たのだから日本でしか出来ない体験(=日本のPerlMongerたちとしゃべること)を出来るようにみんなした方がいいんじゃないかなと思った。
なんかこれは地方pmでも活かせそうな体験で、僕が副リーダーしているYokohama.pmなんかは地方から来た方がもしいたらもっともてなせないかなーとかそういうことを考えるようになった。そういう意味でも貴重な体験が出来た。
それ関連ですが、Dancer2作者のSawyerさんとリアルでuzullaさんとlestrratさんに助けていただきながらお話することが出来た。趣旨としてはawesome-perlはいい活動だからもっとお互いあの場で知っていこうぜということだった。いい人だった。恩に着ます。

まとめ

そんなわけで今年のYAPCは例年に比べてより濃い体験が出来ました。僕自身実は普段はPerlをがっつり触ってる人なんですけれど、今年のYAPCPerl一本で行くで!って言う人も選べばPerlのトークばかり聞けるし、Perlよくわからんからそのコミュニティだけ楽しむぜ!って言う人もイベントホールとか僕みたいな変わり種セッションを聞けば楽しんでもらえるし、そういう意味でTIMTOWTDIYAPCだったと思う。
強いて言えば会場キャパの問題もあるけれど、まあそれは運営の方々も認識していると思うので来年には改善されていると思う。large YAPC::Asiaっていう言葉もあったし。
あと、あと、僕がよりやってほしいなと思うのはTokyo以外のYet Another YAPCなわけですけれど、これは贅沢かな……。ともあれ開催されるなら飛んでいきたい。
まだまだ言いたいことがある。そういえばこれは大事な気づきでした!
!Important!
皆さん前に立ってしゃべるといろんな人から話しかけられます。僕なんかは知らない人に自分から話しかけるの非常に苦手なんですけれど、前に立つとそれをしなくても知らない人としゃべることができるので便利です。おすすめ。地方pmとか他のイベントでもいいと思うんですけれど。皆さんが立っていただけると僕は知見が得られて非常に幸福。自分が喋ることによって他の人が知見を得られたと言っていただけるのも非常に幸福。なのでみなさんやっていただきたい。現場からは以上です。

次回のYokohama.pmに関してはリーダーと相談しますので少々お待ちください

モジュール世界観考

とりあえずメモがてらに記述しておく。

対象読者

LLを使ったサーバサイドWebアプリケーションエンジニア

tl;dr

この記事に結論はない。思いを馳せたことを記述するのみである。
あと長いのでだらだらしたのを読みたくない方はブクマせず閉じるボタンをどうぞ。
ポエムなのでそういう苦手な方はブクマせず閉じるボタンをどうぞ。

ポジション

仕事ではPerlを使ったネイティブアプリケーションのサーバサイドAPIを書く。
趣味ではPerlを使ったWebアプリケーションやGolangを使ったライブラリやミドルウェア等々
Ruby on Railsは触ったことがない。

rapid developmentというコンテキスト

僕がWebアプリケーションフレームワークなるものを初めて触ったのはCakePHPで、それまではPHPでベタッと書いていたのを覚えている。Traditional PHPと言われる手法である。
当時はPHP5系が出始めでclassとかPHPで意味あんの?とか思っていてオブジェクト指向もあまり理解していなかったのだけれど、CakePHPを触ることでオブジェクト意味あるやんって思ったし、あらかじめ用意されている部品を使って素早く見れるレベルのWebアプリケーションを作ることが出来た。なるほど、と思った。
で、CakePHPが「rapid development framework」と当時も掲げていたし今でも掲げているわけで、うりとしては高速に開発できますよということらしい。

micro frameworkというコンテキスト

僕がCakePHPの次に触ったのがPythonのFlaskというフレームワークでこいつはCakePHPのようなフルスタックではなくルーティングとテンプレートエンジンのみを提供したまさにマイクロなフレームワークだ。
Flaskが提供していない部分、例えばORMapper等はSQLAlchemyとかを使っとけとか書いてある。僕はFlaskでDBアクセスをしたことがないのでこのあたりはよく知らない。この文脈から出たRubySinatraなんかもそうだったりするらしい。つまりこれらを使うにはモジュール/パッケージソムリエなる職能もしくは役割が必要である。

Webアプリケーションフレームワークの3要素

ここで僕が思うフレームワークの要素を書き出してみる。もちろん世の中のフレームワークにはこれらを搭載していないものもあるし、僕がいいたいのはそれらが不完全なフレームワークだということではない。

もしかしたらJSONを吐くAPIのサーバはテンプレートエンジンを必要としないかもしれないし、そもそもDBにアクセスをしない場合はORMapperは要らない。先ほどFlaskで必要なかった理由はそれはGoogle App Engine上で開発しており、データベースはCloud Datastoreを使っていたからである。ここでORMapperの定義も必要になってくるかもしれないけれど、SQLをその言語のインターフェイスで組み立てるだけでは不十分で、MapperたるにはそのSQLをDBに投げて帰ってきた結果をその言語に合うObject形式に変換するということろだと思う。

思うところこれはフレームワークとはただの糊である。ルーターやORMapper、テンプレートエンジンは複雑なWebアプリケーションを作るにあたってほぼ必須と言える要素だけれど、なにもこれをフレームワーク内に内包する必要はない。糊としての繋げる仕組みがあれば十分なのである。

仕事

僕が今の職業についてからもっぱらWebフレームワークはPerl5のArkというものを使っている。ArkはCatalystというフルスタックフレームワークを部品に分けて再構成したものである。
ルーター部分にはPath::AttrRouterを使い、テンプレートエンジンはText::MicroTemplate、ORMapperはDBIx::Classを用いている。であるがあくまでこれらは標準構成である。
僕の関わったプロジェクトではテンプレートエンジンをText::Xslateに、ORMapperをTengに置き換えたものが多かった。今ではDBIx::Classを使っているけれど、そこの組み換えも自由である。

ときどきプライベートではPerlを使ってWebアプリケーションをさくっと書くことがあるのだけれど、そういうときにはAmon2を使っている。Amon2はText::Xslate + Tengの組み合わせを推奨していて、さらにルーターは過去のバージョンではRouter::Simpleが使われていたが今ではRouter::Boomが使われている。

Mojo

で、最近PerlではMojoliciousというフレームワークが興ってきていて、MojoConfという専門のカンファレンスも開かれたらしい。で、Mojoliciousというのはフルスタック中のフルスタックで、cpanm Mojoliciousとかするといろんなツールが入ってくる。開発用サーバも本番用サーバも入ってくるし、非同期系のモジュールやスクレイピングに使うDOM操作のモジュールまで入ってくる。あとMojo::*空間が広大だ。Mojoに使われることを想定したプラグインやモジュールが大量にある。

Mojoに(モジュール|人)が依存することの是非

で、僕は以前Promisesというモジュールを非同期環境で使おうとしたことがあったのだけれど、そのときのPromisesはMojo::IOLoopに依存しており、Mojo::IOLoopは単独で存在するモジュールではなくMojoliciousに内包されているパッケージだったので、cpanm Promises::DefferedとするとMojoliciousまで入ってきて、お、おうということになったことがある。
WAFは他のものを使っているのにそのモジュールを使いたいだけでMojoliciousを入れるのはなかなか抵抗がある。厳しい。
最新のバージョンでPromisesはMojo::IOLoop依存がなくなっているので思う存分使えるっぽい。ので今度試してみたい。

でもこれはある面から見たMojoの難点であって、他のいくつかの面ではモジュールを内包することがスバラシイという場合もある。
たった一つの依存で #yapcasia のトーク応募ソーシャルランキングをつくる - ゆーすけべー日記
この記事を見たときにそう思った。Mojo入ってたらこういうスクレイピングするアプリケーションがそれだけで書けるのである。テンプレートエンジンやルーター、サーバも入っているのでここではcliアプリケーションになっているのをWebアプリケーション化するのもMojoだけで可能である。
これはすごいメリットで、先ほど言ったモジュール/パッケージソムリエが必要ないのである。

例えばCPANにはXMLを操作するモジュールは以下のものがある。

だいたいXML::LibXML使っとけば良いらしい。XML::XPathは破綻しているらしい。
とまあそんな感じでソムリエの意見を聞く必要がある。もしくは自分で地雷を踏みに行く必要がある。そして地雷を踏み抜いても耐えられる何本かの足が必要である。

で、MojoMojo::DOM使っとけば良い。それだけでたいてい事足りるようである。
そういうわけでフルスタックフレームワークは面倒臭いこと考えずにrapidに開発できる。これは非常に大きいメリット。

しかし、Mojoみたいな全部あるフレームワークを常に使っとけば良いというわけではないのがこの世の中である。

フレームワークが出来ないことがある

フレームワークはスイスアーミーナイフであってもスイスアーミーナイフが金を生み出すわけではない。スイスアーミーナイフはその鋭利な切っ先で物を切ったり缶切りで缶を開けるといった想定されていることにしか利用できない。
フルスタックフレームワークもそうで、当然提供されている機能しか使えない。
そういうときに結局ソムリエが必要になってくる。そういった時に人はどうするか? コミュニティに聞くしか無いのである。もしくはその道のプロフェッショナルを雇ってお金で解決するしか無い。
さもなくは、再発明である。個人的に再発明は悪だと思っている。でも必要悪だと思っている。しかし避けなければならない。その再発明品は自分、もしくは社内にしか目に触れられないのであれば、OSSのものよりもはるかに実績がない。
万人が使えるものは万人に使われるので、それだけの場数をこなしていると僕は考える。もちろん万人に使ってもらわないといけないので、宣伝も必要だし、使われやすい工夫も必要だ。でもそれ以上に様々な環境で使われるプロダクトは強い。
で、強いプロダクトかどうかを判断するのにソムリエが必要で、これまた経験が必要。
自分には経験がない人はどうするか。コミュニティに入ってプロフェッショナルたちとコミュニケーションを取るしか無い。お金は必要ない。TwitterとかYanchaとかLingrとかIRCとか、そういうところで聞けば良い。もしあなたが自分でコードを書く気があって、それをコミュニティのチカラで解決しようと思うなら、それ以上の代償は必要ないだろう。

awesome-*

ではコミュニケーションすら取りたくない人はどうすればよいのか? そういう人はコミュニティで活躍してそうな人のTwitterやらブログを見れば良いと思っている。さらに最近、awesome-*というgithubリポジトリが盛んである。

等々。さらにこんなのも出てきた

というわけでソムリエたちがこうやって見れる場所に貼っていてくれるのでそれに従うという手もあるのではないか。ここに書いていなければ、書いている方々に質問しに行くことになるが。

ところでawesome-perlがない。ので誰が音頭を取ってやって欲しい。僕は切に願う。

追記: お前がやれやということになったのでいかのレポジトリを作りました。異論やこいつも載せてくれという方はPull-Requestをお願いします。

https://github.com/mackee/awesome-perl

結論

  • フルスタックフレームワークは非常に心地がよく考えることが少なくて開発に集中できる
  • だがマイクロな部品を集めてサービスを作るという世界観もある
  • そのときにはソムリエが必要
  • あなたがソムリエではない場合は、ソムリエに聞くか、雇うか、ソムリエの書いたコードや文章を読めば良い

以上。

追記: 合わせて読みたい。
Sinatra frameworkに関する私見 - Beating the Averages(just like me)

#初めてのArduino ワークショップ#00というイベントをやった

どうもマコピーです。ページャnightの話は皆さん書かれると思うので良いかなと思いました。あとGoとかleveldb使って特化したDBつくるというソリューションはいいのでは。言いたかったのはそれぐらい。

さてページャnightの翌日にArduino初心者向けのワークショップを開いてみたのでそのご報告です。
初めてのArduinoワークショップ #00 - connpass
見学のかたも含めて7人ほど来てくださって良い会が出来たかなと思った次第です。今度はもくもく会をやるという話もあるのでその時はお知らせしますね。
使った資料は以下のものになります。

あとこれのmarkdown版をgistに貼っているのでそれもご活用ください。画像とかはないのでそれはスライドの方で。

あとリンクはreveal.jsをphantomjsで開いてPDFに変換したのでリンク情報がなくなってしまっているのでそれはgistの方で。

あとこれをやった後に「PCからLEDを消したりつけたりすることは出来ますか?」という質問があったので、それをシリアル通信でやるコードをその場で書いて見せたりもしました。こちらです。


話題に出た部品

LCD Keypad Shield For Arduino: ディスプレイ関連 秋月電子通商 電子部品 ネット通販
参考: Arduino用液晶シールド LCD Keypad Shields by ボクにもわかる地上デジタル

XBeeWi−Fi(S6B)モジュール(PCBアンテナタイプ): 無線、高周波関連商品 秋月電子通商 電子部品 ネット通販

  • 赤外線LED

5mm赤外線LED OSI5FU5111C−40 (5個入): LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販

  • 赤外線リモコン受信モジュール

赤外線リモコン受信モジュール GP1UXC41QS: センサ一般 秋月電子通商 電子部品 ネット通販
参考: 橋本商会 » ArduinoとRubyで赤外線リモコン作ってWebから操作できるようにした

CDSセル 5mmタイプ: パーツ一般 秋月電子通商 電子部品 ネット通販
参考: The Strange Storage: ArduinoとCdSセルで遊ぶ

  • Grove System

Grove - スイッチサイエンス

とまあそんな感じです。こういう会を開いて皆さんにArduinoとかハードウェアに興味持って貰えたらなと思います。
あとYAPCで関連するトークを応募しているのではてブとかしていただけたら大変助かります。

Perl meets Real World 〜ハードウェアと恋に落ちるPerlの使い方〜 - YAPC::Asia Tokyo 2014

vultrでstartup scriptが追加されていたので使ってみた

どうもマコピーです。ちなみにVULTR布教活動しておりますが、わたくしには一銭も入ってきません。

さて、久しぶりにVULTR見に行ったらスナップショットとスタートアップスクリプトなる項目が追加されていて、スナップショットはその名の通り動いているインスタンスのイメージを保存して再利用するやつですが、スタートアップスクリプトとはみたいなことを思っていたらVULTRの弱点を補う機能だったので紹介させていただきます。

startup scriptとは

My Servesの「My Startup Scripts」から行けるんですけれど、リンクはこちら
そこにはこう書かれていて

Startup scripts are run by the VPS the very first time it starts up.
- The startup script is saved to /tmp/firstboot.exec
- Output produced can be found in /tmp/firstboot.log
- Scripts are executed using /bin/bash (Linux), /bin/sh (FreeBSD), or cmd.exe (Windows)

初回起動のときに一度だけ実行するスクリプトを登録できるよということですね。Windowsの場合も使えるっぽくて便利。
なおスクリプトやログは/tmpに入るのでディスクの構成によっては再起動すると消えてしまう場合があるので注意です。Ubuntu 14.04のイメージだと2度目には無くなってしまいます。

使い方

Startup Scriptsのページを開いていただいて、Add Startup Scriptsを押していただくと以下の様なページになります。
f:id:mackee_w:20140629190155p:plain
Nameのところに適当な名前を入れて、Scriptのところにはシェルスクリプトを実行するだけの簡単な画面です。
例としてはじめから公開鍵をrootのauthorized_keysに埋め込むスクリプトが書かれています。
echo のあとの部分を少し変えて自分の公開鍵を入れるとそれだけで使えるスクリプトになります。

VULTRは使われている方はご存知かもしれませんが、公式イメージを立ち上げるとランダムでパスワードが設定されてそれでログインしろという仕組みなのですが、sshのパスワードログインはsshコマンドの引数で設定できないので自動化する上ではかなり難儀です。
そこでこのスクリプトを使って鍵を埋め込むことが出来るわけですね。

起動する

deployの画面からプランなどを選択して一番最後のStartup Scriptで選んで起動するだけです。
f:id:mackee_w:20140629190702p:plain
これはこれで便利なのですが、先ほど拙作のgo-vultrを更新しまして、そこからも使えるようにしました。
まずスクリプトを登録した後に、以下の様なコマンドを使って確認します。

$ vultr startupscript
2014/06/29 19:08:44 endpoint: https://api.vultr.com/
2014/06/29 19:08:45 200 OK
{
    "169": {
        "SCRIPTID": "169",
        "date_created": "2014-06-29 04:20:58",
        "date_modified": "2014-06-29 04:20:58",
        "name": "public key",
        "script": "#!\/bin\/sh\nmkdir -p \/root\/.ssh\nchmod 700 \/root\/.ssh\necho \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDGnDdHjsZ6oQLcKrzZ2c2UVkzGMpZ6zEa+GYZzASL\/v3A8pX5i7VJ8Hz0OF6j60C4SYNXeqPbWb+c1ajs7201tylabncosbumd47IoNTtnQZUPSaTue6OiSQF1eIWzjW89Rs+C7kzNadPlSVBRQP0JcMno7VRJDFCwMRg1uwROD+9agK+r0xsTG6JClSaBY\/lICUzRy6UFsgO2loiaknmQ1qAMrGFrGn6k4LljRn5fEoUKd9BXuf3ST10akN0nYQ9iimtIrdu+9Se3YCts3cknK9zTFzx8I1yadWArCcloTRtmhvfYgWtWCgU6yfqKvV7LYEoF55F5uy8AeukdMyzh\" > \/root\/.ssh\/authorized_keys\nchmod 600 \/root\/.ssh\/authorized_keys"
    }
}

で、この169っていうのをメモっておいて、インスタンスをつくるときに使います。
以下のようにscriptidで番号を渡してやるとそれを使って起動します。

$ vultr create --osid 160 --dcid 25 --vpsplanid 31 --scriptid 169

あとはvultr listでIPアドレスを引っ張ってきて鍵を使ってログインするだけ。だいぶ簡単ですね。
なお、sshのパスワードログインは無効化されていないのでそれが嫌だという方は手動でオフにするなり、スタートアップスクリプト内で無効化するなりすれば良いと思います。

他の応用例

やってないですけれど以下の様な応用ができると思います。

  • 一般ユーザを使っておいてrootはログインできないようにする
  • よく使うパッケージのインストール(vimとかgitとか)
  • Dockerを入れて母艦にする
  • ……以上のようなことをやるansibleやchefのレシピの実行

たぶん使い捨てサーバの場合が多いと思うのでconfigspecを使ってもいいと思いますね。

そんなわけで試してみたらVULTRでライフチェンジングな機能だったので紹介してみました。

kuiperbeltのベンチマーク

golang大好きです、マコピーです。

昨日書いたkuiperbeltですが少しいじりまして、リファクタしたりComet部分を別のファイルに追い出したりしていました。
大きいのはコマンドをekboっていう名前に変えたことでしょうか。その際のディレクトリ構造はpecoを参考にしています。
あと、切断検知を入れました。今まではコネクションをクライアントがわから切ってもUUIDが残っちゃうという致命的な問題があったのでそれを検知してUUIDを消すのをしています。

さて、グループ機能はないですけれどここらでベンチでも取ろうかなという気になったのでやってみます。
初めは手元のMacbookAirでやってたんですけれどkuperbelt側とベンチ側でリソース食い合っちゃってあんまりよろしくなかったのでvultr上のインスタンス2台でやってみました。

準備

拙作のgo-vultrで立てていきます。

kuiperbelt側

1 core, 768MB memory, 15GB SSDインスタンスubuntuで東京リージョンに立てます。

$ vultr create --osid 160 --dcid 25 --vpsplanid 31

ログイン後、aptでgoを導入してkuiperbeltをgo get

# apt-get update
# apt-get install golang
# export GOPATH=$HOME
# export PATH=$HOME/src:$PATH
# go get github.com/mackee/kuiperbelt
# go install github.com/mackee/kuperbelt/cmd/ekbo

あとは立ち上げてこちらは放置

# ekbo
2014/06/22 12:07:11 Kuiperbelt start listen and serve on 8080

負荷をかける側

クライアント接続用のcurlベンチマークツールwrkを導入します。
kuiperbelt側と同じスペックでwrkを実行するとメモリが足りなくて怒られるので2 core, 2GB memory, 40GB SSDインスタンスで立てます。

$ vultr create --osid 160 --dcid 25 --vpsplanid 8

ログイン後、aptでbuild-essentialやopensslを入れます(この辺り曖昧

# apt-get update
# apt-get install build-essential libssl-dev

wrkをcloneしてきてbuild

# git clone github.com/wg/wrk src/github.com/wg/wrk
# cd src/github.com/wg/wrk
# make
# mkdir ~/bin
# mv wrk ~/bin
# export PATH=$HOME/src:$PATH

あと、wrkはPOSTでリクエストするにはluaで設定を書かなければならないっぽいので以下のスクリプトをどっかにおいておく。この例では~/work/wrk.luaに保存

wrk.method = "POST"
wrk.body   = "{\"ping\":1}"
wrk.headers["Content-Type"] = "application/json"

ベンチマーク

負荷をかける側でクライアントをconnect
ここではkuiperbelt側のホスト名をkuiperbeltにします。実際のベンチはそれぞれのIPアドレスを直接指定して行いました。結果は/dev/nullに捨てるという感じで。

# curl --silent http://kuiperbelt:8080/connect > /dev/null

これとは別のシェルでwrkで負荷をかけます
この例では8スレッド400接続30秒間でかけます

# wrk -t8 -c400 -d30s -s work/wrk.lua http://kuiperbelt:8080/broadcast

複数コネクションを張る時は以下の様な感じにしたけれど、なんかもっといけているツールがあれば教えて欲しいです

# wrk -t1 -c2 -d1m --timeout 1m http://kuiperbelt:8080/connect

結果

各生データはこちら
https://gist.github.com/mackee/3d135cee3894afa05682

グラフにすると
f:id:mackee_w:20140622233129p:plain
縦軸がreq/sec、横軸が接続数です。

きれいな双曲線になっていてまあそうだよな〜という感じです。
ちなみに1000コネクション時はtimeoutが発生しているのでグラフには載せませんでした。この規模になってくるとマルチコア使うとか台数並べるとかそういう施策が必要そうです。

まとめ

たぶん普通に使う分には大丈夫だけれど大規模環境レベルになると厳しそう。
あと1対1の/sendを使う場合は128 connection時と1000 connection時で性能劣化が見られなかったのでまあそういうアーキテクチャということです。
それとキューに溜まりすぎて送りきれてない説があるのではあどないしようという感じです。

#hachiojipm 41に参加してきたのとKuiperbeltという物を書いた

はい、老害がんばろう、マコピーです。

hachioji.pm #41に参加してきました。
皆さんお元気そうで何よりでした。

あ、あとその直前に行った八王子のヘヤニワというフリースペース(?)が良かった。人工芝が敷かれたところで寝転がったりクッションに座ったりして作業などが出来る。プロジェクターもある。値段も手軽で、唯一何点としては場所が分かりにくいこと。駅チカなのでお勧めです。持ち込み自由だし。

閑話休題。以下のようなプログラムをでっちあげて発表しました。

まあなんつうかというと、PerlでAnyEventつかってCometを実装するのがたるかったのでそこだけGoで書いたという次第です。TODOに書いていること以外にもまだまだやることいっぱいあるけれど(つないでいるコネクションリストとか、テストとか)、なんか意外と使えそうです。
Goの流儀みたいなのがまだよくわかっていないのでこれでパフォーマンス出るかとかは要検証ですが、覗いてみてください。
あとエンドポイントとか起動方法とかは変わる予定。ekbo --protocol Cometとかで起動したい。

他の方だとあずまさん(@)が書かれたVZnopeや、
cpp-HSDSが面白そうでした。
参考: hachiojipm 41 で老害っぷりを発揮してきた | All Your Bugs Are Belong To Ass

本日のハイライト

go-vultrというのを書いた

はい梅雨きらいです、マコピーです

結構前から作っていたんですけれど、最近公開していてそれを放置していたのでちょっと紹介させていただきます。

mackee/go-vultr · GitHub

何をやるもの?

vultr というVPSサービスがございます。詳細に関しては以下の記事を参照していただきたく。

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

そんでもって、こいつはDigitalOceanのようにインスタンスを立てたり消したり操作するAPIがあるのですが、それをコマンドから立たけるようにしたのがgo-vultrです。

インストール方法

# あらかじめgoは入れておいてください
$ go get github.com/mackee/go-vultr
$ go install github.com/mackee/go-vultr/vultr

依存にもろもろ入っているので、それは適宜入れると良い。

使い方

vultrに登録後にhttps://my.vultr.com/settings/にアクセスしていただき、ログインしてから下の方にずーっと行くと、Your API Keyというやつがあるのでソレをコピっておきます。
f:id:mackee_w:20140607153339p:plain

で、おもむろにコマンドを叩きます。gocode/binとかにパスは通しておいてね><

$ vultr list
your api key(https://my.vultr.com/settings API Information):********(さっきコピっておいたAPI Key)
2014/06/07 17:20:49 endpoint: https://api.vultr.com/
2014/06/07 17:20:50 200 OK
[]

持っているインスタンスがないのでこんなかんじです。これで正常です。
で、このあと皆さん課金して頂けましたら(課金しなくても今は$10つかえるらしいですよ!!!)とりあえずインスタンス立ててみましょう。

$ vultr os
...

とやると使えるOSのリストがだらだらーってJSONではかれるわけですが多すぎるので何がなんだかわかりません。なのでjqを使って探してみます。

$ vultr os | jq '. | to_entries | map(select(.value.family == "ubuntu" and .value.arch == "x64"))'
2014/06/07 17:29:28 endpoint: https://api.vultr.com/
2014/06/07 17:29:29 200 OK
[
  {
    "value": {
      "windows": false,
      "family": "ubuntu",
      "arch": "x64",
      "name": "Ubuntu 12.04 x64"
    },
    "key": "128"
  },
  {
    "value": {
      "windows": false,
      "family": "ubuntu",
      "arch": "x64",
      "name": "Ubuntu 12.10 x64"
    },
    "key": "129"
  },
  {
    "value": {
      "windows": false,
      "family": "ubuntu",
      "arch": "x64",
      "name": "Ubuntu 13.10 x64"
    },
    "key": "131"
  },
  {
    "value": {
      "windows": false,
      "family": "ubuntu",
      "arch": "x64",
      "name": "Ubuntu 14.04 x64"
    },
    "key": "160"
  }
]

vultrのAPIは{ "なんかのID" : {...} }みたいなあんまり見ない形式なのでto_entriesでゴニョってやる必要があります。
というわけでubuntuかつx64のOSを探してきました。
最新版を使いたいのでUbuntu 14.04 x64のkeyのIDである"160"をメモっておきます

次はリージョン

$ vultr regions | jq '. | to_entries | map(select(.value.name == "Tokyo"))'
2014/06/07 17:32:26 endpoint: https://api.vultr.com/
2014/06/07 17:32:27 200 OK
[
  {
    "value": {
      "state": "",
      "continent": "Asia",
      "country": "JP",
      "name": "Tokyo"
    },
    "key": "25"
  }
]

やっぱ近い所が良いのでTokyoですね! これも"25"をメモっておきます

最後にVPSプランです。インスタンスの性能とかですね

$ vultr plans | jq '. | to_entries | map(select(.value.price_per_month == "5.00" and .value.ram == "768" and .value.bandwidth == "0.10"))'
2014/06/07 17:34:34 endpoint: https://api.vultr.com/
2014/06/07 17:34:35 200 OK
[
  {
    "value": {
      "windows": false,
      "price_per_month": "5.00",
      "bandwidth_gb": "102.4",
      "bandwidth": "0.10",
      "disk": "15",
      "ram": "768",
      "vcpu_count": "1",
      "name": "768 MB RAM,15 GB SSD,0.10 TB BW"
    },
    "key": "31"
  },
  {
    "value": {
      "windows": false,
      "price_per_month": "5.00",
      "bandwidth_gb": "102.4",
      "bandwidth": "0.10",
      "disk": "15",
      "ram": "768",
      "vcpu_count": "1",
      "name": "768 MB RAM,15 GB SSD,0.10 TB BW, Custom ISO"
    },
    "key": "52"
  }
]

一番安いやつ(月額あたり$5)かつメモリが768MBで帯域が0.10Tのやつを出してきています。Tokyoリージョンは0.10Tのしか使えないっぽいのでこういう条件です。
今回はCustomISOではないので"31"をメモ。

さて、準備が整ったので起動します!

$ vultr create --osid 160 --dcid 25 --vpsplanid 31
2014/06/07 17:38:42 endpoint: https://api.vultr.com/
2014/06/07 17:38:43 200 OK
{
    "SUBID": *******
}

こんなのが出ます。で、ココで先ほどのlistコマンドを打つと

$ vultr list
2014/06/07 17:39:34 endpoint: https://api.vultr.com/
2014/06/07 17:39:35 200 OK
{
    "******": {
        "os": "Ubuntu 14.04 x64",
        "ram": "768 MB",
        "disk": "Virtual 15 GB",
        "main_ip": "********",
        "vcpu_count": "1",
        "location": "Tokyo",
        "default_password": "********",
        "date_created": "2014-06-07 04:38:43",
        "pending_charges": "0.01",
        "status": "active",
        "cost_per_month": "5.00",
        "current_bandwidth_gb": 0,
        "allowed_bandwidth_gb": "100",
        "netmask_v4": "255.255.255.0",
        "gateway_v4": "****",
        "power_status": "running",
        "VPSPLANID": "31"
    }
}

という感じで出てくるわけですね〜。
vultrだいぶ男気溢れる感じでpublic keyを登録する感じではなくなんかrootのデフォルトパスワードを発行するからこれでどうにかしろという感じなので、それで入ります。

で、使い終わったら

$ vultr destroy *****(vultrのlistのキーになっている数字)

インスタンスを落とすことが出来ます。

あとvultr sshというコマンドもあるのですが、こいつは挙動不審なのでExperimentalです。試さないでください

以上VPSライフでした! 次の記事はスナップショット機能とかCustomISOを使った話をします!