SlideShare a Scribd company logo
1 of 19
Download to read offline
CarbonとChronos から見るOSS 運営
CakePHP がCarbonを捨てるに至った経緯
@serimaPHP BLT #6
日付/時刻操作ライブラリといえばCarbon?
Carbonとの出会いはLaravel
Laravel4.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: Stillmutable· 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');
どちらもバグが入り込みやすそうな記述
Chronos
PHP 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日 Carbonv1.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が取り込まれたLaravelv4.0.0 (php >=
5.3.0) が公開
 2013年06月20日  DateTimeImmutable クラスが実装されたPHP
5.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日 Carbonneeds tobemoreACTIVE. という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 も人間の集まりということを認識する

More Related Content

More from Ryo Shibayama

ソフトウェアエンジニアとしてのワークアズライフ
ソフトウェアエンジニアとしてのワークアズライフソフトウェアエンジニアとしてのワークアズライフ
ソフトウェアエンジニアとしてのワークアズライフRyo Shibayama
 
Try to use chromeless on AWS Lambda
Try to use chromeless on AWS LambdaTry to use chromeless on AWS Lambda
Try to use chromeless on AWS LambdaRyo Shibayama
 
CircleCI 2.0 でビルド時間を大幅に短縮する
CircleCI 2.0 でビルド時間を大幅に短縮するCircleCI 2.0 でビルド時間を大幅に短縮する
CircleCI 2.0 でビルド時間を大幅に短縮するRyo Shibayama
 
OSS Contribution through CircleCI 2.0
OSS Contribution through CircleCI 2.0OSS Contribution through CircleCI 2.0
OSS Contribution through CircleCI 2.0Ryo Shibayama
 
PHP-MLを使用して気軽に機械学習にトライしてみる
PHP-MLを使用して気軽に機械学習にトライしてみるPHP-MLを使用して気軽に機械学習にトライしてみる
PHP-MLを使用して気軽に機械学習にトライしてみるRyo Shibayama
 
ElasticBeanstalk で新規事業を爆速ローンチする
ElasticBeanstalk で新規事業を爆速ローンチするElasticBeanstalk で新規事業を爆速ローンチする
ElasticBeanstalk で新規事業を爆速ローンチするRyo Shibayama
 
Amazon inspector で自動セキュリティ診断
Amazon inspector で自動セキュリティ診断Amazon inspector で自動セキュリティ診断
Amazon inspector で自動セキュリティ診断Ryo Shibayama
 
WordPress on PHP7 on CentOS7 on Saraku-VPS
WordPress on PHP7 on CentOS7 on Saraku-VPSWordPress on PHP7 on CentOS7 on Saraku-VPS
WordPress on PHP7 on CentOS7 on Saraku-VPSRyo Shibayama
 
Security Advisories Checker on Travis/Circle CI
Security Advisories Checker on Travis/Circle CISecurity Advisories Checker on Travis/Circle CI
Security Advisories Checker on Travis/Circle CIRyo Shibayama
 
第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話
第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話
第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話Ryo Shibayama
 

More from Ryo Shibayama (10)

ソフトウェアエンジニアとしてのワークアズライフ
ソフトウェアエンジニアとしてのワークアズライフソフトウェアエンジニアとしてのワークアズライフ
ソフトウェアエンジニアとしてのワークアズライフ
 
Try to use chromeless on AWS Lambda
Try to use chromeless on AWS LambdaTry to use chromeless on AWS Lambda
Try to use chromeless on AWS Lambda
 
CircleCI 2.0 でビルド時間を大幅に短縮する
CircleCI 2.0 でビルド時間を大幅に短縮するCircleCI 2.0 でビルド時間を大幅に短縮する
CircleCI 2.0 でビルド時間を大幅に短縮する
 
OSS Contribution through CircleCI 2.0
OSS Contribution through CircleCI 2.0OSS Contribution through CircleCI 2.0
OSS Contribution through CircleCI 2.0
 
PHP-MLを使用して気軽に機械学習にトライしてみる
PHP-MLを使用して気軽に機械学習にトライしてみるPHP-MLを使用して気軽に機械学習にトライしてみる
PHP-MLを使用して気軽に機械学習にトライしてみる
 
ElasticBeanstalk で新規事業を爆速ローンチする
ElasticBeanstalk で新規事業を爆速ローンチするElasticBeanstalk で新規事業を爆速ローンチする
ElasticBeanstalk で新規事業を爆速ローンチする
 
Amazon inspector で自動セキュリティ診断
Amazon inspector で自動セキュリティ診断Amazon inspector で自動セキュリティ診断
Amazon inspector で自動セキュリティ診断
 
WordPress on PHP7 on CentOS7 on Saraku-VPS
WordPress on PHP7 on CentOS7 on Saraku-VPSWordPress on PHP7 on CentOS7 on Saraku-VPS
WordPress on PHP7 on CentOS7 on Saraku-VPS
 
Security Advisories Checker on Travis/Circle CI
Security Advisories Checker on Travis/Circle CISecurity Advisories Checker on Travis/Circle CI
Security Advisories Checker on Travis/Circle CI
 
第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話
第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話
第87回PHP勉強会 LT 知って得するかもしれないテキスト処理コマンドのお話
 

Carbon と Chronos から見る OSS 運営