読むのが面倒な人向けのまとめ
week
コマンドをインストールして ~/.weekrc
をこう設定するといいよ、何ができるかは week -l
を見て、という話。
option default --i18n-v --theme tokyo2020
week コマンドの続き

以前の記事。
--tokyo2020 オプション
来年開催予定の東京オリンピックの成功を祈って --tokyo2020
オプションを作ってみた。


配色については、公式発表されているデータに加え、このサイトを参考にさせて頂いた。プログラムを変更して、曜日毎に異なる色を設定できるようにして、月曜から金曜日に五輪カラーを割り当てた。それ以外はエンブレムカラーだが、こうしてみるとエンブレムの藍色以外、東京五輪特有の色というのは使われていないのだなと思った。
他のカラーテーマでは曜日の色は定義していないので、先に --tokyo2020 オプションを適用すると結果的に曜日の色だけが残り、これはこれでいい感じだ1。

ところで、この記事で使っている画像は iTerm2 の24ビットカラーで表示したものだ。前の記事にも書いたように week コマンドは24ビット表現で色を指定することができるが、通常は 6x6x6 の216色に変換して表示する。macOS 標準のターミナルで実行するとこのように表示される。

エンブレムの微妙な色 (#ee334e
) は表現できず、赤っぽくなってしまう2。Tokyo2020 のイメージとは少し違うのだが、クリスマスっぽくって結構いいんじゃないかとも思っている。
追記
その後、Getopt::EX::Colormap のアルゴリズムを見直して、#ee334e
が 501
にマップされるようになった。バージョン 0.13 以降では、次のように表示されるはずだ。若干明るいが、以前よりはだいぶ近くなったのではないだろうか。

i18n モジュール
オリンピックなのだから、カレンダーも国際色豊かにしたい。week コマンドは cal コマンドの結果を加工しているので、何もせずとも locale 対応している。というか、どんな文字列が来ても処理できるよう、それなりに工夫している。だからこんな風に環境変数を設定すれば簡単に各国のカレンダーを表示できる。

i18n モジュールは、この作業を簡単にするものだ。自国語の設定はログイン時に一度やっておけばいいが、馴染みのない国のロケールコードを知るのは簡単ではない。たとえば、ブラジルの場合 pt_BR
を指定するなんて普通の日本人は覚えてないだろう。でもブラジルが BR であることは知っているかもしれない。-M18n モジュールをロードすると、以下のオプションが設定されて --br
でブラジルのカレンダーを表示することができる。
option --BR &setenv(LANG=pt_BR) # Brazil / Portuguese
option --br &setenv(LANG=pt_BR) # Brazil / Portuguese
option --pt_BR &setenv(LANG=pt_BR) # Brazil / Portuguese
option --ptbr &setenv(LANG=pt_BR) # Brazil / Portuguese

