現在位置: ホーム / みらくるブログ / 改元後に平成を表示させないようにしてみた

改元後に平成を表示させないようにしてみた

2019 年 5 月 1 日から元号が「令和」に変わります。改元に伴い、対応は必要なの?動作にはどんな影響があるの?など様々な疑問があると思います。このブログでは、改元による影響や Asianux Server 7 を用いて改元対応を試してみた際の手順をご紹介したいと思います。

お久しぶりの方も初めましての方もこんにちは。
CTJ 松江ラボ所属のでぃさんです。

今回は改元に伴う影響や、Asianux Server 製品を用いて改元対応を行った際の手順についてお伝えしようと思います。

Asianux Server 製品って?

改元についてのお話に入る前に、今回使用した Asianux Server 製品について簡単に説明します。

Asianux Server 製品は、日本のサービスレベルに求められる信頼性、安全性、可用性、セキュリティ機能を兼ね備えた、アジアでのビジネス要件に最適化された Linux OS です。そして、国内のエンジニアによるサポートを 10 年にわたって提供可能という強みも兼ね備えています。また、2019 年 3 月 7 日には Asianux Server 7 == MIRACLE LINUX V7 SP3 というマイナーバージョンアップも出たばかりです。ちなみに、私が普段使っている環境も Asianux Server 7 です。

Asianux Server 製品についての詳細は以下のページからご確認いただけますので、興味がありましたら確認してみてください。

改元に伴う影響は?

動作への影響

カーネルでは日時情報として和暦に依存していないため、改元に伴う対応を行わなかった場合でも直接的にシステム停止を引き起こすなど、動作への影響はありません。

表示への影響

OS 標準のライブラリを用いて元号を表記するようなアプリケーションでは、改元に伴う対応を行わなかった場合には「平成32年」などの表記がされます。また、元号を表現する組み文字は改元に伴う対応をしていないフォントには収録されていないため、正確な表示がされません。

今後の対応などについては、以下のページに詳細が載っていますのでご参照ください。

改元後の表示変更を 2 パターン試してみた

上述したように、改元対応を行っていないと元号の表示に影響があります。表示がこのままだと困るので、Asianux Server 7 ではどうやって表示を変更させるのか調べてみました!

今回は、その中の一例をご紹介します。ここで紹介するのはあくまで一例ですので、他にも様々なアプローチで改元に関する変更を行うことが出来ます。別のアプローチで試してみるのも楽しいと思いますよ。

まず、比較のために対応を行っていない場合の表示を確認します。例として、2019 年 5 月 1 日を和暦で表示させます。2019 年 3 月時点でリリースしている新元号に対応していないライブラリを使用しており、かつ日本語環境で動作させている場合には以下のような表示になります。

 $ LC_TIME="ja_JP.utf8" date "+%F %Ex" -d "2019-05-01"
2019-05-01 平成31年05月01日

今回は、この表示が「西暦2019年05月01日」になる場合と「令和元年05月01日」になる場合を目標に2パターンの変更を行っていきます。

ステップ1:編集するファイルを見つける

まずは、改元対応を行うにあたり編集するファイルを見つけます。
以下のコマンドを実行し、date コマンドがどこを参照しているのか確認します。結果をみると、以下のファイルを参照していることが分かります。

$ strace -e,open date "+%F %Ex" -d "2019-05-01"
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 3
2019-05-01 平成31年05月01日
+++ exited with 0 +++

そして、名前からしていかにもロケール情報を扱っていそうな「/usr/lib/locale/locale-archive」は何だろうと調べてみました。すると、どうやら glibc 関連のパッケージ由来の localedef でコンパイルされたロケールのアーカイブであることが分かりました。

$ rpm -qf /usr/lib/locale/locale-archive
glibc-common-2.17-222.el7.x86_64

では、定義ファイルはどこにあるのだろうという疑問が次に出てきます。調べてみると、「/usr/share/i18n/locales」配下にあるということが分かりました。今回私は、localedef の man から調べてみました。

$ man localedef
:
:
/usr/share/i18n/locales
Usual default path for locale definition files.

/usr/share/i18n/repertoiremaps
Usual default repertoire map path.

