にせねこメモスマートフォン用の表示で見るにせねこメモはてなダイアリーがUTF-8じゃないので移ってきました。31日)の4種で合計28種ある。祝日などを考えなければ28種を使いまわすことで任意の年月に対応できる。そんな発想で作られた、使いまわしできるカレンダーを万年カレンダーという(日数の違いにまで対応してるとは限らないが)。いう訳で、せっかくなのでこの万年カレンダーをOpenTypeフォントで実装してみる。2016-01とか2016/01とか書くと2016年1月のカレンダーが表示されるようにしたい。KB)ソースコードGitHubに挙げたのでそちらを参照。'mkmk'を有効にして表示する。いった、(年)/(月)の形に対応している。年は正数にしか対応していない*1。6桁以上の年数はOpenTypeの'mkmk'フィーチャを有効にできる環境でないとうまく年が表示できない。年が15桁以上だと月の表示と被る可能性がある。月は2桁または1桁に対応している。スラッシュはハイフンでもよい。正規表現で表すと\d+[-/]\d{1,2}となる。方針togetter.comここで色々検討されているが、カレンダーが28種類のなかからどれを使うかは、その年の元日の曜日は何かその年は閏年かどうか何月かによって決まる。元日の曜日は400年ごとに同じ並びが繰り返され、次のような計算式で計算できるっぽい。offset=3だと日曜が0となる。閏年かどうかは、西暦の年の数字が400で割り切れるときは閏年400で割り切れない、かつ、100で割り切れるときは閏年ではない400で割り切れない、かつ、100で割り切れない、かつ、4で割り切れるときは閏年それ以外は(4で割り切れないとき)は閏年ではないという風に判定でき、4で割り切れる100で割り切れる400で割り切れるかどうかの3つを組み合わせて判定できる。OpenTypeのGSUBによる置換を使って剰余等の計算を真面目に行ってもいいのだろうが、非常に面倒臭そうだし、状態の数が結構な数になってしまいそうなので、今回は西暦の年を400で割った余りについて、400通りの置換を定義することで行う。3桁未満にも対応できるように実際には置換の数はもっと増える(というか、499個)。