オプションの一覧は week -l
で表示することができる。macOS 10.15 (Catalina) で実行すると次のようになる。詳しい説明は Getopt::EX::i18n を見ていただきたい。
$ week -l
option --AM &setenv(LANG=hy_AM) # Armenia / Armenian
option --hy &setenv(LANG=hy_AM) # Armenia / Armenian
option --hy_AM &setenv(LANG=hy_AM) # Armenia / Armenian
option --hyam &setenv(LANG=hy_AM) # Armenia / Armenian
option --AT &setenv(LANG=de_AT) # Austria / German
option --at &setenv(LANG=de_AT) # Austria / German
option --de_AT &setenv(LANG=de_AT) # Austria / German
option --deat &setenv(LANG=de_AT) # Austria / German
option --AU &setenv(LANG=en_AU) # Australia / English
option --au &setenv(LANG=en_AU) # Australia / English
option --en &setenv(LANG=en_AU) # Australia / English
option --en_AU &setenv(LANG=en_AU) # Australia / English
option --enau &setenv(LANG=en_AU) # Australia / English
option --fr_BE &setenv(LANG=fr_BE) # Belgium / French
option --frbe &setenv(LANG=fr_BE) # Belgium / French
option --nl_BE &setenv(LANG=nl_BE) # Belgium / Dutch
option --nlbe &setenv(LANG=nl_BE) # Belgium / Dutch
option --BG &setenv(LANG=bg_BG) # Bulgaria / Bulgarian
option --bg &setenv(LANG=bg_BG) # Bulgaria / Bulgarian
option --bg_BG &setenv(LANG=bg_BG) # Bulgaria / Bulgarian
option --bgbg &setenv(LANG=bg_BG) # Bulgaria / Bulgarian
option --BR &setenv(LANG=pt_BR) # Brazil / Portuguese
option --br &setenv(LANG=pt_BR) # Brazil / Portuguese
option --pt_BR &setenv(LANG=pt_BR) # Brazil / Portuguese
option --ptbr &setenv(LANG=pt_BR) # Brazil / Portuguese
option --BY &setenv(LANG=be_BY) # Belarus / Belarusian
option --be &setenv(LANG=be_BY) # Belarus / Belarusian
option --be_BY &setenv(LANG=be_BY) # Belarus / Belarusian
option --beby &setenv(LANG=be_BY) # Belarus / Belarusian
option --by &setenv(LANG=be_BY) # Belarus / Belarusian
option --en_CA &setenv(LANG=en_CA) # Canada / English
option --enca &setenv(LANG=en_CA) # Canada / English
option --fr_CA &setenv(LANG=fr_CA) # Canada / French
option --frca &setenv(LANG=fr_CA) # Canada / French
option --de_CH &setenv(LANG=de_CH) # Switzerland / German
option --dech &setenv(LANG=de_CH) # Switzerland / German
option --fr_CH &setenv(LANG=fr_CH) # Switzerland / French
option --frch &setenv(LANG=fr_CH) # Switzerland / French
option --it_CH &setenv(LANG=it_CH) # Switzerland / Italian
option --itch &setenv(LANG=it_CH) # Switzerland / Italian
option --CN &setenv(LANG=zh_CN) # China / Chinese
option --cn &setenv(LANG=zh_CN) # China / Chinese
option --zh &setenv(LANG=zh_CN) # China / Chinese
option --zh_CN &setenv(LANG=zh_CN) # China / Chinese
option --zhcn &setenv(LANG=zh_CN) # China / Chinese
option --CZ &setenv(LANG=cs_CZ) # Czech Republic / Czech
option --cs &setenv(LANG=cs_CZ) # Czech Republic / Czech
option --cs_CZ &setenv(LANG=cs_CZ) # Czech Republic / Czech
option --cscz &setenv(LANG=cs_CZ) # Czech Republic / Czech
option --cz &setenv(LANG=cs_CZ) # Czech Republic / Czech
option --DE &setenv(LANG=de_DE) # Germany / German
option --de &setenv(LANG=de_DE) # Germany / German
option --de_DE &setenv(LANG=de_DE) # Germany / German
option --dede &setenv(LANG=de_DE) # Germany / German
option --DK &setenv(LANG=da_DK) # Denmark / Danish
option --da &setenv(LANG=da_DK) # Denmark / Danish
option --da_DK &setenv(LANG=da_DK) # Denmark / Danish
option --dadk &setenv(LANG=da_DK) # Denmark / Danish
option --dk &setenv(LANG=da_DK) # Denmark / Danish
option --EE &setenv(LANG=et_EE) # Estonia / Estonian
option --ee &setenv(LANG=et_EE) # Estonia / Estonian
option --et &setenv(LANG=et_EE) # Estonia / Estonian
option --et_EE &setenv(LANG=et_EE) # Estonia / Estonian
option --etee &setenv(LANG=et_EE) # Estonia / Estonian
option --ES &setenv(LANG=es_ES) # Spain / Spanish
option --ca &setenv(LANG=ca_ES) # Spain / Catalan; Valencian
option --ca_ES &setenv(LANG=ca_ES) # Spain / Catalan; Valencian
option --caes &setenv(LANG=ca_ES) # Spain / Catalan; Valencian
option --es &setenv(LANG=es_ES) # Spain / Spanish
option --es_ES &setenv(LANG=es_ES) # Spain / Spanish
option --eses &setenv(LANG=es_ES) # Spain / Spanish
option --eu &setenv(LANG=eu_ES) # Spain / Basque
option --eu_ES &setenv(LANG=eu_ES) # Spain / Basque
option --eues &setenv(LANG=eu_ES) # Spain / Basque
option --ET &setenv(LANG=am_ET) # Ethiopia / Amharic
option --am &setenv(LANG=am_ET) # Ethiopia / Amharic
option --am_ET &setenv(LANG=am_ET) # Ethiopia / Amharic
option --amet &setenv(LANG=am_ET) # Ethiopia / Amharic
option --FI &setenv(LANG=fi_FI) # Finland / Finnish
option --fi &setenv(LANG=fi_FI) # Finland / Finnish
option --fi_FI &setenv(LANG=fi_FI) # Finland / Finnish
option --fifi &setenv(LANG=fi_FI) # Finland / Finnish
option --FR &setenv(LANG=fr_FR) # France / French
option --fr &setenv(LANG=fr_FR) # France / French
option --fr_FR &setenv(LANG=fr_FR) # France / French
option --frfr &setenv(LANG=fr_FR) # France / French
option --GB &setenv(LANG=en_GB) # United Kingdom / English
option --en_GB &setenv(LANG=en_GB) # United Kingdom / English
option --engb &setenv(LANG=en_GB) # United Kingdom / English
option --gb &setenv(LANG=en_GB) # United Kingdom / English
option --GR &setenv(LANG=el_GR) # Greece / Greek, Modern (1453-)
option --el &setenv(LANG=el_GR) # Greece / Greek, Modern (1453-)
option --el_GR &setenv(LANG=el_GR) # Greece / Greek, Modern (1453-)
option --elgr &setenv(LANG=el_GR) # Greece / Greek, Modern (1453-)
option --gr &setenv(LANG=el_GR) # Greece / Greek, Modern (1453-)
option --HK &setenv(LANG=zh_HK) # Hong Kong / Chinese
option --hk &setenv(LANG=zh_HK) # Hong Kong / Chinese
option --zh_HK &setenv(LANG=zh_HK) # Hong Kong / Chinese
option --zhhk &setenv(LANG=zh_HK) # Hong Kong / Chinese
option --HR &setenv(LANG=hr_HR) # Croatia / Croatian
option --hr &setenv(LANG=hr_HR) # Croatia / Croatian
option --hr_HR &setenv(LANG=hr_HR) # Croatia / Croatian
option --hrhr &setenv(LANG=hr_HR) # Croatia / Croatian
option --HU &setenv(LANG=hu_HU) # Hungary / Hungarian
option --hu &setenv(LANG=hu_HU) # Hungary / Hungarian
option --hu_HU &setenv(LANG=hu_HU) # Hungary / Hungarian
option --huhu &setenv(LANG=hu_HU) # Hungary / Hungarian
option --IE &setenv(LANG=en_IE) # Ireland / English
option --en_IE &setenv(LANG=en_IE) # Ireland / English
option --enie &setenv(LANG=en_IE) # Ireland / English
option --ie &setenv(LANG=en_IE) # Ireland / English
option --IL &setenv(LANG=he_IL) # Israel / Hebrew
option --he &setenv(LANG=he_IL) # Israel / Hebrew
option --he_IL &setenv(LANG=he_IL) # Israel / Hebrew
option --heil &setenv(LANG=he_IL) # Israel / Hebrew
option --il &setenv(LANG=he_IL) # Israel / Hebrew
option --IS &setenv(LANG=is_IS) # Iceland / Icelandic
option --is &setenv(LANG=is_IS) # Iceland / Icelandic
option --is_IS &setenv(LANG=is_IS) # Iceland / Icelandic
option --isis &setenv(LANG=is_IS) # Iceland / Icelandic
option --IT &setenv(LANG=it_IT) # Italy / Italian
option --it &setenv(LANG=it_IT) # Italy / Italian
option --it_IT &setenv(LANG=it_IT) # Italy / Italian
option --itit &setenv(LANG=it_IT) # Italy / Italian
option --JP &setenv(LANG=ja_JP) # Japan / Japanese
option --ja &setenv(LANG=ja_JP) # Japan / Japanese
option --ja_JP &setenv(LANG=ja_JP) # Japan / Japanese
option --jajp &setenv(LANG=ja_JP) # Japan / Japanese
option --jp &setenv(LANG=ja_JP) # Japan / Japanese
option --KR &setenv(LANG=ko_KR) # Korea, Republic of / Korean
option --ko &setenv(LANG=ko_KR) # Korea, Republic of / Korean
option --ko_KR &setenv(LANG=ko_KR) # Korea, Republic of / Korean
option --kokr &setenv(LANG=ko_KR) # Korea, Republic of / Korean
option --kr &setenv(LANG=ko_KR) # Korea, Republic of / Korean
option --KZ &setenv(LANG=kk_KZ) # Kazakhstan / Kazakh
option --kk &setenv(LANG=kk_KZ) # Kazakhstan / Kazakh
option --kk_KZ &setenv(LANG=kk_KZ) # Kazakhstan / Kazakh
option --kkkz &setenv(LANG=kk_KZ) # Kazakhstan / Kazakh
option --kz &setenv(LANG=kk_KZ) # Kazakhstan / Kazakh
option --LT &setenv(LANG=lt_LT) # Lithuania / Lithuanian
option --lt &setenv(LANG=lt_LT) # Lithuania / Lithuanian
option --lt_LT &setenv(LANG=lt_LT) # Lithuania / Lithuanian
option --ltlt &setenv(LANG=lt_LT) # Lithuania / Lithuanian
option --NL &setenv(LANG=nl_NL) # Netherlands / Dutch
option --nl &setenv(LANG=nl_NL) # Netherlands / Dutch
option --nl_NL &setenv(LANG=nl_NL) # Netherlands / Dutch
option --nlnl &setenv(LANG=nl_NL) # Netherlands / Dutch
option --NO &setenv(LANG=no_NO) # Norway / Norwegian
option --no &setenv(LANG=no_NO) # Norway / Norwegian
option --no_NO &setenv(LANG=no_NO) # Norway / Norwegian
option --nono &setenv(LANG=no_NO) # Norway / Norwegian
option --NZ &setenv(LANG=en_NZ) # New Zealand / English
option --en_NZ &setenv(LANG=en_NZ) # New Zealand / English
option --ennz &setenv(LANG=en_NZ) # New Zealand / English
option --nz &setenv(LANG=en_NZ) # New Zealand / English
option --PL &setenv(LANG=pl_PL) # Poland / Polish
option --pl &setenv(LANG=pl_PL) # Poland / Polish
option --pl_PL &setenv(LANG=pl_PL) # Poland / Polish
option --plpl &setenv(LANG=pl_PL) # Poland / Polish
option --PT &setenv(LANG=pt_PT) # Portugal / Portuguese
option --pt &setenv(LANG=pt_PT) # Portugal / Portuguese
option --pt_PT &setenv(LANG=pt_PT) # Portugal / Portuguese
option --ptpt &setenv(LANG=pt_PT) # Portugal / Portuguese
option --RO &setenv(LANG=ro_RO) # Romania / Romanian
option --ro &setenv(LANG=ro_RO) # Romania / Romanian
option --ro_RO &setenv(LANG=ro_RO) # Romania / Romanian
option --roro &setenv(LANG=ro_RO) # Romania / Romanian
option --RU &setenv(LANG=ru_RU) # Russian Federation / Russian
option --ru &setenv(LANG=ru_RU) # Russian Federation / Russian
option --ru_RU &setenv(LANG=ru_RU) # Russian Federation / Russian
option --ruru &setenv(LANG=ru_RU) # Russian Federation / Russian
option --SE &setenv(LANG=sv_SE) # Sweden / Swedish
option --se &setenv(LANG=sv_SE) # Sweden / Swedish
option --sv &setenv(LANG=sv_SE) # Sweden / Swedish
option --sv_SE &setenv(LANG=sv_SE) # Sweden / Swedish
option --svse &setenv(LANG=sv_SE) # Sweden / Swedish
option --SI &setenv(LANG=sl_SI) # Slovenia / Slovenian
option --si &setenv(LANG=sl_SI) # Slovenia / Slovenian
option --sl &setenv(LANG=sl_SI) # Slovenia / Slovenian
option --sl_SI &setenv(LANG=sl_SI) # Slovenia / Slovenian
option --slsi &setenv(LANG=sl_SI) # Slovenia / Slovenian
option --SK &setenv(LANG=sk_SK) # Slovakia / Slovak
option --sk &setenv(LANG=sk_SK) # Slovakia / Slovak
option --sk_SK &setenv(LANG=sk_SK) # Slovakia / Slovak
option --sksk &setenv(LANG=sk_SK) # Slovakia / Slovak
option --TR &setenv(LANG=tr_TR) # Turkey / Turkish
option --tr &setenv(LANG=tr_TR) # Turkey / Turkish
option --tr_TR &setenv(LANG=tr_TR) # Turkey / Turkish
option --trtr &setenv(LANG=tr_TR) # Turkey / Turkish
option --TW &setenv(LANG=zh_TW) # Taiwan, Province of China / Chinese
option --tw &setenv(LANG=zh_TW) # Taiwan, Province of China / Chinese
option --zh_TW &setenv(LANG=zh_TW) # Taiwan, Province of China / Chinese
option --zhtw &setenv(LANG=zh_TW) # Taiwan, Province of China / Chinese
option --UA &setenv(LANG=uk_UA) # Ukraine / Ukrainian
option --ua &setenv(LANG=uk_UA) # Ukraine / Ukrainian
option --uk &setenv(LANG=uk_UA) # Ukraine / Ukrainian
option --uk_UA &setenv(LANG=uk_UA) # Ukraine / Ukrainian
option --ukua &setenv(LANG=uk_UA) # Ukraine / Ukrainian
option --US &setenv(LANG=en_US) # United States / English
option --en_US &setenv(LANG=en_US) # United States / English
option --enus &setenv(LANG=en_US) # United States / English
option --us &setenv(LANG=en_US) # United States / English
option --YU &setenv(LANG=sr_YU) # Yugoslavia / Serbian
option --sr &setenv(LANG=sr_YU) # Yugoslavia / Serbian
option --sr_YU &setenv(LANG=sr_YU) # Yugoslavia / Serbian
option --sryu &setenv(LANG=sr_YU) # Yugoslavia / Serbian
option --yu &setenv(LANG=sr_YU) # Yugoslavia / Serbian
option --ZA &setenv(LANG=af_ZA) # South Africa / Afrikaans
option --af &setenv(LANG=af_ZA) # South Africa / Afrikaans
option --af_ZA &setenv(LANG=af_ZA) # South Africa / Afrikaans
option --afza &setenv(LANG=af_ZA) # South Africa / Afrikaans
option --za &setenv(LANG=af_ZA) # South Africa / Afrikaans
このモジュールは week コマンド専用ではなく、Getopt::EX を利用するすべてのコマンドで使うことができる。さらに汎用の optex コマンドを使えば、任意のコマンドを実行することが可能だ。
$ optex -Mi18n::setopt=verbose date --it
LANG=it_IT (Italian / Italy)
Gio 4 Giu 2020 16:47:33 JST
設定
default.pm
で以下のように設定してあるので、--i18n
と --i18n-v
というオプションが利用可能になっている。両者の違いは、ロケール情報を最初に表示するかどうかだ。
option --i18n -Mi18n::setopt(dash=0,long=0,listopt=-l)
option --i18n-v -Mi18n::setopt(dash=0,long=0,verbose,listopt=-l)
autoload --i18n -l
~/.weekrc
を以下のようにしておけば、デフォルトのテーマを tokyo2020
にし、明るい端末では --tokyo2020
が、暗い端末では --tokyo2020-rev
が自動的に設定される。
option default --i18n-v --theme tokyo2020
インストール
cpan で公開しているので、cpanm (cpanminus) を使ってインストールします。
$ curl -sL http://cpanmin.us | perl - App::week
各国のカレンダー
デバッグのためにいろいろな国のカレンダーを見ていたのだが、これが結構面白い。もちろん言葉はさっぱりわからないが、なにしろカレンダーなので意味はわかっている。一番のお勧めは何かと聞かれたらエストニアだろうか。
なんとなく気に入ったカレンダー
Czech Republic / Czech
チェコ。毛が生えてるw

