日頃の行い

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

2015年振り返りと2016年どうしようかなみたいな雑記

なんとなく振り返って、来年したいこと考えようかなみたいな感じです。
とりあえず大変な一年でした。救われたのはDarkのコミュニティがあったこと。

旅行とか

  • 京都旅行
  • バスケサークル合宿@伊豆長岡
  • バスケサークル合宿@山中湖

Darkイベント

  • もくもく会 計12回
  • イベント 計4回
  • その他(合宿, たこぱ)

行ったイベント

PHP

JavaScript

Python

  • Pycon JP 2015

Scala

AWS

  • JAWS DAYS
  • Lambda Hands On
  • AWS Summit 2015

その他

  • dots. Summit 2015
  • LINE Developers day
  • Fluentd Meetup
  • Notikra Meetup
  • Remixing@AllAbout
  • 第10回若手WEB
  • JAGMO
  • Retty良い食事の日

その他

  • 引っ越し
  • CTOからの挑戦状解答編
  • Treasure 2015
  • ISUCON 2015
  • ギークフェスタ
  • アドベントカレンダー
  • 論文誌 (卒業の時に頑張った論文誌は載ることになったらしい)

https://www.jstage.jst.go.jp/article/tjsai/advpub/0/advpub_31-1_LOD-B/_pdf

感想と抱負

引きこもりだったけど結構たくさん外のイベントに行けて楽しかったです。
一緒に遊んだりしてくれて皆さんありがとう!また来年もおねがいしマッスルマッスル()
来年あたりの気持ち

  • 4コマんま動かしたい 4コマんま - HOME
  • Goについて強くなりたい
  • Scalaについて強くなりたい
  • JavaScriptのBabel周りに慣れたい
  • 本をたくさん読もう

mongooseのconnection周りでちょっとハマったからメモる

スクレイピングのストレージにMongoDBをなんとなく使っていて、その時にnodejsからmongooseを使ってデータを突っ込んでます。
その時になぜか固まってしまったので、原因を追ってみました。

Mongoose ODM v4.3.4

事象

connection生成して、MongoDBにデータ突っ込もうとしたら止まりました。
試したコマンドとコードは下記の通りです。

$npm i --save mongoose
...

$node -v
v4.1.0

$node src/main.js
mongo connection opened
# ここで止まります
  • src/main.js
var mongoose= require("mongoose");
var logger  = console;
var db      = mongoose.createConnection();

db.on('open', function() {
    logger.info("mongo connection opened")
});

db.on('close', function() {
    logger.info("mongo connection closed")
});

db.open("mongodb://localhost/test");
var schema = new mongoose.Schema({
    id: String
});
mongoose.model("Test", schema);

var Model = mongoose.model("Test"); // 結論ここが問題
var m = new Model({
    id: "hogehoge"
});
// console.logとかでどこで止まってるかを見るとここで止まります。
m.save(function(e1) {
    e1 && logger.error(e1);

    Model.count({}, function(e2, count) {
        e2 && logger.error(e2);
        logger.info(count);
        mongoose.disconnect();
    });
});

原因(?)と対策

その1

コネクションを作った場合、そのコネクションからモデルを取得しないといけないようです。
var Model = mongoose.model("Test"); ではなく var Model = db.model("Test"); にします。

  • src/main.js
var mongoose= require("mongoose");
var logger  = console;
var db      = mongoose.createConnection();

db.on('open', function() {
    logger.info("mongo connection opened")
});

db.on('close', function() {
    logger.info("mongo connection closed")
});

db.open("mongodb://localhost/test");
var schema = new mongoose.Schema({
    id: String
});
mongoose.model("Test", schema);

// var Model = mongoose.model("Test"); // 結論ここが問題
var Model = db.model("Test");
var m = new Model({
    id: "hogehoge"
});
m.save(function(e1) {
    e1 && logger.error(e1);

    Model.count({}, function(e2, count) {
        e2 && logger.error(e2);
        logger.info(count);
        mongoose.disconnect();
    });
});
  • 実行結果
