2025/09/23(火)64bit バイナリは footprint の大きさを実行効率で覆せるのか

CPU
近年 Windows では 64bit バイナリが普及してきたが、
基本的に64bit バイナリはプロセスイメージが大きい(必要メモリ容量が大きい)。

64bit版が不利な点

  • キャッシュに収まりにくい
    • CPUの並列化は進んでいるが周波数は伸び悩んでいる。プログラムの動作スピードに影響が大きいのがキャッシュにヒットするかどうかである。その点、プロセスイメージの大きいバイナリはキャッシュ的に不利である。

32bit版が不利な点

  • Windows API が WOW64
    • Windows x86_64 版では 32bit プログラムは WOW64 というエミュ層で動くらしいので、これがネイティブ64bit版APIを経由するような構成の場合は、APIコールの数がスピードに響いてくる。
  • 汎用レジスタが少ない
    • 64bitバイナリは 16個の汎用レジスタを使えるが、32bit版は4~6個くらい。関数コール等のABIでレジスタ渡しが難しいのも影響ありそう
私はキャッシュ信者なので、基本的にはキャッシュに収まりやすい方が速いのでは、と思っている。

32bit と 64bit 両方のバイナリがある場合に、大きいメモリを扱わないケースで 64bit 版のほうが速くなることがあるのだろうか。

思考実験としては
  • 大きいメモリを使わない→キャッシュにヒットしやすい→64bit版でもOK
  • 大きいメモリを使う→キャッシュにヒットしにくい→どちらの版でも遅いがポインタ的には64ビットのほうが良い
実際のプログラムごとのベンチマークが見てみたい所である。

メモリ使用量の例

図は例として Tera Term の 32bit 版と 64bit 版のメモリマップである。
どちらともプログラム起動直後の状態。
  • 32bit
    • teraterm-5-5-0-32bit-20250923.png
  • 64bit
    • teraterm-5-5-0-64bit-20250923.png
Image(Text) も Heap も64bit版がずっと大きい。
CPUのキャッシュ(L1/L2/L3)に収める必要がある領域が大きくなる。

2025/03/09(日)FreeBSD UFS2 SU+J ファイル削除はあまり速くない

FreeBSD の UFS2 SU+J (Softupdate + softupdate journaling) でのファイル削除はあまり速くないようだ。
どうも、I/O よりも kernel VFS 内部でのロック処理あるいは journal 処理などで時間かかってそう。

積年の /var/db/freebsd-update/files ディレクトリのファイルを削除しようとしたら思ったより時間がかかった。

時間かかるので途中で止めて time で時間を計ってみたところ、殆どが sys に時間を取られている。
もしかすると find -delete よりも xargs のほうが速いかも…?

SSD なら fsck を我慢できるので softupdate journal は不要かもしれない。
削除コマンド
root@:/var/db/freebsd-update/files# find . -mtime +365 | wc -l
  468408
root@:/var/db/freebsd-update/files# find . -mtime -365 | wc -l
   62895
root@:/var/db/freebsd-update/files# find . -mtime +365 -delete

^C
root@:/var/db/freebsd-update/files# find . -mtime +365 | wc -l
  114599
root@:/var/db/freebsd-update/files# time find . -mtime +365 -delete

