ttaka/tmp

d.hatena.ne.jp/ttaka_tmp

チャットワークで自分宛のメッセージがあったらメールで通知

モバイル端末でチャットワークを使っていて、自分宛のメッセージを通知させたい場合、アプリ版はプッシュ通知ができるようですが、ブラウザ版は残念ながら自分宛のみのメール通知設定ができないようです。

普段使いのスマホがアプリの動作要件を満たしてなくて利用できないので、それならばとチャットワークAPIGoogle Apps Script (GAS)を使って、メールで通知するようにしてみました。

1. チャットワークAPIの申請

まずはAPIを使えるように、チャットワークAPIドキュメントのページから利用申請を行います。
土曜のお昼に申請したところ、その日の深夜には利用可能のメールが届きました。素晴らしー。

2. チャットワークAPIトークンの取得

無事利用可能のメールが届いたら、認証方法 - チャットワークAPIドキュメントのページに書いてある手順でAPIトークンを取得します。

3. Google Apps Scriptの準備

APIが利用できるようになったら、次にスクリプトの準備を行います。

  1. Googleスプレッドシートを新規作成
  2. メニューから「ツール>スクリプトエディタ」を選択
  3. 空のプロジェクトを作成
  4. プロジェクト名を変更

Google Apps Scriptアプリを追加してる方は、ドライブから直接新規作成でもOKです。

4. ライブラリの導入

チャットワークAPIをGASから使うためのライブラリがあるので導入します。ありがたやー。
  https://github.com/cw-shibuya/chatwork-client-gas
メニューから「リソース>ライブラリ」を選択し、検索欄にライブラリのプロジェクトキーを入力します。

タイトル バージョン 識別子 デベロッパーモード 削除
ChatWorkClient 16 ChatWorkClient 無効 ×

無事ライブラリが読み込まれたら、最新のバージョンを選択して保存します。

5. コードの作成

コード.jsに次のコードを貼付けます。

var CHATWORK_TOKEN = 'チャットワークAPIトークン';
var MAIL_TO = '通知先のメールアドレス';

function myFunction() {
  var rooms = getRooms();

  if (!rooms) {
    Logger.log('rooms request failed');
    return;
  }

  var mentionCount = 0;
  var body = '';

  for (var i = 0; i < rooms.length; i++) {
    var room = rooms[i];

    if (room.mention_num == 0) {
      continue;
    }

    mentionCount += room.mention_num;
    body += room.name + " (" + room.mention_num + ")\n"
          + getRoomUrl(room.room_id) + "\n\n";
  }

  Logger.log('mentionCount: ' + mentionCount);

  if (mentionCount > 0) {
    sendMail(mentionCount, body);
  }
}

function getRooms() {
  var client = ChatWorkClient.factory({token: CHATWORK_TOKEN});

  return client.get('/rooms');
}

function getRoomUrl(roomId) {
  return 'https://www.chatwork.com/#!rid' + roomId;
}

function sendMail(mentionCount, body) {
  var subject = '[ChatWork] mention:' + mentionCount;

  MailApp.sendEmail(MAIL_TO, subject, body);
}

コード先頭のCHATWORK_TOKENに2で取得したAPIトークンを、MAIL_TOに通知先のメールアドレスを設定して保存します。
そして一度実行させて、動作の確認と認証を済ませておきます。

6. トリガーの設定

無事動作することを確認したら、定期的に実行するようトリガーを設定します。
メニューから「リソース>現在のプロジェクトのトリガー」を選択し、実行間隔をお好みにあわせて設定します。

実行 イベント
myFunction 時間主導型 分タイマー 5分ごと 通知

これでチャットワークに自分宛のメッセージがあれば、メールが届くようになるはずです。めでたしめでたし。

今回初めてGASを使ってみたのですが、常時起動させておくサーバーがなくても定期実行ができるので、ほんと便利ですねー。

Bowling Game KataをPHPUnitでやってみた

皆さんは『Bowling Game Kata』ってご存知ですか?

  http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata

ボウリングのスコア計算プログラムをテスト駆動開発(TDD)で実装するもので、自分は恥ずかしながら知らなかったのですが、つい先日知るきっかけがあり、使い慣れたPHPでやってみました。

まずは、上記サイトの文頭にあるHereリンクからパワポをダウンロード。RequirementsおよびQuick designまで読んで、いざ実装開始!

そのときのソースコードが下記で、

  https://github.com/ttaka/the-bowling-game-kata

実装後に型を見ながらもう一度やってみました。

  • php/ownway … 自己流でやったもの
  • php/kata … 型通りにやったもの

型をやった後に自己流を見てみると、概ね同じ実装ではありますが、リファクタリングが足りてないですね...orz

