通常の業務に使うにはかなり無理があるが、用途を限定すれば、使えなくはない。
主記憶の容量の問題で、Xがほぼ利用できないので、fbterm + uim-fepでつかう。20年前に戻ったと思って、コンソールアプリを作て遊べばいいだろう。
atyfb.koを改造すれば、1024x480の広い画面(?)が使えるので、むしろ20年前よりもいい。
若かりし頃を思い出しながらプログラミングをしていても、今は今だ。20年前ではない。
コンソールアプリを作っていても、しばしば調べごとをしたい事もあるし、/usr/share/doc/の下のドキュメントが時々HTMLで書いてあったりするので、webブラウザも使いたい。
しかし、Xが動かないので、FireFoxもChromeも使えない。コンソールでも使えるブラウザが必要になる。
コンソールで、動くブラウザにはいくつかあるが、私はw3mを使っている。
xterm等のグラフィックが使える端末上ならば、w3mは、画像も表示されるので、HTMLで書かれたドキュメント内に画像イメージが入っていても表示できる。
残念なことに、fbterm上では、そのままではw3mは画像を表示できない。
"fbterm"よりも古い"jfbterm"や、fbconでは表示できるのに、だ。
じゃ、jfbtermやfbconを使えばいいと思うかもしれないが、そうは行かない。
jfbtermは不安定で古くメンテナスも行われていない。終了しようとすると、画面がフリーズしてしまう。
(見えないだけで、文字入力はできる。正確に'sudo shutdown -r now'と打って、パスワードを入力すれば、shtdown可能)
fbconは、日本語が表示できないので、仮にw3mが動いたとしても、表示される情報はひどく制限されてしまう。
なんとかfbtermでw3mを使いたい。そして画像も表示させたい。
というわけで、jfbterm と fbterm そして、w3m のソースコードを取ってきて調べた。
そして、なぜjfbterm上ならば、w3mが画像を表示できるのかがわかった。
w3mが特別にjfbtermを認識して、画像表示機能を有効にしている。
w3m-0.5.3/w3mimg/fb/fb_w3mimg.c の以下の部分。
:
172 return NULL;
173 memset(wop, 0, sizeof(w3mimg_op));
174
175 if (!check_tty_console(getenv("W3M_TTY")) && strcmp("jfbterm", getenv("TERM")) != 0) {
176 fprintf(stderr, "w3mimgdisplay/fb: tty is not console\n");
177 goto error;
178 }
:
環境変数 TERM の内容が "jfbterm" だとエラーとしないようになっている。
じゃ、ここで fbterm もエラーとしなければいいのだが、実は fbterm が動作している時の環境変数TERMの値は"linux"である。
そして、この"linux"は、画像が扱えないコンソールでも同じである。そのため、"linux"を許可するわけにはいかない。
ちょっとずるいが試しに、fbterm上から、以下のようにして起動してみると、
$ TERM=jfbterm w3m www.google.com
ちゃんと画像も表示できた。
これに安心して、jfbtermをアンインストールする。
その後、もう一度w3mを動かすと、以下のようになって動かない。
Can't find termcap entry jfbtermjfbtermをアンインストールしたんだから当然だ。
そもそもfbtermに、jfbtermと名乗るのはいかがなものか?
fbtermには"fbterm"と名乗らせるべきだ。/usr/share/terminfo/f/fbterm もinstallしているんだから。
というわけで、改造することにした。
fbtermがどこで環境変数をセットしているのか探してみたら、
fbterm-1.7/src/lib/shell.cpp の以下の部分。
:
79
80 case 0: // child process
81 initShellProcess();
82 setenv("TERM", "linux", 1);
83
84 if (command) {
85 execvp(command[0], command);
:
"linux" となっているのを "fbterm" にする。そして、w3mも fbterm を受け付けるように改造する。
:
148 #ifdef W3MIMGDISPLAY_SETUID
149 static int
150 check_tty_console(char *tty)
151 {
152 if (tty == NULL || *tty == '\0')
153 return 0;
154 if (strncmp(tty, "/dev/", 5) == 0)
155 tty += 5;
156 if (strncmp(tty, "tty", 3) == 0 && isdigit(*(tty + 3)))
157 return 1;
158 if (strncmp(tty, "vc/", 3) == 0 && isdigit(*(tty + 3)))
159 return 1;
160 return 0;
161 }
162 static int
163 check_TERM( const char *term )
164 {
165 static const char const *capableTerminals[] = {
166 "jfbterm", "fbterm", NULL
167 };
168 int i;
169 for( i=0; capableTerminals[i]!=NULL; i++ ) {
170 if( strcmp( term, capableTerminals[i] ) == 0 ) {
171 return 1;
172 }
173 }
174 return 0;
175 }
176 #else
177 #define check_tty_console(tty) 1
178 #define check_TERM(term) 1
179 #endif
180
181 w3mimg_op *
182 w3mimg_fbopen()
183 {
184 w3mimg_op *wop = NULL;
185 wop = (w3mimg_op *) malloc(sizeof(w3mimg_op));
186 if (wop == NULL)
187 return NULL;
188 memset(wop, 0, sizeof(w3mimg_op));
189
190 // if (!check_tty_console(getenv("W3M_TTY")) && strcmp("jfbterm", getenv("TERM")) != 0) {
191 if ((check_tty_console(getenv("W3M_TTY"))==0)&&
192 (check_TERM(getenv("TERM")) ==0)) {
193 fprintf(stderr, "w3mimgdisplay/fb: tty is not console\n");
194 goto error;
195 }
:
やややり過ぎ感もあるが、どうせなら思い切って、改造がわかりやすいほうがいいので、こうした。両方共 debchange や、dpkg-buildpackage をおこなって、バイナリパッケージをビルドする。
出来上がったバイナリパッケージをinstallして動作確認すると、ちゃんと動いた。
ついでに… fbtermで、ambiguous-wideを指定すると、UnicodeのAmbiguous文字(詳しくは、このへんとか、このへんを参照)が倍角になる。フォントのグリフは倍角で書かれているので、こっちのほうがいい。
w3mもそれに対応する機能がある。
オプション画面にして、下の方の「ある種のUnicode文字を全角にする」を「(*)YES」とする。
両方共あってないと表示が崩れる。注意せよ。