$node src/main.js
mongo connection opened
9
mongo connection closed

その2

そもそもコネクションはmongooseオブジェクトが持っているようなので、それを使いましょう。
var db = mongoose.createConnection();var db = mongoose.connection; に変えます。

var mongoose= require("mongoose");
var logger  = console;
//var db      = mongoose.createConnection();
var db      = mongoose.connection;

db.on('open', function() {
    logger.info("mongo connection opened")
});

db.on('close', function() {
    logger.info("mongo connection closed")
});

db.open("mongodb://localhost/test");
var schema = new mongoose.Schema({
    id: String
});
mongoose.model("Test", schema);

var Model = mongoose.model("Test"); // 結論ここが問題
var m = new Model({
    id: "hogehoge"
});
m.save(function(e1) {
    e1 && logger.error(e1);

    Model.count({}, function(e2, count) {
        e2 && logger.error(e2);
        logger.info(count);
        mongoose.disconnect();
    });
});
  • 実行結果
$node src/main.js
mongo connection opened
10
mongo connection closed

動いたみたい。
そもそもMongoやめようかなみたいな気持ち。

【ポエム】まったく!いい1年だった!!!

この記事は Dark - Developers at Real Kommunity Advent Calendar 2015 - Adventar の25日目として書かれています。
なんとなく雑にまとめです。

去年も今年もクリスマスは地雷を踏んで最高でした。
なので、タイトルはこんな気分です。
(ちなみに私はマインスイーパーと名刺に書いています。)

f:id:arata3da4:20151226003211j:plain

みなさんこんばんは。バスケのウィンターカップの時期ですね。
最近はネットで見れるらしくすばらしいです。

応援.COM SPORTS LIVE CASTING

さて、Darkのアドベントカレンダーが一応埋まりました。よかった。
初め @moschann がやろうって言った時どうなるかと思ったけどなんとかなるもんですねw
なんとかしてくれた方々に感謝したいです。今度飲みに行きましょう。
ユニークにすると計13人が投稿してくれたらしいです。来年はもっと増えたら良いなぁ(そもそもやるのか怪しいけどw)
さっき(!?)19日分が投稿されたので、今のところ完走ですね!

結局このアドベントカレンダーなんだったの?

シンプルに言うとDarkの紹介です。
テーマは自由でしたw

Darkとは Dark - Developers at Real Kommunity | Doorkeeper

このコミュニティはだいたい新卒くらいの人が集うコミュニティで、
3ヶ月に一度の大きめのイベントと土曜日に月数回もくもく会をやるのが主なイベントです。
今回のアドベントカレンダーはこんな人がいるんだなぁみたいな気持ちで見てくれたら良いなという思いでやり始めました。(たしか)

ちなみに運営側の人間はこんな感じでポエム書いたりしてました。

arata.hatenadiary.com

ymat.hatenablog.com

moschan.com

@moschann のはあまりポエムっぽくない気はするw
ちなみに僕のは酔っ払って書いてます←
愉快な人々なのでぜひ遊びに来てください。
( 土曜の昼暇だしもくもく会とか行きたいなぁーって人はぜひこちらに連絡を __dark__ (@ngineerxiv) | Twitter )

Dark Advent Calendar 2015 Pick Up!

アドベントカレンダーで超個人的に気になった記事です。

gomayumax.hatenablog.com

hubot-karmaとかのレベルではなく、RPG風にHPで表現した機能の話です。
hubot-hp-pluginが待ち遠しいです。
アルテマとか実装したいですよね。

task-blog.net

DarkのSlackでrubotyの@rayが活躍しているのですが、その話です。

こちらもご参考に・・・w

task-blog.net

rubyコマンドが実行できるのヤバイですね。
ちなみにrubotyはユーザと認識されるのでwebhook等でもコマンドが起動可能です。
僕はrubotyのhomeにloop.mkという名前で下記のようなことを書いて無限ループを実行しました←

