1994年頃、仕事で NEC の UNIXワークステーション EWS4800 を日常的に使っていました。そのマシンの /usr/local/bin (職場の中央サーバを NFS マウントして利用していた) に、kbanner というツール (漢字に対応した banner ソフト) がインストールされていて、その -s オプションの表示の綺麗さに魅了され、よく利用していました。
当時は、誰が作ったものなのか?をググったりはできませんでしたし、ソースは入手できないものだと思っていました。
時は流れ、2003年ごろから Linux どっぷりな仕事 (使うマシンも Express5800 に変わった) になり、kbanner のソースも持っていませんでしたので、EWS4800 の衰退と共に記憶の彼方になっていきました。
そして今、ふと懐かしく思い出し、どこかにソースないのかなと、ググってみたら、ありました!
なんと kbanner の作者さんは、「キーボード配列 QWERTYの謎 NTT出版 (2008年3月), ISBN978-4-7571-4176-6.」の著者さんだったのかー、キーボード好き (特に ThinkPad と RealForce) が高じて手もとにあります。
さっそくダウンロードして、現在の自宅メインマシン (ThinkPad 25 + CentOS8) で make してみました。
コンパイルエラーでも起きるかなと思ったのですが、警告は出るものの、修正なしでビルドできました!
[root@hoge kbanner2]# make
cc -c -O kbanner.c
kbanner.c:5:14: 警告: 組み込み関数 ‘malloc’ と型が競合しています [-Wbuiltin-declaration-mismatch]
extern char *malloc();
^~~~~~
kbanner.c:85:1: 警告: 戻り値の型をデフォルトの ‘int’ にします [-Wimplicit-int]
main(argc,argv)
^~~~
kbanner.c: 関数 ‘main’ 内:
kbanner.c:115:14: 警告: 関数 ‘atoi’ の暗黙的な宣言です [-Wimplicit-function-declaration]
column=atoi(&((*argv)[1]));
^~~~
kbanner.c:82:3: 警告: 関数 ‘exit’ の暗黙的な宣言です [-Wimplicit-function-declaration]
exit(1);\
^~~~
kbanner.c:120:7: 備考: in expansion of macro ‘USAGE’
USAGE
^~~~~
kbanner.c:82:3: 警告: 組み込み関数 ‘exit’ の互換性がない暗黙的な宣言です
exit(1);\
^~~~
kbanner.c:120:7: 備考: in expansion of macro ‘USAGE’
USAGE
^~~~~
kbanner.c:82:3: 備考: include ‘<stdlib.h>’ or provide a declaration of ‘exit’
kbanner.c:4:1:
+#include
kbanner.c:82:3:
exit(1);\
^~~~
kbanner.c:120:7: 備考: in expansion of macro ‘USAGE’
USAGE
^~~~~
kbanner.c:126:5: 警告: 組み込み関数 ‘exit’ の互換性がない暗黙的な宣言です
exit(1);
^~~~
kbanner.c:126:5: 備考: include ‘<stdlib.h>’ or provide a declaration of ‘exit’
kbanner.c:129:5: 警告: 関数 ‘kbanner’ の暗黙的な宣言です [-Wimplicit-function-declaration]
kbanner(stdin);
^~~~~~~
kbanner.c:130:5: 警告: 組み込み関数 ‘exit’ の互換性がない暗黙的な宣言です
exit(0);
^~~~
kbanner.c:130:5: 備考: include ‘<stdlib.h>’ or provide a declaration of ‘exit’
kbanner.c:142:3: 警告: 組み込み関数 ‘exit’ の互換性がない暗黙的な宣言です
exit(0);
^~~~
kbanner.c:142:3: 備考: include ‘<stdlib.h>’ or provide a declaration of ‘exit’
kbanner.c: トップレベル:
kbanner.c:145:1: 警告: 戻り値の型をデフォルトの ‘int’ にします [-Wimplicit-int]
kbanner(fp)
^~~~~~~
kbanner.c: 関数 ‘kbanner’ 内:
kbanner.c:152:12: 警告: implicit declaration of function ‘kgetchar’; did you mean ‘getchar’? [-Wimplicit-function-declaration]
while((i=kgetchar(fp))!=EOF){
^~~~~~~~
getchar
kbanner.c:159:4: 警告: implicit declaration of function ‘kputchar’; did you mean ‘putchar’? [-Wimplicit-function-declaration]
kputchar(i*256+(j&127));
^~~~~~~~
putchar
kbanner.c: トップレベル:
kbanner.c:202:1: 警告: 戻り値の型をデフォルトの ‘int’ にします [-Wimplicit-int]
kputchar(c)
^~~~~~~~
kbanner.c: 関数 ‘kputchar’ 内:
kbanner.c:267:7: 警告: 非 void を戻す関数内に値が無い ‘return’ があります
return;
^~~~~~
kbanner.c:202:1: 備考: ここで宣言されています
kputchar(c)
^~~~~~~~
kbanner.c: トップレベル:
kbanner.c:278:1: 警告: 戻り値の型をデフォルトの ‘int’ にします [-Wimplicit-int]
kgetchar(fp)
^~~~~~~~
cc -c -O font1.c
cc -c -O font2.c
cc -c -O font3.c
cc kbanner.o font1.o font2.o font3.o -o kbanner
strip kbanner
[root@hoge kbanner2]# ls -l
合計 1356
-rw-r--r-- 1 1001 wheel 321 7月 13 2004 Makefile
-rw-r--r-- 1 1001 wheel 203 7月 13 2004 README
-rw-r--r-- 1 1001 wheel 289120 10月 15 1993 font1.c
-rw-r--r-- 1 root root 79952 10月 18 04:47 font1.o
-rw-r--r-- 1 1001 wheel 289120 10月 15 1993 font2.c
-rw-r--r-- 1 root root 79952 10月 18 04:47 font2.o
-rw-r--r-- 1 1001 wheel 278000 10月 15 1993 font3.c
-rw-r--r-- 1 root root 76912 10月 18 04:47 font3.o
-rwxr-xr-x 1 root root 245376 10月 18 04:47 kbanner
-rw-r--r-- 1 1001 wheel 692 10月 15 1993 kbanner.1
-rw-r--r-- 1 1001 wheel 8594 10月 15 1993 kbanner.c
-rw-r--r-- 1 root root 16208 10月 18 04:47 kbanner.o
[root@hoge kbanner2]# ./kbanner --help
Usage: ./kbanner [-l|-numofcol] [-s] [-m] [file]
早速動かしてみると文字化け、、、当時は EUC-JP でしたので、環境変数 LANG=ja_JP.eucJP を設定し、端末文字コードも EUC-JP にして、再実行。
[root@hoge kbanner2]# echo -n キーボード配列 QWERTYの謎 | ./kbanner -s -8
; , ; ; , , , ,,,,,,,,, ,,,,, ,,,,,,,,, , ;
'; ,,, ; ; ' ' ; ; ; ; ; ;
,,;;''' '''''';''''''' ; ;';';'; ; ;,,,, ; ;
'''' ; ,,,, ',,,,,,,,,,,,, , ; , ',,,,,,,,,,,,, ;'';,, ; ; ; ; ;'''' ;' ; ; ;
,,;;''' ,; ; ';, ; ''' ;' ''; ; ,;';, ;' ; ;
'''' ;, ,; ; ;, ; ;,,,,,; ; ';' ' ;
; '' ; ' ; ; ; ;, ,; ,;' ;
'; ''' ' ''''''' '''' ,,;'' ,,;
,,,, ,,,,, ,, ,,,,, ,,,,,,,,,,, ,,,,,,,,, ,,,,,,,,,,,,, ,,,,, ,,,,, ,,,, , , ; ,
,;' ';, ; ;; ; ; ', ; ', ; ; ; ;, ,; ,,;';';,, ,,,,,,'; '; ; ;'
,; ;, ;, ;''; ,; ; , ; ; ; ;, ,; ,;' ; '; ,,,, ,,,;,,,
; ; ; ,; ;, ; ;,,,,; ;,,,,,,' ; ;, ,; ,; ;' '; ,,, ,;,
;, ,; ; ; ; ; ; ; ; ;, ; ';' ; ;' ; '''' ; ,';',
;, ,'', ,; ';; ;;' ; , ; ;, ; ; ; ,;' ;' ,,,, ;,' ; ',
'',,,,'; , ; ; ,,;,,,,,,,; ,,;,, ,,;,, ,,;,, ,,;,, ''' ,,;'' ; ; ,; ;
'' ;,,; ;' ',,,,,,
[root@hoge kbanner2]#
これだ、これだよ〜、懐かしいなあ。また利用させてもらおうと思います。作者さん、ありがとうございます m(_ _)m