real    10m23.096s
user    0m0.362s
sys     10m21.413s
root@:/var/db/freebsd-update/files#
I/O
FreeBSD の dirty buffer の定期書き出し以外では Read/Write はほぼ無し。
root@:~# iostat ada4 1 | perl -pe 's/^/localtime() . " "/e'
Sun Mar  9 14:58:09 2025        tty            ada4             cpu
Sun Mar  9 14:58:09 2025  tin  tout KB/t  tps  MB/s  us ni sy in id
Sun Mar  9 14:58:09 2025    1    73 16.1   11   0.2   2  0  1  0 96
Sun Mar  9 14:58:10 2025    0   311  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:58:11 2025    0   173  4.0    2   0.0   1  0 50  0 49
Sun Mar  9 14:58:12 2025    0   173  4.0    2   0.0   0  0 50  0 50
Sun Mar  9 14:58:13 2025    0   173  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:58:14 2025    0   173  4.0    2   0.0   1  0 50  0 50
Sun Mar  9 14:58:15 2025    0   173  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:58:16 2025    0   173  4.0    2   0.0   0  0 50  0 50
Sun Mar  9 14:58:17 2025    0   173  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:58:18 2025    0   173  4.0    2   0.0   1  0 50  0 50
Sun Mar  9 14:58:19 2025    0   287  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:58:20 2025    0   173  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:58:21 2025    0   173  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:58:22 2025    0   173  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:58:23 2025    0   173  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:58:24 2025    0   173 13.3    3   0.0   0  0 51  0 49
Sun Mar  9 14:58:25 2025    0   173  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:58:26 2025    0   173  4.0    2   0.0   0  0 50  0 50
Sun Mar  9 14:58:27 2025    0   173  4.0    2   0.0   0  0 50  0 50
Sun Mar  9 14:58:28 2025    0   173  4.0    2   0.0   0  0 52  0 48
Sun Mar  9 14:58:29 2025        tty            ada4             cpu
Sun Mar  9 14:58:29 2025  tin  tout KB/t  tps  MB/s  us ni sy in id
Sun Mar  9 14:58:29 2025    0   173  4.0    2   0.0   0  0 50  0 50
Sun Mar  9 14:58:30 2025    0   311 10.0    4   0.0   0  0 50  0 49
Sun Mar  9 14:58:31 2025    0   173 30.8   48   1.4   0  0 50  0 49
Sun Mar  9 14:58:32 2025    0    69  3.0    3   0.0   0  0 56  0 44
Sun Mar  9 14:58:33 2025    0   173  4.0    4   0.0   0  0 51  0 49
Sun Mar  9 14:58:34 2025    0   173  4.0    2   0.0   0  0 50  0 50
Sun Mar  9 14:58:35 2025    0   173  4.0    2   0.0   0  0 51  0 48
Sun Mar  9 14:58:36 2025    0   173  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:58:37 2025    0   173  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:58:38 2025    0   173  4.0    2   0.0   1  0 50  0 49
Sun Mar  9 14:58:39 2025    0   173 27.7   13   0.4   0  0 50  0 50
Sun Mar  9 14:58:40 2025    0   173 13.8 7358  99.2   0  0 55  0 45
Sun Mar  9 14:58:41 2025    0   173  4.0    2   0.0   0  0 50  0 50
Sun Mar  9 14:58:42 2025    0   173  4.0    2   0.0   1  0 50  0 49
Sun Mar  9 14:58:43 2025    0   173  4.0    2   0.0   1  0 50  0 49
Sun Mar  9 14:58:44 2025    0   173  4.0    2   0.0   0  0 50  0 50
Sun Mar  9 14:58:45 2025    0   173  4.0    2   0.0   0  0 50  0 50
Sun Mar  9 14:58:46 2025    0   173  4.0    2   0.0   0  0 50  0 50
Sun Mar  9 14:58:47 2025    0   173  4.0    2   0.0   0  0 50  0 50
Sun Mar  9 14:58:48 2025    0   173  4.0    2   0.0   0  0 50  0 49
Sun Mar  9 14:58:49 2025        tty            ada4             cpu
Sun Mar  9 14:58:49 2025  tin  tout KB/t  tps  MB/s  us ni sy in id
Sun Mar  9 14:58:49 2025    0   173  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:58:50 2025    0   311 18.0    4   0.1   0  0 50  0 50
Sun Mar  9 14:58:51 2025    0   173  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:58:52 2025    0   173  4.0    2   0.0   0  0 50  0 49
Sun Mar  9 14:58:53 2025    0   375  4.0    2   0.0   0  0 51  0 48
Sun Mar  9 14:58:54 2025    0   173  4.0    2   0.0   1  0 50  0 49
Sun Mar  9 14:58:55 2025    0   173  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:58:56 2025    0   173  4.0    2   0.0   0  0 50  0 50
Sun Mar  9 14:58:57 2025    0   173  4.0    2   0.0   0  0 50  0 50
Sun Mar  9 14:58:58 2025    0   173  4.0    2   0.0   0  0 50  0 49
Sun Mar  9 14:58:59 2025    0   173  4.0    2   0.0   0  0 50  0 49
Sun Mar  9 14:59:00 2025    0   173  4.0    2   0.0   0  0 52  0 48
Sun Mar  9 14:59:01 2025    0   173  4.0    2   0.0   0  0 50  0 49
Sun Mar  9 14:59:02 2025    0   173  4.0    2   0.0   0  0 50  0 50
Sun Mar  9 14:59:03 2025    0   173  4.0    2   0.0   0  0 50  0 50
Sun Mar  9 14:59:04 2025    0   173  4.0    2   0.0   0  0 50  0 50
Sun Mar  9 14:59:05 2025    0   173 13.3    6   0.1   0  0 50  0 50
Sun Mar  9 14:59:06 2025    0   173  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:59:07 2025    0   173  4.0    2   0.0   0  0 50  0 50
Sun Mar  9 14:59:08 2025    0   173  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:59:09 2025        tty            ada4             cpu
Sun Mar  9 14:59:09 2025  tin  tout KB/t  tps  MB/s  us ni sy in id
Sun Mar  9 14:59:09 2025    1   175  4.0    2   0.0   0  0 51  0 49
Sun Mar  9 14:59:10 2025    0   311  4.0    2   0.0   0  0 50  0 49
Sun Mar  9 14:59:11 2025    1   228 27.5 3787 101.7   0  0 44  0 56
Sun Mar  9 14:59:12 2025    6   228 20.6 3455  69.6   0  0 23  0 76
Sun Mar  9 14:59:13 2025    9   269  0.0    0   0.0   0  0  2  1 98
Sun Mar  9 14:59:14 2025    0   173  0.0    0   0.0   0  0  0  0 99
Sun Mar  9 14:59:15 2025    1   184  0.0    0   0.0   2  0 11  0 87
tunefs
softupdate, soft update journaling, trim が on。
と言ってもそもそも dirty buffer 書き出しはすぐ終わっているので、古いSSDでも I/O スピードは間に合っている。
root@:/var/db/freebsd-update/files# tunefs -p /
tunefs: POSIX.1e ACLs: (-a)                                disabled
tunefs: NFSv4 ACLs: (-N)                                   disabled
tunefs: MAC multilabel: (-l)                               disabled
tunefs: soft updates: (-n)                                 enabled
tunefs: soft update journaling: (-j)                       enabled
tunefs: gjournal: (-J)                                     disabled
tunefs: trim: (-t)                                         enabled
tunefs: maximum blocks per file in a cylinder group: (-e)  4096
tunefs: average file size: (-f)                            16384
tunefs: average number of files in a directory: (-s)       64
tunefs: minimum percentage of free space: (-m)             2%
tunefs: space to hold for metadata blocks: (-k)            1600
tunefs: optimization preference: (-o)                      space
tunefs: volume label: (-L)
対象デバイス
root@:~# camcontrol identify ada4 | head -6
pass4: <SanDisk SD6SB1M064G1022I X230600> ATA8-ACS SATA 3.x device
pass4: 150.000MB/s transfers (SATA, UDMA6, PIO 512bytes)

