・(1)JPGファイルを解析するプログラム(AnatomyJPG.pl) ・(2)JPGファイルを解剖するプログラム(JPGvivisect.pm) ・(3)JPGファイル解析プログラム旧版(AnalizeJPG.pl) 【注意】ここで扱っているJPGファイルは、Exifフォーマット v1.1 です。 ・(4)デバッグ用メモリダンププログラム(Dump.pl) ・(5)数独のチェックプログラム(SDcheck.pl) ・(6)「?*(?-?/?)=10」に該当する?を求める(intValue.pl) ▼(7)ログファイルを解析するプログラム(AnalizeACSLog.pl) ▼(8)推理法によるカウンター値一覧表示プログラム(MakeCTTable.pl)
▼解剖と解析 方針として、先ず全体の「解剖」(JPGvivisect.pm で処理)を行って、その後で個々に「解析」(AnatomyJPG.pl で処理)するという手順を取ることにした。ただし、呼び出しの手順は AnatomyJPG.pl から JPGvivisect.pm を呼び出すようになっている。
【使用上の注意】:プログラムの文中で、フォントが赤で表示された部分を適宜書き直して活用してください。
▼解剖プログラム(JPGvivisect.pm) 解剖プログラムは最も基本的なプログラムなのでパッケージ化し、ライブラリとして使えるようにしてある。 この「解剖結果」を記憶する場所として %HashTBL という名のグローバルなハッシュ変数を用意する。グローバル変数なので他のモジュールからもアクセスできるようになっている。 各セグメントは先頭にはマーカー(2バイト)があり、次に長さ情報(2バイト)が置かれている。この値がマーカーに続く情報部分(セグメントパラメータ部)の長さである。つまりこの2バイトの長さを置く場所も情報部分に含まれる。
しかしこの関数の記述では、複数のJPGファイルに対し繰り返し適用しようとすると、残念ながら2度目以降はうまく動作しないのです。プログラムの世界ではこういう状況を「reusable でない」と言います。reusable でない関数は、全くとは言わないまでもほとんど利用価値がありません。直接の原因はまだ分かっていませんが、この反省から「AnatomyJPG.pl」や「JPGvisiaect.pm」を作ることにしました。詳しい経緯は「昔プログラマの プログラミング奮戦記(2)」で紹介する予定です。
このプログラムのどこに問題があるのか、是非研究してみてください。
JPGファイルの解析段階で、いよいよ行き詰った時、ふと「ダンププログラムがあったらなあ」と思い出し、なら、自分で作ってみようと思い立ちました。
データは内部表現を8進数、あるいは16進数で表現するのが普通ですが、私は長らくプログラミングの実務から離れていたので、16進数よりも10進数の方が慣れてしまっていることに気が付きました。そこで番地表示としては16進数と10進数の両方を使うことにしました。
なお、このプログラムでも JPGvivisect.pm をパッケージとして使用しています。
そうなると、既存の問題と偶然に一致した問題が作られても、誰もそれに気が付かないまま新しい問題だと思い込んでいる可能性があります。私は、そういう素朴な疑問を持ってしまったのです。そこで、既存の問題と同じものが含まれていないか確認するプログラムを作ってみようと思い立ちました。以前から Perl言語を使えば簡単にできるのではないかと考えていたからです。
先ず、その経緯を紹介した「数独の類似問題について考える」を参照してください。類似度検出プログラムの初版が掲示されています。
その後、改良を加えた版を次々と作り「類似度検出プログラムの改良(V3.0)」が現時点での最新版です(この "Perl Program 集" に収録されているものと同一のものです)。ここには使われたアルゴリズムの詳細が説明されています。