loop:
    curl -F payload='{"text":"ray ruby `make -f ./loop.mk ruby`"}' https://hooks.slack.com/services/XXXXXXXX
    curl -F payload='{"text":"ray ruby `make -f ./loop.mk loop`"}' https://hooks.slack.com/services/XXXXXXXX

ruby:
    curl -F payload='{"text":"ray ruby `ruby /app/vendor/bundle/ruby/2.2.0/bin/ruboty`"}' https://hooks.slack.com/services/XXXXXXXX

この状態で

ruboty ruby `make -f ./loop.mk loop`

とかやると最高な感じになります。

moschan.com

最後はこれ
名前から完璧っぽい←
なんかやってみたいから今度Darkのもくもく会でやってみたいと思います。

ここから先はポエムです。

クリスマスに心を削られてあれなので、ポエム書く。
こんな感じだし

運営とかの話

@moschann と @ymat には感謝してます。
自分はこういうコミュニティが大好きだけど、常に一人で頑張らないといけないのが大嫌いで、代表が嫌いです。
でも2人はやらなければいけないタイミングでやり始めてくれるし、自分もそのタイミングでやらないとって思えるのでほんと良いメンバーとやり始められたなと思いました。
人生で最高とかうそ臭くて嫌いだけど、今は素直に言える。最高!!!!!これからもよろしく!

Darkのこみゅにてぃに対するポエムとか

ポエムはここで書いたんですが、なんか最近思ったことです。

arata.hatenadiary.com

Darkは誰かが沈んでいたらなんでも良いけど声をかけられるコミュニティにいたいなぁって思う。
なんらかの悲しい出来事に合って弱ってる人がいたらなんでもいいけど反応できたらなぁとか。
でもそれをルールにするのはおかしいので、みんながつらい気持ちをわかりあえて心の助け合いになれたらいいなぁ()みたいにふと思いました。
というのも自分自身が今年、すごく生きていてつらいとか、嫌だなぁって思うことがすごくたくさんあったけど、なんだかんだ楽しく過ごせたのは一つこのコミュニティのおかげだと思うから、
もしとてもつらいと思ったとしても僕らが周りにいてまあ楽しいこともあるから頑張ろうかなみたいに思えたらすごくいいのかなぁみたいに思いましたとさ。

一方で、人が少ない小さなコミュニティってすごくやりやすくて、何故かと言うと意思疎通が個々人で取りやすいからと思ってる感じです。
少し人数が増えてくると、コミュニティに対する不満が出くることがあると思うんだけど、
もし解決すべき人が気づけなかったりするとか運なども絡む複雑な理由で、人が去っていってしまったりする。
(解決すべき人?とは?とおもいつつ)
自分自身、参加者が固まっているコミュニティに入っていくのは少し頑張ろうと思わないといけないと感じてるので、
難しいと思いつつ、なんかそういう部分を感じずに参加できるコミュニティがここで実現できたらなぁと思う今日このごろ。

そんで、このコミュニティ(このコミュニティではなく自分の理想のコミュニティ)の個人的な理想な状態は、リーダー(?)がいないけどいい感じにコミュニティが成り立っているみたいな状態で、サッカーで言うとトータルフットボール(?)的な感じ。
運営者がいないのにこのチームのSlackを使いつつもくもく会が行われていたとか僕にとっては :gekiatsu: なんですよ!
(ある程度の秩序は守りつつッて感じですが)
(イベント自体知らないと、普通に誘われなかったのか・・・と思って悲しいだけですが)

だから、みんなもくもく会とかイベントとか参加して、
さらにあなたの会社つまり御社でもくもく会とかやって、人生楽しんでいきましょう!!!(雑

来年の豊富

  • 来年はもっともくもく会を増やしたいなみたいな気持ちです!
  • 今年と同様に3ヶ月に一度イベントしましょう!
  • ISUCONでるチーム増やしたり、DarkでISUCONできたら楽しそう!
  • Mashup Awardは出れてないからでたい!
  • アドベントカレンダー来年はネタ無いから人を増やしたいw
  • コミュニティのみんなありがとう!!!

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 さんによる記事です!