protocol              ATA8-ACS SATA 3.x
device model          SanDisk SD6SB1M064G1022I
firmware revision     X230600
root@:~#
root@:~# mount | grep ssdroot
/dev/gpt/ssdroot on / (ufs, local, noatime, soft-updates, journaled soft-updates)
root@:~#
root@:~# glabel status | grep ssdroot
                               gpt/ssdroot     N/A  ada4p3
root@:~#

ちなみに開始前 /var/db/freebsd-update/files の状況

2014年からの freebsd-update の残りかすが溜まっていたようだ。

2014年は FreeBSD 10 くらいなので、それからずっと freebsd-update で更新してきたという事になる。
root@:/var/db/freebsd-update/files# find . -ls | less

4333839    88640 drwxr-xr-x    2 root  wheel  45338112  3月  8 18:11 .
4334257     1344 -rw-r--r--    1 root  wheel    642298 11月 19  2014 ./8417c2444df4aa495c9ee7e953b9e24ff91a552b512ad7041ced4724f6482e63.gz
4334258      104 -rw-r--r--    1 root  wheel     51255 11月 19  2014 ./e43dbfcf12eb2d71aa998cb17b4e67bd5a52f40482524049a19ceb400019b739.gz
4333840        8 -rw-r--r--    1 root  wheel      1578  8月 23  2014 ./8d9d85c2c6d24a47cadc45dc1074d5c09ac1bfbda719598e28e84c20c4e3ffaf.gz
4333841      160 -rw-r--r--    1 root  wheel     79103  8月 23  2014 ./a9cda8f4ae23244290ad6a939b8a4c4ac28a353e166645948b0aef5cb943eac3.gz
4333842       80 -rw-r--r--    1 root  wheel     37036  8月 23  2014 ./a449f23323e5fab78d05cbd2477a744a31cacc8274d658ce45ab77772c96545a.gz

