ほんじゃらねっと

ダイエット中プログラマのブログ

忙しいけど映画は観たい人のために、テレビ映画放映情報チェックして通知してくれるスクリプト

f:id:piro_suke:20160722000409j:plain

映画鑑賞は割と好きなのだけど、

なかなか映画館にはいけないし、

DVDを借りてもレンタル中に観る時間が取れるとは限らないし、

ということでもっぱらテレビで面白そうな映画をやってたら録画して

時間のある時に観ている。

しかしそうそうテレビ欄をチェックしているわけでもないので、

気づいたら観たかった映画が昨日放映されてて悔しがる、なんてことがよくある。

放映予定の映画をまとめて確認する方法はないのか、と探してみたら

良いページが見つかった。

続きを読む

ボケてきたのかタイムカードの打刻を忘れてしまうので、打刻漏れ防止用チェックプログラムを作成した

f:id:piro_suke:20160620020919j:plain

毎朝出社時に社員カードで入室し、

入室したのと同じカードで出勤打刻をするのだが、

入って数歩のところにタイムレコーダーが置いてあるにも関わらず、

打刻が漏れることがある。

どうやら、

雨の日に途中で傘を置いたり(傘立てはドアとタイムレコーダーの間にある)

誰かと会って話しながら入室したりすると

ルーチンが壊れて打刻を忘れてしまうことがあるようだ。

どれだけ変化に弱いルーチンなんだ、という話だが、

ともあれ打刻が漏れると手続きが面倒なので、

自動チェックの仕組みを考えた。

続きを読む

WindowsのタスクスケジューラからGruntスクリプトを起動する方法

f:id:piro_suke:20160422003356j:plain

どうせ自動化するなら完全自動化したいよね、

ということで今回は作成したGruntスクリプトを

Windowsの起動時や毎日の決まった時間に実行できるように

タスクスケジューラに登録する方法を紹介する。

この記事はGruntを実行する環境が整っていることを前提としているので、

未インストールの方は下記の記事を参考にしていただきたい:

blog.honjala.net

続きを読む

Node.jsとGruntでフォルダ監視ツールを作る

f:id:piro_suke:20160414001322j:plain

コミュニケーションというのはなかなか難しいもので、

「急いで確認したいから資料ができたら共有フォルダに入れて、すぐ連絡してよ」

と強めに伝えても、

資料はとっくにできてるのに

やれ後で連絡するつもりだっただの、

もうちょっと確認してから連絡するつもりだっただの、

今メール書いてただので、

一本内線をくれるだけで良いのになかなか連絡がもらえないことがある。

そんなストレスフルな行き違いは

「このやろう!」と毎回怒りを爆発させるよりも

ツールを使って解決の仕組みを用意してしまうに限る。

ということで今回は指定したフォルダを監視して、

ファイルが追加されたり更新されたりしたら

自動で通知してくれるスクリプトをつくってみたい。

続きを読む

IFTTTのMakerチャンネルを使って、いろんなサービスの更新情報を通知してくれる仕組みを作る

仕事でチーム間のコミュニケーションツールとして使い始めたチャットワークだが、

最近は「いろんなサービスやスクリプトからの通知を集めるツール」としての利用がメインになってきている。

www.chatwork.com

以前記事にした、

「Subversionのコミット情報にメンバーがすぐに気づけるように通知するスクリプト」

blog.honjala.net

を書いたのがきっかけで、

この仕組みを流用すればメールを汚さずにいろんな通知を一元管理できるのでは?

と思いついて色々チャットワークに自動通知するスクリプトを書き始めた。

ただ通知するだけなのだけど、ボットが

「ブログのはてブが増えたよ!」とか

「AmazonにKindle本が追加されたよ!」とか

発言してくれることでチェックの手間が減るのが楽しい。

本題

そんな時に、「IFTTTにMakerチャンネルができた」という話を聞いて、

これを使えば自動通知がさらに捗りそうだ、ということで試してみた、というのが今回の本題だ。

IFTTT(If This Then That)とは

EvernoteやTwitter等様々なアプリやWebサービス(チャンネルと呼ばれる)の更新を監視して、

更新が発生するとをあらかじめ登録しておいたアクションを実行してくれるというサービスで、

これを使えばプログラムを自作しなくても手軽に連携の仕組みが作れるという、

自動化心をくすぐられるサービスだ。

ifttt.com

IFTTTは便利なサービスなのだが、以前はチャンネルが用意されていないサービス間の連携がしにくい、という欠点があった。

