スキマノートスマートフォン用の表示で見るスキマノートAIメーカーなどのwebサービスを作っています。ここでは気になった技術、話題などをまとめたり、雑記を書いたりします。昨日は@isaitoiさんの「Microsoftの技術でもちゃんとしたサービスを作れるんだぞ!!」でした。普段は会社員でWeb系の開発エンジニアとして働き、週末に趣味で個人開発をしています。僕自身、普段あまり時間がない中でどう情報収集したらよいか困っているということもあり、エンジニアらしく技術で何とか解決するべく、ツイッターを活用し、エンジニアの情報収集を助けるキュレーションサービスを作ってみました。作ったものツイッターで話題になっている情報をジャンルごとにまとめる「ツイレポ」というサービスを作りました。リリースしました!🎉https://t.co/oFiPYwT34N時間がない中でどう情報収集したらよいか困っていたので、話題の情報のみをサクッと確認できるように作りました。画面イメージはこんな感じです。「ツイレポ」では以下のジャンルごとに話題となっているツイートを見ることができます。Calendarやってみた歌ってみた演奏してみた弾いてみた叩いてみた踊ってみた描いてみた作ってみたリリースした技術以外のジャンルもありますが、サービスを作り上げるエンジニアたる者、色んなジャンルにアンテナを張って様々な情報に触れる必要があると思うわけです。僕自身もアンテナを張りつつ、常に個人開発のサービスのアイディアに繋げられないかを考えていますので、このサービスによってその情報収集を楽にしたいと考えました。ジャンルごとに以下基準で並び替えを行い、ランキング形式で情報を確認することができます。フォロワー数)何で作ったの?皆さんは情報収集って何でしていますか?GIGAZINE、ITmediaなどの様々なネットメディア、それからはてなブックマーク、技術記事であればQiita、はてなブログ、等々、あげると切りがありません。忙しいエンジニアにとっては、情報収集のためにすべてに目を通すのは難しいです。情報収集されている方だと、RSSリーダーなどを使って自分の欲しい情報を効率的に得ている人もいるかと思います。僕の場合、そこまでのことはやっておらず、はてなブックマークで話題になっている情報にさっと目を通して終わりというのがほとんどでした。少ない時間の中でいかに効率良く情報収集できるか、を解決するために、今回自分でサービスを作ってみることにしました。僕が目をつけたのは、ツイッターです。ツイッターは自分がフォローした人がつぶやいた情報を見ることができますが、タイムラインではすべてを追うのは難しいです。ツイートにはリツイート、いいね、リプライといった、他の人がつけた評価みたいなものがつけられています。リツイート数やいいね数が多いものほど、話題になっている情報ととらえることができます。考え、このサービスを作り始めました。Engine(GCE)でサーバを立てています。サーバのOSはLinuxでCentOSの7系を使っています。ApachewebサーバはApacheを使っています。Nginxもありますが、Apacheは普段から使っており、設定も把握していたため、いつも通りの安定の選択としました。RDSを使ってMySQLを立てています。PlatformのBigQueryを使うようにしました。リリース後2週間ほどツイートを収集したら100万レコードを超えてしまい、応答速度的にも今後ヤバいな...ってなったので、BigQueryへデータを移行しました。BigQueryへの完全移行ではなく、MySQLとBigQueryのハイブリッド構成としました。移行については、この後ちょっと触れます。PHPサーバ側のプログラムはPHPを使って実装しました。jQueryクライアント側のJavaScriptは、jQueryを使って実装しました。ツイッターAPIツイートの情報を取得するために使用しています。使い方については、後述させて頂きます。croncronを使って定期的にバッチを走らせてツイートを収集しています。使って、移行しました。7以上である必要がありますが、使い方は超簡単です。--create-tableこれだけでMySQLからBigQueryへデータを移行できちゃいます。MySQLとBigQueryのハイブリッド構成BigQueryにデータはすべて移行したんですが、BigQueryは保存しているデータ量およびクエリの検索対象となったデータ量をもとに課金され、検索対象のデータ量による課金が今後ヤバくなるのは目に見えているため、MySQLも使ったハイブリッド構成にしました。ツイートをジャンルごとにリツイート数などでソートして一覧を取得する部分は比較的DBに負荷がかかるため、BigQueryを使用しています。ユニークIDからの単一のツイート取得はそれほどDBに負荷がかからないため、MySQLを使用しています。「日ごと」でjsonファイルで分けて結果をキャッシュファイルとして保存するようにしました。jsonファイルがある場合はそのファイルからデータを取得し、jsonファイルがない場合はBigQueryを呼び出して結果を受け取り、jsonファイルへ保存するといった具合にしています。することで、BigQueryによる検索量による課金地獄を回避しています(汗)、、クラウド破産こわい...><また、jsonファイルを保存する際には、単一のディレクトリに保存するのではなく、ファイル名をハッシュ化して先頭の2文字をとって、ディレクトリの階層を2つ作って保存しています。以下のような感じです。jsonファイルを保存これは一つのディレクトリに1000個を超える大量のファイルを置くと、読み込み等のパフォーマンスに悪影響が出てしまうからです。バズったツイートの可視化ツイートがバズった要因のようなものが少しでも可視化できたらと思い、以下に挙げたグラフを確認できるようにしてみました。各ジャンルごとに下部メニューのグラフアイコンをクリック、または各ツイートのインフォメーションアイコンをクリックするとみることができます。リツイート数、いいね数の分布ランキング100位までのツイートのリツイート数、いいね数を分布図で可視化しました。バズったツイートのリツイート数、いいね数の傾向を見ることができます。ツイートの時間帯ランキング100位までのツイートの時間帯を棒グラフで可視化しました。バズったツイートがどの時間帯でツイートされたかを見ることができます。ツイートの曜日・時間帯ランキング100位までのツイートの曜日、時間帯をバブルチャートで可視化しました。バズったツイートがどの曜日、時間帯でツイートされたかを見ることができます。使われているワードランキング100位までのツイートで使われているワードをワードクラウドで可視化しました。バズったツイートでは、どんなワードが使われているかを見ることができます。当該ツイートのエンゲージメント数を棒グラフで可視化しました。当該ツイートのエンゲージメント率をアクティビティゲージグラフで可視化しました。フォロワーのうちの何%が反応してくれているかを見ることができます。ツイッターAPIツイートはツイッターAPIを使って取得しています。ツイートを検索するワード。緯度,経度,範囲(半径)を指定。検索対象とする言語を指定。検索に使用する言語を指定。ツイート結果をpopular(話題のツイート)、recent(最新のツイート)、mixed(すべてのツイート)の中から指定。ツイートを取得する数を指定。yyyy-mm-ddの形式で検索期間のエンドを指定。検索対象とするツイートIDのスタートを指定。検索対象とするツイートIDのエンドを指定。レスポンス値にentitiesプロパティを含めるかを指定また、上記のqパラメータには以下の検索演算子を使うことができます。リツイート数が○○以上のツイートを取得できます。いいね数が○○以上のツイートを取得できます。リプライ数が○○以上のツイートを取得できます。○○(ユーザーID)さんに関するツイートを(ユーザーがしたツイートも、ユーザーへのリプライ、メンションも含め)取得できます。○○(ユーザーID)さんがしたツイートを取得できます。○○(ユーザーID)さんへのツイート(リプライ、メンション)を取得できます。yyyy年mm月dd日以降のツイートを取得できます。yyyy年mm月dd日までのツイートを取得できます。画像が含まれるツイートを取得できます。動画が含まれるツイートを取得できます。リンクが含まれるツイートを取得できます。ニュースに関するツイートを取得できます。ライブ配信に関するツイートを取得できます。認証アカウントのツイートを取得できます。不適切でないツイートを取得できます。ツイートの投稿元(クライアント)を指定して取得することができます。○○には「Instagram」などが使えるようです。○○の場所、半径××km以内でツイートされたものを取得できます。km以内でツイートされたものを取得できます。ツイートの言語を指定して検索することができます。日本語の場合は「ja」を指定します。××」に完全一致したツイートのみ取得できます。ポジティブなツイートを取得できるみたいです。ネガティブなツイートを取得できるみたいです。条件の先頭に「-」をつけると否定の条件にすることができます。これを使うことで除外したツイートを取得できます。通常は半角スペースで複数のワードを入力するとAND検索となりますが、ORを使うことでOR検索をすることができます。ツイート収集対象と条件ツイートを取得する対象と条件について、以下にまとめてみます。以下は各ジャンルごとの条件で、これに以下の流れで条件を追加して収集しています。-filter:verified日本語のツイートをすべて取得します。フォロワー数が多く、リツイート数やいいね数が多くつく認証アカウントのツイートは除外しています。lang:jaニュースに関するツイートをすべて取得します。ニュースでは信頼性の高い認証アカウントのツイートも含めています。-filter:verified画像が含まれるツイートをすべて取得します。フォロワー数が多く、リツイート数やいいね数が多くつく認証アカウントのツイートは除外しています。-filter:verified動画が含まれるツイートをすべて取得します。フォロワー数が多く、リツイート数やいいね数が多くつく認証アカウントのツイートは除外しています。-filter:verifiedライブ配信に関するツイートをすべて取得します。フォロワー数が多く、リツイート数やいいね数が多くつく認証アカウントのツイートは除外しています。lang:ja以下メディアのリンクが含まれたツイートを取得します。lang:ja以下メディアのリンクが含まれたツイートを取得します。lang:ja※半角ハイフン「-」がURLに含まれると、うまく検索できないケースがあったため、「+」や「*」に置き換えているものがあります。以下メディアのリンクが含まれたツイートを取得します。lang:ja以下メディアのリンクが含まれたツイートを取得します。lang:ja以下メディアのリンクが含まれたツイートを取得します。lang:ja※半角ハイフン「-」がURLに含まれると、うまく検索できないケースがあったため、「+」や「*」に置き換えているものがあります。以下メディアのリンクが含まれたツイートを取得します。lang:ja以下メディアのリンクが含まれたツイートを取得します。lang:ja以下ブログのリンクが含まれたツイートを取得します。lang:ja以下ワードのリンクが含まれたツイートを取得します。lang:ja以下サイトの画像が含まれたツイートを取得します。comic-polaris.jp)以下サイトのリンクが含まれたツイートを取得します。lang:ja以下サイトのリンクが含まれたツイートを取得します。lang:ja以下サイトのリンクが含まれたツイートを取得します。lang:ja以下サイトのリンクが含まれたツイートを取得します。lang:ja以下サイトのリンクが含まれたツイートを取得します。lang:ja以下サイトのリンクが含まれたツイートを取得します。lang:ja以下サイトのリンクが含まれたツイートを取得します。lang:ja以下サイトのリンクが含まれたツイートを取得します。lang:ja以下サイトのリンクが含まれたツイートを取得します。lang:ja以下メディアのリンクが含まれたツイートを取得します。lang:ja以下サイトのリンクが含まれたツイートを取得します。lang:ja以下メディアのリンクが含まれたツイートを取得します。lang:ja以下メディアのリンクが含まれたツイートを取得します。lang:ja以下メディアのリンクが含まれたツイートを取得します。lang:ja以下メディアの動画が含まれたツイートを取得します。lang:ja以下メディアの動画が含まれたツイートを取得します。lang:ja以下ワードの動画が含まれたツイートを取得します。lang:ja以下サイトのリンクが含まれたツイートを取得します。lang:ja以下サイトのリンクが含まれたツイートを取得します。lang:ja以下ワードのツイートを取得します。lang:ja以下サイトのリンクが含まれたツイートを取得します。lang:ja以下サイトのリンクが含まれたツイートを取得します。lang:ja以下サイトのリンクが含まれたツイートを取得します。lang:ja以下サイトのリンクが含まれたツイートを取得します。lang:ja以下サイトのリンクが含まれたツイートを取得します。lang:ja以下ワードのリンクが含まれたツイートを取得します。-filter:verified以下ワードの動画が含まれたツイートを取得します。-filter:verified以下ワードの動画が含まれたツイートを取得します。-filter:verified以下ワードの動画が含まれたツイートを取得します。-filter:verified以下ワードの動画が含まれたツイートを取得します。-filter:verified以下ワードの動画が含まれたツイートを取得します。-filter:verified以下ワードの動画が含まれたツイートを取得します。-filter:verified以下ワードの画像が含まれたツイートを取得します。描いてみた描いてみました作ってみた以下ワードのリンク、画像、動画が含まれたツイートを取得します。-filter:verified以下ワードのリンク、画像、動画が含まれたツイートを取得します。リリースしました開発しましたWebサービスwebサービスまとめ今回は各ジャンルごとに話題のツイートを収集し、ランキングで表示するところまで実装しました。作ってみて感じたのは、ジャンルによってはまだまだ収集したツイートの精度があまり良くなかったことです。ツイートにつけられたリツイート数やいいね数での評価だけでは、自分の望む精度の高い情報にはまだ及びませんでした。今後の課題としては、情報の精度をリツイート数やいいね数といったツイートの評価の他に「ツイレポ」のサービス内で改善できそうな点を考えていきたいと思います。今回の実装でリツイート数やいいね数は収集してるので、これを使ってツイートがバズる要因や傾向なども分析していければと考えています。今回、ジャンル分けやその収集対象は自分の独断と偏見で決めてしまっていますので、これを入れたらいいんじゃないか、これを入れて欲しいなどのご要望がありましたら、「ツイレポ」のご意見・ご要望よりご連絡を頂ければ幸いです。リリースしました!🎉https://t.co/oFiPYwT34N時間がない中でどう情報収集したらよいか困っていたので、話題の情報のみをサクッと確認できるように作りました。2018年12月2日ぜひこのサービスを使って情報収集してみてください!■ツイレポhttps://twirepo.com/明日は@Fujiyama_Yutaさんの「今作っているサービスを、この日までにリリースして記事を書きます!」です。はてなブログProAIメーカーなどのサービスを作っています。ここでは気になった技術、話題などをまとめたり、雑記を書いたりします。アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。