evac – Node.js based simple aggregator

evacというシンプルなアグリゲーターを作りました。個人用途で作っていたのですが、そこそこ形になったのでnpmで公開しています。

NPM

よくあるアグリゲータの実装と同様に入力、加工、出力をJSONファイルで定義することでアグリゲーションすることができます。

例えば自分の場合は以下の様な使い方をしています。

  • ブログの記事に更新があれば、gmail通知
  • 社内SNSのスケジュール機能で用意されているiCalファイルを読んで、一時間以内に予定があれば仕事で利用しているMac上にgrowl通知
  • DBに接続して数値を取り、dashingAPIに向けてPOSTする
  • あるサービスのwebページをスクレイピングしてKPIにしているパラメータを抽出してIRCに通知
  • RSSを走査し特定の文字列があればIRCに通知

などなど、いままでであれば小物スクリプト書いて動かしたりしていたものを置き換えすることができました。

自分以外だと、街に詳しい@

  • iTunesConnectから自分が管理しているiPhoneアプリのダウンロード数を取得してIRCに通知

といった形でも利用してくれています。

実際の例として、例えば予定通知の例だと以下の様な設定ファイルを準備します。

{
"in": {
"ical": {
"url": "http://****.********.jp/calendar/ical/*****.ics",
"within": 1
}
},
"filter": {
"through": {}
},
"out": {
"notice": {
"type": "growl",
"title": "予定の通知"
}
}
}

これを定期的にevacで呼び出してやると、呼び出し時から一時間以内に予定があれば…

f:id:hideack:20141114092941g:plain

の様にgrowl通知できます。当たり前ですがOutput変えれば、何か予定があればIRC通知させたり、Yoさせたり、Pushbulletでプッシュ通知させたりもできます。

出力用のプラグインとしてYoやPushbulletを利用して出力ができるようにしたので私が以前作っていたTOKYOAMEDAYOの様なbotも比較的簡単に作れるのではないかと思います。

このあたりの実装しているプラグインは以下のページに簡単にまとめてあります。*1

基本、cronで定期的に回す等々が使い方かなと思うのですが、evac自身にもcron的な動きができる様に実装がしてあるので

[
{"*/10 * * * *": "/home/hideack/recipe/rss.js"},
{"0 18 * * *": "/home/hideack/recipe/news.js"}
]

といった具合に設定ファイルを準備してあげることで一般的なcron書式に従って、evacを起動させることができます。foreverで永続化する等をしてやるとよいかもしれません。

設定ファイルのフォーマットやプログラムの作り自体も荒削りなところがあるのですが、まずは自分の周りが少し便利になったのでより使いやすくなる様に対応進めていきたいと思います。

蛇足

evacは脱出という意で情報をあるところからあるところに飛ばす的な意でつけました。

*1:簡単すぎますね...

日本橋へ魚を食べに行く

入院していた友達が退院したということで、回復祝いにお魚を食べに行った。

日本橋 墨之栄
〒103-0022 東京都中央区日本橋室町2-2-1 COREDO室町1 2F
5,000円(平均)1,000円(ランチ平均)

魚を一匹まるごと頼んで、好きな調理方法で調理してもらってそれで食べるというスタイルなのだけど、大きめの魚を1匹頼んで刺し身、天ぷら、酒蒸しにしてもらったところとても満足だった。

単品のメニューもあるのだけど、魚を指定して店員さんがオススメする調理法を聞きながら料理してもらうのがこの店では正解な気がする。

食べるのに夢中で食べたものの写真を取らなかった...。日本酒の種類も多くて、魚料理によくあって大変よかった。また是非行ってみたい。


全然話は変わるが、夜見る日本橋麒麟は格好良かった。

PushbulletのAPI経由でPush通知する

Pushbullet というサービスのAPIを使ってPushbulletがインストールされた端末(iPhone, Android, PCブラウザ) に向けてPush通知する術をあれこれ調べた際のメモです。

そもそもPushbulletは先に書いた様なPushbulletのクライアントアプリがインストールされた端末間で相互にテキストや画像を相互にやり取りできるサービスです。Googleアカウントのみで利用することができます。

Chrome Web Store - Pushbullet Chrome Web Store - Pushbullet このエントリーをはてなブックマークに追加