2025/03/08(土)FreeBSD iconv がサポートする日本語用エンコード

この記事は FreeBSD 13.4 + バイナリpkg が対象です。

FreeBSD の iconv がサポートする日本語用文字エンコード

FreeBSD は内蔵 iconv と、パッケージの GNU libiconv の両方が存在します。
両者でどの程度日本語用エンコードに違いがあるか確認します。

libiconv は ports コンパイルではなく、バイナリパッケージで導入したものです。

対象となる環境

$ freebsd-version -kru
13.4-RELEASE-p3
13.4-RELEASE-p3
13.4-RELEASE-p4
$
$ pkg info libiconv | egrep -i '^(version|WWW)'
Version        : 1.17_1
WWW            : https://www.gnu.org/software/libiconv/
$

リストを作成する

$ /usr/bin/iconv -l | sed 's/ /\n/g' | sort > usr_bin_iconv_list.txt
$ /usr/local/bin/iconv -l | sed 's/ /\n/g' | sort > usr_local_bin_iconv_list.txt
$
$ diff usr_bin_iconv_list.txt usr_local_bin_iconv_list.txt | wc -l
     803
$

diff を取る

以下それぞれ
+ は /usr/local/bin/iconv (pkgのもの)だけがサポートしている、
- は /usr/bin/iconv (FreeBSD内蔵の物)だけがサポートしている
エンコードです。
JIS 系
$ diff -U0 usr_bin_iconv_list.txt usr_local_bin_iconv_list.txt | egrep -i 'jis|jp' | egrep -iv 'shift|euc|sjis'
+CSISO159JISX02121990
-EBCDIC-JP-E
-EBCDIC-JP-KANA
+ISO-2022-JP-MS
-ISO2022-JP
-ISO2022-JP1
-ISO2022-JP2
-ISO2022-JP2004
-ISO2022-JP3
-ISO646-JP-OCR-B
-JIS_C6229-1984-B
-JIS_X0208:1990
+JIS_X0212
+JIS_X0212-1990
+JIS_X0212.1990-0
-JISX0201
-JISX0201-KANA
-JISX0208-1990
-JISX0208:1990
-JISX0208:1990
-JISX0208@1990
-JP-OCR-B
$

EUC 系
$ diff -U0 usr_bin_iconv_list.txt usr_local_bin_iconv_list.txt  | egrep -i 'euc|extend|[0-9]1932'
-51932
-CP51932
-EUC-JP-MS
-EUCJP-MS
-EUCJP-OPEN
-EUCJP-WIN
-EUCJPMS
+EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE
-IBM-EUCJP
-MS51932
-MSCP51932
-WINDOWS-51932
$

Shift_JIS 系
$ diff -U0 usr_bin_iconv_list.txt usr_local_bin_iconv_list.txt  | egrep -i 'shift|sjis|[^5].932'
-MS932
-MSCP932
-SHIFT_JIS-MS
+SHIFT-JIS
-SJIS-MS
-SJIS-OPEN
-SJIS-WIN
-WINDOWS-932
$

所感

ISO-2022-JP-MS を除くと、おおむね 内蔵 iconv のほうが豊富である。

内蔵iconvにリンク可能なら、GNU libiconv の使用は必要なさそう。
(EUCJP-MSを使いたかったのにエラーが出たので調査した。)

