8/23追記: 本記事の続編を公開しました。
本記事で紹介するソースコードは githubのリポジトリ で公開しています。
えー、毎日のようにSOLID原則を考慮してプログラミングに勤しんでいるわけですが、Qiitaで バイブコーディングの記事 とか読ませていただくと、「えっ、もしかしておれ、生成AIの時代に、伝統芸能で自己マンしてるおっさん? インターネット普及直前にモールス符号の訓練してるみたいな・・・」的な考えが、ふと頭に浮かぶこともあるわけです。
おじさんが Copilot にこういうふうに言われると嬉しい例 笑:

生成AI・SOLID・・・SRP、OCP、LSP、ISP、DIP・・・、あれっ、ちょっと待てよ。もしかして生成AI時代ののバイブコーディングのキーもSOLIDにあるんじゃ?「とりあえずAIにコード書かせて人間が抽象化」じゃなくて、「人間が抽象レイヤを書いてAIに書かせる」のが正道???そしたら俺も「AIに高品質コード書かせるための希少なニンゲン」として生き残れる可能性あるんじゃない?
ということで、とりあえずOCPを意識した設計をした後、ある程度の品質のソースコードをAIに書かせることができるか、ということをミニマムな例で試してみることにしたのです。あくまで Hello, World (ハロワ) レベルで・・・。あくまで。そう、これで転職できちゃったりしたらまさに俺のハロワになるわけです。
おさらい
バイブコーディングとは
「バイブコーディング」という言葉は、Andrej Karpathy の雑談ツイートから火がついた……と言われることもあります(※正確な史実かどうかはさておき、生成AI界隈ではミーム的に語られることが多い)。
Karpathy が示したのは、AIと人間が交互にコードを書き足していく“振動(vibe)”のような開発スタイル。人間が骨格や抽象を設計し、AIが一気に肉付けする。次に人間がリファクタや設計の修正を行い、再びAIがコードを生成する、この往復を繰り返すプロセスらしいです。
従来の「ペアプロ」が人間同士での会話に基づくなら、バイブコーディングは人間の設計思考とAIの生成能力が交互に揺さぶり合うスタイル。言い換えれば「設計は人間、実装はAI」というタッグマッチが自然に実現する、生成AI時代ならではの開発様式です。
ちなみに、世間的には 「AIに任せとけば勝手にやってくれるんでしょ?もうプログラマいらないじゃん。いまどきSOLIDって何?」 みたいな理解をされやすいようです。(あくまで私の偏見ですw)その文脈でいうと、「人間が要件定義してAIが設計、実装、最後にニンゲンレビュー」 みたいな文脈で語られることが多いようです。(これも個人の感想です)
OCP: オープン/クローズドの原則 (Open/Closed Principle) とは
OCP(Open/Closed Principle)は、SOLID原則の「O」にあたるものです。
その内容を一言でまとめると、「ソフトウェアは拡張に対して開いており、修正に対して閉じていなければならない」 という指針になります。
つまり、新しい機能や振る舞いを追加したいときに、既存のコードを直接いじらず、拡張ポイント(抽象クラスやインタフェース、ポリモーフィズムなど)を介して機能を差し込むのが理想的だ、という考え方です。
この原則を守ることで、既存コードを壊さずに機能追加ができ、バグを混入させるリスクを減らせます。特に大規模システムや長期運用されるプロダクトでは、 「閉じたままの基盤」と「開かれた拡張部」 を明確に分離しておくことが保守性のカギとなります。
直感的かもしれない例えでいうと、「鉢植え」 ですね。(もちろん盆栽とかでも可)
「鉢」は上方向以外に対しては閉じている、つまりあくまで 「鉢」 として、手で持って運んだり窓際や庭に飾ったりすることが可能(=仕様が固まっている) で、コツコツと叩いて割れてないことを確認(=テスト)したりもできる わけですが、上方向には開いている、つまり 「何か」を入れて何かをする(=実装・拡張)ことができるわけです。典型的には土を入れて植物を育てるなど。
ちなみに Wikipediaの記事 でも触れられているとおり、OCP には歴史的に二つの解釈が並立しています。現代風にざっくり言うと:
-
メイヤーの開放/閉鎖原則(1988年)
既存コードを改変せずに継承や再定義で拡張するアプローチ。
例:フレームワークが 継承前提(Template Method / Hook)で「この基底クラスを継承して使ってね」と促すパターン。 -
マーチンの開放/閉鎖原則(1990年代)
でました「クリーンアーキテクチャ」の Uncle Bob(ボブおじ)。抽象(インターフェイス/抽象クラス)とポリモーフィズムで拡張し、既存コードは閉じたままにするアプローチ。
例:フレームワークに あるインターフェイスを実装したコンポーネント をDI/ファクトリ/引数で差し込むパターン。
※SOLID という頭字語は Michael Feathers による命名で、Uncle Bob はこの解釈の普及に大きく貢献しました。
(個人的な実務感)現代の DI / 構成管理とは マーチン(Bob)流の“抽象差し替え” が相性良く、可読性とテスト容易性を保ちやすい場面が多いです。一方で、小さなスコープでは Meyer流の継承 が最短でシンプルなこともあり、使い分けが良いかと思います。(継承OCPにはOOP的ロマンもありますねw)。
さっそく実験
構想
実験には筆者が最近慣れ親しんでいる C# を使うことにします。
純粋に「Hello, World!」レベルのプログラムだと、OCP を実感するのはなかなか難しい。せいぜいメッセージの差し替えや出力先の差し替えくらいになってしまいます。
そこで今回は、「西暦1年1月1日から始まる、いわゆるプロレプティック・グレゴリオ暦に基づいたシンプルな日付・時刻シミュレータ」 を作ってみることにします。西暦1年1月1日 00:00 から始まり、秒単位で時刻をインクリメントして、その結果を秒単位で文字列として出力できる――そんなイメージです。
準備
ここからは実際に C# プロジェクトを用意していきます。
コンソールアプリを新規作成し、最小限のクラス構造を準備していきます。
まずは抽象から。
CalendarUnitBase.cs として、各単位(年・月・...・秒)の「数字」を保持するクラスの共通基底クラスを作成します。このクラスには Start/End として、その単位の「開始時の数字」「終わりの数字」 を保持するプロパティを実装し、PrevUnit/NextUnit として 「一つ下位の単位のインスタンス」「一つ上の単位のインスタンス」への参照も保持できるようにします。可能な操作は1単位加算するIncrement() と、文字列を取得するAsString()、それから、「月によって月末の日付が変わる」ようなことに対応するためのSetEnd()です。下位の単位や上位の単位に対する操作は限定するために、IPrevUnit や INextUnitといったインタフェイスも定義して使います。
めんどくさいので あくまでOCPの効果をみたいため、コメントは書かずにおきます。
適当なエントリポイントを記述して、雑に動作確認。
実行例 (クリックで開くけど大したものじゃありません)
After 27,629 seconds: 40:29
After 54,282 seconds: 45:12
After 30,124 seconds: 07:17
After 117,886 seconds: 52:04
After 77,192 seconds: 18:37
After 68,049 seconds: 12:47
After 82,251 seconds: 03:39
After 15,246 seconds: 17:46
After 113,388 seconds: 47:35
After 95,902 seconds: 25:58
After 32,745 seconds: 31:44
After 67,594 seconds: 18:19
After 55,924 seconds: 50:24
After 29,268 seconds: 58:13
After 28,677 seconds: 56:11
After 89,873 seconds: 54:05
After 4,226 seconds: 04:32
After 149,660 seconds: 38:53
After 53,455 seconds: 29:49
After 44,619 seconds: 53:29
After 50,879 seconds: 01:29
After 117,502 seconds: 39:52
After 34,416 seconds: 13:29
After 22,638 seconds: 30:48
After 64,719 seconds: 29:28
After 21,725 seconds: 31:34
After 54,430 seconds: 38:45
After 44,829 seconds: 05:55
After 27,271 seconds: 40:27
After 71,218 seconds: 27:26
After 97,105 seconds: 25:52
After 16,064 seconds: 53:37
After 35,940 seconds: 52:38
After 40,058 seconds: 00:17
After 62,402 seconds: 20:20
After 33,801 seconds: 43:42
After 105,356 seconds: 59:39
After 18,028 seconds: 00:08
After 31,725 seconds: 48:54
After 67,917 seconds: 40:52
After 41,051 seconds: 05:04
After 84,986 seconds: 41:31
After 55,742 seconds: 10:34
After 61,461 seconds: 14:56
After 39,332 seconds: 10:29
After 54,508 seconds: 18:58
After 46,384 seconds: 12:03
After 70,269 seconds: 43:13
After 38,105 seconds: 18:19
After 100,076 seconds: 06:16
After 28,603 seconds: 03:00
After 28,768 seconds: 02:29
After 52,620 seconds: 39:30
After 41,313 seconds: 08:04
After 58,242 seconds: 18:47
After 53,689 seconds: 13:37
After 15,678 seconds: 34:56
After 123,895 seconds: 59:52
After 29,456 seconds: 10:49
After 48,509 seconds: 39:19
After 58,512 seconds: 54:32
After 37,467 seconds: 19:00
After 119,678 seconds: 33:39
After 17,948 seconds: 32:48
After 50,065 seconds: 27:14
After 17,463 seconds: 18:18
After 72,323 seconds: 23:42
After 38,724 seconds: 09:07
After 30,006 seconds: 29:14
After 61,747 seconds: 38:22
After 101,073 seconds: 42:56
After 108,612 seconds: 53:09
After 85,135 seconds: 32:05
After 41,642 seconds: 06:08
After 104,381 seconds: 05:50
After 87,916 seconds: 31:07
After 99,761 seconds: 13:49
After 29,288 seconds: 21:58
After 43,263 seconds: 23:02
After 113,183 seconds: 49:26
After 46,363 seconds: 42:10
After 71,198 seconds: 28:49
After 103,992 seconds: 22:02
After 67,791 seconds: 11:54
After 112,752 seconds: 31:07
After 64,293 seconds: 22:41
After 39,486 seconds: 20:48
After 53,711 seconds: 16:00
After 44,677 seconds: 40:38
After 94,802 seconds: 00:41
After 73,204 seconds: 20:46
After 97,723 seconds: 29:30
After 39,719 seconds: 31:30
After 41,891 seconds: 09:42
After 71,330 seconds: 58:33
After 43,782 seconds: 08:16
After 87,843 seconds: 32:20
After 19,750 seconds: 01:31
After 47,026 seconds: 05:18
After 47,794 seconds: 21:53
After 53,513 seconds: 13:47
After 70,967 seconds: 56:35
After 96,622 seconds: 46:58
After 43,708 seconds: 55:27
After 82,381 seconds: 48:29
After 79,366 seconds: 51:16
After 27,129 seconds: 23:26
After 97,530 seconds: 28:57
After 49,504 seconds: 14:02
After 120,951 seconds: 49:54
After 69,616 seconds: 10:11
After 40,836 seconds: 30:48
After 31,015 seconds: 07:44
After 41,818 seconds: 44:43
After 54,532 seconds: 53:36
After 32,552 seconds: 56:09
After 42,822 seconds: 49:52
After 40,334 seconds: 02:07
After 57,276 seconds: 56:44
After 19,071 seconds: 14:36
After 62,771 seconds: 40:48
After 41,168 seconds: 06:57
After 16,653 seconds: 44:31
After 29,803 seconds: 01:15
After 114,658 seconds: 52:14
After 38,681 seconds: 36:56
After 71,516 seconds: 28:53
After 80,757 seconds: 54:51
After 69,704 seconds: 16:36
After 50,984 seconds: 26:21
After 65,101 seconds: 31:23
After 49,032 seconds: 08:36
After 12,379 seconds: 34:56
After 52,843 seconds: 15:40
After 31,750 seconds: 04:51
After 40,170 seconds: 14:22
After 48,206 seconds: 37:49
After 80,816 seconds: 04:46
After 8,368 seconds: 24:15
After 31,759 seconds: 13:35
After 22,568 seconds: 29:44
After 53,622 seconds: 23:27
After 12,550 seconds: 52:38
After 19,367 seconds: 15:26
After 80,131 seconds: 30:58
After 5,831 seconds: 08:10
After 15,895 seconds: 33:06
After 37,027 seconds: 50:14
After 22,700 seconds: 08:35
After 90,780 seconds: 21:36
After 101,288 seconds: 29:45
After 20,130 seconds: 05:16
After 132,794 seconds: 58:31
After 79,695 seconds: 06:47
After 16,873 seconds: 48:01
After 110,126 seconds: 23:28
After 27,614 seconds: 03:43
After 31,713 seconds: 52:17
After 23,699 seconds: 27:17
After 90,430 seconds: 34:28
After 98,925 seconds: 03:14
After 83,711 seconds: 18:26
After 49,733 seconds: 07:20
After 35,295 seconds: 55:36
After 39,235 seconds: 49:32
After 73,645 seconds: 16:58
After 55,310 seconds: 38:49
After 81,797 seconds: 22:07
After 95,001 seconds: 45:29
After 87,101 seconds: 57:11
After 109,392 seconds: 20:24
After 63,350 seconds: 56:15
After 73,492 seconds: 21:08
After 42,580 seconds: 10:49
After 36,446 seconds: 18:16
After 23,250 seconds: 45:47
After 16,453 seconds: 20:01
After 43,027 seconds: 17:09
After 103,605 seconds: 03:55
After 54,541 seconds: 12:57
After 138,849 seconds: 47:07
After 62,575 seconds: 10:03
After 106,474 seconds: 44:38
After 66,408 seconds: 11:27
After 78,220 seconds: 55:08
After 69,533 seconds: 14:02
After 40,804 seconds: 34:07
After 49,906 seconds: 25:54
After 54,636 seconds: 36:31
After 40,026 seconds: 43:38
After 54,421 seconds: 50:40
After 58,985 seconds: 13:46
After 49,385 seconds: 56:52
After 68,078 seconds: 51:31
After 67,205 seconds: 31:37
After 55,207 seconds: 51:45
After 82,602 seconds: 48:28
After 80,925 seconds: 17:14
After 89,603 seconds: 10:38
After 35,706 seconds: 05:45
After 33,475 seconds: 23:41
After 41,281 seconds: 51:43
After 75,358 seconds: 47:42
After 140,916 seconds: 56:19
After 74,199 seconds: 32:59
After 56,467 seconds: 14:07
After 12,195 seconds: 37:23
After 27,044 seconds: 08:08
After 119,455 seconds: 19:04
After 11,185 seconds: 25:30
After 53,163 seconds: 11:34
After 67,144 seconds: 50:39
After 59,393 seconds: 20:33
After 71,503 seconds: 12:17
After 17,213 seconds: 59:11
After 63,177 seconds: 32:09
After 47,614 seconds: 45:44
After 113,313 seconds: 14:18
After 76,793 seconds: 34:12
After 80,050 seconds: 48:23
After 125,109 seconds: 33:33
After 40,369 seconds: 46:23
After 55,531 seconds: 11:55
After 30,273 seconds: 36:29
After 101,564 seconds: 49:14
After 25,601 seconds: 55:56
After 60,258 seconds: 40:15
After 61,309 seconds: 42:05
After 52,958 seconds: 24:44
After 54,785 seconds: 37:50
After 79,876 seconds: 49:07
After 41,909 seconds: 27:37
After 25,281 seconds: 28:59
After 57,616 seconds: 29:16
After 64,426 seconds: 23:03
After 67,548 seconds: 08:52
After 22,773 seconds: 28:26
After 24,862 seconds: 22:49
After 80,819 seconds: 49:49
After 89,535 seconds: 42:05
After 18,379 seconds: 48:25
After 48,042 seconds: 09:08
After 72,173 seconds: 12:02
After 78,531 seconds: 00:54
After 84,268 seconds: 25:23
After 168,107 seconds: 07:11
After 89,653 seconds: 01:25
After 105,797 seconds: 24:43
After 19,259 seconds: 45:43
After 2,507 seconds: 27:31
After 55,918 seconds: 59:30
After 135,322 seconds: 34:53
After 39,354 seconds: 30:48
After 4,435 seconds: 44:44
After 41,354 seconds: 13:59
After 41,235 seconds: 41:15
After 97,190 seconds: 41:06
After 161,398 seconds: 31:05
After 83,433 seconds: 41:39
After 28,962 seconds: 44:22
After 89,440 seconds: 35:03
After 26,505 seconds: 56:49
After 56,195 seconds: 33:25
After 79,569 seconds: 39:35
After 50,865 seconds: 47:21
After 48,259 seconds: 11:41
After 60,281 seconds: 56:23
After 55,480 seconds: 21:04
After 31,669 seconds: 08:54
After 50,107 seconds: 04:02
After 34,996 seconds: 47:19
After 64,675 seconds: 45:15
After 28,147 seconds: 34:23
After 67,491 seconds: 19:15
After 65,432 seconds: 29:48
After 43,416 seconds: 33:25
After 89,042 seconds: 17:28
After 35,659 seconds: 11:48
After 82,414 seconds: 05:23
After 37,482 seconds: 30:06
After 58,202 seconds: 40:09
After 63,883 seconds: 24:53
After 31,127 seconds: 03:41
After 24,328 seconds: 49:10
After 71,361 seconds: 38:32
After 98,164 seconds: 54:37
After 42,718 seconds: 46:36
After 102,260 seconds: 10:57
After 90,772 seconds: 23:50
After 56,548 seconds: 06:19
After 67,197 seconds: 46:17
After 100,033 seconds: 33:31
After 68,657 seconds: 37:49
After 39,446 seconds: 35:16
After 19,550 seconds: 01:07
After 61,830 seconds: 11:38
After 13,546 seconds: 57:25
After 60,512 seconds: 45:58
After 28,838 seconds: 46:37
After 91,110 seconds: 05:08
After 111,196 seconds: 58:25
After 51,313 seconds: 13:39
After 30,672 seconds: 44:52
After 77,554 seconds: 17:27
After 27,851 seconds: 01:39
After 50,881 seconds: 09:41
After 81,507 seconds: 48:09
After 43,421 seconds: 51:51
After 75,795 seconds: 55:07
After 81,148 seconds: 27:36
After 54,284 seconds: 32:21
After 77,326 seconds: 01:08
After 13,753 seconds: 50:22
After 56,079 seconds: 25:02
After 53,206 seconds: 11:49
After 106,952 seconds: 54:22
After 18,461 seconds: 02:04
After 54,180 seconds: 05:05
After 29,110 seconds: 10:16
After 43,835 seconds: 20:52
After 67,424 seconds: 04:37
After 22,758 seconds: 23:56
After 75,356 seconds: 19:53
After 25,033 seconds: 17:07
After 64,203 seconds: 07:11
After 34,318 seconds: 39:10
After 16,631 seconds: 16:22
After 59,060 seconds: 40:43
After 25,978 seconds: 53:42
After 9,685 seconds: 35:08
After 100,367 seconds: 27:56
After 60,016 seconds: 08:13
After 34,003 seconds: 34:57
After 72,646 seconds: 45:44
After 79,679 seconds: 53:44
After 35,085 seconds: 38:30
After 47,072 seconds: 43:03
After 32,863 seconds: 50:47
After 44,240 seconds: 08:08
After 116,370 seconds: 27:39
After 44,614 seconds: 51:14
After 125,138 seconds: 36:53
After 50,589 seconds: 40:03
After 62,379 seconds: 59:43
After 26,282 seconds: 17:46
After 76,597 seconds: 34:24
After 64,205 seconds: 24:30
After 33,941 seconds: 50:12
After 75,090 seconds: 41:43
After 7,313 seconds: 43:37
After 31,416 seconds: 27:14
After 94,241 seconds: 37:56
After 117,172 seconds: 10:49
After 59,383 seconds: 40:33
After 101,445 seconds: 51:19
After 34,797 seconds: 31:17
After 79,239 seconds: 31:57
After 24,992 seconds: 28:30
After 38,377 seconds: 08:08
After 52,411 seconds: 41:40
After 24,723 seconds: 33:44
After 45,532 seconds: 12:37
After 93,959 seconds: 18:37
After 78,676 seconds: 09:54
After 89,227 seconds: 57:02
After 52,802 seconds: 37:05
After 3,597 seconds: 37:03
After 30,389 seconds: 03:33
After 65,585 seconds: 16:39
After 25,494 seconds: 21:34
After 15,752 seconds: 44:07
After 30,075 seconds: 05:23
After 86,316 seconds: 04:00
After 62,256 seconds: 21:37
After 57,786 seconds: 24:44
After 56,390 seconds: 04:35
After 120,352 seconds: 30:28
After 42,021 seconds: 10:50
After 59,724 seconds: 46:15
After 30,973 seconds: 22:29
After 32,878 seconds: 30:28
After 76,471 seconds: 45:00
After 45,439 seconds: 22:20
After 89,248 seconds: 09:49
After 6,350 seconds: 55:40
After 71,759 seconds: 51:40
After 94,077 seconds: 59:38
After 50,038 seconds: 53:37
After 90,893 seconds: 08:31
After 17,036 seconds: 52:28
After 27,358 seconds: 28:27
After 69,710 seconds: 50:18
After 65,751 seconds: 06:10
After 42,131 seconds: 48:22
After 145,019 seconds: 05:22
After 94,011 seconds: 12:14
After 63,206 seconds: 45:41
After 26,490 seconds: 07:12
After 91,347 seconds: 29:40
After 58,391 seconds: 42:52
After 16,564 seconds: 18:57
After 37,387 seconds: 42:05
After 89,885 seconds: 40:11
After 30,982 seconds: 16:34
After 27,458 seconds: 54:13
After 71,676 seconds: 48:50
After 30,899 seconds: 23:50
After 66,768 seconds: 56:39
After 34,334 seconds: 28:54
After 79,033 seconds: 26:08
After 116,461 seconds: 47:10
After 69,277 seconds: 01:48
After 35,659 seconds: 56:08
After 22,249 seconds: 06:58
After 65,559 seconds: 19:38
After 34,201 seconds: 49:40
After 17,954 seconds: 48:55
After 61,540 seconds: 54:36
After 73,530 seconds: 20:07
After 60,308 seconds: 05:16
After 102,766 seconds: 38:03
After 55,423 seconds: 01:47
After 58,955 seconds: 24:23
After 10,331 seconds: 16:35
After 48,751 seconds: 49:07
After 87,969 seconds: 15:17
After 65,852 seconds: 32:50
After 76,986 seconds: 55:57
After 63,119 seconds: 27:57
After 63,852 seconds: 12:10
After 23,004 seconds: 35:35
After 68,211 seconds: 32:27
After 36,324 seconds: 37:52
After 67,909 seconds: 29:42
After 104,500 seconds: 31:23
After 71,534 seconds: 23:38
After 52,271 seconds: 54:50
After 35,792 seconds: 51:23
After 76,490 seconds: 06:14
After 56,759 seconds: 52:14
After 92,852 seconds: 39:47
After 97,878 seconds: 51:06
After 72,496 seconds: 59:23
After 136,542 seconds: 55:06
After 10,144 seconds: 44:11
After 74,271 seconds: 22:03
After 62,504 seconds: 43:48
After 43,672 seconds: 51:41
After 57,097 seconds: 43:19
After 55,616 seconds: 10:16
After 13,080 seconds: 48:17
After 110,392 seconds: 28:10
After 47,836 seconds: 45:27
After 62,413 seconds: 05:41
After 69,890 seconds: 30:32
After 8,296 seconds: 48:49
After 29,900 seconds: 07:10
After 68,559 seconds: 09:50
After 79,375 seconds: 12:46
After 18,841 seconds: 26:48
After 96,737 seconds: 19:06
After 51,177 seconds: 32:04
After 69,699 seconds: 53:44
After 41,902 seconds: 32:07
After 11,521 seconds: 44:09
After 23,054 seconds: 08:24
After 40,284 seconds: 19:49
After 71,481 seconds: 11:11
After 52,747 seconds: 50:19
After 55,325 seconds: 12:25
After 128,027 seconds: 46:13
After 37,322 seconds: 08:16
After 98,161 seconds: 24:18
After 81,956 seconds: 10:15
After 26,714 seconds: 35:30
After 69,620 seconds: 55:51
After 91,959 seconds: 28:31
After 42,511 seconds: 17:03
After 69,917 seconds: 42:21
After 39,584 seconds: 42:06
After 89,477 seconds: 33:24
After 55,333 seconds: 55:38
After 18,848 seconds: 09:47
After 69,311 seconds: 24:59
After 31,544 seconds: 10:44
After 92,605 seconds: 54:10
After 77,354 seconds: 23:25
After 50,633 seconds: 27:19
After 60,628 seconds: 17:48
After 67,316 seconds: 59:45
After 61,592 seconds: 06:18
After 41,014 seconds: 29:53
After 68,084 seconds: 24:38
After 34,901 seconds: 06:20
After 21,270 seconds: 00:51
After 23,102 seconds: 25:54
After 19,175 seconds: 45:30
After 87,451 seconds: 03:02
After 46,903 seconds: 04:46
After 55,520 seconds: 30:07
After 9,635 seconds: 10:43
After 91,044 seconds: 28:08
After 31,185 seconds: 07:54
After 109,183 seconds: 27:38
After 88,474 seconds: 02:13
After 71,227 seconds: 49:21
After 74,662 seconds: 33:44
After 37,825 seconds: 04:10
After 34,584 seconds: 40:35
After 46,803 seconds: 40:39
After 120,464 seconds: 08:24
After 51,908 seconds: 33:33
After 21,929 seconds: 39:03
After 38,050 seconds: 13:14
After 62,773 seconds: 39:28
After 32,511 seconds: 41:20
After 73,446 seconds: 05:27
After 52,089 seconds: 33:37
After 27,044 seconds: 04:22
After 62,822 seconds: 31:25
After 36,239 seconds: 35:25
After 37,183 seconds: 55:09
After 11,158 seconds: 01:08
After 63,545 seconds: 40:14
After 99,468 seconds: 18:03
After 106,665 seconds: 55:49
After 47,657 seconds: 10:07
After 74,348 seconds: 49:16
After 34,875 seconds: 30:32
After 54,205 seconds: 33:58
After 70,601 seconds: 10:40
After 18,062 seconds: 11:43
After 92,194 seconds: 48:18
After 58,367 seconds: 01:06
After 74,123 seconds: 36:30
After 88,359 seconds: 09:10
After 64,711 seconds: 07:42
After 87,868 seconds: 32:11
After 72,117 seconds: 34:09
After 46,921 seconds: 36:11
After 81,046 seconds: 06:58
After 97,062 seconds: 04:41
After 88,552 seconds: 40:34
After 82,724 seconds: 39:19
After 55,245 seconds: 00:05
After 37,807 seconds: 30:13
After 82,463 seconds: 24:37
After 57,625 seconds: 25:03
After 96,104 seconds: 06:48
After 100,283 seconds: 58:12
After 50,160 seconds: 54:13
After 33,772 seconds: 17:06
After 72,569 seconds: 26:36
After 36,919 seconds: 41:56
After 48,434 seconds: 09:11
After 73,482 seconds: 33:54
After 24,155 seconds: 16:30
After 43,423 seconds: 20:14
After 61,103 seconds: 18:38
After 94,692 seconds: 36:51
After 20,146 seconds: 12:38
After 40,058 seconds: 20:17
After 51,168 seconds: 33:06
After 75,070 seconds: 24:17
After 79,512 seconds: 29:30
After 159,969 seconds: 55:40
After 75,212 seconds: 49:13
After 66,315 seconds: 14:29
After 70,156 seconds: 43:46
After 19,986 seconds: 16:53
After 65,021 seconds: 20:35
After 22,476 seconds: 35:12
After 21,301 seconds: 30:14
After 26,479 seconds: 51:34
After 17,513 seconds: 43:28
After 92,586 seconds: 26:35
After 57,912 seconds: 31:48
After 22,918 seconds: 53:47
After 97,761 seconds: 03:09
After 91,297 seconds: 24:47
After 17,670 seconds: 19:18
After 46,422 seconds: 13:01
After 112,030 seconds: 20:12
After 34,520 seconds: 55:33
After 95,313 seconds: 24:07
After 72,860 seconds: 38:28
After 7,872 seconds: 49:41
After 91,603 seconds: 16:25
After 84,884 seconds: 51:10
After 20,423 seconds: 31:34
After 79,648 seconds: 39:03
After 28,868 seconds: 40:12
After 33,940 seconds: 05:53
After 15,094 seconds: 17:28
After 51,645 seconds: 38:14
After 49,200 seconds: 18:15
After 55,137 seconds: 37:13
After 81,068 seconds: 08:22
After 40,077 seconds: 16:20
After 68,641 seconds: 20:22
After 20,974 seconds: 09:57
After 71,148 seconds: 55:46
After 71,372 seconds: 45:19
After 105,852 seconds: 09:32
After 112,643 seconds: 26:56
After 31,133 seconds: 05:50
After 42,818 seconds: 59:29
After 103,235 seconds: 40:05
After 103,365 seconds: 22:51
After 61,793 seconds: 32:45
After 56,264 seconds: 10:30
After 25,167 seconds: 09:58
After 110,107 seconds: 45:06
After 43,335 seconds: 47:22
After 76,278 seconds: 58:41
After 48,089 seconds: 20:11
After 32,774 seconds: 26:26
After 56,465 seconds: 07:32
After 12,471 seconds: 35:24
After 79,727 seconds: 44:12
After 77,693 seconds: 19:06
After 125,000 seconds: 02:27
After 136,883 seconds: 03:51
After 111,696 seconds: 05:28
After 59,779 seconds: 41:48
After 81,732 seconds: 24:01
After 134,943 seconds: 53:05
After 69,986 seconds: 19:32
After 6,702 seconds: 11:15
After 56,295 seconds: 49:31
After 66,809 seconds: 23:01
After 77,669 seconds: 57:31
After 68,448 seconds: 58:20
After 71,077 seconds: 42:58
After 31,131 seconds: 21:50
After 54,835 seconds: 35:46
After 65,580 seconds: 48:47
After 60,826 seconds: 42:34
After 62,137 seconds: 58:12
After 35,790 seconds: 54:43
After 66,290 seconds: 19:34
After 96,766 seconds: 12:21
After 69,625 seconds: 32:47
After 17,684 seconds: 27:32
After 51,744 seconds: 49:57
After 68,642 seconds: 54:00
After 22,357 seconds: 06:38
After 15,922 seconds: 32:01
After 77,216 seconds: 58:58
After 70,095 seconds: 27:14
After 22,643 seconds: 44:38
After 23,414 seconds: 14:53
After 72,138 seconds: 17:12
After 54,792 seconds: 30:25
After 52,550 seconds: 06:16
After 24,113 seconds: 48:10
After 76,053 seconds: 55:44
After 24,043 seconds: 36:28
After 29,632 seconds: 50:21
After 68,997 seconds: 00:19
After 58,494 seconds: 15:14
After 13,864 seconds: 06:19
After 88,218 seconds: 36:38
After 56,017 seconds: 10:16
After 56,117 seconds: 45:34
After 39,366 seconds: 41:41
After 75,880 seconds: 46:22
After 81,859 seconds: 30:42
After 39,502 seconds: 29:05
After 14,190 seconds: 25:36
After 30,656 seconds: 56:33
After 92,087 seconds: 31:21
After 72,075 seconds: 32:37
After 36,346 seconds: 38:24
After 16,750 seconds: 17:35
After 31,738 seconds: 06:34
After 106,027 seconds: 33:42
After 95,641 seconds: 07:44
After 97,457 seconds: 12:02
After 79,129 seconds: 10:52
After 62,712 seconds: 36:05
After 11,540 seconds: 48:26
After 122,166 seconds: 44:33
After 40,430 seconds: 58:24
After 33,176 seconds: 11:21
After 74,100 seconds: 46:22
After 65,366 seconds: 55:49
After 152,953 seconds: 25:03
After 54,667 seconds: 36:11
After 30,486 seconds: 04:18
After 57,171 seconds: 57:10
After 70,144 seconds: 26:15
After 31,727 seconds: 15:03
After 111,430 seconds: 12:14
After 17,074 seconds: 56:49
After 15,374 seconds: 13:04
After 69,895 seconds: 38:00
After 38,799 seconds: 24:40
After 43,385 seconds: 27:46
After 94,298 seconds: 39:25
After 51,397 seconds: 56:03
After 81,271 seconds: 30:35
After 85,918 seconds: 22:34
After 47,156 seconds: 28:31
After 46,014 seconds: 15:26
After 39,729 seconds: 17:36
After 52,819 seconds: 57:56
After 16,266 seconds: 29:03
After 69,885 seconds: 53:49
After 10,716 seconds: 52:26
After 66,171 seconds: 15:18
After 108,160 seconds: 17:59
After 30,964 seconds: 54:04
After 28,227 seconds: 44:32
After 8,847 seconds: 12:00
After 47,514 seconds: 23:55
After 87,020 seconds: 34:16
After 100,137 seconds: 23:14
After 156,436 seconds: 50:31
After 38,768 seconds: 36:40
After 68,975 seconds: 46:16
After 62,610 seconds: 09:47
After 77,766 seconds: 45:54
After 48,543 seconds: 14:58
After 122,565 seconds: 17:44
After 56,933 seconds: 06:38
After 35,994 seconds: 06:33
After 57,150 seconds: 59:04
After 66,388 seconds: 25:33
After 107,195 seconds: 12:09
After 50,139 seconds: 07:49
After 33,509 seconds: 26:19
After 97,463 seconds: 30:43
After 2,198 seconds: 07:22
After 43,459 seconds: 11:42
After 123,748 seconds: 34:11
After 18,745 seconds: 46:37
After 109,407 seconds: 10:05
After 75,712 seconds: 11:58
After 77,854 seconds: 49:33
After 42,214 seconds: 33:08
After 91,663 seconds: 00:52
After 109,737 seconds: 29:50
After 65,478 seconds: 41:09
After 61,850 seconds: 52:00
After 104,263 seconds: 49:44
After 54,476 seconds: 57:41
After 63,037 seconds: 28:19
After 41,931 seconds: 07:11
After 111,289 seconds: 02:01
After 61,129 seconds: 00:51
After 118,151 seconds: 50:03
After 24,997 seconds: 46:41
After 17,249 seconds: 34:11
After 81,785 seconds: 17:17
After 27,169 seconds: 50:07
After 55,891 seconds: 21:39
After 82,516 seconds: 16:56
After 63,885 seconds: 01:42
After 141,934 seconds: 27:17
After 29,620 seconds: 40:58
After 35,140 seconds: 26:39
After 77,418 seconds: 56:58
After 27,771 seconds: 39:50
After 168,540 seconds: 28:51
After 91,708 seconds: 57:20
After 66,095 seconds: 18:56
After 49,635 seconds: 06:12
After 44,733 seconds: 31:46
After 77,857 seconds: 09:24
After 102,203 seconds: 32:48
After 81,040 seconds: 03:29
After 27,476 seconds: 41:26
After 39,981 seconds: 47:48
After 3,235 seconds: 41:44
After 136,540 seconds: 37:25
After 44,759 seconds: 03:25
After 26,761 seconds: 29:27
After 62,562 seconds: 52:10
After 89,247 seconds: 39:38
After 73,492 seconds: 04:31
After 89,567 seconds: 57:19
After 46,191 seconds: 47:11
After 107,491 seconds: 38:43
After 25,109 seconds: 37:13
After 20,540 seconds: 19:34
After 42,652 seconds: 10:27
After 19,297 seconds: 32:05
After 164,086 seconds: 06:52
After 31,350 seconds: 49:23
After 10,569 seconds: 45:33
After 41,732 seconds: 21:06
After 24,108 seconds: 02:55
After 146,681 seconds: 47:37
After 68,816 seconds: 54:34
After 160,520 seconds: 29:55
After 31,659 seconds: 17:35
After 52,357 seconds: 50:13
After 41,481 seconds: 21:35
After 47,465 seconds: 32:41
After 87,490 seconds: 50:52
After 59,381 seconds: 20:34
After 64,114 seconds: 09:09
After 69,585 seconds: 28:55
After 30,960 seconds: 04:56
After 13,309 seconds: 46:46
After 97,264 seconds: 47:51
After 92,487 seconds: 29:19
After 112,972 seconds: 52:12
After 40,607 seconds: 09:00
After 44,457 seconds: 29:58
After 44,925 seconds: 58:44
After 63,274 seconds: 33:19
After 24,762 seconds: 26:02
After 95,004 seconds: 49:27
After 3,704 seconds: 51:12
After 57,794 seconds: 54:27
After 90,689 seconds: 05:57
After 24,886 seconds: 00:44
After 65,862 seconds: 18:27
After 84,807 seconds: 51:55
After 57,776 seconds: 54:52
After 73,281 seconds: 16:14
After 40,831 seconds: 36:46
After 67,984 seconds: 29:51
After 92,639 seconds: 13:51
After 80,778 seconds: 40:10
After 109,629 seconds: 07:20
After 102,467 seconds: 35:08
After 46,131 seconds: 24:00
After 29,823 seconds: 41:04
After 65,529 seconds: 53:14
After 102,416 seconds: 20:11
After 25,455 seconds: 24:27
After 51,794 seconds: 47:42
After 26,453 seconds: 08:36
After 35,204 seconds: 55:21
After 71,957 seconds: 54:39
After 61,808 seconds: 04:48
After 44,662 seconds: 29:11
After 91,161 seconds: 48:33
After 28,242 seconds: 39:16
After 40,220 seconds: 49:37
After 36,896 seconds: 04:34
After 44,105 seconds: 19:40
After 39,416 seconds: 16:37
After 71,988 seconds: 16:26
After 62,792 seconds: 42:59
After 12,286 seconds: 07:46
After 38,364 seconds: 47:11
After 52,105 seconds: 15:37
After 23,859 seconds: 53:17
After 52,923 seconds: 35:21
After 51,660 seconds: 56:22
After 130,717 seconds: 15:00
After 32,005 seconds: 08:26
After 38,336 seconds: 47:23
After 42,281 seconds: 32:05
After 102,166 seconds: 54:52
After 43,440 seconds: 58:53
After 27,257 seconds: 33:11
After 50,763 seconds: 39:15
After 59,157 seconds: 05:13
After 651 seconds: 16:05
After 60,830 seconds: 09:56
After 91,247 seconds: 30:44
After 93,750 seconds: 33:15
After 120,474 seconds: 01:10
After 96,973 seconds: 57:24
After 25,650 seconds: 04:55
After 45,217 seconds: 38:33
After 49,466 seconds: 23:00
After 89,514 seconds: 14:55
After 15,241 seconds: 28:57
After 75,530 seconds: 27:48
After 67,782 seconds: 17:31
After 33,939 seconds: 43:11
After 69,318 seconds: 58:30
After 101,323 seconds: 07:14
After 8,739 seconds: 32:54
After 84,648 seconds: 03:43
After 55,278 seconds: 25:02
After 47,511 seconds: 36:54
After 86,729 seconds: 42:24
After 12,428 seconds: 09:33
After 46,191 seconds: 59:25
After 84,149 seconds: 21:55
After 57,458 seconds: 19:34
After 26,476 seconds: 40:51
After 46,594 seconds: 37:26
After 64,545 seconds: 33:12
After 30,521 seconds: 01:54
After 123,287 seconds: 16:42
After 27,679 seconds: 58:02
After 73,616 seconds: 24:59
After 35,218 seconds: 11:58
After 39,181 seconds: 05:00
After 63,996 seconds: 51:37
After 39,140 seconds: 43:58
After 99,536 seconds: 22:55
After 34,280 seconds: 54:16
After 64,374 seconds: 47:11
After 61,375 seconds: 50:07
After 43,012 seconds: 47:00
After 70,897 seconds: 28:38
After 104,988 seconds: 38:27
After 70,908 seconds: 20:16
After 70,703 seconds: 58:40
After 74,382 seconds: 38:23
After 96,130 seconds: 20:34
After 50,733 seconds: 26:08
After 71,408 seconds: 16:17
After 40,015 seconds: 23:13
After 70,063 seconds: 50:57
After 110,542 seconds: 33:20
After 8,619 seconds: 57:00
After 58,990 seconds: 20:11
After 81,085 seconds: 51:37
After 49,720 seconds: 40:18
After 160,509 seconds: 15:28
After 31,688 seconds: 03:37
After 91,717 seconds: 32:15
After 58,476 seconds: 46:52
After 56,719 seconds: 32:12
After 98,701 seconds: 57:14
After 16,707 seconds: 35:42
After 34,000 seconds: 02:23
After 80,311 seconds: 20:55
After 24,496 seconds: 09:12
After 132,005 seconds: 49:18
After 34,181 seconds: 19:00
After 65,909 seconds: 37:30
After 72,356 seconds: 43:27
After 84,464 seconds: 11:12
After 54,195 seconds: 14:28
After 14,441 seconds: 15:10
After 52,796 seconds: 55:07
After 112,866 seconds: 16:14
After 123,217 seconds: 29:52
After 6,338 seconds: 15:31
After 71,890 seconds: 13:42
After 27,105 seconds: 45:28
After 15,635 seconds: 06:04
After 22,294 seconds: 17:39
After 79,065 seconds: 15:25
After 26,114 seconds: 30:40
After 35,302 seconds: 19:03
After 36,869 seconds: 33:33
After 2,736 seconds: 19:10
After 65,155 seconds: 25:06
After 142,937 seconds: 07:24
After 4,335 seconds: 19:40
After 80,129 seconds: 35:10
After 49,571 seconds: 21:22
After 23,616 seconds: 54:59
After 48,438 seconds: 22:18
After 126,625 seconds: 32:44
After 82,230 seconds: 23:15
After 53,479 seconds: 14:35
After 71,024 seconds: 58:20
After 79,463 seconds: 02:44
After 91,028 seconds: 19:53
After 80,301 seconds: 38:15
After 35,307 seconds: 26:43
After 32,547 seconds: 29:11
After 63,858 seconds: 13:30
After 15,299 seconds: 28:30
After 48,596 seconds: 58:27
After 38,700 seconds: 43:28
After 18,072 seconds: 44:41
After 50,401 seconds: 44:43
After 16,019 seconds: 11:43
After 28,058 seconds: 59:22
After 57,442 seconds: 56:45
After 99,423 seconds: 33:49
After 31,559 seconds: 19:49
After 88,652 seconds: 57:22
After 46,358 seconds: 50:01
After 35,056 seconds: 34:18
After 8,142 seconds: 50:01
After 62,156 seconds: 05:58
After 47,764 seconds: 22:03
After 34,594 seconds: 58:38
After 55,965 seconds: 31:24
After 78,313 seconds: 16:38
After 31,688 seconds: 04:47
After 62,269 seconds: 22:37
After 115,901 seconds: 34:19
After 37,699 seconds: 02:39
After 39,187 seconds: 55:47
After 17,292 seconds: 44:00
After 81,960 seconds: 30:01
After 143,956 seconds: 29:18
After 64,475 seconds: 23:54
After 91,206 seconds: 44:01
After 80,721 seconds: 09:23
After 22,299 seconds: 21:03
After 92,271 seconds: 58:55
After 40,577 seconds: 15:13
After 70,334 seconds: 47:28
Final time: 47:29
生成君
ここでいよいよ 「わが社(零細個人事業主)のジュニアプログラマーGPT君」 に登場してもらいます。
ChatGPT(GPT-5)
できるし、もう「西暦(YYYY-MM-DD HH
ss)」まで拡張しておきました。
作業内容ざっくり👇
-
既存の
SecondsUnit(秒)→MinuteUnit(分)のチェーンを起点に、上位の単位を追加して時刻→日付→年へと連結しました。- 追加:
HourUnit(時, 0–23) /DayUnit(日, 1–28/29/30/31) /MonthUnit(月, 1–12) /YearUnit(年, 0001–9999)
- 追加:
-
オーバーフロー時のキャスケード(繰り上がり)を全レイヤで実装。
例: 秒が 59→0 のとき分をIncrement()、分が 59→0 のとき時を…という具合に年まで。 -
MonthUnitがDayUnitの上限を動的に更新する仕組みを実装(IPrevUnit.SetEnd(daysInMonth)を利用)。
うるう年判定はグレゴリオ暦ルール(400/100/4)で、2月は 29/28 日に自動切替。 -
文字列表現はユニットごとにオーバーライドして連結。
-
YearUnit→"YYYY" -
MonthUnit→Next + "-MM" -
DayUnit→Next + "-DD" -
HourUnit→Next + " HH" -
MinuteUnit/SecondsUnit→Next + ":mm"/Next + ":ss"
-
-
既存の
MinuteUnitを修正し、秒の繰り上がりだけでなく「分→時」もちゃんと繰り上がるようにしています。
使い方
今までどおり new SecondsUnit() を作って Increment() を回すだけで、
AsString() は "YYYY-MM-DD HH:mm:ss" を返します(初期値は 0001-01-01 00:00:00)。
変更ファイル(追加)
-
0200_CalendarUnits/0230_HourUnit.cs -
0200_CalendarUnits/0240_DayUnit.cs -
0200_CalendarUnits/0250_MonthUnit.cs -
0200_CalendarUnits/0260_YearUnit.cs
変更ファイル(更新)
-
0200_CalendarUnits/0220_MinutesUnit.cs-
繰り上がり時に
NextUnit?.Increment()を呼ぶよう修正 -
NextUnit = new HourUnit(this);を設定
-
必要なら「和暦(令和/平成…)↔ 西暦」相互変換や、タイムゾーン/UTC 切替、DateOnly / TimeOnly 的な分離などもこの構造のまま足せます。やる?😎
実行例 (クリックで開くけど大したものじゃありません)
After 30,705 seconds: 0001-01-01 08:31:45
After 90,223 seconds: 0001-01-02 09:35:29
After 22,043 seconds: 0001-01-02 15:42:53
After 122,437 seconds: 0001-01-04 01:43:31
After 36,559 seconds: 0001-01-04 11:52:51
After 16,920 seconds: 0001-01-04 16:34:52
After 55,884 seconds: 0001-01-05 08:06:17
After 58,703 seconds: 0001-01-06 00:24:41
After 21,066 seconds: 0001-01-06 06:15:48
After 62,375 seconds: 0001-01-06 23:35:24
After 30,623 seconds: 0001-01-07 08:05:48
After 99,864 seconds: 0001-01-08 11:50:13
After 62,526 seconds: 0001-01-09 05:12:20
After 57,483 seconds: 0001-01-09 21:10:24
After 81,169 seconds: 0001-01-10 19:43:14
After 51,348 seconds: 0001-01-11 09:59:03
After 64,847 seconds: 0001-01-12 03:59:51
After 77,198 seconds: 0001-01-13 01:26:30
After 19,236 seconds: 0001-01-13 06:47:07
After 46,386 seconds: 0001-01-13 19:40:14
After 48,518 seconds: 0001-01-14 09:08:53
After 63,635 seconds: 0001-01-15 02:49:29
After 37,300 seconds: 0001-01-15 13:11:10
After 33,040 seconds: 0001-01-15 22:21:51
After 66,643 seconds: 0001-01-16 16:52:35
After 59,443 seconds: 0001-01-17 09:23:19
After 68,150 seconds: 0001-01-18 04:19:10
After 94,388 seconds: 0001-01-19 06:32:19
After 39,832 seconds: 0001-01-19 17:36:12
After 47,282 seconds: 0001-01-20 06:44:15
After 29,625 seconds: 0001-01-20 14:58:01
After 45,250 seconds: 0001-01-21 03:32:12
After 108,780 seconds: 0001-01-22 09:45:13
After 60,651 seconds: 0001-01-23 02:36:05
After 12,208 seconds: 0001-01-23 05:59:34
After 21,412 seconds: 0001-01-23 11:56:27
After 170,126 seconds: 0001-01-25 11:11:54
After 114,499 seconds: 0001-01-26 19:00:14
After 71,989 seconds: 0001-01-27 15:00:04
After 70,505 seconds: 0001-01-28 10:35:10
After 48,648 seconds: 0001-01-29 00:05:59
After 25,741 seconds: 0001-01-29 07:15:01
After 90,390 seconds: 0001-01-30 08:21:32
After 48,773 seconds: 0001-01-30 21:54:26
After 43,941 seconds: 0001-01-31 10:06:48
After 83,547 seconds: 0001-02-01 09:19:16
After 34,453 seconds: 0001-02-01 18:53:30
After 81,188 seconds: 0001-02-02 17:26:39
After 69,175 seconds: 0001-02-03 12:39:35
After 9,156 seconds: 0001-02-03 15:12:12
After 38,746 seconds: 0001-02-04 01:57:59
After 114,456 seconds: 0001-02-05 09:45:36
After 16,887 seconds: 0001-02-05 14:27:04
After 104,955 seconds: 0001-02-06 19:36:20
After 47,769 seconds: 0001-02-07 08:52:30
After 64,293 seconds: 0001-02-08 02:44:04
After 48,778 seconds: 0001-02-08 16:17:03
After 37,384 seconds: 0001-02-09 02:40:08
After 12,324 seconds: 0001-02-09 06:05:33
After 61,906 seconds: 0001-02-09 23:17:20
After 69,691 seconds: 0001-02-10 18:38:52
After 41,827 seconds: 0001-02-11 06:16:00
After 60,053 seconds: 0001-02-11 22:56:54
After 61,279 seconds: 0001-02-12 15:58:14
After 66,921 seconds: 0001-02-13 10:33:36
After 37,565 seconds: 0001-02-13 20:59:42
After 17,044 seconds: 0001-02-14 01:43:47
After 60,453 seconds: 0001-02-14 18:31:21
After 27,394 seconds: 0001-02-15 02:07:56
After 67,950 seconds: 0001-02-15 21:00:27
After 106,454 seconds: 0001-02-17 02:34:42
After 36,100 seconds: 0001-02-17 12:36:23
After 75,627 seconds: 0001-02-18 09:36:51
After 55,786 seconds: 0001-02-19 01:06:38
After 98,623 seconds: 0001-02-20 04:30:22
After 124,336 seconds: 0001-02-21 15:02:39
After 97,550 seconds: 0001-02-22 18:08:30
After 79,384 seconds: 0001-02-23 16:11:35
After 52,098 seconds: 0001-02-24 06:39:54
After 86,178 seconds: 0001-02-25 06:36:13
After 42,304 seconds: 0001-02-25 18:21:18
After 103,131 seconds: 0001-02-26 23:00:10
After 6,826 seconds: 0001-02-27 00:53:57
After 72,668 seconds: 0001-02-27 21:05:06
After 52,194 seconds: 0001-02-28 11:35:01
After 113,273 seconds: 0001-03-01 19:02:55
After 62,052 seconds: 0001-03-02 12:17:08
After 44,863 seconds: 0001-03-03 00:44:52
After 59,369 seconds: 0001-03-03 17:14:22
After 60,688 seconds: 0001-03-04 10:05:51
After 66,920 seconds: 0001-03-05 04:41:12
After 81,990 seconds: 0001-03-06 03:27:43
After 60,781 seconds: 0001-03-06 20:20:45
After 47,934 seconds: 0001-03-07 09:39:40
After 29,458 seconds: 0001-03-07 17:50:39
After 82,767 seconds: 0001-03-08 16:50:07
After 71,664 seconds: 0001-03-09 12:44:32
After 18,648 seconds: 0001-03-09 17:55:21
After 6,785 seconds: 0001-03-09 19:48:27
After 67,980 seconds: 0001-03-10 14:41:28
After 44,671 seconds: 0001-03-11 03:06:00
After 20,413 seconds: 0001-03-11 08:46:14
After 80,942 seconds: 0001-03-12 07:15:17
After 64,175 seconds: 0001-03-13 01:04:53
After 18,376 seconds: 0001-03-13 06:11:10
After 54,182 seconds: 0001-03-13 21:14:13
After 16,147 seconds: 0001-03-14 01:43:21
After 57,862 seconds: 0001-03-14 17:47:44
After 49,773 seconds: 0001-03-15 07:37:18
After 50,794 seconds: 0001-03-15 21:43:53
After 81,787 seconds: 0001-03-16 20:27:01
After 55,835 seconds: 0001-03-17 11:57:37
After 179,632 seconds: 0001-03-19 13:51:30
After 21,331 seconds: 0001-03-19 19:47:02
After 14,143 seconds: 0001-03-19 23:42:46
After 88,026 seconds: 0001-03-21 00:09:53
After 66,611 seconds: 0001-03-21 18:40:05
After 38,358 seconds: 0001-03-22 05:19:24
After 73,897 seconds: 0001-03-23 01:51:02
After 61,862 seconds: 0001-03-23 19:02:05
After 43,517 seconds: 0001-03-24 07:07:23
After 15,656 seconds: 0001-03-24 11:28:20
After 165,716 seconds: 0001-03-26 09:30:17
After 50,379 seconds: 0001-03-26 23:29:57
After 52,916 seconds: 0001-03-27 14:11:54
After 60,451 seconds: 0001-03-28 06:59:26
After 34,231 seconds: 0001-03-28 16:29:58
After 107,783 seconds: 0001-03-29 22:26:22
After 70,636 seconds: 0001-03-30 18:03:39
After 57,000 seconds: 0001-03-31 09:53:40
After 145,566 seconds: 0001-04-02 02:19:47
After 23,721 seconds: 0001-04-02 08:55:09
After 62,171 seconds: 0001-04-03 02:11:21
After 29,936 seconds: 0001-04-03 10:30:18
After 27,964 seconds: 0001-04-03 18:16:23
After 57,984 seconds: 0001-04-04 10:22:48
After 49,885 seconds: 0001-04-05 00:14:14
After 89,851 seconds: 0001-04-06 01:11:46
After 72,299 seconds: 0001-04-06 21:16:46
After 31,421 seconds: 0001-04-07 06:00:28
After 37,799 seconds: 0001-04-07 16:30:28
After 75,093 seconds: 0001-04-08 13:22:02
After 44,319 seconds: 0001-04-09 01:40:42
After 87,361 seconds: 0001-04-10 01:56:44
After 34,490 seconds: 0001-04-10 11:31:35
After 62,291 seconds: 0001-04-11 04:49:47
After 114,499 seconds: 0001-04-12 12:38:07
After 57,664 seconds: 0001-04-13 04:39:12
After 151,683 seconds: 0001-04-14 22:47:16
After 63,028 seconds: 0001-04-15 16:17:45
After 24,919 seconds: 0001-04-15 23:13:05
After 72,227 seconds: 0001-04-16 19:16:53
After 19,746 seconds: 0001-04-17 00:46:00
After 74,597 seconds: 0001-04-17 21:29:18
After 46,520 seconds: 0001-04-18 10:24:39
After 94,765 seconds: 0001-04-19 12:44:05
After 29,788 seconds: 0001-04-19 21:00:34
After 35,713 seconds: 0001-04-20 06:55:48
After 15,868 seconds: 0001-04-20 11:20:17
After 46,112 seconds: 0001-04-21 00:08:50
After 72,462 seconds: 0001-04-21 20:16:33
After 40,184 seconds: 0001-04-22 07:26:18
After 95,738 seconds: 0001-04-23 10:01:57
After 47,655 seconds: 0001-04-23 23:16:13
After 56,371 seconds: 0001-04-24 14:55:45
After 68,578 seconds: 0001-04-25 09:58:44
After 71,568 seconds: 0001-04-26 05:51:33
After 30,839 seconds: 0001-04-26 14:25:33
After 136,404 seconds: 0001-04-28 04:18:58
After 36,817 seconds: 0001-04-28 14:32:36
After 33,063 seconds: 0001-04-28 23:43:40
After 31,528 seconds: 0001-04-29 08:29:09
After 34,183 seconds: 0001-04-29 17:58:53
After 47,948 seconds: 0001-04-30 07:18:02
After 81,262 seconds: 0001-05-01 05:52:25
After 112,070 seconds: 0001-05-02 13:00:16
After 82,591 seconds: 0001-05-03 11:56:48
After 67,415 seconds: 0001-05-04 06:40:24
After 36,322 seconds: 0001-05-04 16:45:47
After 30,194 seconds: 0001-05-05 01:09:02
After 66,490 seconds: 0001-05-05 19:37:13
After 66,246 seconds: 0001-05-06 14:01:20
After 61,082 seconds: 0001-05-07 06:59:23
After 96,601 seconds: 0001-05-08 09:49:25
After 67,453 seconds: 0001-05-09 04:33:39
After 31,083 seconds: 0001-05-09 13:11:43
After 84,477 seconds: 0001-05-10 12:39:41
After 60,413 seconds: 0001-05-11 05:26:35
After 53,680 seconds: 0001-05-11 20:21:16
After 72,753 seconds: 0001-05-12 16:33:50
After 104,154 seconds: 0001-05-13 21:29:45
After 138,125 seconds: 0001-05-15 11:51:51
After 22,221 seconds: 0001-05-15 18:02:13
After 114,506 seconds: 0001-05-17 01:50:40
After 59,578 seconds: 0001-05-17 18:23:39
After 28,752 seconds: 0001-05-18 02:22:52
After 47,437 seconds: 0001-05-18 15:33:30
After 149,645 seconds: 0001-05-20 09:07:36
After 83,274 seconds: 0001-05-21 08:15:31
After 93,567 seconds: 0001-05-22 10:14:59
After 62,750 seconds: 0001-05-23 03:40:50
After 21,227 seconds: 0001-05-23 09:34:38
After 20,093 seconds: 0001-05-23 15:09:32
After 45,362 seconds: 0001-05-24 03:45:35
After 86,059 seconds: 0001-05-25 03:39:55
After 70,965 seconds: 0001-05-25 23:22:41
After 61,112 seconds: 0001-05-26 16:21:14
After 57,022 seconds: 0001-05-27 08:11:37
After 26,427 seconds: 0001-05-27 15:32:05
After 46,779 seconds: 0001-05-28 04:31:45
After 67,570 seconds: 0001-05-28 23:17:56
After 29,886 seconds: 0001-05-29 07:36:03
After 20,419 seconds: 0001-05-29 13:16:23
After 25,556 seconds: 0001-05-29 20:22:20
After 8,655 seconds: 0001-05-29 22:46:36
After 28,269 seconds: 0001-05-30 06:37:46
After 39,845 seconds: 0001-05-30 17:41:52
After 25,169 seconds: 0001-05-31 00:41:22
After 81,592 seconds: 0001-05-31 23:21:15
After 37,075 seconds: 0001-06-01 09:39:11
After 59,527 seconds: 0001-06-02 02:11:19
After 28,978 seconds: 0001-06-02 10:14:18
After 36,739 seconds: 0001-06-02 20:26:38
After 33,644 seconds: 0001-06-03 05:47:23
After 15,686 seconds: 0001-06-03 10:08:50
After 48,210 seconds: 0001-06-03 23:32:21
After 35,856 seconds: 0001-06-04 09:29:58
After 11,390 seconds: 0001-06-04 12:39:49
After 28,130 seconds: 0001-06-04 20:28:40
After 7,251 seconds: 0001-06-04 22:29:32
After 126,422 seconds: 0001-06-06 09:36:35
After 38,698 seconds: 0001-06-06 20:21:34
After 25,717 seconds: 0001-06-07 03:30:12
After 15,952 seconds: 0001-06-07 07:56:05
After 17,220 seconds: 0001-06-07 12:43:06
After 68,254 seconds: 0001-06-08 07:40:41
After 27,127 seconds: 0001-06-08 15:12:49
After 117,362 seconds: 0001-06-09 23:48:52
After 87,257 seconds: 0001-06-11 00:03:10
After 92,655 seconds: 0001-06-12 01:47:26
After 99,393 seconds: 0001-06-13 05:24:00
After 132,938 seconds: 0001-06-14 18:19:39
After 57,821 seconds: 0001-06-15 10:23:21
After 52,709 seconds: 0001-06-16 01:01:51
After 135,680 seconds: 0001-06-17 14:43:12
After 44,028 seconds: 0001-06-18 02:57:01
After 23,653 seconds: 0001-06-18 09:31:15
After 82,936 seconds: 0001-06-19 08:33:32
After 76,960 seconds: 0001-06-20 05:56:13
After 46,728 seconds: 0001-06-20 18:55:02
After 119,663 seconds: 0001-06-22 04:09:26
After 112,541 seconds: 0001-06-23 11:25:08
After 34,452 seconds: 0001-06-23 20:59:21
After 78,310 seconds: 0001-06-24 18:44:32
After 45,831 seconds: 0001-06-25 07:28:24
After 62,395 seconds: 0001-06-26 00:48:20
After 85,743 seconds: 0001-06-27 00:37:24
After 74,498 seconds: 0001-06-27 21:19:03
After 79,798 seconds: 0001-06-28 19:29:02
After 28,888 seconds: 0001-06-29 03:30:31
After 59,934 seconds: 0001-06-29 20:09:26
After 48,345 seconds: 0001-06-30 09:35:12
After 136,562 seconds: 0001-07-01 23:31:15
After 30,849 seconds: 0001-07-02 08:05:25
After 40,039 seconds: 0001-07-02 19:12:45
After 18,030 seconds: 0001-07-03 00:13:16
After 101,030 seconds: 0001-07-04 04:17:07
After 37,625 seconds: 0001-07-04 14:44:13
After 76,958 seconds: 0001-07-05 12:06:52
After 14,397 seconds: 0001-07-05 16:06:50
After 32,689 seconds: 0001-07-06 01:11:40
After 52,574 seconds: 0001-07-06 15:47:55
After 94,294 seconds: 0001-07-07 17:59:30
After 58,879 seconds: 0001-07-08 10:20:50
After 50,604 seconds: 0001-07-09 00:24:15
After 48,211 seconds: 0001-07-09 13:47:47
After 13,250 seconds: 0001-07-09 17:28:38
After 42,544 seconds: 0001-07-10 05:17:43
After 30,550 seconds: 0001-07-10 13:46:54
After 43,524 seconds: 0001-07-11 01:52:19
After 28,249 seconds: 0001-07-11 09:43:09
After 43,293 seconds: 0001-07-11 21:44:43
After 29,003 seconds: 0001-07-12 05:48:07
After 82,353 seconds: 0001-07-13 04:40:41
After 35,234 seconds: 0001-07-13 14:27:56
After 27,211 seconds: 0001-07-13 22:01:28
After 40,318 seconds: 0001-07-14 09:13:27
After 16,677 seconds: 0001-07-14 13:51:25
After 31,934 seconds: 0001-07-14 22:43:40
After 3,730 seconds: 0001-07-14 23:45:51
After 43,008 seconds: 0001-07-15 11:42:40
After 63,654 seconds: 0001-07-16 05:23:35
After 63,486 seconds: 0001-07-16 23:01:42
After 38,759 seconds: 0001-07-17 09:47:42
After 50,206 seconds: 0001-07-17 23:44:29
After 57,652 seconds: 0001-07-18 15:45:22
After 43,650 seconds: 0001-07-19 03:52:53
After 58,811 seconds: 0001-07-19 20:13:05
After 70,726 seconds: 0001-07-20 15:51:52
After 112,972 seconds: 0001-07-21 23:14:45
After 97,178 seconds: 0001-07-23 02:14:24
After 144,939 seconds: 0001-07-24 18:30:04
After 45,790 seconds: 0001-07-25 07:13:15
After 75,418 seconds: 0001-07-26 04:10:14
After 85,905 seconds: 0001-07-27 04:02:00
After 35,851 seconds: 0001-07-27 13:59:32
After 39,563 seconds: 0001-07-28 00:58:56
After 13,950 seconds: 0001-07-28 04:51:27
After 17,522 seconds: 0001-07-28 09:43:30
After 30,320 seconds: 0001-07-28 18:08:51
After 97,365 seconds: 0001-07-29 21:11:37
After 93,329 seconds: 0001-07-30 23:07:07
After 94,219 seconds: 0001-08-01 01:17:27
After 19,725 seconds: 0001-08-01 06:46:13
After 63,501 seconds: 0001-08-02 00:24:35
After 48,484 seconds: 0001-08-02 13:52:40
After 92,281 seconds: 0001-08-03 15:30:42
After 70,504 seconds: 0001-08-04 11:05:47
After 57,132 seconds: 0001-08-05 02:58:00
After 37,876 seconds: 0001-08-05 13:29:17
After 83,976 seconds: 0001-08-06 12:48:54
After 29,769 seconds: 0001-08-06 21:05:04
After 46,483 seconds: 0001-08-07 09:59:48
After 62,078 seconds: 0001-08-08 03:14:27
After 62,192 seconds: 0001-08-08 20:31:00
After 93,199 seconds: 0001-08-09 22:24:20
After 48,597 seconds: 0001-08-10 11:54:18
After 55,047 seconds: 0001-08-11 03:11:46
After 73,789 seconds: 0001-08-11 23:41:36
After 35,191 seconds: 0001-08-12 09:28:08
After 33,628 seconds: 0001-08-12 18:48:37
After 41,692 seconds: 0001-08-13 06:23:30
After 28,409 seconds: 0001-08-13 14:17:00
After 72,612 seconds: 0001-08-14 10:27:13
After 36,347 seconds: 0001-08-14 20:33:01
After 61,938 seconds: 0001-08-15 13:45:20
After 63,355 seconds: 0001-08-16 07:21:16
After 54,824 seconds: 0001-08-16 22:35:01
After 106,379 seconds: 0001-08-18 04:08:01
After 30,176 seconds: 0001-08-18 12:30:58
After 84,083 seconds: 0001-08-19 11:52:22
After 105,790 seconds: 0001-08-20 17:15:33
After 18,629 seconds: 0001-08-20 22:26:03
After 102,922 seconds: 0001-08-22 03:01:26
After 49,343 seconds: 0001-08-22 16:43:50
After 38,658 seconds: 0001-08-23 03:28:09
After 101,926 seconds: 0001-08-24 07:46:56
After 12,488 seconds: 0001-08-24 11:15:05
After 79,303 seconds: 0001-08-25 09:16:49
After 53,670 seconds: 0001-08-26 00:11:20
After 126,549 seconds: 0001-08-27 11:20:30
After 23,893 seconds: 0001-08-27 17:58:44
After 34,345 seconds: 0001-08-28 03:31:10
After 55,417 seconds: 0001-08-28 18:54:48
After 17,767 seconds: 0001-08-28 23:50:56
After 137,497 seconds: 0001-08-30 14:02:34
After 91,820 seconds: 0001-08-31 15:32:55
After 50,963 seconds: 0001-09-01 05:42:19
After 26,392 seconds: 0001-09-01 13:02:12
After 83,516 seconds: 0001-09-02 12:14:09
After 31,629 seconds: 0001-09-02 21:01:19
After 39,595 seconds: 0001-09-03 08:01:15
After 38,676 seconds: 0001-09-03 18:45:52
After 50,454 seconds: 0001-09-04 08:46:47
After 84,561 seconds: 0001-09-05 08:16:09
After 35,585 seconds: 0001-09-05 18:09:15
After 66,719 seconds: 0001-09-06 12:41:15
After 20,778 seconds: 0001-09-06 18:27:34
After 44,908 seconds: 0001-09-07 06:56:03
After 40,462 seconds: 0001-09-07 18:10:26
After 118,958 seconds: 0001-09-09 03:13:05
After 56,049 seconds: 0001-09-09 18:47:15
After 32,208 seconds: 0001-09-10 03:44:04
After 117,990 seconds: 0001-09-11 12:30:35
After 16,891 seconds: 0001-09-11 17:12:07
After 34,560 seconds: 0001-09-12 02:48:08
After 110,821 seconds: 0001-09-13 09:35:10
After 59,435 seconds: 0001-09-14 02:05:46
After 13,721 seconds: 0001-09-14 05:54:28
After 38,593 seconds: 0001-09-14 16:37:42
After 46,852 seconds: 0001-09-15 05:38:35
After 98,083 seconds: 0001-09-16 08:53:19
After 101,490 seconds: 0001-09-17 13:04:50
After 66,499 seconds: 0001-09-18 07:33:10
After 70,811 seconds: 0001-09-19 03:13:22
After 112,022 seconds: 0001-09-20 10:20:25
After 5,136 seconds: 0001-09-20 11:46:02
After 26,003 seconds: 0001-09-20 18:59:26
After 16,316 seconds: 0001-09-20 23:31:23
After 24,637 seconds: 0001-09-21 06:22:01
After 48,878 seconds: 0001-09-21 19:56:40
After 58,539 seconds: 0001-09-22 12:12:20
After 94,715 seconds: 0001-09-23 14:30:56
After 31,651 seconds: 0001-09-23 23:18:28
After 41,602 seconds: 0001-09-24 10:51:51
After 32,543 seconds: 0001-09-24 19:54:15
After 56,432 seconds: 0001-09-25 11:34:48
After 21,195 seconds: 0001-09-25 17:28:04
After 40,212 seconds: 0001-09-26 04:38:17
After 54,636 seconds: 0001-09-26 19:48:54
After 75,264 seconds: 0001-09-27 16:43:19
After 112,140 seconds: 0001-09-28 23:52:20
After 16,464 seconds: 0001-09-29 04:26:45
After 91,243 seconds: 0001-09-30 05:47:29
After 42,031 seconds: 0001-09-30 17:28:01
After 38,492 seconds: 0001-10-01 04:09:34
After 38,732 seconds: 0001-10-01 14:55:07
After 26,525 seconds: 0001-10-01 22:17:13
After 77,389 seconds: 0001-10-02 19:47:03
After 85,333 seconds: 0001-10-03 19:29:17
After 19,724 seconds: 0001-10-04 00:58:02
After 14,336 seconds: 0001-10-04 04:56:59
After 73,601 seconds: 0001-10-05 01:23:41
After 51,136 seconds: 0001-10-05 15:35:58
After 76,823 seconds: 0001-10-06 12:56:22
After 79,474 seconds: 0001-10-07 11:00:57
After 77,453 seconds: 0001-10-08 08:31:51
After 33,146 seconds: 0001-10-08 17:44:18
After 69,083 seconds: 0001-10-09 12:55:42
After 68,132 seconds: 0001-10-10 07:51:15
After 14,649 seconds: 0001-10-10 11:55:25
After 5,128 seconds: 0001-10-10 13:20:54
After 67,665 seconds: 0001-10-11 08:08:40
After 55,236 seconds: 0001-10-11 23:29:17
After 28,529 seconds: 0001-10-12 07:24:47
After 54,499 seconds: 0001-10-12 22:33:07
After 35,683 seconds: 0001-10-13 08:27:51
After 54,391 seconds: 0001-10-13 23:34:23
After 22,107 seconds: 0001-10-14 05:42:51
After 121,630 seconds: 0001-10-15 15:30:02
After 94,154 seconds: 0001-10-16 17:39:17
After 88,883 seconds: 0001-10-17 18:20:41
After 44,747 seconds: 0001-10-18 06:46:29
After 11,481 seconds: 0001-10-18 09:57:51
After 48,314 seconds: 0001-10-18 23:23:06
After 30,460 seconds: 0001-10-19 07:50:47
After 23,813 seconds: 0001-10-19 14:27:41
After 92,560 seconds: 0001-10-20 16:10:22
After 78,455 seconds: 0001-10-21 13:57:58
After 67,694 seconds: 0001-10-22 08:46:13
After 52,701 seconds: 0001-10-22 23:24:35
After 32,196 seconds: 0001-10-23 08:21:12
After 47,699 seconds: 0001-10-23 21:36:12
After 21,048 seconds: 0001-10-24 03:27:01
After 65,435 seconds: 0001-10-24 21:37:37
After 45,793 seconds: 0001-10-25 10:20:51
After 80,678 seconds: 0001-10-26 08:45:30
After 77,054 seconds: 0001-10-27 06:09:45
After 85,528 seconds: 0001-10-28 05:55:14
After 5,494 seconds: 0001-10-28 07:26:49
After 23,726 seconds: 0001-10-28 14:02:16
After 117,383 seconds: 0001-10-29 22:38:40
After 57,056 seconds: 0001-10-30 14:29:37
After 99,301 seconds: 0001-10-31 18:04:39
After 91,013 seconds: 0001-11-01 19:21:33
After 88,122 seconds: 0001-11-02 19:50:16
After 67,208 seconds: 0001-11-03 14:30:25
After 19,109 seconds: 0001-11-03 19:48:55
After 20,950 seconds: 0001-11-04 01:38:06
After 79,695 seconds: 0001-11-04 23:46:22
After 13,883 seconds: 0001-11-05 03:37:46
After 85,277 seconds: 0001-11-06 03:19:04
After 4,592 seconds: 0001-11-06 04:35:37
After 70,217 seconds: 0001-11-07 00:05:55
After 40,821 seconds: 0001-11-07 11:26:17
After 79,652 seconds: 0001-11-08 09:33:50
After 101,663 seconds: 0001-11-09 13:48:14
After 30,412 seconds: 0001-11-09 22:15:07
After 110,745 seconds: 0001-11-11 05:00:53
After 18,076 seconds: 0001-11-11 10:02:10
After 72,966 seconds: 0001-11-12 06:18:17
After 73,445 seconds: 0001-11-13 02:42:23
After 27,051 seconds: 0001-11-13 10:13:15
After 29,548 seconds: 0001-11-13 18:25:44
After 66,711 seconds: 0001-11-14 12:57:36
After 49,250 seconds: 0001-11-15 02:38:27
After 56,262 seconds: 0001-11-15 18:16:10
After 65,136 seconds: 0001-11-16 12:21:47
After 125,252 seconds: 0001-11-17 23:09:20
After 27,772 seconds: 0001-11-18 06:52:13
After 96,002 seconds: 0001-11-19 09:32:16
After 48,870 seconds: 0001-11-19 23:06:47
After 39,967 seconds: 0001-11-20 10:12:55
After 67,586 seconds: 0001-11-21 04:59:22
After 44,304 seconds: 0001-11-21 17:17:47
After 48,358 seconds: 0001-11-22 06:43:46
After 97,435 seconds: 0001-11-23 09:47:42
After 51,954 seconds: 0001-11-24 00:13:37
After 45,328 seconds: 0001-11-24 12:49:06
After 62,246 seconds: 0001-11-25 06:06:33
After 10,667 seconds: 0001-11-25 09:04:21
After 90,387 seconds: 0001-11-26 10:10:49
After 56,762 seconds: 0001-11-27 01:56:52
After 27,245 seconds: 0001-11-27 09:30:58
After 103,579 seconds: 0001-11-28 14:17:18
After 22,108 seconds: 0001-11-28 20:25:47
After 25,026 seconds: 0001-11-29 03:22:54
After 37,878 seconds: 0001-11-29 13:54:13
After 54,752 seconds: 0001-11-30 05:06:46
After 105,544 seconds: 0001-12-01 10:25:51
After 36,461 seconds: 0001-12-01 20:33:33
After 124,104 seconds: 0001-12-03 07:01:58
After 68,468 seconds: 0001-12-04 02:03:07
After 44,559 seconds: 0001-12-04 14:25:47
After 54,872 seconds: 0001-12-05 05:40:20
After 40,842 seconds: 0001-12-05 17:01:03
After 69,793 seconds: 0001-12-06 12:24:17
After 33,858 seconds: 0001-12-06 21:48:36
After 55,024 seconds: 0001-12-07 13:05:41
After 117,455 seconds: 0001-12-08 21:43:17
After 10,120 seconds: 0001-12-09 00:31:58
After 20,534 seconds: 0001-12-09 06:14:13
After 97,732 seconds: 0001-12-10 09:23:06
After 72,569 seconds: 0001-12-11 05:32:36
After 72,137 seconds: 0001-12-12 01:34:54
After 25,466 seconds: 0001-12-12 08:39:21
After 103,539 seconds: 0001-12-13 13:25:01
After 41,186 seconds: 0001-12-14 00:51:28
After 8,294 seconds: 0001-12-14 03:09:43
After 9,379 seconds: 0001-12-14 05:46:03
After 78,041 seconds: 0001-12-15 03:26:45
After 38,459 seconds: 0001-12-15 14:07:45
After 111,979 seconds: 0001-12-16 21:14:05
After 108,207 seconds: 0001-12-18 03:17:33
After 72,633 seconds: 0001-12-18 23:28:07
After 97,951 seconds: 0001-12-20 02:40:39
After 103,155 seconds: 0001-12-21 07:19:55
After 36,363 seconds: 0001-12-21 17:25:59
After 62,053 seconds: 0001-12-22 10:40:13
After 48,079 seconds: 0001-12-23 00:01:33
After 99,487 seconds: 0001-12-24 03:39:41
After 63,428 seconds: 0001-12-24 21:16:50
After 49,241 seconds: 0001-12-25 10:57:32
After 20,200 seconds: 0001-12-25 16:34:13
After 19,013 seconds: 0001-12-25 21:51:07
After 19,718 seconds: 0001-12-26 03:19:46
After 43,396 seconds: 0001-12-26 15:23:03
After 45,736 seconds: 0001-12-27 04:05:20
After 45,190 seconds: 0001-12-27 16:38:31
After 48,431 seconds: 0001-12-28 06:05:43
After 35,721 seconds: 0001-12-28 16:01:05
After 58,175 seconds: 0001-12-29 08:10:41
After 81,957 seconds: 0001-12-30 06:56:39
After 40,438 seconds: 0001-12-30 18:10:38
After 85,238 seconds: 0001-12-31 17:51:17
After 45,746 seconds: 0002-01-01 06:33:44
After 7,399 seconds: 0002-01-01 08:37:04
After 36,140 seconds: 0002-01-01 18:39:25
After 24,503 seconds: 0002-01-02 01:27:49
After 45,681 seconds: 0002-01-02 14:09:11
After 38,459 seconds: 0002-01-03 00:50:11
After 32,421 seconds: 0002-01-03 09:50:33
After 34,325 seconds: 0002-01-03 19:22:39
After 48,658 seconds: 0002-01-04 08:53:38
After 30,949 seconds: 0002-01-04 17:29:28
After 16,929 seconds: 0002-01-04 22:11:38
After 42,258 seconds: 0002-01-05 09:55:57
After 123,793 seconds: 0002-01-06 20:19:11
After 79,151 seconds: 0002-01-07 18:18:23
After 94,945 seconds: 0002-01-08 20:40:49
After 42,973 seconds: 0002-01-09 08:37:03
After 15,971 seconds: 0002-01-09 13:03:15
After 35,669 seconds: 0002-01-09 22:57:45
After 60,842 seconds: 0002-01-10 15:51:48
After 144,022 seconds: 0002-01-12 07:52:11
After 65,293 seconds: 0002-01-13 02:00:25
After 11,794 seconds: 0002-01-13 05:17:00
After 15,699 seconds: 0002-01-13 09:38:40
After 73,040 seconds: 0002-01-14 05:56:01
After 32,338 seconds: 0002-01-14 14:55:00
After 70,659 seconds: 0002-01-15 10:32:40
After 56,337 seconds: 0002-01-16 02:11:38
After 65,003 seconds: 0002-01-16 20:15:02
After 50,878 seconds: 0002-01-17 10:23:01
After 73,058 seconds: 0002-01-18 06:40:40
After 47,843 seconds: 0002-01-18 19:58:04
After 53,297 seconds: 0002-01-19 10:46:22
After 54,502 seconds: 0002-01-20 01:54:45
After 7,680 seconds: 0002-01-20 04:02:46
After 55,906 seconds: 0002-01-20 19:34:33
After 82,375 seconds: 0002-01-21 18:27:29
After 31,382 seconds: 0002-01-22 03:10:32
After 83,046 seconds: 0002-01-23 02:14:39
After 100,785 seconds: 0002-01-24 06:14:25
After 69,474 seconds: 0002-01-25 01:32:20
After 58,488 seconds: 0002-01-25 17:47:09
After 56,011 seconds: 0002-01-26 09:20:41
After 28,142 seconds: 0002-01-26 17:09:44
After 62,148 seconds: 0002-01-27 10:25:33
After 50,024 seconds: 0002-01-28 00:19:18
After 60,907 seconds: 0002-01-28 17:14:26
After 65,243 seconds: 0002-01-29 11:21:50
After 37,444 seconds: 0002-01-29 21:45:55
After 55,452 seconds: 0002-01-30 13:10:08
After 121,130 seconds: 0002-01-31 22:48:59
After 68,492 seconds: 0002-02-01 17:50:32
After 102,613 seconds: 0002-02-02 22:20:46
After 66,740 seconds: 0002-02-03 16:53:07
After 97,810 seconds: 0002-02-04 20:03:18
After 42,749 seconds: 0002-02-05 07:55:48
After 63,793 seconds: 0002-02-06 01:39:02
After 57,711 seconds: 0002-02-06 17:40:54
After 39,670 seconds: 0002-02-07 04:42:05
After 80,876 seconds: 0002-02-08 03:10:02
After 73,643 seconds: 0002-02-08 23:37:26
After 24,686 seconds: 0002-02-09 06:28:53
After 46,243 seconds: 0002-02-09 19:19:37
After 29,440 seconds: 0002-02-10 03:30:18
After 49,741 seconds: 0002-02-10 17:19:20
After 71,764 seconds: 0002-02-11 13:15:25
After 76,003 seconds: 0002-02-12 10:22:09
After 11,856 seconds: 0002-02-12 13:39:46
After 9,550 seconds: 0002-02-12 16:18:57
After 10,566 seconds: 0002-02-12 19:15:04
After 107,494 seconds: 0002-02-14 01:06:39
After 48,513 seconds: 0002-02-14 14:35:13
After 106,425 seconds: 0002-02-15 20:08:59
After 134,016 seconds: 0002-02-17 09:22:36
After 72,721 seconds: 0002-02-18 05:34:38
After 60,865 seconds: 0002-02-18 22:29:04
After 88,716 seconds: 0002-02-19 23:07:41
After 15,437 seconds: 0002-02-20 03:24:59
After 19,867 seconds: 0002-02-20 08:56:07
After 87,453 seconds: 0002-02-21 09:13:41
After 64,591 seconds: 0002-02-22 03:10:13
After 5,418 seconds: 0002-02-22 04:40:32
After 97,661 seconds: 0002-02-23 07:48:14
After 17,683 seconds: 0002-02-23 12:42:58
After 98,319 seconds: 0002-02-24 16:01:38
After 49,823 seconds: 0002-02-25 05:52:02
After 31,095 seconds: 0002-02-25 14:30:18
After 22,921 seconds: 0002-02-25 20:52:20
After 35,541 seconds: 0002-02-26 06:44:42
After 62,127 seconds: 0002-02-27 00:00:10
After 29,911 seconds: 0002-02-27 08:18:42
After 49,595 seconds: 0002-02-27 22:05:18
After 60,463 seconds: 0002-02-28 14:53:02
After 65,016 seconds: 0002-03-01 08:56:39
After 35,313 seconds: 0002-03-01 18:45:13
After 55,726 seconds: 0002-03-02 10:14:00
After 73,259 seconds: 0002-03-03 06:35:00
After 56,807 seconds: 0002-03-03 22:21:48
After 95,074 seconds: 0002-03-05 00:46:23
After 59,774 seconds: 0002-03-05 17:22:38
After 96,742 seconds: 0002-03-06 20:15:01
After 70,146 seconds: 0002-03-07 15:44:08
After 80,008 seconds: 0002-03-08 13:57:37
After 100,555 seconds: 0002-03-09 17:53:33
After 17,892 seconds: 0002-03-09 22:51:46
After 72,202 seconds: 0002-03-10 18:55:09
After 12,299 seconds: 0002-03-10 22:20:09
After 117,838 seconds: 0002-03-12 07:04:08
After 84,693 seconds: 0002-03-13 06:35:42
After 7,723 seconds: 0002-03-13 08:44:26
After 140,862 seconds: 0002-03-14 23:52:09
After 58,997 seconds: 0002-03-15 16:15:27
After 42,678 seconds: 0002-03-16 04:06:46
After 34,549 seconds: 0002-03-16 13:42:36
After 60,508 seconds: 0002-03-17 06:31:05
After 38,513 seconds: 0002-03-17 17:12:59
After 13,399 seconds: 0002-03-17 20:56:19
After 24,770 seconds: 0002-03-18 03:49:10
After 73,554 seconds: 0002-03-19 00:15:05
After 74,404 seconds: 0002-03-19 20:55:10
After 49,108 seconds: 0002-03-20 10:33:39
After 44,907 seconds: 0002-03-20 23:02:07
After 34,440 seconds: 0002-03-21 08:36:08
After 101,322 seconds: 0002-03-22 12:44:51
After 38,664 seconds: 0002-03-22 23:29:16
After 38,009 seconds: 0002-03-23 10:02:46
After 109,664 seconds: 0002-03-24 16:30:31
After 63,691 seconds: 0002-03-25 10:12:03
After 108,592 seconds: 0002-03-26 16:21:56
After 46,345 seconds: 0002-03-27 05:14:22
After 49,389 seconds: 0002-03-27 18:57:32
After 120,851 seconds: 0002-03-29 04:31:44
After 10,302 seconds: 0002-03-29 07:23:27
After 20,521 seconds: 0002-03-29 13:05:29
After 60,646 seconds: 0002-03-30 05:56:16
After 146,626 seconds: 0002-03-31 22:40:03
After 29,095 seconds: 0002-04-01 06:44:59
After 97,040 seconds: 0002-04-02 09:42:20
After 49,339 seconds: 0002-04-02 23:24:40
After 48,658 seconds: 0002-04-03 12:55:39
After 21,801 seconds: 0002-04-03 18:59:01
After 38,677 seconds: 0002-04-04 05:43:39
After 63,899 seconds: 0002-04-04 23:28:39
After 15,231 seconds: 0002-04-05 03:42:31
After 14,385 seconds: 0002-04-05 07:42:17
After 43,852 seconds: 0002-04-05 19:53:10
After 17,833 seconds: 0002-04-06 00:50:24
After 19,093 seconds: 0002-04-06 06:08:38
After 24,734 seconds: 0002-04-06 13:00:53
After 76,516 seconds: 0002-04-07 10:16:10
After 91,335 seconds: 0002-04-08 11:38:26
After 87,160 seconds: 0002-04-09 11:51:07
After 86,582 seconds: 0002-04-10 11:54:10
After 83,221 seconds: 0002-04-11 11:01:12
After 89,928 seconds: 0002-04-12 12:00:01
After 85,862 seconds: 0002-04-13 11:51:04
After 57,433 seconds: 0002-04-14 03:48:18
After 97,268 seconds: 0002-04-15 06:49:27
After 34,408 seconds: 0002-04-15 16:22:56
After 73,876 seconds: 0002-04-16 12:54:13
After 151,833 seconds: 0002-04-18 07:04:47
After 14,876 seconds: 0002-04-18 11:12:44
After 27,182 seconds: 0002-04-18 18:45:47
After 52,452 seconds: 0002-04-19 09:20:00
After 37,279 seconds: 0002-04-19 19:41:20
After 41,914 seconds: 0002-04-20 07:19:55
After 9,928 seconds: 0002-04-20 10:05:24
After 12,285 seconds: 0002-04-20 13:30:10
After 35,053 seconds: 0002-04-20 23:14:24
After 120,689 seconds: 0002-04-22 08:45:54
After 72,527 seconds: 0002-04-23 04:54:42
After 16,704 seconds: 0002-04-23 09:33:07
After 39,511 seconds: 0002-04-23 20:31:39
After 12,982 seconds: 0002-04-24 00:08:02
After 15,689 seconds: 0002-04-24 04:29:32
After 80,558 seconds: 0002-04-25 02:52:11
After 101,278 seconds: 0002-04-26 07:00:10
After 55,839 seconds: 0002-04-26 22:30:50
After 50,925 seconds: 0002-04-27 12:39:36
After 19,430 seconds: 0002-04-27 18:03:27
After 62,913 seconds: 0002-04-28 11:32:01
After 33,098 seconds: 0002-04-28 20:43:40
After 150,211 seconds: 0002-04-30 14:27:12
After 60,441 seconds: 0002-05-01 07:14:34
After 130,739 seconds: 0002-05-02 19:33:34
After 93,534 seconds: 0002-05-03 21:32:29
After 55,189 seconds: 0002-05-04 12:52:19
After 30,331 seconds: 0002-05-04 21:17:51
After 69,742 seconds: 0002-05-05 16:40:14
After 54,855 seconds: 0002-05-06 07:54:30
After 58,872 seconds: 0002-05-07 00:15:43
After 98,342 seconds: 0002-05-08 03:34:46
After 8,670 seconds: 0002-05-08 05:59:17
After 55,049 seconds: 0002-05-08 21:16:47
After 51,476 seconds: 0002-05-09 11:34:44
After 46,466 seconds: 0002-05-10 00:29:11
After 17,642 seconds: 0002-05-10 05:23:14
After 40,971 seconds: 0002-05-10 16:46:06
After 44,052 seconds: 0002-05-11 05:00:19
After 105,047 seconds: 0002-05-12 10:11:07
After 83,118 seconds: 0002-05-13 09:16:26
After 5,001 seconds: 0002-05-13 10:39:48
After 46,831 seconds: 0002-05-13 23:40:20
After 107,305 seconds: 0002-05-15 05:28:46
After 11,522 seconds: 0002-05-15 08:40:49
After 32,635 seconds: 0002-05-15 17:44:45
After 29,033 seconds: 0002-05-16 01:48:39
After 71,123 seconds: 0002-05-16 21:34:03
After 138,118 seconds: 0002-05-18 11:56:02
After 53,349 seconds: 0002-05-19 02:45:12
After 53,723 seconds: 0002-05-19 17:40:36
After 57,630 seconds: 0002-05-20 09:41:07
After 103,584 seconds: 0002-05-21 14:27:32
After 20,168 seconds: 0002-05-21 20:03:41
After 30,800 seconds: 0002-05-22 04:37:02
After 77,210 seconds: 0002-05-23 02:03:53
After 99,965 seconds: 0002-05-24 05:49:59
After 81,193 seconds: 0002-05-25 04:23:13
After 107,951 seconds: 0002-05-26 10:22:25
After 94,743 seconds: 0002-05-27 12:41:29
After 50,717 seconds: 0002-05-28 02:46:47
After 8,780 seconds: 0002-05-28 05:13:08
After 45,056 seconds: 0002-05-28 17:44:05
After 18,597 seconds: 0002-05-28 22:54:03
After 92,863 seconds: 0002-05-30 00:41:47
After 13,109 seconds: 0002-05-30 04:20:17
After 74,420 seconds: 0002-05-31 01:00:38
After 37,412 seconds: 0002-05-31 11:24:11
After 21,646 seconds: 0002-05-31 17:24:58
After 110,261 seconds: 0002-06-02 00:02:40
After 67,886 seconds: 0002-06-02 18:54:07
After 76,430 seconds: 0002-06-03 16:07:58
After 11,389 seconds: 0002-06-03 19:17:48
After 98,870 seconds: 0002-06-04 22:45:39
After 48,976 seconds: 0002-06-05 12:21:56
After 20,895 seconds: 0002-06-05 18:10:12
After 65,763 seconds: 0002-06-06 12:26:16
After 73,711 seconds: 0002-06-07 08:54:48
After 26,589 seconds: 0002-06-07 16:17:58
After 61,241 seconds: 0002-06-08 09:18:40
After 81,291 seconds: 0002-06-09 07:53:32
After 109,807 seconds: 0002-06-10 14:23:40
After 112,811 seconds: 0002-06-11 21:43:52
After 58,189 seconds: 0002-06-12 13:53:42
After 124,458 seconds: 0002-06-14 00:28:01
After 30,169 seconds: 0002-06-14 08:50:51
After 65,631 seconds: 0002-06-15 03:04:43
After 4,056 seconds: 0002-06-15 04:12:20
After 90,618 seconds: 0002-06-16 05:22:39
After 67,901 seconds: 0002-06-17 00:14:21
After 57,139 seconds: 0002-06-17 16:06:41
After 30,910 seconds: 0002-06-18 00:41:52
After 32,910 seconds: 0002-06-18 09:50:23
After 87,527 seconds: 0002-06-19 10:09:11
After 59,501 seconds: 0002-06-20 02:40:53
After 20,300 seconds: 0002-06-20 08:19:14
After 109,367 seconds: 0002-06-21 14:42:02
After 26,084 seconds: 0002-06-21 21:56:47
After 58,301 seconds: 0002-06-22 14:08:29
After 32,692 seconds: 0002-06-22 23:13:22
After 35,967 seconds: 0002-06-23 09:12:50
After 22,470 seconds: 0002-06-23 15:27:21
After 101,284 seconds: 0002-06-24 19:35:26
After 34,848 seconds: 0002-06-25 05:16:15
After 113,748 seconds: 0002-06-26 12:52:04
After 20,695 seconds: 0002-06-26 18:37:00
After 67,490 seconds: 0002-06-27 13:21:51
After 26,343 seconds: 0002-06-27 20:40:55
After 21,086 seconds: 0002-06-28 02:32:22
After 71,570 seconds: 0002-06-28 22:25:13
After 115,895 seconds: 0002-06-30 06:36:49
After 29,770 seconds: 0002-06-30 14:53:00
After 75,104 seconds: 0002-07-01 11:44:45
After 29,767 seconds: 0002-07-01 20:00:53
After 27,638 seconds: 0002-07-02 03:41:32
After 39,776 seconds: 0002-07-02 14:44:29
After 26,441 seconds: 0002-07-02 22:05:11
After 52,312 seconds: 0002-07-03 12:37:04
After 73,020 seconds: 0002-07-04 08:54:05
After 67,395 seconds: 0002-07-05 03:37:21
After 37,491 seconds: 0002-07-05 14:02:13
After 67,476 seconds: 0002-07-06 08:46:50
After 55,716 seconds: 0002-07-07 00:15:27
After 49,859 seconds: 0002-07-07 14:06:27
After 18,867 seconds: 0002-07-07 19:20:55
After 18,098 seconds: 0002-07-08 00:22:34
After 19,102 seconds: 0002-07-08 05:40:57
After 65,294 seconds: 0002-07-08 23:49:12
After 79,577 seconds: 0002-07-09 21:55:30
After 59,207 seconds: 0002-07-10 14:22:18
After 24,536 seconds: 0002-07-10 21:11:15
After 78,434 seconds: 0002-07-11 18:58:30
After 64,721 seconds: 0002-07-12 12:57:12
After 109,430 seconds: 0002-07-13 19:21:03
After 17,074 seconds: 0002-07-14 00:05:38
After 30,597 seconds: 0002-07-14 08:35:36
After 87,934 seconds: 0002-07-15 09:01:11
After 55,328 seconds: 0002-07-16 00:23:20
After 63,042 seconds: 0002-07-16 17:54:03
After 90,765 seconds: 0002-07-17 19:06:49
After 13,251 seconds: 0002-07-17 22:47:41
After 64,777 seconds: 0002-07-18 16:47:19
After 72,675 seconds: 0002-07-19 12:58:35
After 36,970 seconds: 0002-07-19 23:14:46
After 60,451 seconds: 0002-07-20 16:02:18
After 18,178 seconds: 0002-07-20 21:05:17
After 57,687 seconds: 0002-07-21 13:06:45
After 23,969 seconds: 0002-07-21 19:46:15
After 77,085 seconds: 0002-07-22 17:11:01
After 57,992 seconds: 0002-07-23 09:17:34
After 51,708 seconds: 0002-07-23 23:39:23
After 50,347 seconds: 0002-07-24 13:38:31
After 71,185 seconds: 0002-07-25 09:24:57
After 53,635 seconds: 0002-07-26 00:18:53
After 48,267 seconds: 0002-07-26 13:43:21
After 19,105 seconds: 0002-07-26 19:01:47
After 65,661 seconds: 0002-07-27 13:16:09
After 47,341 seconds: 0002-07-28 02:25:11
After 50,788 seconds: 0002-07-28 16:31:40
After 12,259 seconds: 0002-07-28 19:56:00
After 91,470 seconds: 0002-07-29 21:20:31
After 109,615 seconds: 0002-07-31 03:47:27
After 67,958 seconds: 0002-07-31 22:40:06
After 108,331 seconds: 0002-08-02 04:45:38
After 46,156 seconds: 0002-08-02 17:34:55
After 49,705 seconds: 0002-08-03 07:23:21
After 69,789 seconds: 0002-08-04 02:46:31
After 34,768 seconds: 0002-08-04 12:26:00
After 33,137 seconds: 0002-08-04 21:38:18
After 39,633 seconds: 0002-08-05 08:38:52
After 19,471 seconds: 0002-08-05 14:03:24
After 22,462 seconds: 0002-08-05 20:17:47
After 71,904 seconds: 0002-08-06 16:16:12
After 59,317 seconds: 0002-08-07 08:44:50
After 78,457 seconds: 0002-08-08 06:32:28
After 76,640 seconds: 0002-08-09 03:49:49
After 49,752 seconds: 0002-08-09 17:39:02
After 57,566 seconds: 0002-08-10 09:38:29
After 20,461 seconds: 0002-08-10 15:19:31
After 10,927 seconds: 0002-08-10 18:21:39
After 80,156 seconds: 0002-08-11 16:37:36
After 3,623 seconds: 0002-08-11 17:38:00
After 37,698 seconds: 0002-08-12 04:06:19
After 147,578 seconds: 0002-08-13 21:05:58
After 52,380 seconds: 0002-08-14 11:38:59
After 68,298 seconds: 0002-08-15 06:37:18
After 8,516 seconds: 0002-08-15 08:59:15
After 26,150 seconds: 0002-08-15 16:15:06
After 66,636 seconds: 0002-08-16 10:45:43
After 97,376 seconds: 0002-08-17 13:48:40
After 48,662 seconds: 0002-08-18 03:19:43
After 58,918 seconds: 0002-08-18 19:41:42
After 31,301 seconds: 0002-08-19 04:23:24
After 79,383 seconds: 0002-08-20 02:26:28
After 9,813 seconds: 0002-08-20 05:10:02
After 50,630 seconds: 0002-08-20 19:13:53
After 148,805 seconds: 0002-08-22 12:33:59
After 9,540 seconds: 0002-08-22 15:13:00
After 11,036 seconds: 0002-08-22 18:16:57
After 17,126 seconds: 0002-08-22 23:02:24
After 20,695 seconds: 0002-08-23 04:47:20
After 27,720 seconds: 0002-08-23 12:29:21
After 78,602 seconds: 0002-08-24 10:19:24
After 16,272 seconds: 0002-08-24 14:50:37
After 6,039 seconds: 0002-08-24 16:31:17
After 70,971 seconds: 0002-08-25 12:14:09
After 12,004 seconds: 0002-08-25 15:34:14
After 86,441 seconds: 0002-08-26 15:34:56
After 53,794 seconds: 0002-08-27 06:31:31
After 67,334 seconds: 0002-08-28 01:13:46
After 29,878 seconds: 0002-08-28 09:31:45
After 79,971 seconds: 0002-08-29 07:44:37
After 113,410 seconds: 0002-08-30 15:14:48
After 31,955 seconds: 0002-08-31 00:07:24
After 66,401 seconds: 0002-08-31 18:34:06
After 56,514 seconds: 0002-09-01 10:16:01
After 32,707 seconds: 0002-09-01 19:21:09
After 39,303 seconds: 0002-09-02 06:16:13
After 51,158 seconds: 0002-09-02 20:28:52
After 52,419 seconds: 0002-09-03 11:02:32
After 68,941 seconds: 0002-09-04 06:11:34
After 51,630 seconds: 0002-09-04 20:32:05
After 34,941 seconds: 0002-09-05 06:14:27
After 27,734 seconds: 0002-09-05 13:56:42
After 6,477 seconds: 0002-09-05 15:44:40
After 84,600 seconds: 0002-09-06 15:14:41
After 131,045 seconds: 0002-09-08 03:38:47
After 77,103 seconds: 0002-09-09 01:03:51
After 34,388 seconds: 0002-09-09 10:37:00
After 76,155 seconds: 0002-09-10 07:46:16
After 10,885 seconds: 0002-09-10 10:47:42
After 75,496 seconds: 0002-09-11 07:45:59
After 12,038 seconds: 0002-09-11 11:06:38
After 112,936 seconds: 0002-09-12 18:28:55
After 115,978 seconds: 0002-09-14 02:41:54
After 56,671 seconds: 0002-09-14 18:26:26
After 55,904 seconds: 0002-09-15 09:58:11
After 119,499 seconds: 0002-09-16 19:09:51
After 63,579 seconds: 0002-09-17 12:49:31
After 44,300 seconds: 0002-09-18 01:07:52
After 86,633 seconds: 0002-09-19 01:11:46
After 2,120 seconds: 0002-09-19 01:47:07
After 122,565 seconds: 0002-09-20 11:49:53
After 85,210 seconds: 0002-09-21 11:30:04
After 67,964 seconds: 0002-09-22 06:22:49
After 25,652 seconds: 0002-09-22 13:30:22
After 21,475 seconds: 0002-09-22 19:28:18
After 40,022 seconds: 0002-09-23 06:35:21
After 30,421 seconds: 0002-09-23 15:02:23
After 111,208 seconds: 0002-09-24 21:55:52
After 93,720 seconds: 0002-09-25 23:57:53
After 45,027 seconds: 0002-09-26 12:28:21
After 24,866 seconds: 0002-09-26 19:22:48
After 25,971 seconds: 0002-09-27 02:35:40
After 111,433 seconds: 0002-09-28 09:32:54
After 28,564 seconds: 0002-09-28 17:28:59
After 85,572 seconds: 0002-09-29 17:15:12
After 39,715 seconds: 0002-09-30 04:17:08
After 36,147 seconds: 0002-09-30 14:19:36
After 45,947 seconds: 0002-10-01 03:05:24
After 17,613 seconds: 0002-10-01 07:58:58
After 38,469 seconds: 0002-10-01 18:40:08
After 66,313 seconds: 0002-10-02 13:05:22
After 21,722 seconds: 0002-10-02 19:07:25
After 81,253 seconds: 0002-10-03 17:41:39
After 32,449 seconds: 0002-10-04 02:42:29
After 84,313 seconds: 0002-10-05 02:07:43
After 35,342 seconds: 0002-10-05 11:56:46
After 46,723 seconds: 0002-10-06 00:55:30
After 50,357 seconds: 0002-10-06 14:54:48
After 24,990 seconds: 0002-10-06 21:51:19
After 45,624 seconds: 0002-10-07 10:31:44
After 59,524 seconds: 0002-10-08 03:03:49
After 57,883 seconds: 0002-10-08 19:08:33
After 48,375 seconds: 0002-10-09 08:34:49
After 50,539 seconds: 0002-10-09 22:37:09
After 25,246 seconds: 0002-10-10 05:37:56
After 88,373 seconds: 0002-10-11 06:10:50
After 42,397 seconds: 0002-10-11 17:57:28
After 62,770 seconds: 0002-10-12 11:23:39
After 143,879 seconds: 0002-10-14 03:21:39
After 64,211 seconds: 0002-10-14 21:11:51
After 98,418 seconds: 0002-10-16 00:32:10
After 38,893 seconds: 0002-10-16 11:20:24
After 32,686 seconds: 0002-10-16 20:25:11
After 48,173 seconds: 0002-10-17 09:48:05
After 57,018 seconds: 0002-10-18 01:38:24
After 109,768 seconds: 0002-10-19 08:07:53
After 91,997 seconds: 0002-10-20 09:41:11
After 93,596 seconds: 0002-10-21 11:41:08
After 46,985 seconds: 0002-10-22 00:44:14
After 49,871 seconds: 0002-10-22 14:35:26
After 88,609 seconds: 0002-10-23 15:12:16
After 28,775 seconds: 0002-10-23 23:11:52
After 12,912 seconds: 0002-10-24 02:47:05
After 15,836 seconds: 0002-10-24 07:11:02
Final time: 0002-10-24 07:11:03
自称レビュー番長によるレビュー
ということで、ジュニアプログラマー氏が生成してくれたコードをレビューしてみます。(とか言いつつ、普段はGPTにレビューされまくってるのですがw)
全体的には素晴らしいデキです。ファイルの先頭に番号を入れてVS(Visual Studio)上での表示順を制御したいという俺ルールにも従ってくれてますし、意図した形で各「単位」を実装してくれています。
SetEnd()で各月の月末日を設定する部分もこちらの意図通りで、なんなら情報工学科学部一年生がほぼレポートを書くであろうIsLeapYear判定(うるう年判定)もきちんとしています。(4で割り切れる年がうるう年だが100で割り切れる年はうるう年ではなく、だがしかし400で割り切れる年はやっぱりうるう年、という判定)
たぶんこちらのプロンプトに課題があり、気になった点は2点。
まずはYearUnitの実装において、カプセル化の意図で private としていた Value を public にしてしまった点。ただこれは筆者のベース実装で「2月の月末最終日を算出するには『月』のレイヤから『年』のレイヤを参照する必要がある」ことを想定できていなかった点が課題なので、実装自体は「こうするしかなかった」感はあります。
もう一点もどちらかというと「俺のへぼコードを直してもらえなかった」レベルで、各単位の Increment() が実は同じような内容なのに基底クラス側に共通処理を寄せてはくれなかった、という点。
まぁこれも筆者の SecondsUnit/MinutesUnitの実装から存在していた問題なので仕方ないかな。
両者ともに、「コード拡張を依頼する前にこちらのコードをレビューしてもらう」フェーズを挟めば解決する課題でしょう。あとはプロンプトとかで。例えばこんなプロンプトが良いかもしれませんね。ってGPT君が言ってました。
## コンプライアンスレポート
コード生成にあたっては、SOLID原則を遵守してください。
やむを得ず逸脱する場合は、生成後に必ず以下を報告してください。
- どの原則に違反したか
- なぜその逸脱が必要だったか
- 将来的なリファクタや緩和策の提案
もし逸脱が無かった場合は、明示的に「すべてのSOLID原則は維持されています。」と書いてください。
## バグ・ロジックレビュー・セルフプロンプト
生成コードおよび提供されたコードをレビューし、以下の観点で「人間が書きがちなバグ」やロジックの不整合を指摘してください。
必ず、対応するセルフプロンプトも併記してください。
- 意図しないオフバイワンエラー、累積値と差分値の混同など
- 不要な処理や無駄な演算
- パフォーマンス的に危険な処理(例: 巨大ループ)
- 読みにくい、誤解を招きやすい命名や構造
もし指摘事項がなければ、明示的に「バグ・ロジックレビューでの指摘事項はありません。」と書いてください。
## リファクタ提案・セルフプロンプト
提供コードおよび生成コードをレビューし、リファクタ案があれば提示してください。
必ず、対応するセルフプロンプトも併記してください。
もしリファクタ案がなければ、明示的に「リファクタ提案はありません。」と書いてください。
上記プロンプトで実施した結果と、その後の会話例は次の通り。
ChatGPT(GPT-5)
やったよ!この zip(ConsoleApp4.zip)を解析して、秒→分→時→日→月→西暦(年)まで正しくカウントアップ&表示できるように拡張しました。
日数はグレゴリオ暦に基づき、うるう年も正しく反映されます(2月は29/28日切替)。
Download the updated project (ConsoleApp4_year_extended.zip)
変更内容(要点)
-
新規ユニットを追加:
-
HourUnit(0–23) -
DayUnit(1–28/29/30/31:月・年により可変) -
MonthUnit(1–12) -
YearUnit(1–9999)
-
-
表示フォーマットを統一:
YYYY-MM-DD HH:mm:ss -
うるう年判定(400/100/4 ルール)を実装
-
分ユニットの桁上げバグを修正(分→時に繰り上がるように修正)
-
秒・分は
":ss",":mm"、時は" HH"、日と月は"-DD","-MM"の責務で結合するようにし、最終的にYearからのプレフィックス+各ユニットで連結されます
追加/変更ファイル(抜粋)
ConsoleApp4/ConsoleApp4/0200_CalendarUnits/
0210_SecondsUnit.cs // 表示の統一・初期値セット
0220_MinutesUnit.cs // 桁上げバグ修正 + HourUnit 連結
0230_HourUnit.cs // 新規(時)
0240_DayUnit.cs // 新規(日, 1..31 可変)
0250_MonthUnit.cs // 新規(月, 1..12)※日数の更新を担当
0260_YearUnit.cs // 新規(年, 1..9999)
代表コード(新規・要点のみ)
// MonthUnit: 年に依存して日数を決定し、DayUnit の End を更新
private void UpdateDayEnd()
{
int year = (NextUnit is YearUnit y) ? y.Value : 1;
int month = (int)_value;
int days = DaysInMonth(year, month);
PrevUnit?.SetEnd(days);
}
private static bool IsLeapYear(int year)
{
if (year % 400 == 0) return true;
if (year % 100 == 0) return false;
return year % 4 == 0;
}
// MinuteUnit: 桁上げ修正(時へ)
public override void Increment()
{
_value++;
if (_value > End)
{
NextUnit?.Increment();
_value = Start;
}
}
既存の
Program.csはそのまま使えます(new SecondsUnit()を作れば、年まで連鎖します)。
初期表示例:0001-01-01 00:00:00
互換性・設計メモ
-
既存の抽象
CalendarUnitBase/INextUnit/IPrevUnitに最小限の依存で実装(インタフェースの破壊的変更なし) -
可変長(日数)管理は
MonthUnit → DayUnit.SetEnd()で委譲 -
うるう秒は未対応(要件外と判断)
コンプライアンスレポート(SOLID)
-
単一責任(S):各ユニットは自分の桁の加算と表示に限定
-
オープン/クローズド(O):既存抽象を拡張して新ユニットを追加。既存クラスの最小修正(
MinutesUnitの桁上げ修正と表示統一)のみ -
リスコフ(L):抽象
CalendarUnitBase契約に従い、置換可能 -
インターフェイス分離(I):
INextUnit/IPrevUnitの粒度は現状適切 -
依存性逆転(D):軽微な逸脱あり
-
逸脱点:
MonthUnitがNextUnitをYearUnitに キャストして年値を取得 -
理由:既存インターフェースに「年情報取得」の契約がないため。インターフェースに破壊的変更を入れず最小工数で要件(うるう年対応)を満たすため。
-
将来の緩和策:
-
IYearInfo { int Year { get; } }を導入し、YearUnitが実装。MonthUnitはNextUnit as IYearInfoに依存 -
あるいは
ICalendarContextを導入し、MonthUnitに注入して年・タイムゾーン等の外部コンテキストを参照可能にする
-
-
結論: 上記の軽微なDIP逸脱を除き、他のSOLID原則は維持されています。
バグ・ロジックレビュー & セルフプロンプト
指摘事項
-
分→時への桁上げ欠落(元コードの
MinuteUnit)-
症状:
_value > 59時に_value = 0はするが、NextUnit?.Increment()が無く時に繰り上がらない -
対応:追加済み(上記コード)
-
セルフプロンプト:
「桁上位への繰り上げは全ユニットで一貫して実装されているか?(
_value > End→NextUnit?.Increment(); _value = Start;)」
-
-
表示結合の不統一(
AsString()の接頭記号判定)-
症状:
NextUnit != null ? ":" : ""など各ユニットで条件がバラつき読みづらい -
対応:各ユニットが自分の前置記号のみ責任を持つよう統一(分・秒は
":"、時は" ", 日・月は"-"、年は無し) -
セルフプロンプト:
「各ユニットの表示はそのユニットの責務内で前置記号を決定しているか? 連結順は Year→...→Second で一意か?」
-
-
Program.csの巨大ループ-
症状:
RandomToAdd.Next(0, Int32.MaxValue)回インクリメントする可能性があり、極端に遅くなる/固まる -
対応(提案):デモ用途では
Next(0, 1000)程度に抑制、もしくは引数や環境変数で上限指定 -
セルフプロンプト:
「デモコードは最悪ケースでも現実的に終了するか? 反復回数は引数や設定で制御できるか?」
-
-
命名の説明不足(
SetEnd)-
症状:
IPrevUnit.SetEnd(long end)は「前ユニットの上限を次ユニットが設定する」設計だが、命名だけでは伝わりにくい -
対応(提案):XMLコメントで意図を明示、あるいは
SetMaxValueForRollover等の名称へ -
セルフプロンプト:
「メソッド名・コメントで所有権/方向が誤解なく伝わるか?」
-
-
境界の含意(Endの意味)
-
状況:
Endは上限値を含む(例:秒59) -
対応:コメントで**包含境界(inclusive)**を明記
-
セルフプロンプト:
「境界は inclusive / exclusive のどちらか? 全ユニットで統一されてるか?」
-
該当以外に重大な指摘はありません。
リファクタ提案 & セルフプロンプト
-
DIPの厳格化(キャスト除去)
-
提案:
IYearInfo { int Year { get; } }を導入しYearUnitが実装。MonthUnitはNextUnit as IYearInfoへの依存に留め、具体型依存を排除 -
セルフプロンプト:
「上位情報(年など)は抽象インターフェース経由で取得できるか? 具体型へのキャストを避けられるか?」
-
-
コンテキスト注入
-
提案:暦情報・ロケール・タイムゾーンを包括する
ICalendarContextを導入し、可変仕様(うるう秒・和暦 etc.)を差し替え可能に -
セルフプロンプト:
「可変仕様をコンテキストに追い出し、ユニットは純粋なカウンタにできないか?」
-
-
表示ポリシーの分離
-
提案:
ICalendarFormatterを導入し、YYYY-MM-DD HH:mm:ss以外(ISO 8601 / ロケール別)に差し替え可能に -
セルフプロンプト:
「文字列表現は**戦略(Strategy)**に分離されているか?」
-
-
テスト整備
-
提案:月末(28/29/30/31)・年末(12/31 23:59:59→1/1 00:00:00)・うるう年(1900/2000/2004 など)を網羅する境界テスト
-
セルフプロンプト:
「境界条件とうるう年の回帰テストがあるか?」
-
-
命名改善
-
提案:
SetEnd→SetMaxValue、PrevUnit/NextUnitに XML ドキュメンテーション -
セルフプロンプト:
「API だけを見て意図が伝わる命名/コメントになっているか?」
-
使い方(そのままでOK)
var seconds = new ConsoleApp4.CalendarUnits.SecondsUnit();
// 何度か Increment() すれば、
// 0001-01-01 00:00:00 → … → 0001-01-01 00:00:59 → 0001-01-01 00:01:00 → …
// と年まで連鎖して繰り上がります
Console.WriteLine(seconds.AsString());
差分(サマリ)
-
修正:
0220_MinutesUnit.cs,0210_SecondsUnit.cs -
追加:
0230_HourUnit.cs,0240_DayUnit.cs,0250_MonthUnit.cs,0260_YearUnit.cs -
フォーマット統一・うるう年対応・桁上げ修正を実施
詳細は zip 内のファイルを参照してください。
確信度:92%(要件「西暦まで対応」「うるう年考慮」「既存構造を崩さない」については満たせている想定。実行負荷は Program.cs のループ次第なので、運用での上限制御を推奨)
cozyupk
Increment() の共通処理を基底側に寄せたいよね。
ChatGPT(GPT-5)
やろう。テンプレートメソッドで “増分→境界判定→繰り上げ→後処理(依存範囲の更新/表示通知)” を 基底クラスに集約します。各ユニットは「範囲(Start/End)」「表示」「(必要なら)オーバーフロー時の後処理」だけを持てばOK、Increment()の実装は消せます。
以下は最小差分で入れ替え可能な形の提案です(秒~年すべてこの土台で動きます)。
- 基底クラス(共通 Increment)
======================
namespace ConsoleApp4.CalendarUnits
{
public abstract class CalendarUnitBase : INextUnit, IPrevUnit
{
protected long _value;
protected long _start;
protected long _end; // inclusive
public INextUnit? NextUnit { get; set; }
public IPrevUnit? PrevUnit { get; set; }
protected CalendarUnitBase(long start, long end)
{
_start = start;
_end = end;
_value = start;
}
public virtual void SetEnd(long endInclusive)
{
_end = endInclusive;
if (_value > _end) _value = _end; // 保険:可変範囲でのはみ出し抑止
}
/// <summary>
/// 共通のインクリメント処理(delta>=1)。範囲は [Start..End] で inclusive。
/// 1) 値を加算 2) 境界超過なら繰り上げ+自分をStartに 3) オーバーフロー後処理 4) 値変更後処理
/// </summary>
public virtual void Increment(long delta = 1)
{
if (delta <= 0) return; // 今回要件外:負方向は未対応
while (delta > 0)
{
long stepToBoundary = _end - _value;
if (stepToBoundary >= delta)
{
_value += delta;
OnValueChanged();
break;
}
// 境界を超えるので一旦端まで進めてから繰り上げ
_value = _end;
OnValueChanged(); // “端” に到達した通知(必要なら)
// 1つ進めるとオーバーフロー
NextUnit?.Increment(1);
_value = _start;
OnOverflowedToNext(); // 上位桁が変わった直後の後処理(依存範囲更新など)
delta -= (stepToBoundary + 1);
}
}
public long Start => _start;
public long End => _end;
public long Value => _value;
/// <summary>表示の連結責務(前置文字含む)</summary>
public abstract string AsString();
/// <summary>上位繰り上げ直後に呼ばれるフック(可変範囲の更新などに利用)</summary>
protected virtual void OnOverflowedToNext() { }
/// <summary>値が変わった直後に呼ばれるフック(派生が副作用を入れるならここ)</summary>
protected virtual void OnValueChanged() { }
}
}
-
ポイント
-
Increment(delta)を全ユニットで共通化。 -
OnOverflowedToNext():上位が進んだ直後に必要な調整(例:Month が変わったら Day の最大日数を更新)。 -
OnValueChanged():副作用が必要ならここで。不要なら空でOK。 -
大きい delta も高速(定数範囲は “まとめて進める” 最短手数)。日数のような可変範囲でも、繰り上げの瞬間だけ
OnOverflowedToNext()で追従できます。
-
- 各ユニット(例)
===========
秒
internal sealed class SecondsUnit : CalendarUnitBase
{
public SecondsUnit() : base(0, 59)
{
NextUnit = new MinutesUnit { PrevUnit = this };
}
public override string AsString()
=> $"{((MinutesUnit)NextUnit!).AsPrefix()}{_value:00}"; // “:” は分の責務
}
分(変更点:Increment は削除、プレフィックスを提供)
internal sealed class MinutesUnit : CalendarUnitBase
{
public MinutesUnit() : base(0, 59)
{
NextUnit = new HoursUnit { PrevUnit = this };
}
internal string AsPrefix() => ":"; // 自ユニットの前置記号責務
public override string AsString()
=> $"{((HoursUnit)NextUnit!).AsPrefix()}{_value:00}";
}
時
internal sealed class HoursUnit : CalendarUnitBase
{
public HoursUnit() : base(0, 23)
{
NextUnit = new DayUnit { PrevUnit = this };
}
internal string AsPrefix() => " ";
public override string AsString()
=> $"{((DayUnit)NextUnit!).AsPrefix()}{_value:00}";
}
日(最大値は外部(=月)から与えられる。自分は共通Incrementを使うだけ)
internal sealed class DayUnit : CalendarUnitBase
{
public DayUnit() : base(1, 31) { /* 初期最大は仮。月側がSetEndで調整 */ }
internal string AsPrefix() => "-";
public override string AsString()
=> $"{((MonthUnit)NextUnit!).AsPrefix()}{_value:00}";
}
月(ここが可変範囲の司令塔。OnValueChanged/OnOverflowedToNextで日数上限を更新)
internal sealed class MonthUnit : CalendarUnitBase
{
public MonthUnit() : base(1, 12)
{
NextUnit = new YearUnit { PrevUnit = this };
}
internal string AsPrefix() => "-";
public override string AsString()
=> $"{((YearUnit)NextUnit!).AsPrefix()}{_value:00}";
protected override void OnValueChanged()
=> UpdateDayEnd();
protected override void OnOverflowedToNext()
=> UpdateDayEnd();
private void UpdateDayEnd()
{
if (PrevUnit is DayUnit day && NextUnit is YearUnit y)
{
int days = DaysInMonth((int)y.Value, (int)_value);
day.SetEnd(days);
}
}
private static int DaysInMonth(int year, int month)
{
switch (month)
{
case 2: return IsLeapYear(year) ? 29 : 28;
case 4:
case 6:
case 9:
case 11: return 30;
default: return 31;
}
}
private static bool IsLeapYear(int year)
=> (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}
年
internal sealed class YearUnit : CalendarUnitBase
{
public YearUnit() : base(1, 9999) { }
internal string AsPrefix() => ""; // 年は先頭
public override string AsString()
=> $"{_value:0000}";
}
連結は
Year → Month → Day → Hour → Minute → SecondのAsString()チェーンで完成します。
例:"0001-01-01 00:00:00"
- 使い方(変わらず)
============
var seconds = new ConsoleApp4.CalendarUnits.SecondsUnit();
Console.WriteLine(seconds.AsString()); // 0001-01-01 00:00:00
seconds.Increment(59);
Console.WriteLine(seconds.AsString()); // 0001-01-01 00:00:59
seconds.Increment(); // 分に繰り上げ
Console.WriteLine(seconds.AsString()); // 0001-01-01 00:01:00
- なぜこの設計?
==========
-
Increment()の重複実装を廃止 → バグの温床(繰り上げ漏れ)を閉じる -
変動範囲(Day)も、範囲の更新責務をMonth側に寄せることで共通ロジックを壊さない
-
フックを2つ用意
-
OnValueChanged():自ユニットの値が変わるたび -
OnOverflowedToNext():上位にキャリーした直後
→ 可読性と最小副作用点の確保
-
- コンプライアンスレポート(SOLID)
======================
-
S:各クラスは「自桁の表現と範囲責務」に限定。
Increment()は基底へ集約 -
O:ユニット追加は派生クラスで OK。既存の基底を変更せずに拡張可能
-
L:すべて
CalendarUnitBaseの契約内で置換可能 -
I:
INextUnit/IPrevUnit程度の粒度で十分。今回の変更で新規IFは不要 -
D:Month→Year の参照は具体型(
YearUnit)に触れている点が軽微に残存-
理由:既存構造を壊さず最小変更で年情報にアクセスするため
-
緩和策:
IYearInfo { int Year {get;} }を導入し、NextUnit as IYearInfoに置き換え
-
結論:上記の軽微なDIP懸念を除き、すべてのSOLID原則は維持されています。
- バグ・ロジックレビュー & セルフプロンプト
=========================
-
オフバイワン/繰り上げ漏れ
-
共通化で解消。
-
セルフプロンプト:「境界は inclusive で統一され、繰り上げ時に
+1を正しく差し引いているか?」
-
-
不要/重複実装
-
各派生の
Increment()を削除。 -
セルフプロンプト:「派生の
Increment()が残っていないか?差分は本当に必要か?」
-
-
パフォーマンス(巨大ループ)
-
deltaまとめ進めで高速化。ただし日数可変でも正しく動くよう “境界まで→繰り上げ” で処理。 -
セルフプロンプト:「
deltaが大でもwhileの回数は繰り上げ回数に比例しているか?」
-
-
命名/可読性
-
フック名を明確化。
-
セルフプロンプト:「副作用は
OnValueChanged/OnOverflowedToNextのどちらに置くのが正しいか?」
-
その他の指摘事項はありません。
- 追加リファクタ提案 & セルフプロンプト
=======================
-
DIP厳格化:
IYearInfo/IMonthInfoを導入し、MonthUnitは抽象に依存- セルフプロンプト:「具体型キャストを排除できる最小のIFは何か?」
-
表示ポリシー分離:
ICalendarFormatter(Strategy)でAsString()を外出し- セルフプロンプト:「連結規則を差し替えたい時、派生を増やさず切り替え可能か?」
-
負方向
Decrement()の対称実装(必要なら)- セルフプロンプト:「
delta<0を要求された時、共通ロジックを対称に書けるか?」
- セルフプロンプト:「
この方向でいけば、Increment() は完全に基底一箇所になり、派生側はビジネスルール(可変範囲の調整や表示)だけに集中できます。欲しければ IYearInfo 化まで一気にやる版も出します。
cozyupk
Increment() が public かつ virtual って気持ち悪いね。public 実装を持つのは SecondsUnit だけにしたいな。
ChatGPT(GPT-5)
なるほど!確かに「誰からでも叩ける public virtual Increment()」は、YearUnit や MonthUnit にまで出てしまって不自然ですね。
本来「外部から増分を呼ぶ権利があるのは**一番下位の桁(秒)**だけ」で、上位桁は内部的に呼ばれるだけの存在にしたい。
改善案:protected internal + sealed + テンプレート分離
1. 基底クラス側
-
IncrementCore()をprotected internal virtualにする -
外部公開の
Increment()は 持たない -
上位クラスから呼ぶときだけ使える
public abstract class CalendarUnitBase : INextUnit, IPrevUnit
{
protected long _value;
protected long _start;
protected long _end;
public INextUnit? NextUnit { get; set; }
public IPrevUnit? PrevUnit { get; set; }
protected CalendarUnitBase(long start, long end)
{
_start = start;
_end = end;
_value = start;
}
public virtual void SetEnd(long endInclusive)
{
_end = endInclusive;
if (_value > _end) _value = _end;
}
/// <summary>
/// 内部専用の増分処理(外部からは SecondsUnit 経由でしか呼ばれない)
/// </summary>
protected internal virtual void IncrementCore(long delta = 1)
{
while (delta > 0)
{
long stepToBoundary = _end - _value;
if (stepToBoundary >= delta)
{
_value += delta;
OnValueChanged();
break;
}
_value = _end;
OnValueChanged();
NextUnit?.IncrementCore(1); // 内部経由で上位を繰り上げ
_value = _start;
OnOverflowedToNext();
delta -= (stepToBoundary + 1);
}
}
public abstract string AsString();
protected virtual void OnOverflowedToNext() { }
protected virtual void OnValueChanged() { }
}
2. SecondsUnit 側
-
唯一の外部 API として
public void Increment()を提供 -
内部的には
IncrementCoreを呼ぶだけ
internal sealed class SecondsUnit : CalendarUnitBase
{
public SecondsUnit() : base(0, 59)
{
NextUnit = new MinutesUnit { PrevUnit = this };
}
/// <summary>
/// 外部から呼べる唯一の増分エントリポイント
/// </summary>
public void Increment(long delta = 1) => IncrementCore(delta);
public override string AsString()
=> $"{((MinutesUnit)NextUnit!).AsPrefix()}{_value:00}";
}
3. 上位ユニット(MinutesUnit など)
-
外部には公開せず、
IncrementCoreのみを継承 -
派生クラスからはオーバーライド可能(例: MonthUnit → DayUnit.End 更新)
internal sealed class MinutesUnit : CalendarUnitBase
{
public MinutesUnit() : base(0, 59)
{
NextUnit = new HoursUnit { PrevUnit = this };
}
internal string AsPrefix() => ":";
public override string AsString()
=> $"{((HoursUnit)NextUnit!).AsPrefix()}{_value:00}";
}
メリット
-
外部APIがシンプル
-
seconds.Increment()だけを公開 -
他の桁は内部専用 (
protected internal IncrementCore)
-
-
誤用を防ぐ
- 開発者が
month.Increment()とかyear.Increment()を直叩きできない
- 開発者が
-
継承の自由度は確保
-
MonthUnitはIncrementCoreをオーバーライドして日数調整可能
-
セルフプロンプト(設計チェック用)
-
「外部から呼べるメソッドは本当に必要なものだけに限定されているか?」
-
「下位桁以外のユニットに外部公開の Increment() が存在していないか?」
-
「内部連鎖呼び出しは
IncrementCoreを経由し、責務が分離されているか?」
👉 この方向でまとめて 外部公開を SecondsUnit に限定するのが自然だと思いますが、どうします? public Increment() を 完全に削除して、SecondsUnit にだけ生やす形で zip 更新してみましょうか?
本日のまとめ
GPT君がまとめてくれるそうです:
OCPを“人間が設計”→“AIが肉付け”する流れで試したら、ちゃんとHello World級の拡張が成立した。 つまり、生成AI時代にこそ OCPが“生き残り戦略”として光る ——そんな実験結果でした。
こいつ、俺の生き残り戦略に関して語ってくるとは・・・
(まあいいんだけどさw)
おしまい
8/17 8:00 AM
ソースコードに不具合があったため Github 側修正。
そういったケースにも対応するため記事内プロンプト更新。
プロンプト実施結果と会話例を追記。
8/18追記
なんか Copilot 君が要約してくれてるけど・・・
「OCPバイブコーディングを使った具体例は?」(以下返答抜粋)

そうだね!そうそう!きっとCopilot君との相性も抜群だよね!
まだ試してないけどねw こんどね。きっとね!
8/23追記: 本記事の続編を公開しました。




