Eric S. Raymond は現役 (asciiコマンド)

シンプルであり、なくても日常生活にはほとんど支障がないけれども時々欲しくなるもの、というのが Unix コマンドには結構あって、ascii がその一つ。

もはや cygwin には興味はないが、確か cygwin では頼まなくても付いて来てたと思う。MSYS には「当然」入ってない。GnuWinには入ってない。

ソースコードは、ここから手に入る。これを、MinGW なしのMSYSMicrosoft Visual C++ Compiler for Python 2.7でビルド出来たのでご紹介。

ソースの改変は2箇所だけで済んだ。少ないので画像で:


2つ目の変更は警告潰しなので、やらなくても問題はなく、必須なのは上の方だけ。

getopt は開発環境なしのMSYSではどうしようもないが、これは別にソースコードをそのまま持ってきて丸抱えすればいいだけ。こんな Makefile を書いた:

Makefile-msys-msvc
 1 # ascii -- interactive ASCII reference
 2 
 3 VERS=3.14
 4 
 5 CFLAGS = -nologo -O2 -DS_SPLINT_S -DHAVE_STRING_H -DHAVE_STRICMP -I.
 6 
 7 PREFIX = /usr
 8 
 9 all: ascii
10 
11 ascii: getopt.h getopt.c ascii.c splashscreen.h nametable.h
12         cl -c $(CFLAGS) -DREVISION=$(VERS) getopt.c
13         cl -c $(CFLAGS) -DREVISION=$(VERS) ascii.c
14         link -nologo getopt.obj ascii.obj -out:ascii.exe
15 
16 getopt.h:
17         wget https://gnunet.org/svn/flightrecorder/src/flightrecorderd/getopt.h --no-check-certificate
18 
19 getopt.c:
20         wget https://gnunet.org/svn/flightrecorder/src/flightrecorderd/getopt.c --no-check-certificate
21 
22 splashscreen.h: splashscreen
23         sed <splashscreen >splashscreen.h -e 's/\\/\\\\/g' -e 's/"/\\"/g' -e 's/.*/P("&");/'
24 
25 nametable.h: nametable
26         sed <nametable >nametable.h -e '/^#/d' -e 's/^[A-Za-z ]*: */    /' -e 's/%%/    }, {/'
27 
28 clean:
29         rm -f *.exe *.obj splashscreen.h nametable.h MANIFEST *.1 *.html *~
30 
31 install: ascii
32         cp ascii $(DESTDIR)$(PREFIX)/bin/ascii
33 
34 uninstall:
35         rm $(DESTDIR)$(PREFIX)/bin/ascii

(wget はアタシは GnuWin32 のを使ってる。)

めでたくビルド出来て、動かすとこんなです:

 1 me@host: ~$ ascii
 2 Usage: ascii.exe [-dxohv] [-t] [char-alias...]
 3    -t = one-line output  -d = Decimal table  -o = octal table  -x = hex table
 4    -h = This help screen -v = version information
 5 Prints all aliases of an ASCII character. Args may be chars, C \-escapes,
 6 English names, ^-escapes, ASCII mnemonics, or numerics in decimal/octal/hex.
 7 
 8 Dec Hex    Dec Hex    Dec Hex  Dec Hex  Dec Hex  Dec Hex   Dec Hex   Dec Hex
 9   0 00 NUL  16 10 DLE  32 20    48 30 0  64 40 @  80 50 P   96 60 `  112 70 p
10   1 01 SOH  17 11 DC1  33 21 !  49 31 1  65 41 A  81 51 Q   97 61 a  113 71 q
11   2 02 STX  18 12 DC2  34 22 "  50 32 2  66 42 B  82 52 R   98 62 b  114 72 r
12   3 03 ETX  19 13 DC3  35 23 #  51 33 3  67 43 C  83 53 S   99 63 c  115 73 s
13   4 04 EOT  20 14 DC4  36 24 $  52 34 4  68 44 D  84 54 T  100 64 d  116 74 t
14   5 05 ENQ  21 15 NAK  37 25 %  53 35 5  69 45 E  85 55 U  101 65 e  117 75 u
15   6 06 ACK  22 16 SYN  38 26 &  54 36 6  70 46 F  86 56 V  102 66 f  118 76 v
16   7 07 BEL  23 17 ETB  39 27 '  55 37 7  71 47 G  87 57 W  103 67 g  119 77 w
17   8 08 BS   24 18 CAN  40 28 (  56 38 8  72 48 H  88 58 X  104 68 h  120 78 x
18   9 09 HT   25 19 EM   41 29 )  57 39 9  73 49 I  89 59 Y  105 69 i  121 79 y
19  10 0A LF   26 1A SUB  42 2A *  58 3A :  74 4A J  90 5A Z  106 6A j  122 7A z
20  11 0B VT   27 1B ESC  43 2B +  59 3B ;  75 4B K  91 5B [  107 6B k  123 7B {
21  12 0C FF   28 1C FS   44 2C ,  60 3C <  76 4C L  92 5C \  108 6C l  124 7C |
22  13 0D CR   29 1D GS   45 2D -  61 3D =  77 4D M  93 5D &#93;  109 6D m  125 7D }
23  14 0E SO   30 1E RS   46 2E .  62 3E >  78 4E N  94 5E ^  110 6E n  126 7E ~
24  15 0F SI   31 1F US   47 2F /  63 3F ?  79 4F O  95 5F _  111 6F o  127 7F DEL

「char-alias…」を渡す使い方は、今回初めて知った。これ、便利なのね:

 1 me@host: ~$ ascii STX
 2 ASCII 0/2 is decimal 002, hex 02, octal 002, bits 00000010: called ^B, STX
 3 Official name: Start of Text
 4 me@host: ~$ ascii '{'
 5 ASCII 7/11 is decimal 123, hex 7b, octal 173, bits 01111011: prints as `{'
 6 Official name: Left Curly Bracket
 7 Other names: Left Brace, Brace, Open Brace, Curly, Leftit, Embrace
 8 Note: See } for matching names.
 9 