/usr/lib/locale/locale-archive
Usual default locale archive location.
:

ここまで分かれば、定義ファイルのあるディレクトリ内で find コマンドを使ってファイルを探すのが手っ取り早いと思い、「ja」という単語で検索をかけました。

$ find /usr/share/i18n/locales | grep ja
/usr/share/i18n/locales/ja_JP

すると、1つのファイルが見つかりました。このファイルを開き、「era」という単語で検索をかけてみると、それらしい定義箇所が見つかります。

ステップ2:ファイルの修正を行う

では、変更する箇所が分かったのでファイルを編集していきます。元ファイルと編集後の diff を以下に示します。

★2019年05月01日以降「西暦」で表示するように変更した場合

$ diff -uNr /usr/share/i18n/locales/ja_JP ja_JP_new
--- /usr/share/i18n/locales/ja_JP 2018-04-18 15:04:51.000000000 +0900
+++ ja_JP_new 2019-03-27 18:15:20.224215448 +0900
@@ -14942,7 +14942,8 @@

t_fmt_ampm "<U0025><U0070><U0025><U0049><U6642><U0025><U004D><U5206><U0025><U0053><U79D2>"

-era "<U002B><U003A><U0032><U003A><U0031><U0039><U0039><U0030><U002F><U0030><U0031><U002F><U0030><U0031><U003A><U002B><U002A><U003A><U5E73><U6210><U003A><U0025><U0045><U0043><U0025><U0045><U0079><U5E74>";/
+era "<U002B><U003A><U0032><U0030><U0031><U0039><U003A><U0032><U0030><U0031><U0039><U002F><U0030><U0035><U002F><U0030><U0031><U003A><U002B><U002A><U003A><U897F><U66A6><U003A><U0025><U0045><U0043><U0025><U0045><U0079><U5E74>";/
+ "<U002B><U003A><U0032><U003A><U0031><U0039><U0039><U0030><U002F><U0030><U0031><U002F><U0030><U0031><U003A><U0032><U0030><U0031><U0039><U002F><U0030><U0034><U002F><U0033><U0030><U003A><U5E73><U6210><U003A><U0025><U0045><U0043><U0025><U0045><U0079><U5E74>";/
"<U002B><U003A><U0031><U003A><U0031><U0039><U0038><U0039><U002F><U0030><U0031><U002F><U0030><U0038><U003A><U0031><U0039><U0038><U0039><U002F><U0031><U0032><U002F><U0033><U0031><U003A><U5E73><U6210><U003A><U0025><U0045><U0043><U5143><U5E74>";/
"<U002B><U003A><U0032><U003A><U0031><U0039><U0032><U0037><U002F><U0030><U0031><U002F><U0030><U0031><U003A><U0031><U0039><U0038><U0039><U002F><U0030><U0031><U002F><U0030><U0037><U003A><U662D><U548C><U003A><U0025><U0045><U0043><U0025><U0045><U0079><U5E74>";/
"<U002B><U003A><U0031><U003A><U0031><U0039><U0032><U0036><U002F><U0031><U0032><U002F><U0032><U0035><U003A><U0031><U0039><U0032><U0036><U002F><U0031><U0032><U002F><U0033><U0031><U003A><U662D><U548C><U003A><U0025><U0045><U0043><U5143><U5E74>";/

diff の内容だけではどのように変更したのか分かり辛いと思いますので、以下に分かりやすくしたものを示します。

●変更前
era "+:2:1990/01/01:+*:平成:%EC%Ey年";/
"+:1:1989/01/08:1989/12/31:平成:%EC元年";/
"+:2:1927/01/01:1989/01/07:昭和:%EC%Ey年";/
"+:1:1926/12/25:1926/12/31:昭和:%EC元年";/
"+:2:1913/01/01:1926/12/24:大正:%EC%Ey年";/
"+:2:1912/07/30:1912/12/31:大正:%EC元年";/
"+:6:1873/01/01:1912/07/29:明治:%EC%Ey年";/
"+:1:0001/01/01:1872/12/31:西暦:%EC%Ey年";/
"+:1:-0001/12/31:-*:紀元前:%EC%Ey年"

