[初音ミク] kinesis でフリーザを撃て!

54

Upload: takayuki-shimizu

Post on 15-Jan-2015

11.786 views

Category:

Technology


2 download

DESCRIPTION

Amazon Kinesis と初音ミクをもちいた、元気パワーのリアルタイムビジュアライザー

TRANSCRIPT

Page 1: [初音ミク] Kinesis でフリーザを撃て!
Page 2: [初音ミク] Kinesis でフリーザを撃て!

自己紹介

しみず @shimy_net

発売中 近日発売

iOS逆引きレシピ

Page 3: [初音ミク] Kinesis でフリーザを撃て!

AWS芸人

無駄に技術を使って 面白いLTをする

Page 4: [初音ミク] Kinesis でフリーザを撃て!

過去の発表

自転車でDynamoDB ピタゴラスイッチで自動化

Kinect でキックスタート

Page 5: [初音ミク] Kinesis でフリーザを撃て!

今回は

Kinesis

Page 6: [初音ミク] Kinesis でフリーザを撃て!

Kinesisとは?

Kinesis

ビッグデータ

リアルタイム分析 見える化

Page 7: [初音ミク] Kinesis でフリーザを撃て!

なんでも リアルタイムに見える化

簡単にいうと

Page 8: [初音ミク] Kinesis でフリーザを撃て!

ひらめいた

Page 9: [初音ミク] Kinesis でフリーザを撃て!

みんなの元気を Kinesis に流し込めば

Page 10: [初音ミク] Kinesis でフリーザを撃て!

フリーザを倒せるんじゃね?

Page 11: [初音ミク] Kinesis でフリーザを撃て!

つまり

Page 12: [初音ミク] Kinesis でフリーザを撃て!

元気を集めて

Page 13: [初音ミク] Kinesis でフリーザを撃て!

Kinesis に入れて

Page 14: [初音ミク] Kinesis でフリーザを撃て!

見える化

Page 15: [初音ミク] Kinesis でフリーザを撃て!

フリーザを倒す

Page 16: [初音ミク] Kinesis でフリーザを撃て!

(゚ー゚*;) なるほど

Page 17: [初音ミク] Kinesis でフリーザを撃て!

(́Д`;) 大丈夫か俺

Page 18: [初音ミク] Kinesis でフリーザを撃て!

まずは、考えた

Page 19: [初音ミク] Kinesis でフリーザを撃て!

元気を集める方法

Tweet 元気 ・形態素解析 ・感情分析 ・元気の数値化

1Tweet = Max 100 pt 元気を数値に変換

Page 20: [初音ミク] Kinesis でフリーザを撃て!

ー Step1. 形態素解析

本日は晴天なり

本日 / は / 晴天 / なり

MeCab

Page 21: [初音ミク] Kinesis でフリーザを撃て!

ー Step2. 感情解析

本日 / は / 晴天 / なり

Positive or Negative -1.0~+1.0で評価

+0.63 -0.18

Page 22: [初音ミク] Kinesis でフリーザを撃て!

ー Step3. 数値化

元気 72 pt

本日 / は / 晴天 / なり +0.63 -0.18

Page 23: [初音ミク] Kinesis でフリーザを撃て!

ー Step4. エネルギー弾の生成

82pt

37pt 77pt

64pt

93pt Tweet

Tweet

Tweet

Tweet

Tweet

Page 24: [初音ミク] Kinesis でフリーザを撃て!

53万pt を超えろ

Page 25: [初音ミク] Kinesis でフリーザを撃て!

ということで、作った

Page 26: [初音ミク] Kinesis でフリーザを撃て!

仕組み

Kinesis Stream

Twitter4J Kinesis MeCab Dynamo Unity

見える化 分析 Kinesis Tweet

#jawsdaysのTLの元気で フリーザと戦う

Page 27: [初音ミク] Kinesis でフリーザを撃て!

Tweet を Stream に入れる Kinesis Stream

Twitter4J Kinesis MeCab Dynamo Unity

TwitterStream twitterStream = new TwitterStreamFactory().getInstance();StatusListener listener = new StatusListener() { @Override public void onStatus(Status status) {

String key = RandomStringUtils.randomAlphanumeric(10);String json = DataObjectFactory.getRawJSON(status); PutRecordRequest putRecordRequest = new PutRecordRequest();putRecordRequest.setStreamName(PropUtil.getInstance().getProp("StreamName"));putRecordRequest.setData(ByteBuffer.wrap(json.getBytes(Charset.forName("UTF-8")));putRecordRequest.setPartitionKey(key);PutRecordResult putRecordResult = kinesis.putRecord(putRecordRequest);

}};twitterStream.addListener(listener);FilterQuery filterQuery = new FilterQuery();filterQuery.track(new String[] { PropUtil.getInstance().getProp("Keyword1"), PropUtil.getInstance().getProp("Keyword2") });twitterStream.filter(filterQuery);

Page 28: [初音ミク] Kinesis でフリーザを撃て!

Tweet を Stream から出す Kinesis Stream

Twitter4J Kinesis MeCab Dynamo Unity

private void processRecordsWithRetries(List<Record> records) { for (Record record : records) { boolean processedSuccessfully = false; String data = null; for (int i = 0; i < NUM_RETRIES; i++) { try { // Get Data data = decoder.decode(record.getData()).toString(); Status status = DataObjectFactory.createStatus(data ); // MeCab something // ・・・・・・

processedSuccessfully = true; break; } catch (Throwable t) {} }}

}

Page 29: [初音ミク] Kinesis でフリーザを撃て!

Tweet を分析して数値化 Kinesis Stream

Twitter4J Kinesis MeCab Dynamo Unity Tagger tagger = new Tagger("-Ochasen");tagger.parse(status.getText().replaceAll("¥n", ""));Node node = tagger.parseToNode(status.getText().replaceAll("¥n", ""));Double sum = 0.0;int count = 0;for (; node != null; node = node.getNext()) {

String[] mecabArray = node.getFeature().split(","); String originalWord = node.getSurface();if (!mecabArray[6].equals("*")) { originalWord = mecabArray[6]; // 基本形 } String feature = mecabArray[0];if (feature.equals("名詞") || feature.equals("動詞") || feature.equals("形容詞”) || feature.equals("形容動詞") || feature.equals("副詞")) { // Positive or Negative sum += PositiveNegativeJudge.getInstance().getDouble(originalWord + ":" + feature); count++;}

}Double point = Math.floor((sum / count + 1.0) * 100.0 / 2.0);

Page 30: [初音ミク] Kinesis でフリーザを撃て!

DynamoDB で集計 Kinesis Stream

Twitter4J Kinesis MeCab Dynamo Unity

private static PutItemRequest createPutItemRequest(String id, String datetime, String name, String screenName, String text, Double value) {

Map<String, AttributeValue> putItems = new HashMap<String, AttributeValue>();putItems.put("AppName", new

AttributeValue().withS(PropUtil.getInstance().getProp("ApplicationName")));putItems.put("Datetime/SerialNumber", new AttributeValue().withS(datetime+"/"+id));putItems.put("ScreenName", new AttributeValue().withS("@" + screenName));putItems.put("Name", new AttributeValue().withS(name));putItems.put("Text", new AttributeValue().withS(text));putItems.put("Value", new AttributeValue().withN(Double.toString(value)));PutItemRequest putItemRequest = new

PutItemRequest().withTableName(PropUtil.getInstance().getProp("DynamoDbTableNameDetail")).withItem(putItems);

return putItemRequest;}

Page 31: [初音ミク] Kinesis でフリーザを撃て!

DynamoDB に元気が溜まる

元気ポイント

元気ポイント総量 Atomic Counter

Page 32: [初音ミク] Kinesis でフリーザを撃て!

集計結果を JSON で Unityへ

Page 33: [初音ミク] Kinesis でフリーザを撃て!

Unity で見える化 Kinesis Stream

Twitter4J Kinesis MeCab Dynamo Unity

ミクさんに お手伝いしてもらう

Page 34: [初音ミク] Kinesis でフリーザを撃て!

おねだりするミクさん

Page 35: [初音ミク] Kinesis でフリーザを撃て!

リアルタイムに Kinesis から元気を集めるミクさん

ミクさん

みんなのTweet

元気ゲージ

Page 36: [初音ミク] Kinesis でフリーザを撃て!

かめはめ波

かめはめ波

Page 37: [初音ミク] Kinesis でフリーザを撃て!

フリーザ

フリーザ

Page 38: [初音ミク] Kinesis でフリーザを撃て!

デモします

Page 39: [初音ミク] Kinesis でフリーザを撃て!

負けバージョン

Page 40: [初音ミク] Kinesis でフリーザを撃て!

ずっこけるミクさん

負けバージョン

53万ptに達せず

Page 41: [初音ミク] Kinesis でフリーザを撃て!

元気が足りない ※ここまでは予定調和

Page 42: [初音ミク] Kinesis でフリーザを撃て!

こんなこともあろうかと 仕込んでおいた 集計プログラム

if (tweet.indexOf(“芸人イケメン”)) != -1) {

point = 530000.0;

}

Page 43: [初音ミク] Kinesis でフリーザを撃て!

オラに元気をわけてくれ

芸人イケメン #jawsdays

とTweetすると元気 53万pt が届く BGM:チャラヘッチャラ

Page 44: [初音ミク] Kinesis でフリーザを撃て!

みんなの応援が 届く

Page 45: [初音ミク] Kinesis でフリーザを撃て!

再び デモします

Page 46: [初音ミク] Kinesis でフリーザを撃て!

かめはめ波

勝ちバージョン

53万を超えた! 超えすぎww

※発表当時は「芸人イケメン」というTweetでいっぱいになりました。 照れるますわ(;́Д`)

