日頃の行い

個人的な日頃の行いをつらつら書いてます\\\\ ٩( 'ω' )و ////

PHP(Laravel)製TaskRunner「Envoy」を試してみた

この記事は PHP Advent Calendar 2015 - Qiita の20日分として書かれています。
個人的な開発でLaravel製マイクロフレームワークLumenを利用しているので、デプロイ等に使えないかと思いLaravel製のTask Runner「Envoy」を試してみました。
結論から言うと私は今後多分使わないです。
※Envoyは、Bladeのシンタックスを利用してタスクを定義し、リモートサーバに対してそれらのタスクを適用させることが出来るタスクランナーです。

ドキュメント laravel.com

レポジトリ github.com

今回試した色々はこちらのレポジトリで試せます。 github.com

この後の話の流れはある程度Envoyのドキュメントにそって試していこうと思っています。

  • インストール
  • タスクとマクロの実行
  • 通知機能

1. インストール

インストールはcomposerを利用することで可能です。 ara-ta3/envoy-getting-started · GitHub では make install でおkです。

$curl -sS https://getcomposer.org/installer | php
$php composer.phar require "laravel/envoy: ~1.0"

これで /path/to/directory/vendor/bin/envoy が利用できるようになります。 そして、envoy initを実行するとテンプレートを作成することが出来ます。

$./vendor/bin/envoy init vagrant@192.168.33.10
Envoy file created!
$cat Envoy.blade.php
@servers(['web' => 'vagrant@192.168.33.10'])

@task('deploy')
    cd /path/to/site
    git pull origin master
@endtask

2. タスクとマクロの実行

ダミーサーバとしてvagrantcentosのサーバをローカルに立てています。 書いてみたタスクはこんな感じです。

  • Envoy.blade.php
@include("./vendor/autoload.php")

@servers (['vm' => 'vagrant@192.168.33.10'])

@setup
    $start = date('Y/m/d H:i:s');
@endsetup

@task ('ls', ['on' => 'vm'])
    ls -la /tmp
@endtask

@task ('touch', ['on' => 'vm'])
    touch /tmp/hoge
@endtask

@task ('fail', ['on' => 'vm'])
    test -f /tmp/fuga
    echo "failed"
@endtask

@macro ('all')
    touch
    ls
@endmacro

@macro ('all-fail')
    touch
    fail
    ls
@endmacro

@after
    echo "after" . PHP_EOL;
    echo "started: " . $start . PHP_EOL;
    echo "endted: " . date('Y/m/d H:i:s');
@endafter

簡単な文法

  • @includeはrequire_onceのエイリアス
  • @serversはデプロイ対象のサーバを設定できる
  • @taskはシェルスクリプトが書ける
  • @taskのシェルスクリプトが途中で終了コード0以外が出た場合、@taskはその終了コードで終了する。
  • @macroは@taskの名前が書ける
  • @setupはマクロまたはタスクの開始前に呼ばれ、phpのコードが書ける
  • @afterはマクロまたはタスクが終わった後に呼ばれ、phpのコードが書ける

あぁ・・・って思ったこと

@servers ([
  'vm1' => 'vagrant@192.168.33.10',
  'vm2' => 'vagrant@192.168.33.11'
])

みたいなことしたいじゃないですか。
できないです。
アノテーションはその行しか見てくれないんです。くっ・・・

  • @macroの中のタスクが異常終了しても@macroは止まらない。
@task ('ls', ['on' => 'vm'])
    ls -la /tmp
@endtask

@task ('touch', ['on' => 'vm'])
    touch /tmp/hoge
@endtask

@task ('fail', ['on' => 'vm'])
    test -f /tmp/fuga
    echo "failed"
@endtask

@macro ('macro-fail')
    touch
    fail
    ls
@endmacro

↑でenvoy run macro-failを実行すると途中のfail taskで失敗します。
が、failタスクの後のlsタスクも実行され、macro-failマクロは正常終了します。くっ・・・

  • @serversのサーバはsshコマンドの形式と全く同じ
@servers (['vm' => 'vagrant@192.168.33.10'])

のようになってる時、port変えてたらどうするんだ・・・みたいになるじゃないですか。
その時はこのようにします。

@servers (['vm' => 'vagrant@192.168.33.10 -p 10022'])

sshコマンドと同じですね。
別にいいんだけど、なんかなぁみたいな気持ちです。

3. 通知機能

slackとhipchatに通知が出来るらしいです。
下みたいな感じです。 タスクやマクロがまともだったらすごく便利だなぁーみたいに思ったかもしれません。

@after
    @hipchat('token', 'room', 'Envoy', "$task ran on [$environment]")
@endafter

