日付の期間を扱いやすくする 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'
委譲の使いどころ
委譲について調べたので記録を残しておきます。
参考
Rubyでdelegation(委譲)を簡単にする2つの方法 http://qiita.com/w650/items/671cc9c49b2ebf60620d
「継承より委譲」≠「継承使うな」 http://osa.hatenablog.com/entry/2014/08/28/204853
まとめ
- Ruby では Forwardable モジュールを使用することで委譲をより簡単に行うことができる。委譲そのものは Forwardable を使用しなくても実現することができる。
- 継承と委譲は同じ目的を達成できるがそれぞれにメリット、デメリットが存在する。
- どんなときにどちらを使うべきかを理解する必要あり。
配列の要素の中で特定の条件を満たす要素を取り出す
partition
メソッドを使うことで特定の条件を満たす要素を取り出すことができます。
下記は [1,9,3,15,5]
という配列から 4 以上の要素を変数 a
に、3 未満の要素を変数 b
に代入します。
a, b = [1,9,3,15,5].partition{ |item| item > 3 }
特異メソッドから直接インスタンスメソッドは呼び出せない
下記のような書き方をするとエラーになる。
class A def self.speak say_hello end def say_hello puts "Hello" end end A.speak # undefined local variable or method というエラーが表示される。
self.speak
メソッドの中で自分自身のクラスをnewすると呼び出すことができる。
class A def self.speak self.new.say_hello end def say_hello puts "Hello" end end A.speak # Helloと表示される。
エラーになる理由
qrank に新着記事一覧を追加しました
qrank に新着記事を一覧表示するページを追加しました。Qiitaはログインしないと新着記事の一覧を見られないので、多少便利かと思います。
Rails 4.0.0 でコントローラーに GET リクエストを行うと、何故か複数回コントローラーが実行される
Rails 4.0.0 で特定のコントローラーに GET リクエストを送ると、何故か複数回コントローラーが実行される現象に遭遇しました。しかも直接 URL に GET リクエストを送ると、1度だけ実行されるのですが、HTML の a タグを使って他のページからのリンクで移動するかたちで該当の URL を実行すると複数回実行されるという謎の挙動です。
コントローラーの処理の途中に、ログに文字列を残す処理を書いてログを確認すると複数回分ログに残っていますし、メールを送る処理を書くとメールが複数通数送信されているので、複数回実行されていることは間違いありませんでした。
中の処理の書き方がまずいのかと思っていろいろと変更しても結果に変わりがないため、Rails を最新バージョンの 4.1.5 にアップグレードしたところ、その現象は解消されました。
ターミナルの現在のディレクトリ名や $ が表示される部分(PS1)の色を変えると見やすい
ターミナルで作業をしていると、どの行が自分が実行したコマンドでどの行が標準出力なのか分かりづらかったので、これの色を変えると見やすくなりました。
ターミナルの現在のディレクトリ名や $ が表示される部分は PS1 と呼ばれ、PS1 という変数に書式が定義されています。デフォルトで定義されている PS1 に色をつけるだけなら簡単にできました。下記のように .bashrc
にて PS1 の値を上書きします。(Ubuntu 14.04で試しました。)
export PS1="\[\e[1;32m\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ \[\e[00m\]"
PS1 の色については下記の記事が参考になりました。
http://babyp.blog55.fc2.com/blog-entry-663.html
追記
tmux を起動した時に反映させるには .bash_profile
にも書く必要がありました。