jk-meets-js

恋に落ちるコード.js [技術系コメディ/短編/連載中]

This project is maintained by 8novels

恋に落ちた日 -Every time I fall in love-

「ところで絵子、時間と言うのは実にかけがえのない、大事なものだな」
「どうした。今日はいつにも増して唐突でどうした」

 放課後、|情報処理《JS》部の部室。
 今日も|瀬尾絵子《せのおえこ》と|篠宮樹里《しのみやじゅり》の二人は、部活動という学生生活を謳歌している。

「いや、私たちがこの|学舎《まなびや》で楽しく過ごせる時間も、そう長くは残されていない」
「……確かに、そうだよね。考えると寂しいけど、その通りだよね」
「|制服《ブレザー》というプレミアコスチュームを無理なく身にまとえる時間も限られている」
「一気に動機が不純になったように聞こえるなー」
「そんな時間の大切さと儚さを、今日はJavaScriptで表現してみよう」
「この強引なやり取りも、限りがあると思うと感慨深いわ」

 部室の中央に置かれた、それなりには立派な事務用デスク。
 その正面の席に絵子が座る。
 絵子の右手、袖机の真上。デスクの縁に樹里が浅く腰掛ける。
 樹里を見上げる絵子。絵子を見守る樹里。
 いつもの、当たり前の光景。

「さて、JavaScriptでも、他の言語と同様に、日付や時刻を取り扱う仕組みが用意されている」
「ま、プログラムには外せない概念だからねー」
「具体的にはDateオブジェクトを使用する。宣言する時の構文は……絵子、書いてみよう」
「えー。まあ、わかるけどさ」

 と、絵子はMacBookを引き寄せ、お気に入りのテキストエディタにコードを入力する。

   var d = new Date();  

「Webページに現在時刻を表示するサンプル、とかでイヤっていうほど見てきたからねー」
「その通り。このDateオブジェクトの中には、協定世界時(UTC)の1970年1月1日0時0分0秒を起点とした、ミリ秒単位の整数が格納される」
「ミリ秒刻みで送る人生ってイヤだねー」
「絵子には求めてないぞ……で、その値が1,000なら0時0分1秒になるし、86,400,000なら1970年1月2日の0時になる」
「ふーん。たった1日で8,640万も進んじゃうのか。なんかすごい無駄に浪費してる感が……改めて時間って大事だよね」
「正確な時刻を扱うためには仕方なかろう」
「ドライだねー。あ、そういえばさ、その日付なんだけど。機械の日付を1970年1月1日にすると壊れるとか、何度か聞いたことがあるんだけど」
「それも、多くのシステムの時計が、この日を起点としていることに端を発する問題だ。ゼロ、またはゼロに近い値が設定されることで、予期しないバグを引き起こしたりするらしい」
「へー」

 絵子は自分のスマートフォンを眺めながら頷く。

「ところでさ、なんでその日が起点なの? 西暦1年とかの方がキリがいいのに」
「これ、色々調べてみたんだがな。なんとなく都合が良かったから、らしいぞ」
「はあ?」

 絵子は慌てて顔を上げる。

「昔はコンピュータのメモリも少なかったし、限られた範囲の日付しか扱えなかった。なので、だいたい1970年から数えて数十年分の時間が扱えればいいんじゃね? といった理由で決まったとかなんとか」
「ほんとかねー。でも事実、大半のシステムの時計がもうそれで動いちゃってるからねー」

 絵子は再びスマートフォンに視線を移し、時計アプリをタップして起動した。画面の中で時刻が秒単位で刻まれていく。

「ちなみに最新のJavaScriptの仕様では、1970年1月1日から前後1億日の日付を扱える」
「いちおくにち! JavaScriptでいちおくにち!」
「年数でいうと、ざっと27万年だ」
「にじゅう、なな、まんねん!」
「ちなみにネアンデルタール人が出現したのが23万年前だと言われている」
「ネアンデルタール人! ネアンデルタール人の日々のスケジュールも管理できる!」
「JavaScriptにおいては、日付のオーバーフローの問題は事実上ない、と言っていいだろう」
「ほえー。コンピューターもこの数十年で進化したねー」