10 me@host: ~$ ascii '}'
11 ASCII 7/13 is decimal 125, hex 7d, octal 175, bits 01111101: prints as `}'
12 Official name: Right Curly Bracket
13 Other names: Right Brace, Unbrace, Close Brace, Uncurly, Rytit, Bracelet
14 Note: See { for matching names.
15 
16 me@host: ~$ ascii '['
17 ASCII 5/11 is decimal 091, hex 5b, octal 133, bits 01011011: prints as `['
18 Official name: Left Square Bracket
19 Other names: Bracket, Bra, Square
20 Note: See ] for matching names.
21 
22 me@host: ~$ ascii ']'
23 ASCII 5/13 is decimal 093, hex 5d, octal 135, bits 01011101: prints as `]'
24 Official name: Right Square Bracket
25 Other names: Unbracket, Ket, Unsquare
26 Note: See [ for matching names.
27 
28 me@host: ~$ ascii '('
29 ASCII 2/8 is decimal 040, hex 28, octal 050, bits 00101000: prints as `('
30 Official name: Left Parenthesis
31 Other names: Open, Open Paren, Left Paren, Wax, Sad
32 Note: See ) for matching names.
33 
34 me@host: ~$ ascii ')'
35 ASCII 2/9 is decimal 041, hex 29, octal 051, bits 00101001: prints as `)'
36 Official name: Right Parenthesis
37 Other names: Close, Close Paren, Right Paren, Wane, Happy
38 Note: See ( for matching names.

改変したものはhttp://hhsprings.pinoko.jp/personal_works/site-hhs_downloads/ascii-3.14-msvc.tar.bz2として置いときます。欲しい人はどーぞ。(ただし、man 関係は一切処理しません。ソースの中の ascii.1 は roff ソースなので、頑張って groff 環境作ればどうにかマニュアル作れますけどね。)


さて。では、なんで「今」これが欲しくなったのか? 「時々」が今日だったわけなんだけれどね。要はこれです:

1 [showtagcloud format="array" width="500" height="500" nofollow="1"]

WordPress は「ショートコード」といって、上記のような記述にプラグインなどが反応するんですけど、反応させたくない場合でも、これ、html とは関係ないから WordPress の投稿エディタも「>」を「&gt;」に置換する、のようなことはしてくれないわけなんですな。となれば、こんなサイト:

なんかをみて手動で置換する、ってことをするハメになるわけなんだけれど、所詮 html の実体参照は「Entity Number」形式&#nn;で記述出来るので、この形式だけ記憶してれば、「あとは ASCII コードがわかればいいだけ」なわけで。こんなときに、さっとコード表が得られる ascii コマンドが大変貴重なのですな。


なお、「なくても日常生活にはほとんど支障がない」のは、単純なものはすぐに自作出来るから、ですよん。python でも perl でも ruby でも、あるいは PowerShell でだって、ほとんど一瞬で書けるはずです。言語の初心者が最初にトライする課題としても面白いだろうしね。perl なんかだとワンライナーで書いちゃう人多いよね。ま、探せば大量に出てくると思うよ、この種のネタ。


今回これやって、ascii が、Eric S. Raymond 作であることを始めて知った。Eric S. Raymond といえば、とにかくこれが大変楽しい:

ハッカーズ大辞典 (Ascii books)


これも良い本:

The Art of UNIX Programming

で、驚いたのは、「ascii 3.15」のリリース日は 2015-04-02 なのですよ。おぅ。なんか「歴史上の人物」と思ってたのね、Raymond。まだまだ現役、っすか。