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

Post on 15-Jan-2015

11.786 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

自己紹介

しみず @shimy_net

発売中 近日発売

iOS逆引きレシピ

AWS芸人

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

過去の発表

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

Kinect でキックスタート

今回は

Kinesis

Kinesisとは?

Kinesis

ビッグデータ

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

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

簡単にいうと

ひらめいた

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

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

つまり

元気を集めて

Kinesis に入れて

見える化

フリーザを倒す

(゚ー゚*;) なるほど

(́Д`;) 大丈夫か俺

まずは、考えた

元気を集める方法

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

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

ー Step1. 形態素解析

本日は晴天なり

本日 / は / 晴天 / なり

MeCab

ー Step2. 感情解析

本日 / は / 晴天 / なり

Positive or Negative -1.0~+1.0で評価

+0.63 -0.18

ー Step3. 数値化

元気 72 pt

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

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

82pt

37pt 77pt

64pt

93pt Tweet

Tweet

Tweet

Tweet

Tweet

53万pt を超えろ

ということで、作った

仕組み

Kinesis Stream

Twitter4J Kinesis MeCab Dynamo Unity

見える化 分析 Kinesis Tweet

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

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);

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) {} }}

}

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);

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;}

DynamoDB に元気が溜まる

元気ポイント

元気ポイント総量 Atomic Counter

集計結果を JSON で Unityへ

Unity で見える化 Kinesis Stream

Twitter4J Kinesis MeCab Dynamo Unity

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

おねだりするミクさん

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

ミクさん

みんなのTweet

元気ゲージ

かめはめ波

かめはめ波

フリーザ

フリーザ

デモします

負けバージョン

ずっこけるミクさん

負けバージョン

53万ptに達せず

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

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

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

point = 530000.0;

}

オラに元気をわけてくれ

芸人イケメン #jawsdays

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

みんなの応援が 届く

再び デモします

かめはめ波

勝ちバージョン

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

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

フリーザに直撃

倒れるフリーザ

勝ちバージョン

やったね!

芸人イケメン Kinesisイケメン

まとめ

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

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

おまけ(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

おまけ(LTの裏側)

任天堂のピーク発生

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

スケールするDyanamoDB

参考(感謝) ドラゴンボール 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

ありがとうございました

top related