おまけ

内蔵 iconv リスト

$ iconv -l   |  egrep -i 'jis|jp' | egrep -iv 'shift|euc|sjis'
CP281 281 EBCDIC-JP-E IBM281
CP290 290 EBCDIC-JP-KANA IBM290
ISO-2022-JP-1 ISO2022-JP1
ISO-2022-JP-2 CSISO2022JP2 ISO2022-JP2 ISO-2022-JP-2004 ISO-2022-JP-3 ISO2022-JP2004 ISO2022-JP3
ISO-2022-JP CSISO2022JP ISO2022-JP
ISO646-JP-OCR-B ISO-IR-92 JIS_C6229-1984-B JP-OCR-B
ISO646-JP CSISO14JISC6220RO ISO-IR-14 JIS_C6220-1969-RO JP
JISX0201-KANA CSHALFWIDTHKATAKANA JISX0201 JISX0201-1976 JIS_X0201 X0201
JISX0208:1990 CSISO87JISX0208 ISO-IR-87 JIS0208 JISX0208-1990 JIS_C6226-1983 JIS_X0208 JIS_X0208-1983 JIS_X0208-1990 JIS_X0208:1990 X0208
JISX0208@1990 JISX0208:1990
$
$ iconv -l   | egrep -i 'sjis|shift|([^5].|\b)932|31j'
CP932 932 CSWINDOWS31J MS932 MSCP932 SHIFT_JIS-MS SJIS-MS SJIS-OPEN SJIS-WIN WINDOWS-31J WINDOWS-932
SHIFT_JIS-2004 SHIFT_JISX0213
SHIFT_JIS CSSHIFTJIS MS_KANJI SJIS
$
$ iconv -l   | egrep -i 'euc|extend|[0-9].?932'
CP51932 51932 MS51932 MSCP51932 WINDOWS-51932
CP932 932 CSWINDOWS31J MS932 MSCP932 SHIFT_JIS-MS SJIS-MS SJIS-OPEN SJIS-WIN WINDOWS-31J WINDOWS-932
EUC-CN CN-GB CSGB3212 EUCCN GB2312
EUC-JIS-2004 EUC-JISX0213
EUC-JP-MS EUCJP-MS EUCJP-OPEN EUCJP-WIN EUCJPMS
EUC-JP CSEUCPKDFMTJAPANESE EUCJP IBM-EUCJP
EUC-KR CSEUCKR CSKSC56011987 EUCKR ISO-IR-149 KOREAN KSC_5601 KS_C_5601-1987 KS_C_5601-1989
EUC-TW CNS11643 CSEUCTW EUCTW
$
pkg libiconv リスト
$ /usr/local/bin/iconv -l   |  egrep -i 'jis|jp' | egrep -iv 'shift|euc|sjis'
ISO-IR-14 ISO646-JP JIS_C6220-1969-RO JP CSISO14JISC6220RO
JISX0201-1976 JIS_X0201 X0201 CSHALFWIDTHKATAKANA
ISO-IR-87 JIS0208 JIS_C6226-1983 JIS_X0208 JIS_X0208-1983 JIS_X0208-1990 X0208 CSISO87JISX0208
ISO-IR-159 JIS_X0212 JIS_X0212-1990 JIS_X0212.1990-0 X0212 CSISO159JISX02121990
ISO-2022-JP CSISO2022JP
ISO-2022-JP-1
ISO-2022-JP-2 CSISO2022JP2
CP50221 ISO-2022-JP-MS
ISO-2022-JP-2004 ISO-2022-JP-3
$
$ /usr/local/bin/iconv -l   | egrep -i 'sjis|shift|([^5].|\b)932|31j'
MS_KANJI SHIFT-JIS SHIFT_JIS SJIS CSSHIFTJIS
CP932
SHIFT_JIS-2004 SHIFT_JISX0213
$
$ /usr/local/bin/iconv -l   |  egrep -i 'euc|extend|[0-9].?932'
EUC-JP EUCJP EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE CSEUCPKDFMTJAPANESE
CN-GB EUC-CN EUCCN GB2312 CSGB2312
EUC-TW EUCTW CSEUCTW
EUC-KR EUCKR ISO-IR-149 KOREAN KSC_5601 KS_C_5601-1987 KS_C_5601-1989 CSEUCKR CSKSC56011987
EUC-JIS-2004 EUC-JISX0213
$