チャットワークもチャンネルが用意されていない。

それが、Makerチャンネルが使えるようになったことで多少やりやすくなった。

ifttt.com

Makerチャンネルは簡単に言うと「他のチャンネルとWebアプリを連携できる」チャンネルだ。

自作のWebアプリをトリガーとしてMakerチャンネル経由で他のチャンネルを呼び出したり、

特定のチャンネルで更新が発生したら指定したURLにリクエストを飛ばすようなことができる。

これを使えば、何かしらのサービスで更新が発生した時に自作のWebアプリを経由してチャットワークにメッセージを保存する、みたいなこともできるわけだ。

Makerチャンネルを使ってチャットワークに連携するサンプルを作る

試しに、Node.jsで作成したWebアプリ経由で「Date&Timeチャンネルをトリガーに、定時になったらチャットワークに通知するレシピ」を作ってみた。

Webアプリを準備する

まずはIFTTTからアクセス可能なWebアプリを用意する。

ここがややハードルの高いところ。

今回は「http://自分のサーバのドメイン:3000/ifttt/notify_workend」というURLを用意し、

POSTリクエストで「time:時間」「message:メッセージテキスト」をJSON形式で渡すとその内容をチャットワークに送れるようにした。

下記はnode.js + Express4のサンプルソース:

(Webアプリでパラメータを受け取れたら環境は問わないので、Apache + PHP環境とかでも可)

REST API Sample For IFTTT Maker Channel.

こういうものを1つ用意しておけば、URLを追加していくだけでいろんなチャンネルと連携できるようになる。

IFTTTのレシピを作成する

次はITFFF側で用意したURLを呼び出すレシピを作成する。

トリガーとなるチャンネルの選択後、Makerをアクションとして選択して新しいレシピを作成する。

f:id:piro_suke:20160215013908p:plain

アクションの設定を行って、

f:id:piro_suke:20160215013918p:plain

作成したWebアプリのURLとパラメータを定義する。

「Content Type」を「application/json」にしておき、BodyでJSONを渡すようにしている。

f:id:piro_suke:20160215013928p:plain

この内容で登録しておくと、平日の17:30になったら、「Time to leave work」というメッセージが

用意したURLに飛び、そこを経由してチャットルームにメッセージが投稿される。

おわり

とりあえず仕組みが作ってみたが、まだまだ活用法は模索中。

また良い通知レシピを思いついたら試してみたい。

実践Node.jsプログラミング Programmer's SELECTION

実践Node.jsプログラミング Programmer's SELECTION

Subversionにコミットしたらチャットワークに通知するNode.jsスクリプト

ある開発プロジェクトで、

非技術系のメンバーにも進捗を知っておいてもらいたいものの、

「お前らSubversion入れろ」とか「リポジトリログを見ろ」といっても見そうになく、

いちいち伝えるのも面倒大変そうだったので、

Subversionにコミットがあったらメッセージ内容がリアルタイムで

チャットワークに流れる仕組みを作ってやった。

www.chatwork.com

チャットワークはチーム間でのやりとりに使っていたので、ここに流してやろうというわけだ。

チャットワークはプレビュー版ながらAPIを公開してくれているので、

developer.chatwork.com

API経由でメッセージ投稿を行うスクリプトと、

Subversionのフック機能を組み合わせることで実現することができた。

Node.jsでチャットワークのAPIにアクセスするスクリプトを作成する

今回はNode.jsでスクリプトを作成した。

手軽に環境が作れて、速くて、一通りライブラリが揃っているので気に入っている。

スクリプトの内容としては、

コマンドラインからリポジトリパスとリビジョン番号を受け取って、

svnlookコマンドでリビジョンをコミットしたユーザー名、メッセージログを取得して、

メッセージを組み立てて、

チャットワークのAPI経由で投稿している。

Subversionが動いているサーバにnode.js環境をインストールして、このスクリプトを配置する。

svn2chatwork.js

var execSync = require('child_process').execSync;
var _ = require('underscore');
var request = require('request');

if (process.argv.length < 4) {
    return;
}

var repo = process.argv[2];
var rev = process.argv[3];

var cwApiKey = '<ChatworkのAPIキー>';
var endpointBase = 'https://api.chatwork.com/v1/';

var svnRootPath = '/var/www/svn'; //Subversionのリポジトリルートパス

