下町柚子黄昏記 by @yuzutas0

したまち発・ゆずたそ作・試行錯誤の瓦礫の記録

ひたすら肯定してくれるチャットボットを作ったけど供養します

概要

何を言っても頷いてくれる人工無脳「Unazukin-Chan」(ウナズキンちゃん)を作ったのですが供養します。だいぶ昔の話です。

f:id:yuzutas0:20170320234822p:plain

※注意:この記事は個人的な糞アプリの供養であって、データサイエンティストやAI開発者に向けたものではありません。

もくじ

  1. どんなサービスか
  2. なぜ作ったのか
  3. どうやって作ったのか
  4. なぜ供養するのか
  5. 思ったこと

1. どんなサービスか

  • LINEのようなチャットUIでメッセージを投稿できます。
  • 「なるほど」「すごいな」「悪いのは君じゃない」みたいな感じで励ましてくれます。

iOSのネイティブアプリですが、IPAファイルを知り合いにばらまいただけです。

2. なぜ作ったのか

  1. 誰かに頷いてほしかったからです。
  2. 某所でチャット機能の開発を検討していたのでプロトタイピングがてら作ってみました。
    • 「吹き出し」というUI自体が興味深いと感じました。
    • スマートデバイスの普及に応じて広く親しまれるようになったように思えたからです。
  3. 人工知能ではなく)人工無脳に関心があったので試しに動くものを作ってみたかったからです。
    • 開発時はちょうど第3次AIブームが加熱する手前で、Siriのようにプラットフォーマーにロックするための客寄せパンダが主流でした。
    • より窓口の広いデジタルパートナー(サマーウォーズロックマンEXEみたいな世界)を作ったらカスタマー行動の入口を抑えられるのではという仮説がありました。

3. どうやって作ったのか

以下のサイトで掲載されていたサンプルコードを参考にしました。

[iOS] JSQMessagesViewController でチャットアプリを実装する | Developers.IO

上記の内容をコピーしてペーストして、対話相手が自動返答するように書き換えました。 そんだけ!

- (void)viewDidLoad {
    [super viewDidLoad];
    // チャットUI生成
    [self initNewChat];
    // メッセージデータの配列を初期化
    self.messages = [NSMutableArray array];
    [self makeDictionary];
    // 擬似的に自動でメッセージを受信
    [self startChat];
}

// Sendボタンが押下されたときに呼ばれる
- (void)didPressSendButton:(UIButton *)button
           withMessageText:(NSString *)text
                  senderId:(NSString *)senderId
         senderDisplayName:(NSString *)senderDisplayName
                      date:(NSDate *)date
{
    // 新しいメッセージデータを追加する
    JSQMessage *message = [JSQMessage messageWithSenderId:senderId
                                              displayName:senderDisplayName
                                                     text:text];
    [self.messages addObject:message];
    // メッセージの送信処理を完了する (画面上にメッセージが表示される)
    [self finishSendingMessageAnimated:YES];
    // 擬似的に自動でメッセージを受信
    [self response];
}

// 初回挨拶
- (void)startChat
{
    [NSThread sleepForTimeInterval:1.0];
    self.content = @"やぁ\n何かありましたか?\nよかったら聞かせてください";
    [self receiveAutoMessage];
}

// 肯定
- (void)response
{
    [NSThread sleepForTimeInterval:1.0];
    self.content = self.getDictionary;
    [self receiveAutoMessage];
}

// 辞書作成
-(void)makeDictionary
{
    NSMutableArray *words = [NSMutableArray array];
    [words addObject:@"うんうん"];
    [words addObject:@"わかるわかる"];
    [words addObject:@"わかるよ"];
    [words addObject:@"そっかー"];
    [words addObject:@"そうなんだ"];
    [words addObject:@"なるほど"];
    [words addObject:@"すごいね"];
    [words addObject:@"きみは悪くない"];
    // [words addObject:@"お前がそう思うんならそうなんだろう\nお前ん中ではな"];
    self.terms = words;
}

// 辞書設定
- (NSString *)getDictionary
{
    int n = arc4random() % self.terms.count;
    return [self.terms objectAtIndex:(NSUInteger)n];
}

このときがiOS開発(これを開発とは呼ばないか)デビューだったのでセットアップに手間取りましたが1日で完成しました。

4. なぜ供養するのか

適当な顔アイコンに頷かれても虚しいだけだったからです。

5. 思ったこと

  • UIの重要性!!!
  • 糞アプリは作った直後は面白いですけど、保守する気にならないという問題。
    • 糞アプリだからこそ本気で保守し続けたら、無駄なこだわりがかえって面白いかも、とは一瞬思いました。
    • 辞書を充実させたり、いい感じの応答をできるようにしたり、きちんとした機械学習を挟んだり。
  • また、個人開発でネイティブアプリの保守コストを張るのは辛そうだと思うようになりました。
    • (この程度の規模ならどうとでもなりますが)AppleGoogleの進化に追従しなければいけないので。
    • そこで発想をWEBサービスに絞ってみる→ToCではなくToBの製品が適しているのではと考える→グループウェアに関心を持つようになる→自作Qiita:Teamクローンに繋がります。

yuzutas0.hatenablog.com

でもやっぱり、こうして振り返ると楽しかったです。 面白おかしくやっていきたいですなぁ。

最後に

  • 長くなってしまいましたが最後まで読んでいただき本当にありがとうございます。
  • 一応Githubリポジトリは公開しておきます。最新のXcodeでビルドできるとは思えないですが……。