@after
    @slack('https://hooks.slack.com/services/ZZZZZZZZZ/YYYYYYYYY/XXXXXXXXXXXXXXX', '#general', 'test with envoy')
@endafter

4. まとめ

bladeのテンプレートといいつつ、blade感あまりないですね。
PHP製といいつつPHPあんまり出てなくて、PHPで作られたツールみたいな立ち位置っぽいです。
マクロの途中でタスクが失敗してもマクロは失敗しないのはちょっと厳しい気がしました。
これならMakefileで良さそう。たぶんEnvoyは使いません。
調べている間に似たようなものにRoboというのも見つけたのでそっちもそのうち試してみたいと思います。

github.com

明日のアドベントカレンダーhidakatsuya - Qiita さんによる記事です!

【日記】せっかくだからDarkでどんなイベントしたかを振り返ってみようかなと思った

この記事は Dark - Developers at Real Kommunity Advent Calendar 2015 - Adventar の17日目として書かれています。

こんにちは。たなあら (@ara_ta3) | Twitter です。
Darkのコミュニティがせっかく一周年迎えたので振り返ってみようかなと。
ネタがないから逃げてる?
exactly ...

2014/12/06 第一回イベント

参加者は29名ほど?

ngineerxiv.doorkeeper.jp

2015/03/07 第二回イベント

参加者は23名ほど。

ngineerxiv.doorkeeper.jp

2015/03/28 お試しもくもく会@VOYAGE GROUP 8F

@moschan と @ymatと試しにやった気がする。

2015/05/09 もくもく会@VOYAGE GROUP 8F

2015/05/16 もくもく会@VOYAGE GROUP 8F

二次会にひしゅうや行ったらしい。

retty.me

2015/05/30 もくもく会@VOYAGE GROUP 8F

5月頻度高い。

2015/06/06 第三回イベント

参加者は20名ほど。減ってきてるw

ngineerxiv.doorkeeper.jp

arata.hatenadiary.com

2015/07/04 もくもく会@VOYAGE GROUP 8F

この時も二次会はひしゅうや行ったらしい。

retty.me

2015/07/18 もくもく会@VOYAGE GROUP 8F

2015/09/19 第四回イベント

参加者は22名ほど。

ngineerxiv.doorkeeper.jp

arata.hatenadiary.com

2015/09/25 ~ 26 闇合宿() @我が家

huluのリアル鬼ごっこ3,4,5は楽しかったw

www.hulu.jp

そして、次の日のそばは美味しかった。

retty.me

2015/09/27 ISUCON5 @VOYAGE GROUP 8F

isucon.net

いやー22番ポート空いてなかったやつごめんなさいw
結果は5300点!来年も出たい。

arata.hatenadiary.com

2015/10/17 もくもく会@VOYAGE GROUP 8F

この時はカラオケに行ったw
めちゃくちゃ楽しいからまた行きたい。

2015/11/14 もくもく会@VOYAGE GROUP 8F

2015/12/05 もくもく会@VOYAGE GROUP 8F

2015/12/12 第五回イベント

参加者は29名ほど。参加数は元に戻った!!

ngineerxiv.doorkeeper.jp

arata.hatenadiary.com

2015/12/19 もくもく会@All About (予定)


いやー色々やりました。
来年もやっていきたい。
もくもく会をやった回数数えてみたら12回でした!
来年はもっとたくさんもくもく会とかその他のイベントとかやっていきたいなー

Slackのメッセージ数の増減をgrowthforecastで見てみる。

この記事は Dark - Developers at Real Kommunity Advent Calendar 2015 - Adventar の16日目として書かれています。

あと少しで埋まるはずや!

DarkのコミュニティではSlackを利用してるのですが、 ray というruby製のbotが現れた途端みんなで殺そうとしたりして 突発的にメッセージの投稿がたくさんあったりします。

github.com

あの時どれくらい盛り上がったんだろうって、なんか見たくなるじゃないですか。
なので今回はそれを頑張ってみました。

概要

GrowthForecastとfluentdを利用します。

GrowthForecast

GrowthForecast - Lightning fast Graphing / Visualization

利用したfluentdのplugin

ara-ta3/fluent-plugin-slackrtm · GitHub

tagomoris/fluent-plugin-growthforecast · GitHub

tagomoris/fluent-plugin-forest · GitHub

fluent/fluent-plugin-rewrite-tag-filter · GitHub

GrowthForecastのインストール

こちらを参考にインストールします。
cpanm -n GrowthForecast で結構時間かかって不安になりますが、ちゃんと待てば終わります。

GrowthForecast - Lightning fast Graphing / Visualization

ちょっとハマったこと

nginxでproxyさせるとjsやcssのURLが正しくなく読めなかった。

=> 2つやれば解決されます。

  • nginx側