●変更後
era "+:2019:2019/05/01:+*:西暦:%EC%Ey年";/
"+:2:1990/01/01:2019/04/30:平成:%EC%Ey年";/
"+:1:1989/01/08:1989/12/31:平成:%EC元年";/
"+:2:1927/01/01:1989/01/07:昭和:%EC%Ey年";/
"+:1:1926/12/25:1926/12/31:昭和:%EC元年";/
"+:2:1913/01/01:1926/12/24:大正:%EC%Ey年";/
"+:2:1912/07/30:1912/12/31:大正:%EC元年";/
"+:6:1873/01/01:1912/07/29:明治:%EC%Ey年";/
"+:1:0001/01/01:1872/12/31:西暦:%EC%Ey年";/
"+:1:-0001/12/31:-*:紀元前:%EC%Ey年"

赤字の部分を修正することにより、2019 年 4 月 30 日までは平成と表示され、2019 年 5 月 1 日以降は西暦が表示されるように変更しました。

★2019年05月01日以降「令和」で表示するように変更した場合

$ diff -uNr /usr/share/i18n/locales/ja_JP ja_JP
--- /usr/share/i18n/locales/ja_JP 2018-04-18 15:04:51.000000000 +0900
+++ ja_JP 2019-04-03 19:50:54.896715817 +0900
@@ -14942,7 +14942,9 @@

t_fmt_ampm "<U0025><U0070><U0025><U0049><U6642><U0025><U004D><U5206><U0025><U0053><U79D2>"

-era "<U002B><U003A><U0032><U003A><U0031><U0039><U0039><U0030><U002F><U0030><U0031><U002F><U0030><U0031><U003A><U002B><U002A><U003A><U5E73><U6210><U003A><U0025><U0045><U0043><U0025><U0045><U0079><U5E74>";/
+era "<U002B><U003A><U0032><U003A><U0032><U0030><U0032><U0030><U002F><U0030><U0031><U002F><U0030><U0031><U003A><U002B><U002A><U003A><U4EE4><U548C><U003A><U0025><U0045><U0043><U0025><U0045><U0079><U5E74>";/
+ "<U002B><U003A><U0031><U003A><U0032><U0030><U0031><U0039><U002F><U0030><U0035><U002F><U0030><U0031><U003A><U0032><U0030><U0031><U0039><U002F><U0031><U0032><U002F><U0033><U0031><U003A><U4EE4><U548C><U003A><U0025><U0045><U0043><U5143><U5E74>";/
+ "<U002B><U003A><U0032><U003A><U0031><U0039><U0039><U0030><U002F><U0030><U0031><U002F><U0030><U0031><U003A><U0032><U0030><U0031><U0039><U002F><U0030><U0034><U002F><U0033><U0030><U003A><U5E73><U6210><U003A><U0025><U0045><U0043><U0025><U0045><U0079><U5E74>";/
"<U002B><U003A><U0031><U003A><U0031><U0039><U0038><U0039><U002F><U0030><U0031><U002F><U0030><U0038><U003A><U0031><U0039><U0038><U0039><U002F><U0031><U0032><U002F><U0033><U0031><U003A><U5E73><U6210><U003A><U0025><U0045><U0043><U5143><U5E74>";/
"<U002B><U003A><U0032><U003A><U0031><U0039><U0032><U0037><U002F><U0030><U0031><U002F><U0030><U0031><U003A><U0031><U0039><U0038><U0039><U002F><U0030><U0031><U002F><U0030><U0037><U003A><U662D><U548C><U003A><U0025><U0045><U0043><U0025><U0045><U0079><U5E74>";/
"<U002B><U003A><U0031><U003A><U0031><U0039><U0032><U0036><U002F><U0031><U0032><U002F><U0032><U0035><U003A><U0031><U0039><U0032><U0036><U002F><U0031><U0032><U002F><U0033><U0031><U003A><U662D><U548C><U003A><U0025><U0045><U0043><U5143><U5E74>";/
●変更前