Pushbullet - Google Play の Android アプリ Pushbullet - Google Play の Android アプリ このエントリーをはてなブックマークに追加

Pushbullet on the App Store on iTunes Pushbullet on the App Store on iTunes このエントリーをはてなブックマークに追加

これらを端末に導入することで導入した端末間で例えば、

  • iPhoneで撮影した画像をPC側へ送る
  • PCのChromeブラウザでメモしたURLをiPhoneに送る

といったことが簡単にできてとても便利なのですが、APIが用意されているのでプログラムを作成して操作することもできます。

まず、APIのアクセストークンを取得します。Pushbulletにログインして、右上のアカウント設定(Account Settings)を選ぶとAPIAccess Tokenが表示されるのでこちらを控えます。

で、これを利用してAPIを呼び出せばPushbullet経由で任意の情報をPushbulletが導入された端末にPushすることができます。素朴なHTTP APIなので各言語向けにライブラリが用意しているのでそちらを利用すると良いかと思います。

以下、node.jsの場合、npmに pushbullet というパッケージがあるのでそちらを利用すると楽です。

NPM

$ npm install pushbullet

を行った後、以下の様な実装でPushbullet導入端末にプッシュすることができます。

第1引数にPushbulletで使ったGoogleアカウントのメールアドレスを渡すとPushbulletの自身のアカウントに紐もづいている全てにPush、Pushbulletで割り当てられているdevice ID を渡すと特定の端末のみにPushできます。

var PushBullet = require('pushbullet');
var pusher = new PushBullet("*******");   // Access Token
pusher.note("****@gmail.com", "test", "test body", function(error, response) {
// snip
});

とするだけで、例えばiPhoneであれば、

といった具合にPush通知がされて、開くと、

といった具合で、pushした本文も含めて表示されます。他にも通知の種類があって、

pusher.link("****@gmail.com", "blog", "http://hideack.hatenablog.com", function(error, response) {});

とすると、リンクを直接通知することができて、このPush通知を開くと

と、Pushbulletアプリ内のブラウザで即座に該当するページが開かせることができたり、

pusher.list("*****@gmail.com", "list", ["foo", "bar", "hoge"], function(error, response) {});

とすると、以下の様なチェックリストを送ることができます。

Pushbulletで用意されているiPhone/Android向けアプリやブラウザ拡張でも素朴に便利なのですが、エンジニアの方であればAPI経由で操作することでいろいろ拡張できそうですね。というお話でした。

Jekyllで記事中にレンダリングされたMarkdownを差し込む

GitHub Pages を利用して静的なページを持つサイトを作るときにJekyllを利用していて、作成したページ中に別ファイルで書いたMarkdownファイルを流し込んでHTMLを作成したいと思ってあれこれ調べたのでメモ。

Jekyllのテンプレートのタグに include があるので、

.
├── _incldes
│   └ foo.md

といった具合に _includes というディレクトリを新しく掘ってその中にMarkdownのファイルを置いて

{% include foo.md %}

と書いたら表示はされるのだけど、Markdownファイルがそのまま表示されてしまった。
あれこれ調べてみると、

{% capture foo %} {% include foo.md %} {% endcapture %} {{ foo | markdownify }}

といった書き方で解決できた。中身的には

  • fooという変数を定義開始
  • 変数に _include に置かれたfoo.mdの内容を入れる
  • fooという変数の定義終了
  • fooの中身をMarkdownからHTMLに変換

といった意になると理解した。というメモエントリでした。

node.jsで定期処理をさせる

npmにあるcronというモジュールを使うとサーバーでよく扱うcronと同様にスケジュールを指定して定期的な処理を書くことができる。

var CronJob = require('cron').CronJob;
var job = new CronJob({
cronTime: "*/5 * * * * *",
onTick: function() {
console.log("5sec!");
},
start: true
});

と、書くことで5秒毎に 5sec! と表示できます。

魚を食べる

大学の同級生の入院お見舞いへ行って、お見舞いメンバで東京駅近くでお魚を食べていました。

http://photos-c.ak.instagram.com/hphotos-ak-xaf1/10729197_309779729214082_1075794144_n.jpg

煮付け頼んだら普段よりデカイと店員さんが言いながら持ったキンメダイの様子です。

友達が退院したらみんなで今度、また何か食べに行こう。