『はてな匿名ダイアリー』の日別投稿記事数をHighchartsを使って可視化してみた

あまり触れてこなかったオブジェクト指向に苦手意識があり、Rubyで何かを作ってみたら理解が捗るんじゃないかというのと、Webスクレイピングに興味があったので、表題の通り、Highcharts*1を使って描画するところまでやってみた。

成果物

f:id:toC_1421:20170425230802p:plain

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-Delayclawl-Delaytypoしている*2
    • 自分も「やるぞ!」ってなった時に作ったリポジトリ名を同様に間違えた
  • 1日に投稿された日記はhttp://anond.hatelabo.jp/20170101といった形で確認できる
  • 1ページにつき25件の日記が表示され、25件ごとにページが増える
    • http://anond.hatelabo.jp/20170101?date=20170101&page=30で30ページ目の日記が表示される
  • 記事の無いページにもアクセスできるが、記事が存在しないので要素が表示されない

実装方針

  1. robots.txtGoogle検索を参考にスクレイピング間隔を決める
  2. ページに25件の日記を表示する要素(day)があるかないかを判別していく
  3. 見ているページにdayがあり、次のページに無かった場合、そのページの日記タイトルを表示する要素(h3)を数える
  4. 2と3を足し算!したものをDBに格納する
  5. DBに格納したデータをHighchartsで整形してサイトで描画ホスティングする

時間を使った所

実装方針2の処理について

1ページごとにあるかないか単純に確認していくのは1日辺りのアクセス数が O(n) になってしまい、スクレイピング的な意味でやばそうというのが作っていて分かった。というわけで、1日にどのぐらい日記が投稿されているのかを事前に確認し、これからどのぐらいのデータを扱うのか見積もった。

その結果、1500件以上投稿されている日が無い様に見えたので、60ページを上限とした二分探索で処理する事にした。

最終的に、二分探索のコードを実装する事になったので時間がかかったけど、 O(log_2n)で済んだので、実行時間もアクセス数も改善された。(とはいえ、結局かなりアクセスしてしまったので迷惑をかけてしまったと思います。はてなさん申し訳ございません。) また、1500を超える日があった事も分かり、それについては1500件になっていたデータを確認して、その日だけ上限変えたりしてSQLを叩く形で済ませた。

データベースの設計と作成

Qiitaに参考になる記事(最後に記載)があったので、設計はすぐに終わった。しかし、PostgreSQLには更新時にcurrent timestampを書き込むという様なupdated_atを手助けしてくれる関数が存在しなかったので、先人の知恵を借りた。

さいごに

を、実際に作りながら知見として蓄積する事が出来た。スケジュールとしては4月4日にアイデア出して作業、就活、大学といった感じなので、1ヶ月かかった。最終的にはHeroku辺りでホスティングして、SQLを何度も実行されてアレだからキャッシュを~みたいな事を考えたりしたかったけど、あんまり余裕が無いので、今回はとりあえずここまで。就活と卒論つらい。

関連サイト

*1:HighchartsではなくD3で行こうと思って入門していたけど比較とアドバイスもありこっちにした

*2:魚拓によれば、去年発見されていたっぽい

Atomも便利だけどVSCodeも便利ですね

最近Atomの調子が悪くなってきて(プラグイン入れすぎた?)、動作停止が頻発するようになりました。というわけで Visual Studio Code(VSCode)を入れてみたんですけど、ちょっとまだ色々分かっていない所がありますが、軽くて良さそうです。 VSCodeの基本的な方針は以下みたいな感じの様です。

  • プロジェクトフォルダ毎に{workspaceroot}/.vscode/で設定(ビルドや構成、デバッグなど)を管理する
    • なのでフォルダ毎に設定ファイルを書く必要がある(作れって言われる)
    • 複数の言語のファイルが同じフォルダにあるというのは適してない形になる(設定が面倒になる)
  • 拡張機能を導入した後にconfig.jsonで追加された設定を確認する
    • たとえば「C/C++(cpptool)」を導入した後に、設定を確認するとC_Cpp.*といった設定が書ける様になっている

今後はVSCodeがソースコード編集のメインになるかもしれませんが、今まで勉強フォルダに複数の言語ファイル置いてたりしたので、整理が必要になりそうですね/(^o^)\

PostgreSQLで更新日時を記録する「update_at」カラムを実現させる

データベースを作っていく上で、最低限必要とされているカラムに idcreated_atupdated_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で更新時のtimestampをアップデートするには | OpenGroove

PostgreSQLで叩いたコマンド(SQL文)の履歴を持ってくるには

MySQLだと、SQLを叩いた後、上矢印キーを押せば叩いたSQLが表示されて再利用出来たけど、 PostgreSQLだとそれが出来なくて、困っていた。というか、分からなくて毎回毎回打っていたけど、調べたら分かった。

叩いたコマンドを全て表示

\s

直前に叩いたコマンドを表示

\p

参考:ポストグレスpsqlメモ(Hishidama's psql Memo)

Microsoft Online Outlookで差出人名を変更する方法

配布されたメールアドレスには既に差出人名として学籍番号が割り当てられていて、 特に気にせず利用していたけど、自分から送ったメールを受け取った側からすると、 誰が誰だか分からないので困るみたいな話だった。

というわけで変更する

まとめ

  1. ログインする
  2. 右上の設定(歯車)を押すとメニューが出てくるので、「アプリの設定」にある「メール」を選ぶ
  3. 左側の「オプション」から「全般」を開き、「マイアカウント」を選ぶ
  4. 入力項目の「表示名*」を変更する

[追記 2017/11/30] コメント欄で指摘があったので、まとめの方法を書き換えた

Slackで好きなステータスを設定出来る様になった

という情報がSlackで流れてきた。

この機能で設定したステータスは、ユーザー名の右側に絵文字という形で表示される様になるほか、 左側のユーザー・チャンネル一覧のところとチャットの自分の名前の右側に表示される様になる。

f:id:toC_1421:20170414150934p:plain
マウスポインタを載せれば文章が表示される)

設定するには、左上のチーム名から「Edit Status」を選択し、後は最初から用意されているのを設定するか、 自分で好きな絵文字と文章を設定してもよい。

ここで設定した絵文字+文章に関してはCtrl+kで出てくるメニューで表示される様になるので、 組織内の人達で書くルールを決めて運用するのも面白いのかもしれない。

f:id:toC_1421:20170414151130p:plain

また、APIも既に用意されている様なので、家と学校/仕事場に物理ボタンを用意しておいて、 ボタンを押す毎にPOSTして「家なう」「仕事場なう」みたいな感じで管理するのも面白そう。 時間があったら触っておきたいところ。

プロジェクターにパワポ、ノートPCに発表者ツールを表示させる

ノートPC側のモニターを「拡張」、パワーポイントで「F5」を押しても、プロジェクター側にパワポが表示されなくて困った。

環境

解決方法

スライドショータブにあるモニターで自動ではなく自分でモニターを設定させる

f:id:toC_1421:20170412131329p:plain