var targetRepos = {}; 
// このtargetReposにリポジトリパスを追加したら複数のリポジトリに対応可能
targetRepos[svnRootPath + '/<SVNリポジトリパス>'] = {'roomId': '<投稿先ChatworkのルームID>'};

var post2Chatwork = function (roomId, message, callback) {
    var options = { 
        url: endpointBase + 'rooms/' + roomId + '/messages',
         headers: {
             'X-ChatWorkToken': cwApiKey
         },  
        form: {
            body: message
        },
        json: true
    };

    request.post(options, function (error, response, body) {
        if (!error &amp;&amp; response.statusCode == 200) {
            callback(body);
        }   
    }); 
}
if (_.has(targetRepos, repo)) {
    var repoInfo = targetRepos[repo];
    var message = 'New Commit\n';

    var result = '' + execSync('svnlook author ' + repo + ' -r ' + rev);
    message += 'User:' + result;

    result = '' + execSync('svnlook log ' + repo + ' -r ' + rev);
    message += result;

    // 下記のコメントを外すと更新ファイル一覧もメッセージに追加できる(大量にファイルが更新されると結構うざい)
    // result = '' + execSync('svnlook changed ' + repo + ' -r ' + rev);
    // message += 'Files Updated:\n';
    // message += result;

    post2Chatwork(repoInfo.roomId, message, function (body) {});
}

Subversionのフックスクリプトを作成する

Subversionのリポジトリを作成すると、その中にhooksフォルダが作成され、

そこに置いたフックスクリプトを各種タイミングで実行してくれる。

Subversion フックスクリプト

今回はコミット後に上で作成したスクリプトを実行してもらいたいので、

「post-commit」という名前で下記のような内容のファイルを作成する。

作成したスクリプトにパラメータとしてリポジトリパスとリビジョン番号を渡し、nodeコマンドで実行するコマンドを書いてる。

最初のexport文を書かないと、日本語が文字化けしてしまうので注意。

あと、node.jsのバージョンとか、どこにsvn2chatwork.jsを置いたかでパスが変わるので注意。

post-commit

export LANG=ja_JP.UTF-8

REPOS='$1'
REV='$2'

# <nodeコマンドへのパス> <svn2chatwork.jsへのパス> $REPOS $REV
/usr/local/node-v0.12.7/bin/node /home/test/svn2chatwork/svn2chatwork.js $REPOS $REV

編集後、post-commitに実行権限をつけたら以降のコミットがチャットワークに通知されるはず。

おわり

ソースを整理したり、リポジトリとルームの関連付けを外部化したりしたものをGitHubに置いている。

よかったら参考にしていただきたい。

github.com

今時Subversionなんか使わねーよ!と言われるかもしれないが。

blog.honjala.net

Subversion実践入門:達人プログラマに学ぶバージョン管理(第2版)

Subversion実践入門:達人プログラマに学ぶバージョン管理(第2版)

GMailで特定の条件に合うメールのみ携帯に転送する

GMailのフィルタ機能はメールにラベルをつける以外にもいろいろできる。 条件に合うメールを既読にしたり、アーカイブしたり、 今回のようにメールアドレスを指定して転送したり。

正月休みに入るにあたり、重要なメールのみ携帯に 転送されるように設定したら良い具合だったので、 設定方法を記録しておく。

設定方法

設定画面の「フィルタ設定」を開く。

f:id:piro_suke:20160207221343p:plain

フィルタ設定画面下部の「フィルタを追加」ボタンクリック。

f:id:piro_suke:20160207221450p:plain

フィルタ作成ダイアログで条件を指定する。 送信元メールアドレスや含まれるキーワードで条件指定できる。

f:id:piro_suke:20160207221700p:plain

転送先メールアドレスを指定して転送設定。

f:id:piro_suke:20160207221726p:plain

色々活用できそう。

日経新聞に自社情報が掲載されたら通知されるようにする

日経新聞を読むことが社会人のたしなみと 考えられている会社は多いと思う。 うちもそうなのだけど、ついつい流し読みになってしまって 重要な記事を見逃し、上司と話が合わない、なんてことがよくある。

そこで役に立っているのが、日経新聞電子版の「キーワード管理」機能。 ここに検出したいキーワードを登録しておくと、メールで通知してくれたり、 電子版アプリで強調表示してくれたりする。

自社名とか、自社の業界、関連分野に関するキーワードを登録しておくと、 見逃す心配なくさらーっと読み流せる。

http://www.nikkei.com/

池上彰の新聞活用術

池上彰の新聞活用術