パワポには、TDDの流れが順を追って記載されていて、何が悪いのかやリファクタリングにいたる考えなどの丁寧なコメントがあり、とても素晴らしいドキュメントです。

やったことない人はもちろんのこと、昔やったけどもう忘れちゃった人は、ぜひお好みのプログラミング言語とテスティングフレームワークでチャレンジしてみましょう!

Sinatra風PHPマイクロフレームワーク5つ

WebアプリケーションのモックやちょっとしたAPIサービスの作成用に、小粒なフレームワークを探してたところ、RubySinatraライクに作られたPHPマイクロフレームワークをまとめてあるスライドを発見!

  http://johnsonpage.org/more/php-microframeworks/

同じアプリをそれぞれのフレームワークで記述した際のコードも記載されているので、比較しやすくて素敵な資料ですね。
ただ、作成日は2010年12月1日時点のようなので、2011年4月28日現在の状況を加味して、表にしてみました。

PHP Ver. Document Test Latest Ver. License Size 備考
Slim 5+ 1.3.3 MIT
Limonade 5+ 0.5.1 MIT
Fitzgerald 5+ × 0.3 MIT 極小 1ファイル
Silex 5.3+ 7438550 2011-04-26 13:14:06 +0200 MIT Symfony2ベース
Lithium as a microframework 5.3+ 0.9.9 MIT Lithiumベース

一通りさくっと触ってみたところ、どれもフィルター・テンプレート・ヘルパーを提供し、フレームワークの規模感にあわせて、より機能が追加されてる感じです。
特にSilexLithium as a microframeworkは、元となるフレームワークから必要最低限のコンポーネントを利用して実現している模様。

なお、無名関数が使えたほうが、記述もすっきりするので、PHP5以上で利用できるものでも、5.3以上で使ったほうがオススメです。

さて、この中のどれが良いかですが、どれもドキュメントやサンプルコードが充実(英語ですが……)しているため、それらを眺めてみたり、実際に触ってみたりして、自分に合いそうなのを選ぶのが一番いいかなーと。

なんといっても、どれも学習コストは低く、全部触ってもそれほど時間がかからないのが嬉しいですね!

GNU/Linuxディストリビューションで提供されている開発系ツールなどのバージョン

昨日はMac OS X 10.6.7で提供されている開発系ツールなどのバージョンについて調べたので、今日はGNU/Linuxディストリビューションで提供されているコマンドラインツールやプログラミング言語などの各バージョンを調べてみました。

Debian 6.0 Ubuntu 10.10 CentOS 5.6
Apache 2.2.16 2.2.16 2.2.3
Bash 4.1.5(1)-release 4.1.5(1)-release 3.2.25(1)-release
Bazaar 2.1.2 2.2.1 -
Emacs 23.2.1 23.1.1 21.4.1
GCC 4.4.5 4.4.5 4.1.2
GDB 7.0.1 7.2 7.0.1
Git 1.7.2.5 1.7.1 -
Kernel 2.6.32 2.6.35 2.6.18
Memcached 1.4.5 1.4.5 -
Mercurial 1.6.4 1.6.3 -
MySQL 5.1.49 5.1.49 5.0.77
Perl 5.10.1 5.10.1 5.8.8
PHP 5.3.3 5.3.3 5.1.6
PostgreSQL 8.4.7 8.4.7 8.1.23
Python 2.6.6 2.6.6 2.4.3
Ruby 1.8.7 (2010-08-16 patchlevel 302) 1.8.7 (2010-06-23 patchlevel 299) 1.8.5 (2006-08-25)
Ruby on Rails 2.3.5 2.3.5 -
Screen 4.00.03jw4 (FAU) 4.00.03jw4 (FAU) 4.00.03 (FAU)
SSH OpenSSH_5.5p1 OpenSSH_5.5p1 OpenSSH_4.3p2
Subversion 1.6.12 (r955767) 1.6.12 (r955767) 1.6.11 (r934486)
Vim 7.2.445 7.2.330 7.0.237
Zsh 4.3.10 4.3.10 4.2.6

※「-」は標準のリポジトリでは未提供

Mac OS X 10.6.7で提供されている開発系ツールなどのバージョン

Mac OS Xには、UNIX系OSでお馴染みのコマンドラインツールやプログラミング言語が標準で提供されているので、とりあえず気になったもののみ、各バージョンを調べてみました。
なお、環境はMac OS X 10.6.7にXcode 3.2.6をインストールしています。

Version
Ant 1.8.2
Apache 2.2.17
Bash 3.2.48(1)-release
Derby 10.7.1.1
Emacs 22.1.1
GCC 4.2.1 (Apple Inc. build 5666) (dot 3)
GDB 6.3.50-20050815 (Apple version gdb-1515)
Java 1.6.0_24
JUnit 4.8.2
Maven 3.0.2
Perl 5.10.0
PHP 5.3.4
Python 2.6.1
Ruby 1.8.7 (2009-06-12 patchlevel 174)
Ruby on Rails 2.3.5
Screen 4.00.03 (FAU)
SSH OpenSSH_5.2p1
Subversion 1.6.15 (r1038135)
Vim 7.2.108
Zsh 4.3.9

