従来は人数や時間、場所に制約されていたKPTの共有だが、KPT出しをIRC上で行い、IRC botに集計・管理・表示させる事で、前述の制約を取り除きたい。そのためのbotを開発する。
KPTちゃんはKPTを管理するbotです。KPTちゃんは簡単な言葉を解釈し、人間のぬくもりを感じさせるKPT生活を実現します。
例えば、Tryとして"プロジェクト概要をgistに書く"を記録したいとしましょう。
その場合、以下のようなメッセージを送れば、KPTちゃんがTryとして覚えておいてくれます。
hdemon: KPT-chan: "プロジェクト概要をgistに書く"をTryに追加して。
kpt-chan: "プロジェクト概要をgistに書く"を、tryのid:1として追加しました。
KPTちゃんはこのメッセージを、「"プロジェクト概要をgistに書く"という文言をTryとして記録しろ」という指示であると解釈します。
記録しろという指示は、文中に"追加"という言葉が現れていることから、また"Try"という言葉から追加したいカテゴリーがTryであることを理解します。
順番や表現のゆらぎを許容する設計になっているので、例えば次のように指示することも可能です。
hdemon: KPT-chan: Tryに"プロジェクト概要をgistに書く"を足してくれる?
"Try"の文字は、"TRY"でも"トライ"でも構いません。
同様に、"追加して"の他にも、"加えて"や"足して"などの言葉でも、同じく「記録しろ」という命令だと解釈します。
単純に、「記録しろ」という指示を複数の表現に対応させているだけです。どんな言葉が使えるかは、https://github.com/hdemon/anata-no-imouto-kpt-chan/blob/master/lib/category_word_map.coffee や https://github.com/hdemon/anata-no-imouto-kpt-chan/blob/master/lib/query_word_map.coffee を見てください。
今までに追加したKPTのリストを見たい場合は、次のようにします。
hdemon: kpt-chan: トライのリストを見せて
kpt-chan: try(1) プロジェクト概要をgistに書く (13-07-19 16:13 hdemon)
この場合も記録の指示と同様に、文中にカテゴリーとリストを示す文言が現れてさえいれば、リストを表示しろという命令だと解釈してくれます。
例えば、次のような指示でも同様にリストを表示してくれます。
hdemon: kpt-chan: TRYの一覧が見たい
kpt-chan: try(1) プロジェクト概要をgistに書く (13-07-19 16:13 hdemon)
"try(1)"の括弧内の数字は、KPT文言のidです。これは次に説明する削除の際に使います。
hdemon: KPT-chan: Tryのid:1を削除して。
kpt-chan: try id:1を消しました。
記録やリスト表示のときと同じように、カテゴリーと、"削除"、"消して"などの言葉をセットにします。また、消したい文言のidを"id:(数字)"のように文中で指示してください。
- KPTをそれぞれ個別に記録できる。
- それぞれ、発言日時、発言者、KPTの内容を記録できる。
- 記録したKPTのリストを表示できる。
- 記録者、記録日時の詳細を表示できる。
- 事前にリスト表示の日時を予約し、その日時になったらリストを表示できる。
- KPTをそれぞれ個別に削除できる。
- カテゴリーごとの個別削除、全部削除ができる。
- botにキャラクター性を持たせること。
- 短期間で開発可能なこと。
記録する要素は、
- 発言日時
- 発言者
- KPTの内容
とする。
この機能を実現するためには、
- どの「カテゴリー」に対して記録すべきか
- 「記録しろ」という命令の意図が、文中に現れているか
を判別する必要がある。そこで、次の2つのプロトコルのどちらかを使うことで、機能を実現する。
- 呼びかける対象のニックネームとして、K: / P: / T: を指定し、続いて記録したい文字列を加えて発言する。
例
hoge: K: 定時に帰ること。
この場合、"K:"が記録したい文言のカテゴリーを示し、"定時に帰ること。"を記録する文言とする。 記録しろという命令は明示的に現れていないが、"K:"というカテゴリーを示す文言を冒頭においた時点で、文全体として記録を命令するメッセージだと解釈する。
- :KPT-chanに対して、KPTのいずれかのカテゴリーと、”加える”という趣旨の言葉を合わせて発言する。
例
hoge: KPT-chan: "定時に帰ること。"をKeepに足しておいて
1.のプロトコルと異なり、メッセージの送信はKPT-chanに対して行う。また、記録したい文言をダブルクォートで囲み、「記録しろ」という命令を意味する文言を文中のどこかに加える。
カテゴリーの判別は、カテゴリーに対応する文字列が文中に登場しているかどうかによって行う。例えば上の例では"Keep"が文中に現れていることから、KPT-chanはKeepカテゴリーに対する何らかの命令が行われていると判断する。 また、Keepカテゴリーを示す文字列は"Keep"だけでなく、"K"や"keep"、"キープ"なども、カテゴリーとしての"Keep"を表すものとして解釈できるようにする。
次に命令の意図であるが、カテゴリーと同様に、意図を示す文字列が文中に登場しているかどうかで判断する。上の例では"足しておいて"という表現が登場していることをもって、「記録しろ」という意図の命令があると解釈する。 そしてカテゴリーの場合と同様に、"足して"、"加える"、"add"などの文言を、「記録しろ」という意図の命令だと解釈できるようにする。
返答として、指示された文字列とそのidを返す。 idはKPTごとに独立して、0から始まるインクリメンタルなものとする。つまり、Keepのid:123とProblemのid:123は同時に存在する。
hoge: KPT-chan: "◯◯"をKeepに加えましょう。
KPT-chan: はい、◯◯(123)ですね。
hoge: KPT-chan: Tryのid:123を消して。
KPTChan: ◯◯(123)を消しました。
KPTChan: KPT-chan: Tryを全部消して。
KPTChan: Tryを全部消しました。
リストにはidを表示する。 リストを表示した後、それぞれのTryに対しての議論や、idを指定しての削除などを想定しているため。 verboseオプションを付けた場合は、記録日時と記録者も表示する。
datetimeオプションを付けることで、そこで指示された日時にリストを表示する。
例:
hoge: K:
KPTChan: わかりました。
KPTChan: この前のTryは、
KPTChan: …
KPTChan: です。
hoge: KPTChan: list t verbose
KPTChan: Tryは、
KPTChan: id: ………
KPTChan: id: ………
KPTChan: id: ……..
KPTChan: です。
- KPT管理ツールとして動かすためのクエリーは、できるだけ簡単にする。そこにキャラクタ性を盛り込まない。
- node
- hubot
- hubot-irc
- mongodb
Rubyより慣れがあることからnodeを、個人的な関心と実験済みという強みがあることからhubotを洗濯。 なおhubotでNOTICEが送れない問題は、現在のバージョンでは解決済み。
永続化にはmongodbを利用。スキーマレス性による開発の始めやすさ、nodeとの親和性から。
- botは、誰かが自分に対して発言したとき、反応することができる。
- botは、KPTの文言を、日付と発言者とともに記録することができる。
- botは、記録したKPTを消すことができる。
- botは、記録したKPTの一覧を出すことができる。
- botは、KPTの一覧を表示する時刻を、事前に指定することができる。
2013/7/8 10:00
- 専用の稼働環境を構築しない。当面は自分のマシンにサーバを立てる。
- キャラクター性に執着しすぎない。あとから改良可能。
文法要素からは、キャラクタ性を取り除く。クエリを簡単に。運用者に任せる。