自分のツイートデータをKibanaで可視化して当時の心境を振り返る

大遅刻すみません。ちょっと技術的に躓いていてしまいまして、心が折れてしまっていました…

Twitterは [https://twitter.com/settings/your_twitter_data](https://twitter.com/settings/your_twitter_data) ここから自分の全ツイートデータを取得することができます。
これをKibanaで可視化してみたいと思います。

# データ加工

ツイート、画像、動画などたくさんの懐かしいデータが得られます。
ツイートは `tweet.js` がそれで、本文だけではなく、いつ、どのクライアントでなど様々な情報が得られます。
ファイル名から予想がつくように、これは JavaScript のコードで json ではありません。

乱暴ですが以下のように json にします。

```sh
# brew install gnu-sed
gsed -i -e "s/^window.YTD.tweet.part0 =//" tweet.js
jq -c '.[]' tweet.js > tweet_jsonlines.json
```

これで `tweet_jsonlines.json` にできあがるのは JSON Lines などと呼ばれる形式で、1行に1つのjsonが書かれているファイルになります。
 
# 環境構築

手前味噌でなんですが、[5分でできるElastic stack(Elasticsearch, Logstash, Kibana)環境構築](https://qiita.com/kaibadash@github/items/52f7c205e74d98c5612a)を参照ください。

今回は `/usr/share/logstash/work` に　json lines(1行に1JSON)をおいて読み込ませてみます。
デフォルトだと port 5000 で待ち受けているので、[docker-elkを使って過去のCloudTrailのログをサクッと分析してみた ｜ Developers.IO](https://dev.classmethod.jp/tool/docker/analytics-cloudtrail-logs-using-docker-elk/)のようにやったほうが環境構築は楽ですね。
今回のような「大量のツイートデータをいれたい」のようなケースだと遅そうかな、と思いましてファイルから読むようにしてみました。
(僕のツイートは3万件程度で全然こだわるところではないのですが…)

workディレクトリをDockerとホストで共有するようにします。

```diff
diff --git a/docker-compose.yml b/docker-compose.yml
index a590b5b..491da23 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -40,6 +40,10 @@ services:
         source: ./logstash/pipeline
         target: /usr/share/logstash/pipeline
         read_only: true
+      - type: bind
+        source: ./logstash/work
+        target: /usr/share/logstash/work
```

ファイルを読み込む設定をします。
Kibanaでは timestamp に datetime を入れると扱いやすいのですが、Twitterの `created_at` は `Sat Oct 26 09:56:24 +0000 2019` の形式なのでそのままでは文字列として扱われてしまいます。
date filter を使ってフォーマットを指定し、 date time として扱うようにしています。

```logstash/pipeline/logstash.conf
input {
  file {
    codec => "json"
    path => ["/usr/share/logstash/work/*.json"]
    sincedb_path => "/usr/share/logstash/work/since"
    start_position => "beginning"
  }
}

filter {
  date {
    match => [ "created_at", "EEE MMM dd HH:mm:ss Z yyyy" ]
      target => "timestamp"
  }
}

output {
  elasticsearch {
    hosts => "elasticsearch:9200"
      user => "elastic"
      password => "changeme"
      index => "tweet%{+YYYYMMdd}"
  }
  # 読み込まれない！などはデバッグ出力を見ると良い
  # stdout { codec => rubydebug }
}
```

先程、作成した `tweet_jsonlines.json` を `works` の下に起き、Dockerを再起動します。

# 確認

まずは Elasticsearch への挿入の確認から。以下から確認できます。

http://localhost:5601/app/kibana#/management/elasticsearch/index_management/indices

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21799/602321ba-2d44-ad07-776a-a784e93c3000.png)

`tweet20191222` の Docs Count がツイート数とほぼ一致しました。

# Kibana

[index patternを作ります](http://localhost:5601/app/kibana#/management/kibana/index_patterns?_g=())。
ゴミが残っていますが、 `tweet*` としてみました。
Kibanaは複数の Elasticsearch index をいい感じにまとめてくれるのですね。
ログとかは 日付ごとに index を作ったりすると良さそうです。

# Kibanaで可視化する

http://localhost:5601/app/kibana#/discover を見てみます。

## ツイート数の遷移

![スクリーンショット 2019-12-22 18.28.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21799/ab42b73f-c416-4d5c-3efa-feec513492de.png)
ツイート数の遷移。2012年は今より活発です。
[僕のブログの2012年のエントリ](http://pokosho.com/b/archives/date/2012/)を見ると、釣りに行ったり、工作をしたり、プログラム書いて発表したりしていました。

## 疲れていた時期

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21799/262eff48-2a33-1323-6973-74d6352236df.png)

`full_text 疲` で検索して疲れていそうなデータを探してみました。
同じく2012年は疲れていた模様。

## 好きなTwitterクライアント

![スクリーンショット 2019-12-22 18.36.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21799/584661e0-2509-cd72-18ad-da7f30c967a6.png)

http://localhost:5601/app/kibana#/visualize/ から `source` (Twitterクライアント)を集計してみる。
なんだかんだでTwitter Webは良く出来てる。Featherも好きでしたし、今はなきついっぷるも好きでした。

## まとめ

これ以上、僕の分析をしても面白くありませんのでこの辺にしましょう。みなさん、独自の切り口で自己分析してみてはいかがでしょうか？
僕もKibanaはあまり使ったことがなく、手探りですが、これは触って覚える系のツールな感じがします。
強いひとと一緒に一度触ってみると良さそう、と思いました。