Masteries

技術的なことや仕事に関することを書いていきます.

PerlからSocket.IOのイベントをEmitする

Socket.IOという, WebSocketなどの非同期双方向通信を実現するNode.js向けのライブラリがあるのですが, 宗教上の事情などいろいろあり, このSocket.IOのイベントをPerlからemitしたい事例がありました.

CPANにはそれらしきモジュールがなく, GitHubを探していたところ@toritori0318さんが開発されたSocketIO::Emitterというものがありました.

github.com

...が, 手元の環境だとうまく動かず, いろいろイジった結果, 動くっぽいけど, 微妙にいろいろ実装が変わったSocketIO::Emitterが生まれてしまい, 現状はそれを使っています. 前述の通り, 「微妙にいろいろ実装が変わった」という状態で, さっとPull Requestを出せる感じではなかったので, 最終的にはtoritori0318さんの実装にあわせてPull Requestを作ってマージまで持っていけたら... という気持ちです.

現場からは以上です. よろしくお願いします.

VimにおけるPerl関連のスニペットを晒してみる

Perl入学式の講義の中で, 講師の@umaaaaa_chanさんがコードを書いている時に, 「use strictとかuse warningsとか, どうやって一発で出しているの?」という質問が飛んでいました.

自分はこのあたり, Vimのスニペット機能を使って実装しているので, 小ネタみたいな感じで自分のVimにおけるPerl関連のスニペットを晒してみます:

snippet u
    use strict;
    use warnings;

    ${0}

snippet uu
    use strict;
    use warnings;
    use utf8;

    ${0}

snippet us
    #!/usr/bin/env perl
    use strict;
    use warnings;

    ${0}

snippet uus
    #!/usr/bin/env perl
    use strict;
    use warnings;
    use utf8;

    ${0}

snippet D
    warn Dumper ${0}

snippet DD
    use Data::Dumper;

snippet DW
    use Data::Dumper;
    warn Dumper ${0}

snippet dd
    use DDP { deparse => 1 };

snippet dw
    use DDP { deparse => 1 };
    DDP::p ${0}

snippet pkg
    package ${1:package};
    use strict;
    use warnings;
    use utf8;

    ${2:code}

    1;

snippet fs
    use feature 'say';

いわゆる「printデバッグ」をするために, Data::Printer(DDP)はよく使うので, それ系統のスニペットが多いですね!

ちなみにData::Printerについては, 2年くらい前にブログ記事を書いていますので, 参考にして頂ければと思います: Perlのprintデバッグをシュッと見やすくする 〜Data::Printer編〜 - Masteries

6月25日は「ハッカーズチャンプルー」で僕と握手!

6月22日〜25日にかけて, 沖縄で「ハッカーズチャンプルー」というイベントが開催されるのですが, ひょんなことからOkinawa.pmの方々から「papixさん, なんか話してくださいよ〜」というお声がけを頂く機会があり, 「あーいっすよ!」と気軽に受諾したところ, なんか凄い面々の中で50分話す事になっていて, 今から戦々恐々としています.

自分は, 「全部見せます! “PerlでつくるInfrastructure as Code”」というトークのタイトルを予定していて, 以前WEB+DB PRESSの「Perl Hackers Hub」に書いた, 「PerlでInfrastructure as Code」の拡大版というか, 紙面の都合とかあって省いた部分などについて語る予定です.

ちょうど1年くらい前, Reactioのインフラを作るにあたって, 自分がどのような所を意識して, どのような工夫を行ったのか? その中で, Perlやそのモジュール, IaaS/PaaSをどのように活用したか? そしてその結果, Reactioというサービスの開発がどのようになっていったか? というお話について,これまでいろいろな勉強会で細かく分割してお話してきた訳ですが, 今回は50分という長い時間お話することができるので, その完全総集編っぽい感じで, 全てをみっちり, 余す所なく, ありったけの全てを語りきりたいと思います.

...時間が余れば, 最近趣味でやっているサービス開発(まだブログでは公にしていませんが, 一部界隈で徐々に披露しているアレ)についての話も織り込もうかと思っています.

