GitHub Pagesの404ページをカスタマイズする

https://help.github.com/articles/custom-404-pages/
404.htmlを追加するか、Jekyllで出力すればOK。

できないと思って調べてもいなかった…。

Railsのproduction.logから一番重いやつの時間を出す

まじめに解析するなら
https://github.com/wvanbergen/request-log-analyzer
とか使う。超便利。

が、なんか遅いのある気がするって時に、さっと一番重いリクエストの処理時間を出したい。そんな時に。

I, [2015-07-02T03:47:07.832647 #1439]  INFO -- : Completed 200 OK in 374ms (Views: 35.2ms | ActiveRecord: 326.1ms)
I, [2015-07-02T03:47:07.863499 #1445]  INFO -- : Completed 200 OK in 532ms (Views: 5.9ms | ActiveRecord: 213.3ms)
:
:

ログにはこういうのが並んでるので、

$ grep "Completed 200 OK in" production.log | awk '{ print $11 }' | sort -n 

すれば、

:
:
374ms
532ms

みたいに出せる。

Railsのコミットを検索するWebアプリ(作りかけ)

普段、コミットメッセージは英語で書いてるんだけど、絶対正しくない気がしている。
まぁ短文だから何してるかぐらいはわかるんだけど、これじゃあいつまでもWritingのスキルが上がらないんじゃないか?

慣れない変数名を付ける時はちゃんと辞書を引くんだから、コミットログもそうすべきだよね。
ということで作り始めた。

http://commits.parseapp.com/
https://github.com/tnantoka/commits

既存のサービス

後から気づいたけど、もう類似のサービス結構ある。

データ

ひとまずhttps://github.com/rails/rails を対象にした。50000コミットぐらい。
ソースコード見ればどんな変更がどういうコミットログになるかわかる気がするし。
Merge pull requestみたいなのは除外している。

こういうやっつけのスクリプトでJSON化。
https://github.com/tnantoka/commits/blob/master/Rakefile#L22

全データだとサイズが思ったより大きかったのでひとまず1000件に絞ってる。どうしようかなぁ。

使ったもの

基本的な方針としてクライアント再度で完結させて、Github pagesなりに載せるつもりだった。もう個人のサービスで監視とかやりたくないねん…。
最終的にstar付けたいなということになり、じゃあ何かしらDBを、ということでParseに落ちついた。のでhostingもparseにした。(結局スター部分は実装してないけど)

Parse Web Hosting

日本語ガイドがある。
https://parse.com/docs/jp/js/guide#hosting

ParseにSign Upしてアプリを作っておく。

あとは

$ curl -s https://www.parse.com/downloads/cloud_code/installer.sh | sudo /bin/bash
$ parse new commits
$ cd commits
$ parse deploy

とすれば、

http://commits.parseapp.com/

で公開される。お手軽。

Grommet

HP製のフレームワーク。当然のようにReactを要求してくる硬派な感じ。
http://grommet.io/docs/

$ gromment init example
$ cd example

# localhost:9000でテストサーバー起動
$ gulp dev

# プロダクション用にbuild
$ gulp dist

gulpタスクとか用意してくれてるので、Reactの入門に良いのかもしれない。

こんな感じ。また気が向いたらいじる。

AnsibleでEC2のインスタンスにSwapを設定する

デフォルトは0。
Degital Ocean使ってる時は自分で設定してたけど、EC2もそうなのね。知らなかった。(インスタンスタイプによるのかも。t2は設定されてなかった)

このままでは、メモリが足りなくなるとOOM Killerにやられてしまう。
http://qiita.com/konpyu/items/20d1989d1251d805cf3b

というわけでAnsibleのPlaybookを書いて設定した。

Swapfileの追加手順はこの辺を参考に。

Ansibleでやる方法はこの辺り。

ちなみに、--checkはdry-runのこと。
https://docs.ansible.com/playbooks_checkmode.html

Playbook

最終的にこんなPlaybookになった。

---
- hosts: all
  user: ec2-user
  sudo: yes
  tasks:
    - name: create the file to be used for swap
      command: fallocate -l 1G /swapfile
    - name: format the file for swap
      command: mkswap /swapfile
    - name: change swap file permissions
      file: path=/swapfile owner=root group=root mode=0600
    - name: add the file to the system as a swap file
      command: swapon /swapfile
    - name: write swap entry in /etc/fstab
      mount: name=swap src=/swapfile fstype=swap opts=defaults passno=0 dump=0 state=present

存在チェックとかしてないので、2回目実行するとエラーで止まる。
ので、単体で実行。

$ ansible-playbook add_swap.yml -i hosts

無事、設定されました。

$ swapon -s
Filename                Type        Size    Used    Priority
/swapfile                               file    1048572 0   -1
$ free -m
             total       used       free     shared    buffers     cached
Mem:          2004       1700        304          0        131        224
-/+ buffers/cache:       1344        659
Swap:         1023          0       1023

CentOS 7

CentOS 7にもそのまま使えるかと思ったら、

stderr: swapon: /swapfile: swapon failed: Invalid argument

となった。

dd使わんとダメっぽい。

-     command: fallocate -l 1G /swapfile
+     command: dd if=/dev/zero of=/swapfile bs=1M count=1024

で行けた。

Rubyの$:の意味

http://docs.ruby-lang.org/ja/2.2.0/class/Kernel.html#V_--2D-I

$LOAD_PATHと同じ。

こういうのググるの辛い。

誰かのためにドルコロン、ダラーコロン、ドルマークコロンとか書いとこう。