Page 47: [初音ミク] Kinesis でフリーザを撃て!

フリーザに直撃

倒れるフリーザ

勝ちバージョン

Page 48: [初音ミク] Kinesis でフリーザを撃て!

やったね!

Page 49: [初音ミク] Kinesis でフリーザを撃て!

芸人イケメン Kinesisイケメン

まとめ

リアルタイムに データ処理できるクールなサービス

Page 50: [初音ミク] Kinesis でフリーザを撃て!

おまけ(LTの裏側) 題材にKinesis を選んだ時点で絶対にクリアせねばならん課題がありました。  ↓それは 5分の発表枠のなかで、 リアルタイムに反映できるデモを実現する事  ↓というわけで、デモプログラムのためのサーバーサイドのプロセスは   安定稼働させる必要があり、それなりに監視していました。 ところが・・・

Page 51: [初音ミク] Kinesis でフリーザを撃て!

おまけ(LTの裏側) [発表直前] DyanamoDBからデータを取り出すプロセスが高頻度で死亡する事案が発生 ec2-user 14685 0.1 4.2 1625848 71584 ? Sl 02:10 0:27 java KinesisPutter ec2-user 18622 2.2 4.8 1787796 82660 pts/1 Sl 06:01 0:21 java -Djava.library.path=.:/usr/local/bin/mecab-java KinesisGetter ec2-user 18944 22.0 4.2 1618412 71836 ? Sl 06:16 0:08 java DynamoJsonCreator  ↓ ec2-user 14685 0.1 4.2 1625848 71584 ? Sl 02:10 0:27 java KinesisPutter ec2-user 18622 2.2 4.9 1839496 83452 pts/1 Sl 06:01 0:21 java -Djava.library.path=.:/usr/local/bin/mecab-java KinesisGetter

cronでプロセスを再起動するように泥臭い対応をしていましたが もし運悪くプロセス死亡時にデモをすると、リアルタイムに最新データを 取り出せない可能性がありました。困った・・・ */2 * * * * bash /home/ec2-user/KinesisTwitter/check_putter.sh > /home/ec2-user/cron.log.putter.txt 2>&1 */2 * * * * bash /home/ec2-user/KinesisTwitter/check_getter.sh > /home/ec2-user/cron.log.getter.txt 2>&1 */2 * * * * bash /home/ec2-user/KinesisTwitter/check_create_json.sh > /home/ec2-user/cron.log.create.json.txt 2>&1

Page 52: [初音ミク] Kinesis でフリーザを撃て!

おまけ(LTの裏側)

任天堂のピーク発生

と調べていると、DyanamoDBが単純にキャパを超えていました・・・ (;́Д`)すんません、ぼけてました。 ちょうど、任天堂AWS導入事例のセッションが開催されていて TLへの書き込みが増加したため、キャパ超えが頻発していたようです。 DyanamoDBをスケールアウトして対応 AWSの真髄ここにありですね

スケールするDyanamoDB

Page 53: [初音ミク] Kinesis でフリーザを撃て!

参考(感謝) ドラゴンボール Amazon Kinesis http://aws.amazon.com/jp/kinesis/ Amazon DynamoDB http://aws.amazon.com/jp/dynamodb/ Twitter4J http://twitter4j.org/ja/ MeCab http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html MeCab-java  単語感情極性対応表 http://www.lr.pi.titech.ac.jp/~takamura/pndic_ja.html Unity http://japan.unity3d.com/ MikuMikuDcance for Unity http://mmd-for-unity-proj.github.io/mmd-for-unity/  Lat式ミク http://dic.nicovideo.jp/a/lat フリーザ http://ux.getuploader.com/karota318/ かめはめ波モーション http://www.nicovideo.jp/watch/sm15093547 歩き・スキップモーション http://www.nicovideo.jp/watch/sm21263509 待機モーション http://www.nicovideo.jp/watch/sm18961728 やられモーション http://www.nicovideo.jp/watch/sm19073965 日常モーション http://www.nicovideo.jp/watch/sm18015670

Page 54: [初音ミク] Kinesis でフリーザを撃て!

ありがとうございました