2019年6月22日土曜日

fedora30 で日本語ロケールを追加するには?

fedora30 で日本語マニュアルページを参照しようとしたら、日本語ロケールがインストールされていませんでした。
知りませんでした(いつもインストールの時に日本語サポートを追加していた)が、glibc-langpack-ja を入れたら日本語ロケールが追加されました。忘れそうなので、備忘録。
[root@fedora30 ~]# rpm -qi glibc-langpack-ja
Name        : glibc-langpack-ja
Version     : 2.29
Release     : 15.fc30
Architecture: x86_64
Install Date: 2019年06月22日 21時51分40秒
Group       : Unspecified
Size        : 2200156
License     : LGPLv2+ and LGPLv2+ with exceptions and GPLv2+ and GPLv2+ with exceptions and BSD and Inner-Net and ISC and Public Domain and GFDL
Signature   : RSA/SHA256, 2019年06月07日 01時19分38秒, Key ID ef3c111fcfc659b9
Source RPM  : glibc-2.29-15.fc30.src.rpm
Build Date  : 2019年06月06日 21時27分54秒
Build Host  : buildvm-19.phx2.fedoraproject.org
Relocations : (not relocatable)
Packager    : Fedora Project
Vendor      : Fedora Project
URL         : http://www.gnu.org/software/glibc/
Bug URL     : https://bugz.fedoraproject.org/glibc
Summary     : Locale data for ja
Description :
The glibc-langpack-ja package includes the basic information required
to support the ja language in your applications.
[root@fedora30 ~]# locale -a | grep ja
ja_JP.eucjp
ja_JP.utf8

bash のヒアドキュメントは、一時ファイルを作成する

ディスクの空きスペースが無くなった際、手持ちの bash スクリプトから次のようなメッセージが出ていました。
myscript: cannot create temp file for here-document: No space left on device
そのスクリプトではヒアドキュメントを使っており、メッセージから察するに、bash のヒアドキュメントでは、背後で一時ファイルが作られるらしい、と認識しました。考えてみると自然な実装であり「まあそうなるわなあ」という感想。
いちおう確かめるために、そのスクリプトのエッセンスを抽出して実験してみました。
#!/bin/bash
perl <<'PERL'
exit 0
PERL
[root@hoge ~]# uname -a
Linux hoge 3.10.0-957.12.2.el7.x86_64 #1 SMP Tue May 14 21:24:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge ~]# rpm -q bash
bash-4.2.46-31.el7.x86_64
[root@hoge ~]# diff -c test1 test2
*** test1 2019-06-21 23:38:42.812280355 +0900
--- test2 2019-06-21 23:39:56.797172798 +0900
***************
*** 1,4 ****
  #!/bin/bash
! perl <<'PERL'
  exit 0
! PERL
--- 1,4 ----
  #!/bin/bash
! perl -e '
  exit 0
! '
[root@hoge ~]# strace -o /tmp/strace.out -f ./test1   ※ヒアドキュメントを使用した場合
[root@hoge ~]# strace -o /tmp/strace.out2 -f ./test2
[root@hoge ~]# grep /tmp/ /tmp/strace.out
86704 open("/tmp/sh-thd-1561087024", O_WRONLY|O_CREAT|O_EXCL|O_TRUNC, 0600) = 3
86704 open("/tmp/sh-thd-1561087024", O_RDONLY) = 4
86704 unlink("/tmp/sh-thd-1561087024")  = 0
[root@hoge ~]# grep /tmp/ /tmp/strace.out2
※ヒアドキュメントを使用しない場合は出力なし
[root@hoge ~]# wc -l /tmp/strace.out*
  402 /tmp/strace.out
  393 /tmp/strace.out2
  795 合計
strace の出力から、bash のヒアドキュメントは、一時ファイルを作成すると確認できました。この例の場合は、ヒアドキュメントをやめて perl -e '...' と書き換えれば、一時ファイル作成を避けることができました。全体のシステムコール数も減りました。
せこいようですが、「塵も積もれば山となる」という場合もあるものと思います。

2019年6月7日金曜日

Perl のモジュール(.pm)のパスを調べたい

Perl のモジュール(.pm)を追加インストールするため、そのモジュールを含む RPM パッケージ名が知りたい場合があります。yum search perl で適当に名前から推測でも、大抵間に合いますが、正確に知る方法を調べてみました。
モジュールがインストールされている環境で、そのモジュールのパスを調べる方法がわかればよいと思って検索してみると、ありがたいことに、先人の方が居られました。

http://wizard-blue.hatenablog.jp/entry/20091029/1256743552

なるほど @INC を find すればよいですね。ドット(.)の find には気をつけたほうがよいって、なんと親切な補足と思いました。ドット(.)の下に大量にファイルがあるという状況は、よくありそうですよね。ホームディレクトリとか。
man perlvar によると、-T オプションを使えば、ドット(.)が除外されるとありました。
       @INC    The array @INC contains the list of places that the "do EXPR",
               "require", or "use" constructs look for their library files.
               It initially consists of the arguments to any -I command-line
               switches, followed by the default Perl library, probably
               /usr/local/lib/perl, followed by ".", to represent the current
               directory.  ("." will not be appended if taint checks are
               enabled, either by "-T" or by "-t".)  If you need to modify
ということは、先人の方が書かれていたテクニックを若干変形して、次のようにすれば、ドット(.)を避けて検索できるようです。
[root@hoge ~]# perl -T -e 'map { print "$_\n" ; } @INC ;'
/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
※ドット(.)は含まれない
[root@hoge ~]# find `perl -T -e 'print "@INC" ;'` -name "Zlib.pm"
find: '/usr/local/lib64/perl5': そのようなファイルやディレクトリはありません
find: '/usr/local/share/perl5': そのようなファイルやディレクトリはありません
/usr/lib64/perl5/vendor_perl/Compress/Raw/Zlib.pm
/usr/lib64/perl5/vendor_perl/Compress/Raw/Zlib.pm
/usr/share/perl5/Compress/Zlib.pm
この出力を rpm -qf に渡すことで、そのモジュールを含む RPM を特定できました。
[root@hoge ~]# rpm -qf /usr/share/perl5/Compress/Zlib.pm
perl-IO-Compress-2.061-2.el7.noarch
[root@hoge ~]# uname -a
Linux hoge 3.10.0-957.12.2.el7.x86_64 #1 SMP Tue May 14 21:24:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)
/usr/share の下とは、ちょっと意外でした。/usr/lib64 の下かと思ってた。
人気ブログランキングへ にほんブログ村 IT技術ブログへ