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

17,174 views

Published on

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

Published in: Technology
0 Comments
81 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
17,174
On SlideShare
0
From Embeds
0
Number of Embeds
2,910
Actions
Shares
0
Downloads
40
Comments
0
Likes
81
Embeds 0
No embeds

No notes for slide

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

  1. 1. 自己紹介 しみず @shimy_net 発売中 近日発売 iOS逆引きレシピ
  2. 2. AWS芸人 無駄に技術を使って 面白いLTをする
  3. 3. 過去の発表 自転車でDynamoDB ピタゴラスイッチで自動化 Kinect でキックスタート
  4. 4. 今回は Kinesis
  5. 5. Kinesisとは? Kinesis ビッグデータ リアルタイム分析 見える化
  6. 6. なんでも リアルタイムに見える化 簡単にいうと
  7. 7. ひらめいた
  8. 8. みんなの元気を Kinesis に流し込めば
  9. 9. フリーザを倒せるんじゃね?
  10. 10. つまり
  11. 11. 元気を集めて
  12. 12. Kinesis に入れて
  13. 13. 見える化
  14. 14. フリーザを倒す
  15. 15. (゚ー゚*;) なるほど
  16. 16. (́Д`;) 大丈夫か俺
  17. 17. まずは、考えた
  18. 18. 元気を集める方法 Tweet 元気 ・形態素解析 ・感情分析 ・元気の数値化 1Tweet = Max 100 pt 元気を数値に変換
  19. 19. ー Step1. 形態素解析 本日は晴天なり 本日 / は / 晴天 / なり MeCab
  20. 20. ー Step2. 感情解析 本日 / は / 晴天 / なり Positive or Negative -1.0∼+1.0で評価 +0.63-0.18
  21. 21. ー Step3. 数値化 元気 72 pt 本日 / は / 晴天 / なり +0.63-0.18
  22. 22. ー Step4. エネルギー弾の生成 82pt 37pt 77pt 64pt 93pt Tweet Tweet Tweet Tweet Tweet
  23. 23. 53万pt を超えろ
  24. 24. ということで、作った
  25. 25. 仕組み Kinesis Stream Twitter4J Kinesis MeCab Dynamo Unity 見える化分析KinesisTweet #jawsdaysのTLの元気で フリーザと戦う
  26. 26. 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);
  27. 27. 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) {} } } }
  28. 28. 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);
  29. 29. 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")).withIte m(putItems); return putItemRequest; }
  30. 30. DynamoDB に元気が溜まる 元気ポイント 元気ポイント総量 Atomic Counter
  31. 31. 集計結果を JSON で Unityへ
  32. 32. Unity で見える化 Kinesis Stream Twitter4J Kinesis MeCab Dynamo Unity ミクさんに お手伝いしてもらう
  33. 33. おねだりするミクさん
  34. 34. リアルタイムに Kinesis から元気を集めるミクさん ミクさん みんなのTweet 元気ゲージ
  35. 35. かめはめ波 かめはめ波
  36. 36. フリーザ フリーザ
  37. 37. デモします
  38. 38. 負けバージョン
  39. 39. ずっこけるミクさん 負けバージョン 53万ptに達せず
  40. 40. 元気が足りない ※ここまでは予定調和
  41. 41. こんなこともあろうかと 仕込んでおいた 集計プログラム if (tweet.indexOf(“芸人イケメン”)) != -1) { point = 530000.0; }
  42. 42. オラに元気をわけてくれ 芸人イケメン #jawsdays とTweetすると元気 53万pt が届く BGM:チャラヘッチャラ
  43. 43. みんなの応援が 届く
  44. 44. 再び デモします
  45. 45. かめはめ波 勝ちバージョン 53万を超えた! 超えすぎww ※発表当時は「芸人イケメ ン」というTweetでいっぱい になりました。 照れるますわ(;́Д`)
  46. 46. フリーザに直撃 倒れるフリーザ 勝ちバージョン
  47. 47. やったね!
  48. 48. 芸人イケメン Kinesisイケメン まとめ リアルタイムに データ処理できるクールなサービス
  49. 49. おまけ(LTの裏側) 題材にKinesis を選んだ時点で絶対にクリアせねばならん課題がありました。  ↓それは 5分の発表枠のなかで、 リアルタイムに反映できるデモを実現する事  ↓というわけで、デモプログラムのためのサーバーサイドのプロセスは   安定稼働させる必要があり、それなりに監視していました。 ところが・・・
  50. 50. おまけ(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
  51. 51. おまけ(LTの裏側) 任天堂のピーク発生 と調べていると、DyanamoDBが単純にキャパを超えていました・・・ (;́Д`)すんません、ぼけてました。 ちょうど、任天堂AWS導入事例のセッションが開催されていて TLへの書き込みが増加したため、キャパ超えが頻発していたようです。 DyanamoDBをスケールアウトして対応 AWSの真髄ここにありですね スケールするDyanamoDB
  52. 52. 参考(感謝) ドラゴンボール 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
  53. 53. ありがとうございました

×