2025/02/17(月)現時点で adiary で使えると思われる syntax highlight

現時点で adiary で使えると思われる syntax highlight。

https://adiary.adiary.jp/0422#c47 を参考。

追加してもよさそうなSyntax
  • reStructuredText サポートしているならそれ用拡張子
  • go, rust
  • yaml
おまけ
GitHubで最も使われている言語、PythonがJavaScriptを抜いて1位に。生成AI関連プロジェクト急増で。GitHubが年次調査「Octoverse 2024」発表
https://www.publickey1.jp/blog/24/githubpythonjavascript1aigithuboctoverse_2024.html
以下現状
  • 正式名
    • エイリアス名
  • coffeescript
    • coffee
    • cson
    • iced
  • objectivec
    • mm
    • objc
    • obj-c
  • tex
  • dos
    • bat
    • cmd
  • cs
    • csharp
    • c#
  • json
  • bash
    • sh
    • zsh
  • x86asm
  • makefile
    • mk
    • mak
  • armasm
    • arm
  • properties
  • apache
    • apacheconf
  • perl
    • pl
    • pm
  • python
    • py
    • gyp
    • ipython
  • xml
    • html
    • xhtml
    • rss
    • atom
    • xjb
    • xsd
    • xsl
    • plist
  • markdown
    • md
    • mkdown
    • mkd
  • cpp
    • c
    • cc
    • h
    • c++
    • h++
    • hpp
  • css
  • javascript
    • js
    • jsx
  • lisp
  • php
    • php
    • php3
    • php4
    • php5
    • php6
    • php7
  • ruby
    • rb
    • gemspec
    • podspec
    • thor
    • irb
  • sql
  • nginx
    • nginxconf
  • ini
    • toml
  • verilog
    • v
    • sv
    • svh
  • java
    • jsp
  • diff
    • patch
  • mipsasm
    • mips
  • shell
    • console
  • powershell
    • ps
  • http
    • https
  • vhdl

2025/02/16(日)Cygwin 3.5.7 における日本語変換ソフト

Cygwin 3.5.7 の標準インストーラでインストール可能な日本語文字コードを扱える文字エンコード変換ソフトのパッケージについて。

標準には無いパッケージ

nkf

