ぱいぱいにっき

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

モジュール世界観考

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

対象読者

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を使った話をします!

#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)があるからこそ、今までやってこれたわけで、そういうわけなので一応僕なりのモットーをここで披露しておくかという話でした。

以上です。