[初音ミク] kinesis でフリーザを撃て!
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
ありがとうございました