ただし、ソースからコンパイルしてインストールすることは可能。
$ tar xzf nkf-2.1.5.tar.gz
$ cd nkf-2_1_5/
$ make
cc -g -O2 -Wall -pedantic -c nkf.c
cc -g -O2 -Wall -pedantic -c utf8tbl.c
cc -g -O2 -Wall -pedantic  -o nkf nkf.o utf8tbl.o
$ make install
mkdir /usr/local/bin
mkdir: ディレクトリ `/usr/local/bin' を作成できません: File exists
make: [Makefile:49: install-main] エラー 1 (無視されました)
cp -f nkf /usr/local/bin/
mkdir /usr/local/man
mkdir /usr/local/man/man1
cp -f nkf.1 /usr/local/man/man1/
mkdir /usr/local/man/ja
mkdir /usr/local/man/ja/man1
cp -f nkf.1j /usr/local/man/ja/man1/nkf.1
$ nkf
$ nkf --help
Usage:  nkf -[flags] [--] [in file] .. [out file for -O flag]
 j/s/e/w  Specify output encoding ISO-2022-JP, Shift_JIS, EUC-JP
          UTF options is -w[8[0],{16,32}[{B,L}[0]]]
 J/S/E/W  Specify input encoding ISO-2022-JP, Shift_JIS, EUC-JP
          UTF option is -W[8,[16,32][B,L]]
 m[BQSN0] MIME decode [B:base64,Q:quoted,S:strict,N:nonstrict,0:no decode]
 M[BQ]    MIME encode [B:base64 Q:quoted]
 f/F      Folding: -f60 or -f or -f60-10 (fold margin 10) F preserve nl
 Z[0-4]   Default/0: Convert JISX0208 Alphabet to ASCII
          1: Kankaku to one space  2: to two spaces  3: HTML Entity
          4: JISX0208 Katakana to JISX0201 Katakana
 X,x      Convert Halfwidth Katakana to Fullwidth or preserve it
 O        Output to File (DEFAULT 'nkf.out')
 L[uwm]   Line mode u:LF w:CRLF m:CR (DEFAULT noconversion)
 --ic=<encoding>        Specify the input encoding
 --oc=<encoding>        Specify the output encoding
 --hiragana --katakana  Hiragana/Katakana Conversion
 --katakana-hiragana    Converts each other
 --{cap, url}-input     Convert hex after ':' or '%'
 --numchar-input        Convert Unicode Character Reference
 --fb-{skip, html, xml, perl, java, subchar}
                        Specify unassigned character's replacement
 --in-place[=SUF]       Overwrite original files
 --overwrite[=SUF]      Preserve timestamp of original files
 -g --guess             Guess the input code
 -v --version           Print the version
 --help/-V              Print this help / configuration
Network Kanji Filter Version 2.1.5 (2018-12-15)
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa).
Copyright (C) 1996-2018, The nkf Project.
$

存在するパッケージ

lv

ビューアーだが、変換プログラムとしても使用できる。


$ cat file | lv -Os | cat
指定できる文字コード
       coding-system:
              a: auto-select
              c: iso-2022-cn
              j: iso-2022-jp
              k: iso-2022-kr
              ec: euc-china
              ej: euc-japan
              ek: euc-korea
              et: euc-taiwan
              u7: UTF-7
              u8: UTF-8
              l1..9: iso-8859-1..9
              l0: iso-8859-10
              lb,ld,le,lf,lg: iso-8859-11,13,14,15,16
              s: shift-jis
              b: big5
              h: HZ
              r: raw mode


libiconv

libiconv2 パッケージではダメ。
libiconv を入れること。GNU libiconv 実装の iconv コマンドが使えるようになる。
$ iconv -l | egrep -i 'jis|2022-?jp|20932' | egrep -vi 'sjis|shift|euc'
ISO-IR-14 ISO646-JP JIS_C6220-1969-RO JP CSISO14JISC6220RO
JIS0201 JISX0201-1976 JISX0201.1976-0 JIS_X0201 X0201 CSHALFWIDTHKATAKANA
ISO-IR-87 JIS0208 JISX0208.1983-0 JISX0208.1990-0 JIS_C6226-1983 JIS_X0208 JIS_X0208-1983 JIS_X0208-1990 X0208 CSISO87JISX0208
ISO-IR-159 JIS0212 JISX0212.1990-0 JIS_X0212 JIS_X0212-1990 JIS_X0212.1990-0 X0212 CSISO159JISX02121990
ISO-2022-JP ISO2022JP CSISO2022JP
ISO-2022-JP-1
ISO-2022-JP-2 CSISO2022JP2
CP50221 ISO-2022-JP-ESC ISO-2022-JP-MS
ISO-2022-JP-2004 ISO-2022-JP-3
$
$ iconv -l | egrep -i 'euc' | egrep -i 'jp|jis'
CP51932 EUC-JP EUCJP EUC_JP EXTENDED_UNIX_CODE_PACKED_FORMAT_FOR_JAPANESE CSEUCPKDFMTJAPANESE
EUC-JIS-2004 EUC-JISX0213
$
$ iconv -l | egrep -i 'sjis|shift|932|31j'  | grep -v 51932
MS_KANJI SHIFT-JIS SHIFT_JIS SJIS CSSHIFTJIS
CP932 WINDOWS-31J
SHIFT_JIS-2004 SHIFT_JISX0213
$

piconv (perL)

perl に付属の iconv コマンド。
$ piconv -l | grep -i jis | egrep -iv 'shift|sjis'
7bit-jis
jis0201-raw
jis0208-raw
jis0212-raw
$
$ piconv -l | egrep -i 'jis|31j|932' | egrep -i 'shift|sjis'
shiftjis
$
$ piconv -l | egrep -i 'euc' | egrep -v -e '[-_](cn|tw|kr)'
euc-jp
$