『はてな匿名ダイアリー』の日別投稿記事数をHighchartsを使って可視化してみた
あまり触れてこなかったオブジェクト指向に苦手意識があり、Rubyで何かを作ってみたら理解が捗るんじゃないかというのと、Webスクレイピングに興味があったので、表題の通り、Highcharts*1を使って描画するところまでやってみた。
成果物
11年間で最も投稿が多かった日
日付 | 1日の投稿数(件) |
---|---|
2016-11-12 | 10674 |
2016-11-13 | 5919 |
2016-11-10 | 1431 |
2016-11-11 | 1344 |
2015-06-11 | 1340 |
2016-10-20 | 1128 |
2016-03-15 | 1060 |
2016-06-16 | 1025 |
2015-06-10 | 1017 |
2015-07-23 | 1013 |
11年間で最も投稿が少なかった日
日付 | 1日の投稿数(件) |
---|---|
2006-10-09 | 10 |
2006-11-01 | 12 |
2006-10-08 | 14 |
2006-10-31 | 15 |
2006-10-26 | 15 |
2006-10-11 | 16 |
2006-10-07 | 16 |
2006-10-27 | 19 |
2006-10-10 | 19 |
2006-10-18 | 20 |
~感じたこと~
- 2016年11月12日や2016年10月20日といった荒らされていた日を確認することが出来た
- 2008年に入ってから一気に記事数が増えているのが不思議だなと思った
- 2011年から2012年にかけて記事数が減っているのは、震災もあり匿名サイトに構ってられないみたいな流れがあったんだろうか
- 2018年から2019年にかけてはちょっとずつ日別投稿数が減っていき、オリンピック後ぐらいにまたどんどん記事が増えていくのでは?見守っていきたい
ToDo
- コードのリファクタリング(highchartに描画するためのデータ整形がやばい)
- テストコードの切り分け
- 1日ごとに
cron
みたいな形で動かして記事件数を取得し、グラフが更新されるようにしたい
以下は技術的(これを果たして技術と括って良いのか)な話とか、どうして作るかに至ったか?書いていきます。
『はてな匿名ダイアリー』について
はてな匿名ダイアリーは、株式会社はてなが実験として展開しているサービスの1つで、ユーザーが匿名で日記を投稿できることから、多種多様な日記が投稿されている。しかし日記の投稿サイトなのに1日に何件の日記が投稿されているのかがパット見分からない…というわけで可視化したくなってやってみました。
サイトの仕様
- http://anond.hatelabo.jp/robots.txt があるが
crawl-Delay
をclawl-Delay
とtypoしている*2- 自分も「やるぞ!」ってなった時に作ったリポジトリ名を同様に間違えた
- 1日に投稿された日記は
http://anond.hatelabo.jp/20170101
といった形で確認できる - 1ページにつき25件の日記が表示され、25件ごとにページが増える
http://anond.hatelabo.jp/20170101?date=20170101&page=30
で30ページ目の日記が表示される
- 記事の無いページにもアクセスできるが、記事が存在しないので要素が表示されない
実装方針
robots.txt
やGoogle検索を参考にスクレイピング間隔を決める- ページに25件の日記を表示する要素(
day
)があるかないかを判別していく - 見ているページに
day
があり、次のページに無かった場合、そのページの日記タイトルを表示する要素(h3
)を数える - 2と3を足し算!したものをDBに格納する
- DBに格納したデータをHighchartsで整形してサイトで描画
しホスティングする
時間を使った所
実装方針2の処理について
1ページごとにあるかないか単純に確認していくのは1日辺りのアクセス数が になってしまい、スクレイピング的な意味でやばそうというのが作っていて分かった。というわけで、1日にどのぐらい日記が投稿されているのかを事前に確認し、これからどのぐらいのデータを扱うのか見積もった。
その結果、1500件以上投稿されている日が無い様に見えたので、60ページを上限とした二分探索で処理する事にした。
最終的に、二分探索のコードを実装する事になったので時間がかかったけど、で済んだので、実行時間もアクセス数も改善された。(とはいえ、結局かなりアクセスしてしまったので迷惑をかけてしまったと思います。はてなさん申し訳ございません。) また、1500を超える日があった事も分かり、それについては1500件になっていたデータを確認して、その日だけ上限変えたりしてSQLを叩く形で済ませた。
データベースの設計と作成
Qiitaに参考になる記事(最後に記載)があったので、設計はすぐに終わった。しかし、PostgreSQLには更新時にcurrent timestamp
を書き込むという様なupdated_at
を手助けしてくれる関数が存在しなかったので、先人の知恵を借りた。
さいごに
- webスクレイピングに関すること
- PostgreSQL・SQLに関すること
- グラフ描画に関すること
を、実際に作りながら知見として蓄積する事が出来た。スケジュールとしては4月4日にアイデア出して作業、就活、大学といった感じなので、1ヶ月かかった。最終的にはHeroku辺りでホスティングして、SQLを何度も実行されてアレだからキャッシュを~みたいな事を考えたりしたかったけど、あんまり余裕が無いので、今回はとりあえずここまで。就活と卒論つらい。
関連サイト
- 外套とdoyagao
- はてブAPIを利用してはてな匿名ダイアリーを分析しているブログ
- データベースオブジェクトの命名規約(Qiita記事)
- データベースの設計で参考になった
Atomも便利だけどVSCodeも便利ですね
最近Atomの調子が悪くなってきて(プラグイン入れすぎた?)、動作停止が頻発するようになりました。というわけで Visual Studio Code(VSCode)を入れてみたんですけど、ちょっとまだ色々分かっていない所がありますが、軽くて良さそうです。 VSCodeの基本的な方針は以下みたいな感じの様です。
- プロジェクトフォルダ毎に
{workspaceroot}/.vscode/
で設定(ビルドや構成、デバッグなど)を管理する- なのでフォルダ毎に設定ファイルを書く必要がある(作れって言われる)
- 複数の言語のファイルが同じフォルダにあるというのは適してない形になる(設定が面倒になる)
- 拡張機能を導入した後に
config.json
で追加された設定を確認する- たとえば「C/C++(cpptool)」を導入した後に、設定を確認すると
C_Cpp.*
といった設定が書ける様になっている
- たとえば「C/C++(cpptool)」を導入した後に、設定を確認すると
今後はVSCodeがソースコード編集のメインになるかもしれませんが、今まで勉強フォルダに複数の言語ファイル置いてたりしたので、整理が必要になりそうですね/(^o^)\
PostgreSQLで更新日時を記録する「update_at」カラムを実現させる
データベースを作っていく上で、最低限必要とされているカラムに
id
、created_at
、updated_at
があります。
MySQLの場合は、
DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
とカラムに設定することで、更新時に日時も合わせて更新されるという仕様になっていますが、PostgreSQLにはありません。
そこで、PostgreSQLではトリガーと、トリガーで実行される関数をを仕込んでやっていく様になるみたいで…凄いですね。
create table tests ( id integer primary key, name text not null, created_at timestamp not null default current_timestamp, updated_at timestamp not null default current_timestamp );
create function set_update_time() returns opaque as ' begin new.updated_at := ''now''; return new; end; ' language 'plpgsql';
create trigger update_tri before update on posts for each row execute procedure set_update_time();
これを順に実行すればOKでした。
PostgreSQLで叩いたコマンド(SQL文)の履歴を持ってくるには
MySQLだと、SQLを叩いた後、上矢印キーを押せば叩いたSQLが表示されて再利用出来たけど、 PostgreSQLだとそれが出来なくて、困っていた。というか、分からなくて毎回毎回打っていたけど、調べたら分かった。
叩いたコマンドを全て表示
\s
直前に叩いたコマンドを表示
\p
Microsoft Online Outlookで差出人名を変更する方法
配布されたメールアドレスには既に差出人名として学籍番号が割り当てられていて、 特に気にせず利用していたけど、自分から送ったメールを受け取った側からすると、 誰が誰だか分からないので困るみたいな話だった。
というわけで変更する
まとめ
- ログインする
- 右上の設定(歯車)を押すとメニューが出てくるので、「アプリの設定」にある「メール」を選ぶ
- 左側の「オプション」から「全般」を開き、「マイアカウント」を選ぶ
- 入力項目の「表示名*」を変更する
[追記 2017/11/30] コメント欄で指摘があったので、まとめの方法を書き換えた
Slackで好きなステータスを設定出来る様になった
という情報がSlackで流れてきた。
この機能で設定したステータスは、ユーザー名の右側に絵文字という形で表示される様になるほか、 左側のユーザー・チャンネル一覧のところとチャットの自分の名前の右側に表示される様になる。
(マウスポインタを載せれば文章が表示される)
設定するには、左上のチーム名から「Edit Status」を選択し、後は最初から用意されているのを設定するか、 自分で好きな絵文字と文章を設定してもよい。
ここで設定した絵文字+文章に関してはCtrl+k
で出てくるメニューで表示される様になるので、
組織内の人達で書くルールを決めて運用するのも面白いのかもしれない。
また、APIも既に用意されている様なので、家と学校/仕事場に物理ボタンを用意しておいて、 ボタンを押す毎にPOSTして「家なう」「仕事場なう」みたいな感じで管理するのも面白そう。 時間があったら触っておきたいところ。
プロジェクターにパワポ、ノートPCに発表者ツールを表示させる
ノートPC側のモニターを「拡張」、パワーポイントで「F5」を押しても、プロジェクター側にパワポが表示されなくて困った。
環境
- Win7
- PowerPoint 2013
解決方法
スライドショータブにあるモニターで自動ではなく自分でモニターを設定させる