00:00
僕の思いつきで、そういえば今年うるう年だなと思って、 ポッドキャストでうるう年ネタ、カレンダーサービスならではのネタだし話しませんかって言ったら、
まさかのダークホースバックスが手を挙げてくれて。 バックス、ダークホースだったの? ダークホースだったんですよ。
いやいや、多分ですけど、他の人が手を挙げなかったのは、あんまりなかったからだと思うんですよ。
自分は前に開発したときにちょっと気にかけた部分があったので、 自分が行くしかないみたいなところがあったんですよ。
男気があった。
それではTimeTreeTechTalkを始めたいと思いまーす。
2024年初回、2024年はうるう年ということで、うるう年ネタで話したいということで、
iOSエンジニアのバックスをお招きして、 ちょっとうるう年に関するあれやこれを聞いていきたいなと思います。 バックスよろしくお願いします。
バックス、ちょっと軽く自己紹介お願いします。
はい、iOSエンジニアのバックスです。 自分はうるう年の専門とかではないんですけども、
以前、カレンダーの部分をいじっていたことがあって、 そのときにうるう年の問題というか、そういった課題に直面したということで、
話させていただければなということで参加させていただきました。
よろしくお願いします。
自分の自己紹介も忘れてました。 今年もアナスコットでやっていきたいと思います。よろしくお願いいたします。
よろしくお願いします。
まずうるう年、ウィキペディアで、あれ順って読むんですね。 門に中をって書いて、うるう年って感じがありますけど、
うるう年、順年っていうらしい。 英語だとリープイヤーとは、うるうのある年である。
うるうって何かっていうと、小読みにおいて1年の月の数や日数が普段の年、平年よりも多いことですね。
うるう年ではない年を平年と呼ぶということで、2月の29日がある年、4年に1回みたいなのがだいたいみんなの共通認識かなと思うんですけど。
だいたい4年に1回なんですね。
1年の平均的な長さが、だいたい365.242日だそうです。
1年が365日ではなく、ちょっと長いんですね。4分の1日ほど長い。
6時間ほどちょっと長いので、4年に1回やることで1日合うということですね。
03:01
よくできてんな。
冒険のあれによるものなのかな。
古代ローマで採用される4年に1回うるう年としていた。そんな前からわかってたことなんですね。
ということですね、うるう年に関しては。
そうですね、ちょっと補足させていただくと。
うるう年専門家が。
4で割り切れる年なんですけども、もう一つ条件があって。
ただし、100で割り切れて400で割り切れない年は平年っていう条件があるんですよね。
だから2000年はうるう年じゃなかったってことですね。
逆で2000年はうるう年だったんですよね。
100で割り切れてるけど400で?
400で割り切れるので、うるう年なんです。
逆に例えば2100年とかであれば100で割り切れるんですけど400で割り切れないので平年ということになるんですね。
なるほど。
なんか専門家っぽい。
そうなんですよ。2000年の時代に生まれていたってことは結構貴重で。
そうですね、400年に1回しかできないんですよね。
そうなんですよ。次2400年なんで。
ぼーっとして過ごしてしまった2000年。
それでうるう年の問題って僕らプログラミングを学び始めた時によく出される問題なんですよ。
多分スコット分かると思うんですけど、入力した年がうるう年かどうかを判定せよみたいな。
ちょっとフィズバーズのアシュみたいなやつですよね。
計算としては処方的なものなので、先ほど説明したように4で割り切れて、
ただし100で割り切れて400で割り切れない年は例外で平年なのでそれを除くという形で。
なので割とうるう年っていうものの存在は知っていたんですけど、実際にタイムツリーに入るまではあまり意識したことがなかったという感じです。
はい、今でもない僕は。
そうですよね、普通に生きていて意識することはほぼないですよね。
タイムツリーで取り扱ったうるう年のあれこれってどんなことがあったんですか?
そうですね、まずプログラミングの世界というかカレンダーの世界では2024年の2月29日っていう日は存在するわけじゃないですか。
で、例えばですけど2023年2月29日は存在しないんですよね。
はい。
で、例えばじゃあ2023年の2月29日はどんな日になるかっていうと、プログラミングの中ではどういう日になるかっていうと、実は3月1日にクリアがあるんですよね。
これはどういうことかっていうと、例えば25時っていうと次の日の1時になるじゃないですか。
06:06
それと同じで、存在しない日を指定するとクリアがあって3月1日になるという、そういうロジックなんですよね。
なので、単純にバグはすごく起こりにくくて、存在しない2月29日を指定してもちゃんと3月1日にクリアがあってくれるので、時間的には整合性が合っているということで。
例えばカレンダーの描画に関しても、あまり実はほぼプログラマーが意識することなくできるっていうのが実態なんですよね。
だいたい各言語に組み込みに入っているデートクラスみたいなやつが。
その通りです。
iOSに関してはカレンダークラス、デートクラスっていうのもありますし、実際それがURUDOSかっていう判定もあらかじめ基盤の中に組み込まれている感じなんですね。
ここからの話なんですけど、誕生日に、URUDOSの2月29日に誕生日だった人はどうなるかっていう。
よくある話ですよね。
そうなんですよ。
なんか犬の年齢みたいになっちゃうってことですね。
そうなんです。確か僕が小学校の時に初めてURUDOSっていうものを存在として初めて知ったと思うんですけど、
自分の母親が10歳とかっていう変な人がいたんですよね。
なるほどね。
と思ったんですけど、それがURUDOSで4年に1回しか年を取らないっていう、そういう話だったんですよ。
いいなーって。
嘘なんですけど、実際は年は取ってるんですけど。
実際、例えば2月29日に生まれた人が、URUDOSの年はいいんですけど、URUDOSじゃないときは何日に祝うかっていう問題があったんですよ。
1日前にする派か1日後にする派か。
まさにその通りです。
実はタイムツリーで誕生日の日におめでとうございますというダイアログを出しているんですけど、
どっちに出したらいいかっていうことになったんですよね。
差別問題だ。
おもろ。
そのときにいろいろ調べてですね、プロジェクトでもどっちがいいのかっていうことを調べたりしてですね、
結論としては2月28日にしました。
前の日?
そうですね、前日。
これはですね、日本の法律において、前日の24時に年齢が加算されるっていうふうに定められているみたいなんですね。
そうなんですね。
なので、例えば1月12日が誕生日の日だったら、1月12日の0時に年が変わるのではなく、
1月11日の24時に年齢が加算されるという。
09:04
時間的には一緒なんですけど、実は前日に加算されるという形ですね。
そういうロジックで、どうやらブルード氏の人は2月28日に一切年をとっているんじゃないかということになり、
2月28日を誕生日とする考えっていうのが割と定着しているということがわかったんです。
それでも日本の法律なんですよね。海外ってどうなんですかね。
海外だとまたちょっと違ったりするかとは思いますね。
難しい問題をやぶへびしてしまったかもしれない。
そうですね。ただ、日本の場合は割と法律で決まっていて、
例えば運転免許証あるじゃないですか。運転免許証で2月29日に生まれた人の免許証の更新ってどうなるかって想像つきます?
いやーわかんない。それもやっぱり28日扱いになるのかな。
そうなんですよね。本当にその人しかわからない悩みだと思うんですが、
2月28日が誕生日とみなされて、翌月の同じ日までが更新期限なので、
3月28日までが更新期限となって、実は1日損してるんじゃないかっていう。
損してる。
本当だ。
そういう話があるそうです。
ちなみにその前日の24時、例えば今日だと1月11日の0時0分0秒って12日なんですか?あれ?12日だと思ってた。
12日の0時と11日の24時って時間的には一緒。
法律上の表現として出るってことですよね。
なるほど、なるほど、なるほど。
年齢計算に関する法律っていうのがあるらしい。
国によって違いそうで、本当なんかマジで扱おうとするとなんか大変なやつだな。
それでですね、ブルー年の2月29日生まれの人の感覚からしてもですね、やはり月が変わる前にお祝いをしてほしいって人が多いようです。
2月生まれっていうことになってるのか。
そうなんですよね。
だから3月っていう風になっちゃうとちょっと違うかなという感覚があるようなんですね。
なるほどね。
面白いと言っていいのかわからないですけど、興味深いですね。
それどうやって調べたんですかバックスは?普通にググったら出てくるようなもの?
一応ですね、これは検索すれば割と出てきます。
運転免許証に関しては道路交通法で細かく書いてあるようですね。
すげー。
やろうとすると法律にぶつかるっていう。
ちなみに日本のルールがグローバル基準になってる。
12:08
今タイムツリーは実装としてはそうなってると思うんですけどね。
そうですね、できるだけタイムツリーは各国の基準にいろんなことを合わせたりはしてるんですよね。
日曜始まりなのか、週は日曜始まりなのか月曜始まりなのか。
あとは週番号の考え方についても各国にできるだけ合うように実装していて。
ただ現状ですね、ウルードスの2月29日に関しては基盤の技術的にもそういう判定がないということもあり、
2月29日生まれの人は2月28日に誕生日にするっていうところは固定で対応しているというところです。
やはり誕生日は結構大事なものなので、そこはもうプロジェクト内で、
どっちの日に誕生日を出すかっていうのは最初からいろいろ話をして、
AndroidもiOSも前日で行こうっていうのはやったことです。
めっちゃ面白い。
ちなみに2月29日に設定した1年大きな繰り返し予定とかもそういう扱いになるってことですか?
すごくいい質問ですね。
現状ですね、誕生日のお知らせに関してはその対応なんですけども、
実は繰り返しに関しては対応ができていなくて、
月のカレンダーにはウルードスしか今誕生日が表示されていないということになってしまっています。
多分Rルールで実装していると思うんで、RFCに何かしら決まりがあるんでしょうね。
そうですね、まさにRルールでして29日と月の29日に繰り返すという、
2月29日に繰り返すという設定にしているので、
29日にある2月しか繰り返されないという形になってしまっていますね。
なるほどですね、ちょっとあれですね、またRFC読み込まないといけない。
なんかありそうな気がするんですけどね。
なんかね、いろいろありそうで、ちょっと調べてみればありそうですね。
Rルールの定め方として、2月の最終日にするとか、そういうRルールにすればもしかしたら。
そうですね、うまく同い年で。
そうですね。
フル年、悩ませてこれが意外っていうのはね。
1日もやっぱり1日の時間を変えればいいんじゃない?
1秒の長さをもうちょっといい感じにすれば。
なんか、波数をもうちょっと切り上げて。
そうそうそうそう。だから1年、1年というか、地球の光点がちょうど365日ぴったりになるように1秒設定すれば。
世界は大混乱に包まれてしまう。
15:02
そうなんです。ちょっと小ネタなんですけど、これも。
このズレを解消するために、やはりウルードシというものがあるということなんですけども、
実はちょっとずつそれでもズレているということがありますね。
ちょっとずつね。
ちょっとずつズレていて、それがでも人類が存在し続ける、どれぐらい存在し続けるかによるんですけど、
今のところ1000年とかそれぐらいの単位であれば、あまりズレは気にならないということなので、
もしかしたら将来的には補正される可能性がありそうです。
なるほど。1000年ぐらいの単位で、結構あからさまにズレちゃうぐらいがズレなんですね。
そうですね、はい。そうなんです。
へー。
ちょっとタイムに似たような話で言うと、ウルビオウっていうのがあって。
やば、気狂いそうになりますね。
なはずなんですけど、12月31日の確か23時59分60秒っていうのがある、年が。
なんやねん。
直近だと2017年になったそうですけど、
めっちゃ最近ですね。
そう、4年に1回とかじゃないですけど、確かどっか決めてウルビオウっていうのを入れるみたいなのを決める組織があるらしいんですけど、
なんかちょうど廃止が決まったらしいですね。
こんな最近。
そうなんですね。
なんかいろいろシステム上問題があるシステムとないシステムがあって困るんでしょうね、これはね。
うちとかだと今サーバーAWSとか使ってる。
データベースの時間とかはAWSさんがいい感じにやってくれて、
対応が確かずっとやってるんだっけな。
24時間かけて1秒ちょっとどうにかするみたいなやり方だったり、
23時59分59秒が2秒間とかっていうパターンの対応が確かあった気がするんですけど、
そういう感じで対応することによってうまいこと、次の年には何とかみたいな。
すごい問題が起こるっていうのは想像つきますね。
タイムゾーンとかもそうですけど、100秒後がシステムによって違う時間を表すって、
結構それは問題になってきますよね、いろんなところで。
12月31日とは限らないのか、どっかの日でって決めてやるみたいな。
6月とかっていう場合もあるみたいですね。
6月の何時何分みたいな。
例えばカレンダー上でズレるのは確かに問題が起きそうだけど、
結構人類にとってクリティカルな問題って他に何あるんですかね。
日時がズレる。
日時がズレる。
小読みとかズレたり、あとGPSとか天体系とかって問題になるじゃないですかね。
正確にやってたりすると誤差、誤用誤差超えちゃうとか。
18:02
やばそうですね。
わかんないですけど、ちょっと想像で話したんで、全然ラジオで言っていい話。
いろいろありそう。
今日話したらもう4年間はしなくていいので。
4年間はしなくていい話。
ありがとうございます。
こちらこそ。
今回はですね、2024年ウルドシにまつわるアレコレをWAXに聞きました。
今回のTechTalkは以上で終わりたいと思います。
ではまた。WAXありがとうございました。
ありがとうございました。