MacにHomebrew版Emacsをインストール

これまでEmacsは、
  http://emacsformacosx.com/
のものを使ってたのですが、折角Homebrewをインストールしたので、移行することにしてみました。

また、ついでにMacEmacs JP Projectにて配布されているCarbon Emacs版インラインパッチも適用したかったので、

の記事を参考にやってみました。

Emacs用Formulaスクリプトの編集

inline_patchを適用するため、まずはHomebrewの設定ファイルを編集します。

$ brew edit emacs

エディタが起動したら、patchesの箇所を、次のように修正します。

diff --git a/Library/Formula/emacs.rb b/Library/Formula/emacs.rb
index 2a84384..5bc6aa0 100644
--- a/Library/Formula/emacs.rb
+++ b/Library/Formula/emacs.rb
@@ -21,7 +21,10 @@ class Emacs < Formula
 
   def patches
     if ARGV.include? "--cocoa" and not ARGV.build_head?
-      "https://github.com/downloads/typester/emacs/feature-fullscreen.patch"
+      {
+        :p1 => "https://github.com/downloads/typester/emacs/feature-fullscreen.patch",
+        :p0 => "http://jaist.dl.sourceforge.jp/macemacsjp/47986/inline_patch-23.2-beta3.tar.gz"
+      }
     end
   end
 

ビルドとインストール

次のコマンドを実行します。

$ brew install emacs --cocoa

うちのMacBook Airでは、10分ほどで完了しました。

Emacsの設定と確認

あとは、~/.emacs.d/init.el などに

(setq default-input-method "MacOSX")

を追加して、
  /usr/local/Cellar/emacs/23.3/Emacs.app
を起動します。
日本語入力のオン・オフで、Emacsのモードラインが変化すればOKです。わーい。(^-^)/

親指シフト入力で問題発生

が!なんとKeyRemap4MacBook親指シフトで「っ」「ゃ」「ゅ」「ょ」を入力すると、ミニバッファに

Args out of range: 0, 2

とエラーメッセージが表示され、入力中の文字が非表示に……。一応そのまま入力を続ければ、また表示されましたが、どうも「xtu」などの3文字のキーコードが発行されてる文字が駄目みたい。

ならばと、「ことえり環境設定」の「入力操作」の設定を「ローマ字入力」から「かな入力」に変更し、KeyRemap4MacBookの設定も「Oyayubi Shift Input」を「<かなモード>」に変更したところ、大丈夫になりました。ふー。

が!これで解決かと思いきや、今度は「英数+1」などで記号が入力できなくなりました……。ぐぬぬ

また、どちらの入力操作でも、

(add-hook 'minibuffer-setup-hook 'mac-change-language-to-us)

はうまく動作しませんでした。しくしく。

うぅ、折角パッチあててビルドしたのに、哀しすぎる...orz

MacでCapsキーをFnキーに変更する方法

MacBook AirのJISキーボードは、最初からAキーの左隣にControlキーがあるので、Emacs使いには嬉しいですね。この位置にめったに使わないCaps Lockキーが配置してあると、ほんと泣けてきます……。

そんな左下のCaps Lockキーですが、たまに間違って押す事があるので、Fnキーに変更しようと思ったところ、「システム環境設定」の「キーボード」にある「修飾キー」の設定メニューからは、Control・Option・Commandキーにしか変更できません。

そのため、以下の方法を用いました。

1. KeyRemap4MacBookのインストール

Mac OS X用のキーボードリマッパーであるKeyRemap4MacBookを使いますので、インストールしていない方は、KeyRemap4MacBookのサイトからzipファイルをダウンロードし、pkgをインストールします。

なお、他のリマッパーとは併用できないので、ご注意ください。

2. PCKeyboardHackのインストール

同じサイトにて配布されているPCKeyboardHackもダウンロードしてインストールします。

3. 設定

再起動後、PCKeyboardHackの設定を次のようにします。

※Fnキーのkeycodeは「63」

次に、KeyRemap4MacBookの設定を
  http://pqrs.org/macosx/keyremap4macbook/faq.html.ja#t1p0
に書かれているように有効にします。

上記の設定後にCaps+F1〜F12を押すと、輝度や音量コントロールなどができるようになります。
なお、MacBook Airでは、「Enable CapsLock LED Hack」を有効にしなくとも、大丈夫でした。

これで、左右どちらでも機能キーの操作ができるので、便利になりました。(^-^)v