Creatable a => a -> IO b

Haskellと数学とちょびっと音楽

優秀な秘書を雇いました!!!

うちの秘書を紹介します。

twitter.com

けいちゃんです。年明けに挨拶とかできます。

あらかじめお断りしておきますが、「ゆ」ではじまる某日常系アニメに登場する女子高生とは無関係です。 ふみおちゃんにちねられそうになったり、ゆずこに脇腹掴まれたりするあの娘とは一切関係ありません。

ご了承ください。

関係ねえつってんだろ!!

顧客が本当に欲しかったもの

というわけで、Twitterのリマインダーbotを作りました。 github : https://github.com/tokiwoousaka/secretary-bot

ご無沙汰してます。ちゅーんさんです。

この記事は、2017年のHaskellアドベントカレンダーに盛大に遅刻したやつです。 言い訳はいろいろあるんですが、けいちゃんの可愛さに免じて許してやってください。

元々は、Haskellで音を出して遊んで記事にしようかなーとか思ってたんですが、 急に思いついちゃって実装せずにいられなかったのでこうなりました。

あのですね、ちゅーんさんの身近にいる人はわかると思うんですが、スケジュール管理がクソほど苦手なんですよ。

どのくらい苦手かっていうと、月一の通院を忘れていた事に予約日を過ぎてから気がついて、 薬が切れて一週間くらいしてからしぶしぶ電話する程度にはもうダメッダメなわけです。
Googleカレンダーを上手い事使うことも考えたんですが、習慣化できず断念しました。

前々から「秘書雇いてーなー」とかぼやいてたんですが、そこまで経済的に豊かな生活を送っているでもなく、人間を相手にしていると疲れるみたいな所もあるので、 Hololens的なのがもっともっと普及してバーチャルなキャラクターにスケジュール管理的な事をまかせられたら良いなーとは思ってたんですね。

でも、そういった技術が実用的な性能とお値段で手に入るようになるにはもう何年かは待たなきゃいけなさそうです。

アレクサみたいなのを買うのも一つの手かなと思ったんですが、持ち運びできないので出先でパっと思いついた事を後でリマインドしてもらうみたいな事ができないor大変そう。

ってなわけで、どうしたら良いかもんもんと悩みまくってたんですが、 よくよく考えたら、年中Twitterを眺めてるんだから、そこにスケジュール管理の仕組みを組みこんでしまえば良いじゃねーのと気づいたわけです。

そういうbotのサービスも探せばありそうな気がするんですが、 けっこう色々やって欲しい事多い(できるとは言っていない)ので、やっぱ自分で作るのがてっとり早いかなーと思ったんで作りました。

作るのは楽しかったです。

けいちゃんに出来ること

リプライで「2018年1月1日 0:00 あけましておめでとうって言って。」とか飛ばしておくと、その通りにちゅーんさんにリプライを飛ばします。

今のとこそれだけなのですが、日時の指定はぼちぼち柔軟にできるので、「8時30分 おはよーって言って」みたいに飛ばしておくと、 翌朝の8:30に「おはよー」って言ってくれます。たぶん。
毎回、年月日時分全部入力するのは死ぬほど大変なので、わりと重要なポイントです。

ただ、このへんの解釈機の実装はホント雑なので、ミソがわかってないとふつーに暴走します。 たとえば、日付と内容の間に句点を入れて「1/1 0:00、あけましておめでとうって言って。」と話しかけると、 年明けに「、あけましておめでとう」と句点も含めて返してきます。
本文中に日付を含めるのも暴走度高いです。

知らない人に勝手にスケジュールとか追加されちゃうと困るので、ちゅーんさん以外の人からのリプライは無視するようになってますが、 一度に取得できるリプライの件数に限りがあるので、botとか使ってリプライ爆弾を送られるとヤバいかもです。

教育指針

