2015年 3月 の投稿一覧

evacを使ってスケジュール(iCal)をSlack経由で通知する

evacを公開した時のエントリで、iCalの予定を読み込んでMac上のgrowlに通知する等を紹介したのですが、ペパボ社内でSlackが使われる様になったので通知をSlackに移しました。

やり方としては自分用のチャンネルをSlack上に開設してmention付きで通知させることでMacの前で作業しているときはSlackのnoticeで通知され、ミーティング等でMacの前にいない場合もiPhoneにプッシュ通知されるので便利。(だと思います。)

ペパボでは誰でも利用できる形でtakosanが用意されているので、evacのikachanプラグインを使うことでslack通知させることができます。

といったフローになります。

$ npm install -g evac

evacはインストールができますので、以下の様なレシピを用意します。

ここでは実行時点から1時間以内の予定を通知対象にします。

in:
ical:
url: http://〜/****.ics
within: 1
out:
ikachan:
url: http://******
join: false
channel: "#evactest"
message: "@hideack __word__"

あるいは、incoming webhook が確保できればそちらを使うこともできます。

in:
ical:
url: http://〜/****.ics
within: 1
out:
slack:
url: https://hooks.slack.com/services/****/****/****
format: "@hideack __word__"

こういったYAMLファイルを用意した上でcron等で定期的に以下の様な形でevacに設定を渡すと...

$ evac /home/hideack/evac/plan-notice.yaml

以下の様にslack上で予定が通知されます。

これできっと「あ!」っということが減るはずです。

満開

いい色だった。

perceptual hash(phash)を利用して画像比較をしてみる

突然ですが画像がたくさんあってそれを人の目で分類するのって大変ですよね。

自動でこういったものを分類できないか興味があったので調べてみました。


perceptual hashとは

perceptual hash というのは、ハッシュ関数の実装なのですがSHA1等のハッシュ関数とは違い、以下の様な特徴があります。

  • 得られるハッシュ値は64bit
  • 対象は静止画, 画像, 音声等のマルチメディアデータ
  • コンテンツ内容が類似しているケースでハッシュを得た場合、例えば静止画画像の拡大、縮小といった加工の場合ハッシュ値が全く同じになる
  • また、色調の修正やノイズが加わった場合も得られるハッシュ値間のハミング距離が近くなる
    • 64bitのハッシュ値なので最も遠いハミング距離は64 (=全くコンテンツが異なっている)
    • 逆にハミング距離が0であればperceptual hashで得られた結果上は同一コンテンツ

こういった特徴があるため具体的にWebアプリケーションでの用途を考えると

  • コンテンツの重複判定
  • 類似画像検索

などに使えそうというのは上の特徴でわかるのではないでしょうか。

具体的なアルゴリズムはperceptual hashのオープンソース実装のphashのドキュメントにも記載があるのですが、

  • 対象画像を縮小する
  • 画像の輝度情報に対してDCT(離散コサイン変換)をかける
  • 低周波成分を得て、この部分をハッシュとして扱う

という考え方の様です。DCTまでは理解できたのですが、低周波成分をどの様にハッシュとして扱っているのか理解が届かない...。*1

node.jsで利用する方法

先に書いた http://www.phash.org/ の実装があり、そのラッパーがいくつか公開されています。今回は同名の phash を利用してみます。

で、実際に利用する前には環境にphashとimagemagickがライブラリを入れる必要があるのでMacであれば先に入れておきます。

$ brew install phash imagemagick

で続けてnpmコマンドでインストール。

$ npm install phash

実際に試してみる

では、いくつか画像を用意してハッシュ値の取得と画像の比較を行ってみます。

画像処理ではおなじみのLena画像を利用して実験。その画像をそれぞれ以下の様な加工をしてみて、元画像で得られたハッシュ値とのハミング距離を求めてみます。

  • 画像の縮小 (No.1)
  • 画像のセピア加工 (No.2)
  • 画像のモザイク化 (No.3)
  • 画像上に文字を重ねあわせる(No.4, No.5)
  • 画像を反転させる (No.6)

先ほどインストールしたnpmライブラリを利用してハッシュ値を求めた上で元画像とのハミング距離での比較を行います。

以下が得られた結果です。

No 画像 ハッシュ値 No.0とのハミング距離
0 (元画像) c91cb262775a9800 -
1 (縮小) c91cb262775a9800 0
2 (セピア化) c914b262775a9800 2
3 (モザイク) c98cb022375ad800 8
4 (文字追加) c9acb866635a9800 8
5 (文字記号追加) cb8cba66535a9800 8
6 (反転) dc69f7330287e000 34

perceptual hashの利用例等を見るとハミング距離20前後を閾値としているケースが多かったので、反転させたケース以外は全て同一画像として判断できているといってよさそうです。

反転させるという処理は根本的に画像の作りを変える操作(画素の並びを変える) になるのでハッシュ値は全く異なってしまいますね。仮に類似コンテンツを抽出する目的でphashを利用する場合はこの辺りも配慮する必要がありそうです。

まとめ

  • perceptual hash についてそれとなく把握しました
  • phashという実装がありそれをラップしたnpmライブラリを使ってみました
  • 実際に画像をいくつか用意してハッシュを得てハミング距離を比較し、縮小やセピア加工、文字を上に重ねる等の加工であれば同一コンテンツとして検出できた

*1:詳しい人教えてください...

追記

- 2020/6/6 WordPress移設に伴ってソースコードが読みにくくなっていたのでgistに貼り直しました。

比較三原則

みうらじゅんが各種メディアで唱えているのを読み聞きして賛同している三原則。

  • 自分を親と比べない
  • 自分を友達・知人と比べない
  • 自分を過去の自分と比べない

過去と他人 は変えられないという言葉もある通りの三原則。

とはいえ、どうしても生きていると上の比較はしがちだったりするのが人の常*1なので、そういったときは「癖」がついてしまったと思ってその癖を直していこうと思うとよいのかな。などと、思う今日このごろ。

唯一変えられるとしたら自分が将来向かっていく方向や姿勢ぐらいじゃないだろうか。

最近見事に上の原則を破っていること多かったので書いてみたが、多分、また原則を破ることはあると思うけど、その時に振り返れればそれでいい気もする。

*1:昔はよかった。などと年配の方が言ってしまうのも過去との比較だろうか

evac weekly – スクリーンショット取得プラグイン追加

evac - Node.js based simple aggregator - でこの一週間改良した箇所まとめです。

screenshotプラグイン追加

outputプラグインとしてPhantomJSでスクリーンショットを撮影できるプラグインを追加しました。入力として与えられたURLのスクリーンショットを撮影できる様になりました。

例えばこの様なレシピを用意して、

in:
textfile:
name: /home/hideack/recipe/url.txt
filter:
through:
out:
screenshot:
path: /home/hideack/recipe/screenshots

入力としてURLのリスト、

www.remp.jp/hello
www.yahoo.co.jp
hideack.github.io/evac/

を与えれば、以下の様にスクリーンショットをまとめて撮影することができます。

スクリーンショットはレシピで指定したパスにPNGファイルとして保存されます。

evac Ver.1.3 以降で利用可能です。

Uptime RobotでWebサービスの死活監視する

REMPStobo , Casto のそれぞれのHTTP(S)レベルでの疎通監視に以前から使っていたUptime Robotというサービスのことを書いていなかったので思い出した様に書いてみます。*1

Uptime Robotは50箇所のモニタリングで且つ5分間隔であれば無料で使える監視のWebサービスでHTTP(S)の疎通監視したいサイトを登録すると上の様なダッシュボードで監視状況を見ることができて、且つアラートの通知先として、

  • 基本通知
  • アプリケーション連携
    • Pushbullet, Pushover, HipChat, Slack

が使えます。ちなみにTwitterは通知先のアカウントが @ をフォローすれば、DMで通知が届きます。

またダッシュボードで各監視しているサイトの情報は以下の様な感じでレスポンスタイムの遷移と直近起きたUp / Down 状況とともに確認できます。

無償内でも個人で利用する上では十分な機能を抑えていますので、個人サービス等運営されている方は利用してみてはどうでしょうか。

*1:無論、今日アラートがここから飛んだから書いているということは言うまでもない訳で...。

evac weekly – ikachanプラグインを少し修正

evac - Node.js based simple aggregator - でこの一週間改良した箇所まとめです。

ikachanプラグインにjoinフラグ追加

ikachanに通知するアウトプットプラグインが今まで必ずjoinしてからメッセージを送る形になっていたので、joinコマンドの結果に関わらず直接メッセージ送れる様にするため、joinフラグを追加しました。*1

joinフラグをfalseにするとjoinを省略します。

以下のレシピの例では、某サイトから「◯◯.◯%」といった形式で評価値が掲載されているページからその数値のみをスクレイピングして #hideack チャンネルに「現在の評価 = ◯◯.◯%」といった形でikachan通知させる例。

in:
webPageParse:
url: http://〜
target: "body > div.maincol > table"
filter:
match:
regexp: "\\d\\d.\\d\\s%"
out:
ikachan:
url: http://〜
join: false
channel: "#hideack"
message: 現在の評価 = __word__

*1:目的は業務で使っていたikachan通知をtakosanに移行したところevacからoutputできなくなったので...