Carbon と Chronos から見る OSS 運営
-
Upload
ryo-shibayama -
Category
Internet
-
view
1.923 -
download
1
Transcript of Carbon と Chronos から見る OSS 運営
Carbon と Chronos から見る OSS 運営
CakePHP が Carbon を捨てるに至った経緯
@serima PHP BLT #6
日付/時刻操作ライブラリといえば Carbon?
Carbon との出会いは LaravelLaravel 4.2 を使い始めた時、Carbon を知りました
めっちゃ便利!日付操作簡単!
DateTime クラスを継承している
使用例
// 現在時刻$now = Carbon::now();// $now : 2017-02-20 03:32:09
// 明日$now->addDay();// $now : 2017-02-21 03:32:09
// 月末$now->endOfMonth();// $now : 2017-02-28 23:59:59
とても便利だけど、ちょっと違和感
違和感の正体はミュータブル
リリース後最初に作られた issue がミュータブルについて
しかし、今は対応しないということでクローズされる
Ref: Still mutable · Issue #2 · briannesbitt/Carbon
ミュータブルの何が良くないのか
オブジェクトが変更可能 = 複数の状態をとりうる複数の状態を扱う必要
想定外のデータが飛んでくる可能性
バグの温床
バグを生みそうな例
Carbon を使っているとこんな場面はよくあるはず
$now = Carbon::now();$two_hours_later = $now->modify('+2 hours');
このとき、 $now も $two_hours_later も2時間後をさしているあとで、 $now を使うとき、もはやそれは now じゃない
では、どのように回避するか
copy() を使って新たなインスタンスをコピーし、その上で時間操作
$now = Carbon::now();$two_hours_later = $now->copy()->modify('+2 hours');
もしくは
$now = Carbon::now();$two_hours_later = clone $now;$two_hours_later->modify('+2 hours');
どちらもバグが入り込みやすそうな記述
ChronosPHP 5.5.0 から実装されている DateTimeImmutable クラスを継承している
CakePHP に v3.2.0 から導入CakePHP はこのタイミングで Carbon を捨てた
使用例
// 現在時刻$now = Chronos::now();// $now : 2017-02-20 07:09:06
// 明日$tomorrow = $now->addDay();// $now : 2017-02-20 07:09:06// $tomorrow : 2017-02-21 07:09:06
// 月末$end_of_month = $now->endOfMonth();// $now : 2017-02-20 07:09:06// $end_of_month : 2017-02-28 23:59:59
Chronos において、 $now はイミュータブル(不変)
Carbon と Chronos の比較表
nesbot/carbon cakephp/chronos
Requirements"php": “>=5.3.0"
"symfony/translation": "~2.6|| ~3.0"
"php": ">=5.5.9"
Owner briannesbitt cakephp
Stars 5209 295
Downloads 21.59M 513K
Dependents 980 7
時系列
2012年09月11日 Carbon v1.0.0 公開 (この時点での、PHPのメジャー
バージョンは 5.4 ) 2012年09月12日 Carbon のリポジトリでイミュータブルに出来ないか
という issue が作られる 2013年04月19日 Laravel のリポジトリで Eloquent 内で DateTime の代わりに Carbon を使っては?という提案 issue が作られる 2013年04月20日 Laravel に Carbon が取り込まれる 2013年05月28日 Carbon が取り込まれた Laravel v4.0.0 (php >=5.3.0) が公開 2013年06月20日 DateTimeImmutable クラスが実装された PHP5.5.0 が公開 2014年04月17日 CakePHP に Carbon が取り込まれる 2015年05月08日 CakePHP コミュニティで Carbon を使うのを止めようという提案がされる
分岐点となった issue
https://github.com/cakephp/cakephp/issues/6509
何が決め手だったのか
Carbon コミュニティの不活発性
バグ修正の遅さ(クリティカルなバグ修正も遅かった)
より良い実装の実現例がイメージできていた
時系列
2015年10月12日 Chronos v0.1.0 公開 2016年01月02日 Carbon がすべて Chronos に置き換えられたCakePHP 3.2.0‑RC1 (php >= 5.5.10) が公開 2017年01月08日 Carbon needs to be more ACTIVE. という issue がCarbon リポジトリ内で作成される (2016年、1度もリリースがなかった)
2017年01月11日 @lucammichot が Carbon のメンバーに追加される
2017年01月15日 1 年 3 ヶ月ぶりに Carbon のマイナーバージョンアッ
プされ 1.22.0 が公開
結果的に Carbon は危機を乗り越えた。今後もメンテナンスは続きそう
だが、イミュータブルな実装を取っていくことはなさそうな気がする。
PHP 5.5 未満をサポートしなくてはならないプロジェクトでもない限
り、Chronos を使ったほうが良いのでは�
いちデベロッパーとしての教訓
スター数が多くても、その時点で適切なライブラリとは限らない
Laravel のような巨大なフレームワークが使用しているライブラリ
だからといって鵜呑みにするのは良くない
違和感を大切にしたい
OSS 運営側としての教訓コントリビュータは大切
いずれメンバーに昇格できるように設計思想や指針などをオープン
にしていく必要がある
適切な権限委譲ができないと、いかにデファクトスタンダードを取
っていても、廃れていく可能性がある
先日、emacs も同じような問題に直面してるという記事も
結局、OSS も人間の集まり ということを認識する