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

38
Botを使った業務効率化 平成26年8月22日 山本 裕介 株式会社サムライズム

Upload: yusuke-yamamoto

Post on 18-Dec-2014

3.221 views

Category:

Technology


2 download

DESCRIPTION

JavaでTwitterボット開発簡単!

TRANSCRIPT

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

Botを使った業務効率化平成26年8月22日 山本 裕介

株式会社サムライズム

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

本研究の目的

•Botを活用し業務効率化を図る

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

研究の背景•業務効率化が求められる

!

•システム化による業務自動化

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

研究の背景• 自動化度が高まるにつれて実装コスト増大 • 自動化度を高めてもオペレーションコストの削減効果低

全自動手動 半自動

コスト大

コスト小

システム実装コストとオペレーションコストの関係 (※当社調べ)

オペレーションコスト実装・メンテナンスコスト自動化を進めると費用対効果は急速に低下

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

本研究のアプローチ•完全な自動化を目指さない

• 自動化コストが高い箇所は人間系が介在

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

先行研究• HUBOT 【GitHub2011】- https://hubot.github.com

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

先行研究 - HUBOT• Node.jsで動作するボットフレームワーク

• HipChat、Twitter、IRC等々多彩なチャネルに対応

• 様々なサードパーティープラグインが存在

• Herokuなどに手軽にデプロイ可能

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

先行研究の課題

•Javaで実装できない

•これは大問題ですね

•ね?

Today's version of Hubot is open source, written in CoffeeScript on Node.js, and

easily deployed on platforms like HerokuHUBOT[14]より

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

本研究のアプローチ•JavaでBotを実装

•簡単

•そう、Twitter4Jならね

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

実装してみた• 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(); } }

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

動作の様子

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

弊社業務用Botの出来ること• ライセンス発注 • 入金消し込み • Botのセルフアップデート (シャットダウン→git pull→起動) などなど

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

Twitter連携Botのいいところ• リプライで命令: 文脈に応じたコマンドを実行できる

発注処理

処理対象帳票コード

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

Twitter連携Botのいいところ• UI不要

• Twitterクライアントより操作可能

• HTMLやSwing、JavaFXでUIを書く必要がない

• セキュリティ

• Twitter APIが口となる。SSLの口を用意したり、VPN接続など不要

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

アンケートによる効果測定• 調査対象者: 株式会社サムライズム全社員

• 無記名

• 有効回答数: 1名

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

アンケート結果

はい100%

はい いいえ

• Bot利用により業務効率は向上しましたか?

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

アンケート結果

はい100%

はい いいえ

• 今後Botの利用を拡大していきたいですか?

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

アンケート結果

はい100%

はい いいえ

• Javaで実装するBotをお友達に勧めたいですか?

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

アンケート結果

はい、100%

はいはい、Java8らしく書けたらもっと簡単いいえ

• Botの実装は簡単でしたか?

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

まとめと考察• JavaでBot実装超簡単

• そう、Twitter4Jならね

•Java8ならもっとがんばれる

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

Java8を使ったBot実装効率化平成26年8月22日 山本 裕介

株式会社サムライズム

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

本研究の目的

•Botの開発効率向上

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

研究の背景•先行研究【山本14】よりBot開発効率に課題判明

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

具体的な不満点(匿名)

匿名クラスとか書いたら負け

Lambdaで書きたい

switch文とかダサい

0 1

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

つまり

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

古き良き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(); } }

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

そこで

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

Java8で書けるようにした

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

流れるように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と返す

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

工夫した箇所• Lambda内の例外処理がめんどいので…

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

工夫した箇所• BiConsumerを使い、例外を吐かないユーティリティオブジェクトを提供

onMention(BiConsumer<Status, TwitterWrapper> c)

onMention(Consumer<Status> consumer)

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

ユーティリティオブジェクトのインターフェース

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)

@ツイートで返信、ダイレクトメッセージ送信など 例外を投げない便利メソッドを搭載

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

ユーティリティオブジェクトの効果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うざい

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

アンケートによる効果測定• 調査対象者: 株式会社サムライズム全社員

• 無記名

• 有効回答数: 1名

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

アンケート結果

はい100%

はい いいえ

• Botの実装は効率化出来ましたか?

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

まとめと考察• Java8でBot実装簡単

• そう、Twitter4Jならね

• 続きはGitHubで!

https://github.com/yusuke/kagechiyo

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

ご静聴ありがとうございました

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

便利なBot作りました• フォローするとグラビアアイドルのステキな画像で

タイムラインが埋まります → @grajiga

フォローなう!