server {
  listen 80;
  server_name www.example.com;

  location / {
    proxy_pass http://localhost:5125;
    proxy_set_header Host $host;
    # proxy_set_headerを追加します。
  }
}
  • GrowthForecast側
$growthforecast.pl --data-dir /path/to/data/growthforecast --front-proxy=127.0.0.1

のように--front-proxyオプションを追加して起動する。

fluentdの設定

最終的な設定ファイルがこんな感じです。

<source>
    type slackrtm
    token xxxx-xxxx...
    tag slack.rtm
</source>

<filter slack.**>
    @type grep
    regexp1 type ^message$
</filter>

<match slack.**>
    type rewrite_tag_filter
    capitalize_regex_backreference yes
    rewriterule1 channel C012ABCDE filtered.yami
    rewriterule2 channel .+ clear
</match>

<match clear>
    type null
</match>

<match filtered.**>
    type forest
    subtype flowcounter
    <template>
        count_keys type
        unit       minute
        aggregate  all
        tag channel.${tag_parts[1]}
    </template>
</match>

<match channel.**>
    type growthforecast
    gfapi_url /url/for/api
    graph_path dark/slack/${tag}
    name_keys count
    remove_prefix test
</match>

流れ

1. slackrtm -> filter-grep -> rewrite_tag_filter

まずSlackのmessageイベント以外をfilterします。
そしてrewrite_tag_filterでchannel名をtagに付与します。
Slack Real Time Messageの場合Channel IDしかメッセージに書いてないので、手でChannel IDとChannel名をマッピングしています。

TODO Slack APIに初め問い合わせて、ID to 名前のMapを作って、来たもの全てを変換するみたいなfilter pluginでも書こうかな

2. rewrite_tag_filter -> flowcounter

flowcounter pluginを利用して1分毎のメッセージイベント数をgrowthforecastにforwardします。

3. flowcounter -> growthforecast

growthforecast pluginを利用して自前のgrowthforecastにPOSTしています。
graph_pathに${tag}を含めることでどこのチャンネルのグラフなのかがわかります。

${tag}が使えるようになったからforestいらなくねって思ったけどちょっと良くわからない感じにハマった上に体調が最高に悪かったので調査やめました。
そのうち修正します。

結果

Darkの #yami チャンネルのメッセージ数の推移です。
(まあそんな多くないですよね)
昼ぐらいから増え始めて、2時間毎に投稿数が増えて、夕方16時頃に爆発してます。
また、なにかネタが出た時に面白い感じにトゲってくれたらいいなぁって感じですね。

f:id:arata3da4:20151216204401p:plain

Dark とは ?

Dark - Developers at Real Kommunity | Doorkeeper

(だいたい)新卒エンジニア向け技術交流会vol.5 を実施した話

この記事は Dark - Developers at Real Kommunity Advent Calendar 2015 - Adventar の14日目として書かれています。

12/12にこんなイベントが有りました。

ngineerxiv.doorkeeper.jp

dark.connpass.com

ついに1年間続きました。よかった。
今回の参加人数は34人中29人の参加で約85%でした。わりと高めな気がする。

【参加された方々へ】
Slackの方にもぜひぜひ参加してください。
認証情報わからん・・・等あればこちらから招待送るので、__dark__ (@ngineerxiv) | Twitter にリプライやDMまたは、 https://ngineerxiv.doorkeeper.jp/contact/new などから連絡ください〜

http://yamiga.waka.ru.com/slack

発表内容

@equal_001氏による「Django 1.9」

www.slideshare.net

ディージャンゴ。
12/1にPythonフレームワークDjangoの最新版1.9がリリースされたので、新しい機能の一部紹介をしてくれました。
Django 1.9 released | Weblog | Django

@jp_taku2 氏による「Varnishの設定ファイルを幸せにした話」

(資料は見つかり次第更新します)

Varnishの設定変更が所々の理由により大変だった状態から容易にしていった話をしてくれました。
バージョン管理やレビューは大事ですよね。
そういえばお化け退治のIoTを実現したらしいです。
RaspberryPi - IOTにIoTで対抗してみた - Qiita

@hoto17296 氏による「闇の魔術に対する防衛術」

www.slideshare.net

テーマ通りでした←
闇を許容せよというとてもいい話。

@yamadagenki0607 氏による「でも、機械学習ってお難しいんでしょ?」

www.slideshare.net

12/24 (平日)についての話・・・←
いえ、Rのコードを利用しつつ、回帰分析や分類モデルの話をしてくれました。

最後に

イベントの開催は3ヶ月後とかになるかと思いますが、もくもく会とかやってるんで、興味があったら下記のアカウントとかに連絡ください〜

twitter.com

明日のDarkアドベントカレンダーはいないので、きっと私がDark botのデプロイについて話すんだと思います。