Botを使った業務効率化
平成26年8月22日
山本 裕介
株式会社サムライズム
本研究の目的
• Botを活用し業務効率化を図る
研究の背景
• 業務効率化が求められる
!
• システム化による業務自動化
研究の背景
• 自動化度が高まるにつれて実装コスト増大
• 自動化度を高めてもオペレーションコストの削減効果低
全自動手動 半自動
コスト大
コスト小
システム実装コストとオペレーションコストの関係
(※当社調べ)
オペレーションコスト
実装・メンテナンスコスト
自動化を進めると費用対効果は急速に低下
本研究のアプローチ
• 完全な自動化を目指さない
• 自動化コストが高い箇所は人間系が介在
先行研究
• HUBOT 【GitHub2011】- https://hubot.github.com
先行研究 - HUBOT
• Node.jsで動作するボットフレームワーク
• HipChat、Twitter、IRC等々多彩なチャネルに対応
• 様々なサードパーティープラグインが存在
• Herokuなどに手軽にデプロイ可能
先行研究の課題
• Javaで実装できない
• これは大問題ですね
•ね?
Today's version of Hubot is open source,
written in CoffeeScript on Node.js, and
easily deployed on platforms like Heroku
HUBOT[14]より
本研究のアプローチ
•JavaでBotを実装
•簡単
•そう、Twitter4Jならね
実装してみた
• echo ボット
public class BotMain {

public static void main(String[] args) {

Twitter twitter = TwitterFactory.getSingleton();

TwitterStream twitterStream = TwitterStreamFactory.getSingleton();

twitterStream.addListener(new UserStreamAdapter() {

@Override

public void onDirectMessage(DirectMessage directMessage) {

String[] args = directMessage.getText().trim().split(" ");

String command = args[0];

switch (command.toLowerCase()) {

case "echo":

twitter.sendDirectMessage(YUSUKE, args[1]);

break;

default:

twitter.sendDirectMessage(YUSUKE,
"invalid args:" + Arrays.toString(args));

}

});

twitterStream.user();

}

}
動作の様子
弊社業務用Botの出来ること
• ライセンス発注
• 入金消し込み
• Botのセルフアップデート
(シャットダウン→git pull→起動)
などなど
Twitter連携Botのいいところ
• リプライで命令: 文脈に応じたコマンドを実行できる
発注処理
処理対象帳票コード
Twitter連携Botのいいところ
• UI不要
• Twitterクライアントより操作可能
• HTMLやSwing、JavaFXでUIを書く必要がない
• セキュリティ
• Twitter APIが口となる。SSLの口を用意したり、
VPN接続など不要
アンケートによる効果測定
• 調査対象者: 株式会社サムライズム全社員
• 無記名
• 有効回答数: 1名
アンケート結果
はい
100%
はい いいえ
• Bot利用により業務効率は向上しましたか?
アンケート結果
はい
100%
はい いいえ
• 今後Botの利用を拡大していきたいですか?
アンケート結果
はい
100%
はい いいえ
• Javaで実装するBotをお友達に勧めたいですか?
アンケート結果
はい、
100%
はい
はい、Java8らしく書けたらもっと簡単
いいえ
• Botの実装は簡単でしたか?
まとめと考察
•
JavaでBot実装超簡単
•
そう、Twitter4Jならね
•Java8ならもっとがんばれる
Java8を使ったBot実装効率化
平成26年8月22日
山本 裕介
株式会社サムライズム
本研究の目的
•Botの開発効率向上
研究の背景
•先行研究【山本14】より
Bot開発効率に課題判明
具体的な不満点(匿名)
匿名クラスとか書いたら負け
Lambdaで書きたい
switch文とかダサい
0 1
つまり
古き良きJava過ぎる
• 匿名クラス、switchでコマンド分岐とかダサい
twitterStream.addListener(new UserStreamAdapter() {

@Override

public void onDirectMessage(DirectMessage directMessage) {

String[] args = directMessage.getText().trim().split(" ");

String command = args[0];

switch (command.toLowerCase()) {

case "echo":

twitter.sendDirectMessage(YUSUKE, args[1]);

break;

default:

twitter.sendDirectMessage(YUSUKE,
"invalid args:" + Arrays.toString(args));

}

});

twitterStream.user();

}

}
そこで
Java8で書けるようにした
流れるようにBotを実装
public static void main(String[] args) {

new Jenkinsan()

.onMention("echo",
(status, twitter) -> twitter.reply(status.getText()))

.onMention(“hello",
(status, twitter) -> twitter.reply("Hello world!"))

.start();

}
echoコマンドを受けたらそのままリプライ
helloコマンドを受けたらHello Worldと返す
工夫した箇所
• Lambda内の例外処理がめんどいので…
工夫した箇所
• BiConsumerを使い、例外を吐かないユーティリ
ティオブジェクトを提供
onMention(BiConsumer<Status, TwitterWrapper> c)
onMention(Consumer<Status> consumer)
ユーティリティオブジェクトのインターフェース
class TwitterWrapper{
public void updateStatus(String text);
public void reply(String text);

public void updateStatus(StatusUpdate status);

public void sendDirectMessage(String message);
}
onMention(BiConsumer<Status, TwitterWrapper> c)
@ツイートで返信、ダイレクトメッセージ送信など
例外を投げない便利メソッドを搭載
ユーティリティオブジェクトの効果
Twitter twitter = TwitterFactory.getSingleton();

new Kagechiyo()

.onMention("help",

(message) -> {

try {

twitter.updateStatus(String.format("@%s %s", message.getUser().getScreenName(), "ググレカス"));

} catch (TwitterException e) {

e.printStackTrace();

}

})

.start();
new Kagechiyo()

.onDirectMessage("help",

(message, twitter) -> twitter.sendDirectMessage("ググレカス"))

.start();
Lambda万歳
Lambdaうざい
アンケートによる効果測定
• 調査対象者: 株式会社サムライズム全社員
• 無記名
• 有効回答数: 1名
アンケート結果
はい
100%
はい いいえ
• Botの実装は効率化出来ましたか?
まとめと考察
• Java8でBot実装簡単
• そう、Twitter4Jならね
• 続きはGitHubで!
https://github.com/yusuke/kagechiyo
ご静聴ありがとうございました
便利なBot作りました
• フォローするとグラビアアイドルのステキな画像で
タイムラインが埋まります → @grajiga
フォローなう!

Botを使った業務効率化 / Java8を使ったBot実装効率化 @yusuke #jjug