Estonia / Estonian
エストニア。曜日が一文字で不安定なところが愛せる。

Spain / Basque
バスク語。基本的に曜日が小文字で始まるとなんとなく可愛い。a, b, g, o など、まるっぽい字が多いせいもあるだろうか。

Finland / Finnish
フィンランド。テンテンがいい。

Hungary / Hungarian

Iceland / Icelandic

Lithuania / Lithuanian
リトアニア。草生えてるw

Netherlands / Dutch
うさこちゃんの国。

Norway / Norwegian
オランダ語と似ているが、土曜日だけ似てない。

Poland / Polish

Sweden / Swedish

Slovenia / Slovenian

Slovakia / Slovak

Yugoslavia / Serbian

文字が判別できないカレンダー
Armenia / Armenian
アルメニア。

Ethiopia / Amharic
エチオピア。
枠からはみ出てるし... しかも日曜日は右に、金曜日は左に...

Israel / Hebrew
イスラエル。正しく表示されているのか判断できず。
ちなみに、これは iTerm だとちゃんと表示できますが、Apple_Terminal では表示が壊れます。

かっこいいカレンダー
ギリシャ、カコイイ。ΔとかΣとかが日常で使われてるのかと思ったり。ギリシャでも円周率はπなんだろうか。なんだろうなあ。
Greece / Greek, Modern (1453-)