「そんなわけでDateオブジェクトは、日付の計算に特化した、便利なメソッドが数多く備わっている」
「ふむふむ」
「例えば……」

   var d = new Date("2019/2/14");  

「……宣言時に、日付や時刻として判別できる文字列を渡せば、その日時で初期化してくれる」
「ほー。うまいこと解析してくれるのは便利だね」
「他にも……」

   var d = new Date( 2019, 1, 14 );  

「……みたいに、年・月・日を示す数値を順に渡せば、同様にその日時に変換してくれる。ただし月は0から始まるので注意してほしい」
「それだっ!」

 絵子は樹里の顔に人差し指を突きつける。思わず避けた樹里の黒髪が左右に揺れる。

「この、月だけは0から始まるっての、未だに納得いかないんだけどね、私は」
「そうは言っても、しょうがないだろう。昔からそうなのだから」
「欧米人は1月、2月じゃなくてJanuaryとかFebruaryとか呼ぶから、だったら0から始まるインデックスで返す方が自然である。とか、そう言うんでしょう?」
「よく知ってるじゃないか」
「樹里はいつもそう。理屈で返して、私の心を弄ぶ」
「……なんの話だ」
「ともかく、なんか納得いかなくない? ISO8601とかいう国際規格でも、2月14日は『2019-02-14』と表記する、とか決まってんだよね?」
「それも、よく知ってるじゃないか」
「これ、欧米人は納得してるんだろうか。『2019-02-14』と表示するのに『2019, 1, 14』と入力するの」
「いや、おそらく納得してないが、今さら直しようがないというのが正直なところだろう。向こうにも絵子みたいに不平不満を言う奴らがわんさか居ると思うぞ」
「そっかー。急に親近感が湧いてきた。君達も頑張りたまえ」
「はいはい。えー、あとは……」

   d.getDate();  

「とすると、日時のうち『日』の部分だけを取得できる。今回だと『14』が返ってくるな」
「あー、これも散々見たぞ。あと時計の表示にgetHoursとかgetMinutesとか」
「日付や時刻を|解析《パース》したり|整形《フォーマット》したりという処理は、今でもよく使うので覚えておいて損はない」
「はーい」
「もちろん、頻繁に使われる書式には、簡単に変換できるように専用のメソッドが用意されている。代表的なのがtoISOStringだ」
「お、さっき言ってたやつだね」

   d.toISOString();  

「こうすると、『2019-02-13T15:00:00.000Z』という書式の日付が返ってくる。他のサービスとデータをやり取りする場合は、日付はこの書式にしておくのが無難だ」
「ふむふむ」
「同じようなメソッドにtoJSONというものもある。その名の通り、日付をJSON形式の文字列に変換する。ま、結果はtoISOStringと同じなのだが」
「JSON?」
「JSONについては、喜べ、来週のあのラジオでやるらしいぞ」 「……またあいつか」

 *

 帰り道。だいぶ陽も傾いてきた。今日という日が去っていく。
 学生生活という、後からどんなに求めようとも、決して手の届かないカード。
 そのカードがまた一枚、はらりと落ちていく。

「ねえ、樹里」
「ん?」
「私、頑張ってるかな」
「……急に、何の話だ」
「時間の話とかしたからさ、なんか不安になっちゃって」

 二人同時に立ち止まる。アスファルトから昇る熱気が二人を包む。

「十年後、二十年後の自分にさ。恥ずかしくないように、全力で生きてるかな。私」
「……突然すぎて、よく分からないが」

 樹里は絵子の真正面に立つと。
 絵子の口に両の人差し指を突っ込み、左右に大きく引っ張った。

「どの口が抜かすのか。この口か」
「あ、あひぇー」
「誰かがOKと言えばそれで処理を止めるのか。お前のMAX_VALUEはそんなに簡単に求められるのか」
「ま、まっへ、まっへ」
「つべこべ言わずに、今できるすべてのことをやれ。わかったか」

 絵子は慌てて頷く。ほどなく、二本の人差し指から解放される。

「カーリーブラケットと命名した」
「え? ……ああ、今の攻撃か」

 絵子が微笑む。おそらく今日という日にしか見られない、輝く笑顔。

「……ありがとね、樹里」

 そっと腕を絡ませる。影が重なる。

「……次の攻撃は、ブラケットと命名する」
「……四本指で、ということかな?」