というわけで, 6月25日は「ハッカーズチャンプルー」で僕と握手! ...はしなくていいので, 参加する皆様, どうぞ宜しくお願い致します.

追伸

その前週に行われるPerl入学式 in沖縄 第1回も宜しくお願いします! こっちも自分参加するので!!!

(しかもその後, 2日だけ東京に帰ってまたハッカーズチャンプルーの為に沖縄行く)

処理に時間がかかるスクリプトが終わった時にEC2インスタンスを止めるには

...という質問を, 会社の同期から受けました.

状況としては, 夜退社する前にEC2インスタンス上で処理に時間がかかるスプリクトを動かしていて, 朝に結果を確認しているのだけれど, スクリプトの処理が終わってから, 朝確認するまで無駄にEC2インスタンスが動いていて, もったいないので何とか出来ないか? とのこと.

ソリューション

こういう場合, awsコマンドとか, 或いはSDKを使って, プログラムが終わったタイミングで自分が動いているEC2インスタンスを止めてしまう, というのが1つの手だと思います.

awsコマンドであれば, EC2インスタンスのインスタンスIDがi-xxxxxxxxの場合,

$ aws ec2 stop-instances --instance-ids i-xxxxxxxx

のように止められるので, 同じインスタンスを使い回すのであれば, 処理に時間がかかるスクリプトの最後で, このコマンドを実行するようにしておけば良さそうです.

インスタンスIDについては,

$ curl http://169.254.169.254/latest/meta-data/instance-id
i-xxxxxxxx

このようにすれば取れるので,

$ aws ec2 stop-instances --instance-ids $(curl http://169.254.169.254/latest/meta-data/instance-id)

こういう感じにしてやれば, どのEC2インスタンスでスクリプトを動かしても, 処理が終わったタイミングで適切に自分自身のEC2インスタンスを停止してくれる, と思います.

まとめ

処理に時間がかかるスクリプトが終わった時にEC2インスタンスを止める方法について書きました. もっと良い方法をご存知の方は, 是非教えていただけると嬉しいです!

Node.jsのWebアプリケーションでGraceful Restart

いろいろあって, Expressを使って開発されたNode.jsのWebアプリケーションでGraceful Restartする必要が出てきました. Perlであれば, 単純にServer::Starterなどを使って素直に構築できるのですが, Node.jsでGraceful Restartは今回が始めての経験.

Googleでさっくり調べてみた感じ, PerlでのServer::Starterのような「王道!」という構成やツールが見つからず苦労していました. 藁にもすがる思いでGotanda.jsのSlackで質問してみたところ, 「pm2というパッケージを使ってみてはどうですか?」という提案を受けたので, 今回はこれを使ってGraceful Restartしてみました.

インストール

まずはpm2をインストールします.

$ npm install -g pm2

簡単ですね!

設定ファイルの用意

[{
  "name":      "myapp",
  "instances": 0,
  "script":    "myapp.js",
  "exec_mode": "cluster_mode",
  "env": {
    "NODE_ENV": "production"
  }
}]

今回は, こんな感じで設定ファイルを用意してみました. scriptで起動するスクリプト(今回はmyapp.js)を, envで環境変数を設定できます. また, instancesは起動するプロセス数ですが, 0にした場合, コア数分のインスタンスを起動するようにしてくれます.

プロセスの起動

あとは, 先ほど用意したJSONをこのように読み込むと, myapp.jsのWebアプリケーションが立ち上がります.

$ pm2 start processes.json

このとき, Graceful Restartをするのであれば,

$ pm2 gracefulReload processes.json

でOK.

更に, 「プロセスが起動していない場合start, 既に起動している場合はgracefulReloadしたい」という場合は, 次のようにすればOKです.

$ pm2 startOrGracefulReload processes.json

これで, Node.jsで書かれたWebアプリケーションをうまくGraceful Restartできそうです.

まとめ

pm2を使って, Node.jsのWebアプリケーションをGraceful Restart出来るようにしてみました. この辺り, より良いベストプラクティスがあれば非常に興味があるので, ご存知の方は教えて頂けると嬉しいです.