« 今日の工作 棒テンプ式機械時計 | メイン | SF本読了:物体O »

2005年07月09日

●grayコード変換CGI

グレイコーディングを行うCGIを書いてみた。バイナリコーディング(一般的な10進2進変換)では,10進表記で隣り合っている値のハミング距離が1にならない場合がある(たとえば,3と4を2進数に直すと011と100となりハミング距離は3になる)。隣り合う値のハミング距離が常に1になるようなコーディング手法をグレイコーディングという(らしい)。3と4をグレイコードで表すと010と110となり,異なるビットの数は1つ,つまりハミング距離が1となっている。

CGIの使い方は,バイナリ→グレイか,グレイ→バイナリの動作を選んで,入力欄に変換元になるビット列(11001など)を入れて実行ボタンを押すだけだ。入力桁数に制限はなく,メモリが許す限り長いビット列を変換できる(はず)。

→[バイナリ⇔グレイコード変換CGIを実行]

グレイコーディングは主に遺伝的アルゴリズム(Genetic Algorithm;GA)の中で,数値を遺伝子コーディングする際に解の探索性を向上させる工夫で,それ以外には使い道はないかもしれない。従ってこのCGIも実用性は低い(実用性が高ければとっくに誰かが作っている)。

GA自体もrubyで書いてしまえばいい(実際,rubyにはruby/GPという遺伝的アルゴリズム用のライブラリが用意されている)のだが,スクリプト言語(インタプリタ)に数値計算をやらせるのはちょっと荷が重いかもしれない。

今回初めてcgiライブラリを使ってみたが,ローカル環境では動くのにサーバにアップロードするとInternal Server Errorが出るという現象が出て悩まされた()。レンタルサーバ(Telnet不可)だとプロセスをkillすることも出来ないし,間違って無限ループなどしてしまったらどうしたらいいのだろう...。

非常に稚拙なコードで恥ずかしいが,一応ソースを公開する。[gray.lzh(2kB)]
ただしこのコードを使用して何らかの不利益を被ることがあっても,Webmasterは責任を担保しない。

延べ数時間悩んだ挙句,RubyでCGIを作ろうで,

#!/usr/local/bin/ruby
print "Content-type: text/html\n\n"

この2行はプログラムの始めの部分に必ず付ける必要があります。

この,必ず付けるというのを無視して,1行目だけを書いていたのが原因とわかった。2行目も重要だったのだ。しかしWindowsにインストールしたローカル環境のrubyではWarningも何も出なかったのだが...。

grayコード変換,逆変換アルゴリズム

コメント

昨日は長々と話してすみませんでした。

ローカル環境でうまく動作したのは、Windowsに限らずLinuxでもWebサーバー管理初心者向けにContent-Typeを出力しない場合はテキストのHTMLファイルとして強制的に指定する設定になっているみたい。
そういう些細な違いって、わからないとはまりますよね。僕も自宅でアルバム用Webページを作ってる時に、同じ問題で悩まされたことがあります。些細だからネットで検索しても原因が究明しづらいから、やっかいなんだと思います。

蛇足かもしれないけど、スクリプトで画像ファイルを出力する場合は、
print "Content-type: imege/jpeg\n\n"
とかってなるはず。

そうそう,難しいことは意外に調べるのが簡単だったりするんだけど,本当に初歩のところはつまづきやすい。初心者向けの解説ページ作ろうという段階の人は自分は既に初心者を卒業してしまっていて,努力はしても完全に初心者の気持ちには戻れないし,難しいところですね。

それにしてもIP電話使うようになると,今までのNTTへの高額お布施はなんだったんだ?と思いますよね。

これからもアドバイスよろしくお願いします。