Capistrano のタスク間で共有できる変数
set :hoge, capture("pwd")
変数 hoge
に capture("pwd")
の実行結果が格納される。この hoge
は別のタスクからでも fetch(:hoge)
と書くとアクセスすることができる。
Cygwin でデスクトップに移動しやすくするエイリアス
下記を.bashrc
に書くとデスクトップに移動しやすくなります。
alias desktop='cd $USERPROFILE/Desktop'
PHPloy を使った FTP サーバーへのデプロイ
いろいろと FTP サーバーへのデプロイツールを探していましたが、PHPloy が今のところの使用感としては良い感じです。
https://github.com/banago/PHPloy
PHPloy は Git と連携しており、php phploy.phar deploy
というコマンドを実行すると最後のコミットのワークツリーを FTP サーバーにアップロードしてくれます。最初にデプロイする場合は全てのファイルが転送され、既にデプロイをしたことがある場合は差分がアップロードされます。
デプロイ先の FTP サーバーのユーザー名やパスワードは deploy.ini
に記述します。このファイルには複数のデプロイ先を記述することができ、コマンドの実行時にどの環境にデプロイするか指定できます。
また、PHPloy はディレクトリの削除に対応しています。FTP のデプロイツールは他にも dandelion や git-ftp がありますが、これらのツールはディレクトリを削除したコミットを行ったのちにそれをデプロイすると空のディレクトリが残ってしまいます。(動作確認した当時)
日本語の情報が無いようなので、追って記事化したいと思います。
qrank を WordPress から Flight に移行した
Flight への移行
qrank では WordPress をフレームワークとして使っていましたが、ランキングデータの保存をすべて外部のサーバーで行うようにしたので、WordPress の役割はルーティングとビューだけになってしまいました。となると WordPress である必要はなくなったので、DB を使用しなくてもよい軽量のフレームワークを探したところ、Flight というフレームワークが見つかりました。Flight 自体が提供している機能は非常にシンプルで学習コストも低く助かりました。単純なウェブサイトを作る分には充分ではないかと思います。
Bootstrap の導入
PHP のフレームワークの移行にあたり、ほとんどのコードを書き直す必要がありましたので、ついでに今更ながら Bootstrap を導入しました。Bootstrap が提供しているグリッドシステムは汎用性が高く、これだけでも利用価値はあるのではないかと思います。グリッドシステムに従っていればスマートフォンで見ても、それなりにレスポンシブにしてくれるため良いです。
結果
Flight を使ったフロントエンド側ではルーティングとビューと多少のコントローラーだけを扱えばよく、ランキングデータを提供するサーバー側と役割が分離されたためメンテナンス性が高まりました。
qrank | Qiitaの人気記事ランキング
http://qrank.wbsrv.net/
qrank の API サーバーを Serversman から ConoHa に移管した
概要
qrank はもともと WordPress で動かしていましたが、保存している記事の件数が増えてレスポンスが遅くなっていたため、記事情報の保存やランキングの計算を外部のサーバーに委ねることにしていました。そのサーバーに Serversman のメモリ 1GB のプランを使っていたのですが、記事が 7 万件ほどに到達した段階で新着記事を返すだけで約 12,800ms くらいかかるスピードになってしまいました。そこで、応急処置としてストレージが SSD になっている ConoHa に移管することに決めました。メモリは同じ 1GB のプランです。
移管の結果
移管の結果、新着記事 20 件を返すエンドポイントはレスポンスが、約 12,800ms から約 700ms に、ユーザー数のストック数ランキングの上位 100 件を返すエンドポイントは約 2,900ms から約 200ms に改善されました。サーバーの利用料金が月額 500 円から 900 円に上昇しましたが、速度の改善率を考えると充分な費用対効果はあったと思います。
qrank | Qiitaの人気記事ランキング
http://qrank.wbsrv.net/
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w[.. lib]) の意味
Serverspecのbin/serverspec-initに書かれていた一行です。
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
趣旨
$LOAD_PATH に実行中のファイルのディレクトリから ../lib の場所を追加する。 $LOAD_PATH に lib ディレクトリの位置を追加する。
$LOAD_PATH.unshift
unshiftメソッドは配列の先頭に引数として渡された要素を追加する。
File.join
与えられた引数をファイル区切り文字列で連結する。
File.dirname(FILE)
実行中のファイルのパスを返す。
*%w[.. lib]
%wはスペース区切りで与えられた文字列を配列に変換する。 *は配列を分解して別々の引数に変換する。
なぜ File.join で連結しているのか?
日付の期間を扱いやすくする PHP ライブラリ DateRange を作りました
ある日付がある期間に含まれているかどうかやある期間とある期間が重なっているかどうかを検査したりする機能を提供するライブラリを作りました。
GitHub
https://github.com/suzuki86/DateRange
GitHub Page
http://suzuki86.github.io/DateRange/
使い方
DateRange::includes()
ある日付がある期間に含まれているかどうかを確かめます。
$dateRange = new DateRange(
strtotime('2015-10-01'),
strtotime('2015-10-20')
);
$result = $dateRange->includes(strtotime('2015-10-10'));
var_dump($result); // bool(true)
DateRange::overlaps()
ある期間とある期間が重なっているかどうかを確かめます。
$dateRange = new DateRange(
strtotime('2015-10-01'),
strtotime('2015-10-20')
);
$target = new DateRange(
strtotime('2015-10-10'),
strtotime('2015-10-25')
);
$result = $dateRange->overlaps($target);
var_dump($result); // bool(true)
DateRange::extract()
期間に含まれる全ての日付を返します。
$dateRange = new DateRange( strtotime('2015-10-01'), strtotime('2015-10-05') ); $result = $dateRange->extract(); echo date('Y-m-d', $result[0]); // '2015-10-01' echo date('Y-m-d', $result[1]); // '2015-10-02' echo date('Y-m-d', $result[2]); // '2015-10-03' // ...
DateRange::getOverlap()
2つの期間の重なっている日付を返します。
$dateRange = new DateRange( strtotime('2015-10-01'), strtotime('2015-10-05') ); $target = new DateRange( strtotime('2015-10-03'), strtotime('2015-10-07') ); $resultDateRange = $dateRange->getOverlap($target); echo strtotime('Y-m-d', $resultDateRange->startDate); // '2015-10-03' echo strtotime('Y-m-d', $resultDateRange->endDate); // '2015-10-05'
DateRange::merge()
2つの期間を1つの期間に結合します。
$dateRange = new DateRange( strtotime('2015-10-01'), strtotime('2015-10-05') ); $target = new DateRange( strtotime('2015-10-03'), strtotime('2015-10-07') ); $resultDateRange = $dateRange->merge($target); echo strtotime('Y-m-d', $resultDateRange->startDate); // '2015-10-01' echo strtotime('Y-m-d', $resultDateRange->endDate); // '2015-10-07'