Carbon と Chronos から見る OSS 運営

66 views

Published on

Carbon、Chronos の実装面からの紹介をしつつ、CakePHP が Carbon を捨てた理由からより良い OSS 運営の方法を探る。

Published in: Internet
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
66
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Carbon と Chronos から見る OSS 運営

  1. 1. CarbonとChronos から見るOSS 運営 CakePHP がCarbonを捨てるに至った経緯 @serimaPHP BLT #6
  2. 2. 日付/時刻操作ライブラリといえばCarbon?
  3. 3. Carbonとの出会いはLaravel Laravel4.2 を使い始めた時、Carbonを知りました めっちゃ便利!日付操作簡単!  DateTime クラスを継承している
  4. 4. 使用例 // 現在時刻 $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
  5. 5. とても便利だけど、ちょっと違和感
  6. 6. 違和感の正体はミュータブル リリース後最初に作られたissueがミュータブルについて しかし、今は対応しないということでクローズされる Ref: Stillmutable· Issue#2 · briannesbitt/Carbon
  7. 7. ミュータブルの何が良くないのか オブジェクトが変更可能= 複数の状態をとりうる 複数の状態を扱う必要 想定外のデータが飛んでくる可能性 バグの温床
  8. 8. バグを生みそうな例 Carbonを使っているとこんな場面はよくあるはず $now = Carbon::now(); $two_hours_later = $now->modify('+2 hours'); このとき、 $now も $two_hours_later も2時間後をさしている あとで、 $now を使うとき、もはやそれはnow じゃない
  9. 9. では、どのように回避するか  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'); どちらもバグが入り込みやすそうな記述
  10. 10. Chronos PHP 5.5.0 から実装されている DateTimeImmutable クラスを継 承している CakePHP にv3.2.0 から導入 CakePHP はこのタイミングでCarbonを捨てた
  11. 11. 使用例 // 現在時刻 $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 はイミュータブル(不変)
  12. 12. 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
  13. 13. 時系列  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を使うのを止めよ うという提案がされる
  14. 14. 分岐点となったissue https://github.com/cakephp/cakephp/issues/6509
  15. 15. 何が決め手だったのか Carbonコミュニティの不活発性 バグ修正の遅さ(クリティカルなバグ修正も遅かった) より良い実装の実現例がイメージできていた
  16. 16. 時系列  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 を使ったほうが良いのでは
  17. 17. いちデベロッパーとしての教訓 スター数が多くても、その時点で適切なライブラリとは限らない Laravelのような巨大なフレームワークが使用しているライブラリ だからといって鵜呑みにするのは良くない 違和感を大切にしたい
  18. 18. OSS 運営側としての教訓 コントリビュータは大切 いずれメンバーに昇格できるように設計思想や指針などをオープン にしていく必要がある 適切な権限委譲ができないと、いかにデファクトスタンダードを取 っていても、廃れていく可能性がある 先日、emacs も同じような問題に直面してるという記事も 結局、OSS も人間の集まりということを認識する

×