My Perl Program List, 私が作ったPerlのソースプログラム一覧

      印の行をクリックすると開きます。
      印の行をクリックすると閉じます。
(右側の《一括操作》も活用できます)

     ・(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)

 
  •   《 Perl Program 集 》
  • Version : 3.141592653589 ( Last Update : 2022-02-12 )
    • 変更履歴
      • V1:試作版 : SDcheck.pl を数独欄からコピーしました(2017-4-25)
        V2:限定公開版 : Dump.pl デバッグ用メモリダンプ・プログラム(2017-6-1)
        V3:公開版 : AnatomyJPG.pl を公開(2017-6-25)
        V3.1 : JPGvivisect.pm を公開(2017-7-1)
        V3.14 : SDcheck.pl の【説明】を追加(2017-7-3)
        V3.141 : AnatomyJPG.pl と JPGvivisect.pm を一部修正(2017-7-16)
        V3.1415 : AnatomyJPG.pl の出力結果を一部修正(2017-7-30)
        V3.14159 : 一部のブラウザで表示できない部分を回避しました。(2017-8-1)
        V3.141592 : Dump.pl に【説明】を追加しました(2017-8-6)
        V3.1415926 : AnalizeJPG.pl に【説明】を追加しました(2017-8-8)
        V3.14159265 : AnalizeJPG.plとJPGvivisect.pmに【説明】を追加(2017-8-16)
        V3.141592653 : Copyleft 表示を挿入 (2017-8-20)
        V3.1415926535 : プログラムと実行結果の表示方法を、target="_new" から target="_blank" に変更しました。(2017-8-25)
        V3.14159265358: : intValueプログラムを追加しました。(2017-12-01)
        V3.141592653589: : AnalizeACSLog.plとMakeCTTable.plプログラムを追加しました。(2022-02-12)
        (内容に関して感想があれば歓迎します)
  • 作成の経緯 
    •  私が作ったPerlプログラムを集めました。実行したプログラムそのままを(HTML表示に変換し)掲示しています。(続く)
    • クリックで(続きを読む) 
      •  (未完です!)私が作ったPerlプログラムを集めました。実行したプログラムそのままを(HTML表示に変換し)掲示しています。

         ソースプログラム実行結果 を見たい場合は、クリックにより他の場所に表示されます(target="_blank" で表示されるので、動作はブラウザにより異なります)。

  •   
  •   《 Perlプログラムの一覧 》
  • AnatomyJPG.pl
    • 説明
      •  デジタルカメラで使われているJPGファイル形式のデータを解析して撮影データを取り出せるようにするプログラムです。

        ▼解剖と解析
         方針として、先ず全体の「解剖」(JPGvivisect.pm で処理)を行って、その後で個々に「解析」(AnatomyJPG.pl で処理)するという手順を取ることにした。ただし、呼び出しの手順は AnatomyJPG.pl から JPGvivisect.pm を呼び出すようになっている。

        (図1:処理の手順)

         JPGファイルでは、本来の画像データの前に情報セグメントが複数個置かれている。
        (図2:JPGファイルの構造)

         この「情報セグメント部」に属する「各情報セグメント」の「種類」と「位置関係」を明確にする必要がある。つまり解剖して各セグメント(内臓)の種類と位置と寸法が分かるようにする。そして全体の骨格が明確になった後で、初めて個々のセグメントの中を解析することにする。

        ▼解析プログラム(AnatomyJPG.pl)
         解析段階では、解剖段階で得られた情報を使って一般の利用者(カメラ愛好家)が必要とするであろう各種情報を得られるようにする。得られた「解析結果」は %DataTBL という名の、グローバルなハッシュ変数上に保存し共用されるようにする。
         解析結果を記憶したければ、適当に識別名を付けて値を代入すればよい。

         $DataTBL{'File Name'} = "$fileString";

         例えば、SOF0('FFC0')マーカーに属するデータを得たければ

         $pos =$HashTBL{'FFC0'}[1];
         
        として'FFC0'マーカーの位置情報を取り出し getByte関数を使ってセグメントパラメータ部から値を取り出す。

         $h = getByte($pos+5,2);
         $w = getByte($pos+7,2);


         これらを $DataTBLに保存するときは、数値にコンマを挿入(insCom関数)したり、数値の単位も合わせて記録しておくと利用するときに便利である。

         $DataTBL{'横幅'}=insCom($w)." Pixel\n";
         $DataTBL{'高さ'}=insCom($h)." Pixel\n";

        【使用上の注意】:プログラムの文中で、フォントがで表示された部分を適宜書き直して活用してください。

    • AnatomyJPG.pl のソースプログラム
    • 実行結果の例
    •   
  • JPGvivisect.pm
    • 説明
      •  JPGファイル形式のデータを解剖しファイルの骨格を明らかにする。

        ▼解剖プログラム(JPGvivisect.pm)
         解剖プログラムは最も基本的なプログラムなのでパッケージ化し、ライブラリとして使えるようにしてある。

         この「解剖結果」を記憶する場所として %HashTBL という名のグローバルなハッシュ変数を用意する。グローバル変数なので他のモジュールからもアクセスできるようになっている。

         各セグメントは先頭にはマーカー(2バイト)があり、次に長さ情報(2バイト)が置かれている。この値がマーカーに続く情報部分(セグメントパラメータ部)の長さである。つまりこの2バイトの長さを置く場所も情報部分に含まれる。

        (図3:セグメントの構造)

         %HashTBLというハッシュ変数をどのように使うかを説明しよう。
         ハッシュ変数というのは、<キー><値>を対にして記憶するものであるが、%HashTBLでは<キー>として JPGファイルのセグメント情報を示す「マーカー」を利用する。<値>としては、そのマーカーの<位置情報>を記憶する。

        (表:代表的なマーカーの一覧)
        Merker
        Code
        SOI(Start of Image) FFD8
        APP0(JFIF) FFE0
        APP1(Exif) FFE1
        APP1(Exif) FFE1
        DQT(Define Quantization Table)FFDB
        DQT(Define Quantization Table)FFDB
        SOF0(Start Of Frame 0) FFC0
        DHT(Define Huffman Table) FFC4
        DHT(Define Huffman Table) FFC4
        DHT(Define Huffman Table) FFC4
        DHT(Define Huffman Table) FFC4
        SOS(Start Of Scan) FFDA
        EOI(End Of Image) FFD9

         ただし、同じマーカーが繰り返し登録される可能性もあるので、<位置情報>には登録個数とそれぞれの位置情報を保存できるようにする。そのため、値はリスト形式にしてある。
          ( [0], [1], [2], [3], .... )
        [0]に登録個数、[1]以降に位置情報が置かれる。  最初に

          $HashTBL{ <キー> }[0];

        とするとマーカーが%HashTBLに登録され、値を置く位置の[0]はまだ空であるがPerlでは空はゼロと解釈されるので、

          $i = ++$HashTBL{ <キー> }[0];

        と書いておけば [0]の値が 1 に、$i にも 1 が代入される。

        次の行の

          $HashTBL{ <キー> }[$i] = <位置情報>;

        <キー>に対応する<位置情報>[$i]つまり[1]の位置に保存される。
        以下同様にして、登録のたびに[0]に個数が
        それぞれの位置情報が[1],[2],[3],[4],...
        に保存されていく。

    • JPGvivisect.pm のソースプログラム
    •   
  • AnalizeJPG.pl ( 旧版 GetJPGsize.pl )
    • 説明
      •  このプログラム AnalizeJPG.pl の中で使われている GetJPGsize という関数を使えば、画像の横の長さ縦の長さを求めることができます。手作業によるのではなくプログラムでその値を抜き出すことができれば、沢山の画像ファイルに対し一括して適用できるようになります。具体的な活用法は「昔プログラマの プログラミング奮戦記」で紹介されています。

         しかしこの関数の記述では、複数のJPGファイルに対し繰り返し適用しようとすると、残念ながら2度目以降はうまく動作しないのです。プログラムの世界ではこういう状況を「reusable でない」と言います。reusable でない関数は、全くとは言わないまでもほとんど利用価値がありません。直接の原因はまだ分かっていませんが、この反省から「AnatomyJPG.pl」や「JPGvisiaect.pm」を作ることにしました。詳しい経緯は「昔プログラマの プログラミング奮戦記(2)」で紹介する予定です。

         このプログラムのどこに問題があるのか、是非研究してみてください。

    • AnalizeJPG.pl のソースプログラム
    •   
  • Dump.pl
    • 説明
      •  ダンプという技法は、ファイルやメモリの内容を書き出してトラブルの原因を見つけ出すために使われます。最も基本的なデバッグツールです。昔はよくお世話になったものですが、長らくご無沙汰していました。

         JPGファイルの解析段階で、いよいよ行き詰った時、ふと「ダンププログラムがあったらなあ」と思い出し、なら、自分で作ってみようと思い立ちました。

         データは内部表現を8進数、あるいは16進数で表現するのが普通ですが、私は長らくプログラミングの実務から離れていたので、16進数よりも10進数の方が慣れてしまっていることに気が付きました。そこで番地表示としては16進数と10進数の両方を使うことにしました。

         なお、このプログラムでも JPGvivisect.pm をパッケージとして使用しています。

        【使用上の注意】:プログラムの文中で、フォントがで表示された部分を適宜書き直して活用してください。

    • Dump.pl のソースプログラム
    • 実行結果の例
    •   
  • SDcheck.pl
    • 説明
      •  私は、数独の問題を自分で作ろうと考えました。新しい問題を作ることはもちろん難しいのですが、既存の問題とは異なる新しいものであることを確認するのはもっと難しいことなのです。数独の問題の組み合わせは ほぼ無限に(約54億パターン)あると言われていますから、誰も確認などしないでそのまま公表しているのだと思います。

         そうなると、既存の問題と偶然に一致した問題が作られても、誰もそれに気が付かないまま新しい問題だと思い込んでいる可能性があります。私は、そういう素朴な疑問を持ってしまったのです。そこで、既存の問題と同じものが含まれていないか確認するプログラムを作ってみようと思い立ちました。以前から Perl言語を使えば簡単にできるのではないかと考えていたからです。

         先ず、その経緯を紹介した「数独の類似問題について考える」を参照してください。類似度検出プログラムの初版が掲示されています。

         その後、改良を加えた版を次々と作り「類似度検出プログラムの改良(V3.0)」が現時点での最新版です(この "Perl Program 集" に収録されているものと同一のものです)。ここには使われたアルゴリズムの詳細が説明されています。

        【使用上の注意】:プログラムの文中で、フォントがで表示された部分を適宜書き直して活用してください。

    • SDcheck.pl のソースプログラム
    • 実行結果の例
    •   
  • intValue.pl
    • 説明
      •  友人八卷氏が Facebook 上で提起した次のような問題を解くためのプログラムです。

         『?*(?-?/?)=10 の?には一桁の異なる整数が入る

         つまり ? に入る整数を求めよという問題です。

         詳しい経緯は「眼科の待合室で考えた」を参照してください。

    • intValue.pl のソースプログラム
    • 実行結果
    •   
  • AnalizeACSLog.pl
    • 説明

      •  私のホームページ上で使っていたカウンターが突然使えなくなってしまいました。そのため私が作った「カウンター値一覧表の表示プログラム」が使えなくなってしまったのです。詳しい経緯は「(アクセスカウンター(その1))カウンターが使えなくなりました」を読んでいただければ分かると思います。

         ここでは、その対策としてログファイルを解読することにより、カウンター値の変化を推測し、その値を使って長年愛用してきたプログラムを救い出すことに成功しました。この方法を用いれば、システムがカウンターの設定を認めない環境下でもカウンター処理ができるかもしれません。参考にしてください。

         技術的な問題点がどこにあるかを知りたければ、「(アクセスカウンター(その3))カウンター機能を自作する」を参照し、▼不思議なカウンター機能の項を読んでください。

    • AnalizeACSLog.pl のソースプログラム
    • 実行結果
    •   
  • MakeCTTable.pl
  •   
      (c)2022 by Knuhs