Kazakhstan / Kazakh
金曜日とかキツキツw

キリル文字っぽいカレンダー
Bulgaria / Bulgarian

Belarus / Belarusian

Russian Federation / Russian

Ukraine / Ukrainian

アジア
漢字の国でも、それぞれ微妙に違う。香港と台湾は同じか。
China / Chinese

Hong Kong / Chinese

Japan / Japanese

Korea, Republic of / Korean

Taiwan, Province of China / Chinese

英語圏
これは、全部同じっぽい。ただし、OS によっては Tu
と Th
以外を1文字で表示したり、右寄せと左寄せが違ったりとバリエーションがあって、テストコードを書くのには結構苦労したのだ。テストは LANG=C
でしかしてないので、他の言語についてはわからない。
Australia / English

Canada / English

United Kingdom / English

Ireland / English

New Zealand / English

United States / English

South Africa / Afrikaans

その他
Austria / German

Belgium / French

Belgium / Dutch

Brazil / Portuguese
月曜と金曜、水曜と木曜が同じだ。いいのか?

Canada / French

Switzerland / German

Switzerland / French

Switzerland / Italian

Germany / German

Denmark / Danish

Spain / Catalan; Valencian
曜日が全部 d
ではじまる。

Spain / Spanish

France / French

Croatia / Croatian

Italy / Italian

Portugal / Portuguese


Turkey / Turkish