era "+:2:1990/01/01:+*:平成:%EC%Ey年";/
"+:1:1989/01/08:1989/12/31:平成:%EC元年";/
"+:2:1927/01/01:1989/01/07:昭和:%EC%Ey年";/
"+:1:1926/12/25:1926/12/31:昭和:%EC元年";/
"+:2:1913/01/01:1926/12/24:大正:%EC%Ey年";/
"+:2:1912/07/30:1912/12/31:大正:%EC元年";/
"+:6:1873/01/01:1912/07/29:明治:%EC%Ey年";/
"+:1:0001/01/01:1872/12/31:西暦:%EC%Ey年";/
"+:1:-0001/12/31:-*:紀元前:%EC%Ey年"

●変更後
era "+:2:2020/01/01:+*:令和:%EC%Ey年";/
"+:1:2019/05/01:2019/12/31:令和:%EC元年";/
"+:2:1990/01/01:2019/04/30:平成:%EC%Ey年";/
"+:1:1989/01/08:1989/12/31:平成:%EC元年";/
"+:2:1927/01/01:1989/01/07:昭和:%EC%Ey年";/
"+:1:1926/12/25:1926/12/31:昭和:%EC元年";/
"+:2:1913/01/01:1926/12/24:大正:%EC%Ey年";/
"+:2:1912/07/30:1912/12/31:大正:%EC元年";/
"+:6:1873/01/01:1912/07/29:明治:%EC%Ey年";/
"+:1:0001/01/01:1872/12/31:西暦:%EC%Ey年";/
"+:1:-0001/12/31:-*:紀元前:%EC%Ey年"

赤字の部分を修正することにより、2019 年 4 月 30 日までは平成と表示され、2019 年 5 月 1 日以降は新元号である令和が表示されるように変更しました。

ポイント
この修正で一番間違いやすいのは +: の後の数字だと思います。この場所には表示される最初の年数を記載することになるので間違えないように注意する必要があります。明治はなぜ 6 なのかというのも調べてみると面白いかもしれません。

ステップ3:ファイルの変更を反映させる

ステップ 1 で記載したとおり、date が 参照している locale-archive は localedef でコンパイルされたファイルなので、以下のコマンドを実行して差し替えたファイルを反映させる必要があります。

# localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale-archive ja_JP.UTF-8

ステップ4:修正が反映されているか確認する

変更を行った後の表示を確認すると以下のように期待通りの表示になっていることが確認できます。

 ★2019年05月01日以降「西暦」で表示するように変更した場合

$ LC_TIME="ja_JP.utf8" date "+%F %Ex" -d "2019-04-30"
2019-04-30 平成31年04月30日
$ LC_TIME="ja_JP.utf8" date "+%F %Ex" -d "2019-05-01"
2019-05-01 西暦2019年05月01日

 ★2019年05月01日以降「令和」で表示するように変更した場合

$ LC_TIME="ja_JP.utf8" date "+%F %Ex" -d "2019-04-30"
2019-04-30 平成31年04月30日 
$ LC_TIME="ja_JP.utf8" date "+%F %Ex" -d "2019-05-01"
2019-05-01 令和元年05月01日
$ LC_TIME="ja_JP.utf8" date "+%F %Ex" -d "2020-01-01"
2020-01-01 令和2年01月01日

以上が改元対応の例になります。

まとめ 

今回基本的な改元対応を行ってみて、どこで和暦を表示させているのかなど知ることが出来る良いきっかけになりました。最初は、改元対応は面倒臭いだろうというマイナスなイメージが大きかったのですが、実際に作業をしていくと知らないことを色々学べ、結果が目に見えるという満足感もあり、すごく楽しかったです。また別の改元対応として、独自パッケージなどの話も別の記事でご紹介できたら良いなと思っています。
今回試した内容は、あくまで実験的な内容となりますので、当社としての正式な対応のご案内ではないことをご了承ください。

皆さんはこのような作業を行わなくても、改元対応を行った glibc 関連のパッケージにアップデートをしていただければ大丈夫です。

最後まで読んでいただきありがとうございました!
今回はシステムのライブラリのお話でしたが、次回は組み文字について書いてみたいと思います。

それでは、またお会いしましょう(`・ω・')ゝ
以上、でぃさんでした 。

更新履歴

2019年 3月 29日 新規作成
2019年 4月  4日 新元号発表に伴う加筆修正
2019年 4月 12日 合字を組み文字に修正

タグ: