« プログラミングを始めるには(32) | Main | プログラミングを始めるには(34) »

August 30, 2014

プログラミングを始めるには(33)

あなたは幸運にもelispに興味を持ってプログラミングを始めてみたが、まだ最初のうちはあまり上手くいかないのと同樣に、私にもまだまだelispで書いたことがない、または書けないプログラムがいろいろある。その一つが他のプロセスと通信するプログラムだ。このところ每日投稿していたのが急に失速したのはネタ切れではなく、その通信相手としてまずgnupackを入れてみたがダメ(何がダメなんだ?!と思われる方も多いかもしれないが詳細は省畧)で、パソコンを買い替える度に結果的に入れる羽目になるCygwinをインストールしていたからだ。ちょっと動作的におかしいところもあるが、一應Windows8.1のパソコンでもCygwinは動くらしい。

プロセスと通信するということについては、いろいろと面白い話がある。私はいわゆる「交換・傳送系」と言われる分野の開發をしてきた人なので通信には親近感があるが、そうでない專らOA系?の技術者にとっては通信と言うとむずかしいイメージがあるかもしれない。EmacsはむかしからUNIXというOS(オペレーティングシステム)の中で動いてきたエディタであり、他のプログラムと連攜する機能はUNIXのプロセス閒通信を使用したものとなっている。

若い頃は同僚との閒でプロセスって何?という話をするのが好きだった記憶がある。似たような用語にタスク、スレッド、ハンドラなどがあるが、これらの違いをちゃんと說明出來る人がほとんど居なかったのだ。このへんはUNIXWindowsのようなOSの上で動くプログラムしか作ったことがない人には理解出來ない領域なので、說明出來なくても無理はない。プロセスとはリソースを表す單位で、UNIX上のアプリケーションプログラムはすべてプロセスの中で實行される。最近の感覺で言えば、プロセスは假想サーバの中で動く假想マシンのようなものだ。OSに乘っかってプロセス上で動くアプリケーションプログラムは、自身のコードとOSのコードを實行しながら機能を實現する。自身のコードを實行する場合は保護モードで、OSのコードはカーネルモードで動く。アプリケーションがファイルアクセスなどのシステムコールをすると、ソフトウェア割り込みが發生させ、カーネルモードに切り替え、例外が發生しない限り他から割り込まれないような狀態にしてから、OSカーネルのコードを實行する...などの話は本題からあまりに脫線し過ぎなので、このくらいにしておく。

他のプロセスと通信すると言っても、實はむずかしいことではない。みなさんが、WindowsでコマンドプロンプトからDOSコマンドを實行すると、コマンドプロンプトのウインドウに結果が表示されるだろう。當たり前だと思うかもしれないが、これはコマンドプロンプトからdirコマンドを實行すると、dirプログラムの標準出力と、コマンドプロンプトの標準出力が同じになっているからだ。Emacsでも同樣に、Emacsの中からコマンドを實行するとEmacsの中に結果が表示される。Emacsの場合は、起動したプログラムの結果出力に對してちょっかいを出すことが出來るので、それを應用していろんな機能を實現しているのである。

default-process-coding-system
(japanese-shift-jis-dos . japanese-shift-jis-unix)

(shell-command "ls -l /usr/bin/ls.exe" t)
316
-rwxrwxr-x 1 NOBUO 縺ェ縺・121373 Aug 13 04:58 /usr/bin/ls.exe

(let ((default-process-coding-system '(utf-8-unix . utf-8-unix)))
  (shell-command "ls -l /usr/bin/ls.exe" t))
386
-rwxrwxr-x 1 NOBUO なし 121373 Aug 13 04:58 /usr/bin/ls.exe

上の例のように、Windowsパソコン上のEmacsの中だけでelispのプログラムを書いているのなら、あまり文字コードのことを意識する必要はないが、外部のプログラムが出力する文字列を出力する場合は、そういうことまで意識する必要が出てくる。氣にせずにプログラムを書くと文字化けしてしまうことがある。Cygwinが日本語文字列を表示しないように設定すれば良いのかもしれない。今囘はteratermからCygwin接續するときの文字コード設定を參考にして、Cygwin側の設定を變えようとは思わない。

Ws000098


(shell-command "echo $TERM" t)
32
CMD

(shell-command "echo $LANG" t)
32
JPN

(shell-command "(export LANG=C; ls -l Meadow.exe)" t)
55
----------+ 1 NOBUO なし 6205440 Aug 10  2009 Meadow.exe

こういう結果になる環境の文字コードって制御出來るかどうか分からないので、調査したりトライ&エラーを繰り返す氣になれないのだ。なので、Emacs上のdefault-process-coding-systemI/Oどちらもutf-8-unixにするという、ちょっと强引なやり方で濟ませることにする。

|

« プログラミングを始めるには(32) | Main | プログラミングを始めるには(34) »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/74224/60232403

Listed below are links to weblogs that reference プログラミングを始めるには(33):

« プログラミングを始めるには(32) | Main | プログラミングを始めるには(34) »