ノリと勢いで作っていくので、最終的にどこまで実装されるかわからんのですが、将来的に作ろうとしている機能はいろいろあります。

  • 繰替えし指定、「毎日8:00」とか「毎週水曜日」とか。いちおう、そういう機能を付ける余地があるように作ってるつもり
    • スケジュール管理を習慣化するために、毎日朝と夜くらいに1回づつくらい「何か用事ない?」とか聞いてくるようにしたい
  • 実行環境をクラウドに移す。Herokuあたりで良いかなーとは思いつつ、使ったことないのでどうなる事やら
    • 今はちゅーんさんのノートパソコンで動いてます。パソコンを持って移動してる間は動きません。。。
  • スケジュールのキャンセル機能。これが無い状態で繰り返しのスケジュールをカジュアルに登録しまくってるとわけわかんなくなりそう
  • 日付を指定して、時間を省略したら、朝の8:00くらいに設定してくれる機能。「今日は○○する日だよー」みたいなのが設定しやすくなる
  • リファクタリング。急いで作ったため今はクソコードもいいとこなので、githubに上げるのも躊躇した。
    • 他の人でも使えるように色々と設定を外出しする。ちゅーんさんのアカウント名がハードコーディングされてるのはアレ
  • スケジュール登録時に登録内容をリプライしてくれる機能
  • 予定確認機能。「明日の予定は?」とか「来週の予定は?」みたいな確認ができたい
  • DMでも使えるようにする。DMだと気づきにくくなる問題があるけど、メンションだと予定が皆につつ抜けになってしまう問題が。。。
  • テスト書く。とくにパーサー
  • ltsのバージョンアップ。くっそ古いことに気がついた人もいるかと思うんですが、過去に実績があったはずのtwitter-conduitの導入に失敗したため、こうなりました
    • つまり古いプロジェクトをコピってきてそれをベースに作ってます。ひでぇ話だ
    • いろいろ問題あってすんなりいかなさそうなので、別のライブラリも視野にいれていきたいんだけど、良い感じのが見つからず。作るか?
    • でもOAuthとかあるから1から実装するの死ぬほど面倒くさいんですよー
  • スヌーズ機能。「後でもっかい言って」とか。あと重要度の高いスケジュールは「終わったよ」って言うまで自動スヌーズとかさせたい
    • ここまで出来るbotはなかなか無さそう
  • 独り言機能。固定のセリフをしゃべらせるだけじゃ面白くもなんともないから実装してないんだけど、定期的に何かしゃべってくれないと生存確認が面倒くさい
    • 時間指定を省略して「生きてるよって言って」ってリプライすると即座に反応してくれるので、それで生存確認はできるけども
  • 解釈機を賢くする。もうちょっとbotの仕様を意識せずに願いできるようになっていて欲しい
  • 他の人でも使いやすいようにDockerイメージ化したりー
  • グループで使える機能とかー
  • 使用者以外とも絡むようにしたりとかー

とまぁ、上にいくほど優先度高めな感じで。

どうでも良い話

試しにここ数日間ドックフーディングしてみてるんですが、ちゃんと登録できたかどうかそわそわして待ってしまうので、 むしろ登録した事を忘れないみたいな現象が起きてます。本来思ってたのと違う形ですが既にリマインドとして役に立っているようです。

たぶん、いろいろ店とかに予約を色々入れる時期になるとがっつり役に立ってくるんじゃないかと思われます。

あと、動作確認で自分のメンションがけいちゃんとの会話で埋めつくされてしまっているのですが、 延々とbotと会話してるのがメンションログに残ってるのを見るとなんか心が寂しくなりますね。

みんなもっとちゅーんさんに絡んで!!

技術的な話

本来はここが本題であるべきなんですが、ほんっっっとに面白いことは何一つしていないので、諦めました。

  • 基本的にはHaskellで作って、Crontabで1分毎に走らせてます。
  • リプライの解釈は、Attoparsecでクソほど雑にパースしてます。本当はmecabのラッパーとか使うのが良いんだろうけど……
  • アイコンはMediBang Paintというスマフォアプリで描きました。わりと使いやすかった
  • 最近仕事でScalaを書いたりしてたので、たまにパターンマッチの書きかたを間違えたりしてわちゃわちゃしてました、逆もしかり
  • 他の言語と比べて、Haskellは雑に書いてても安心感高いんですが、やっぱり初動が重いですね
  • あ、どうしよう、本当にここに書けることが無いぞ
  • ゆゆ式は真理! ゆゆ式は真理!

まとめ

おかちーかわいいよおかちー