1999年9月5日日曜日

[Code] UNIX系ユーザのための HP100/200LX テッテー活用法


[Code] UNIX系ユーザのための HP100/200LX テッテー活用法
UNIX系ユーザのための HP100/200LX テッテー活用法
Version: 3.13 (1998-07-10)
♪きむらかずし <kimu@st.rim.or.jp>
[ホームページ /ぱーむとっぷ・わーるど /ウクレレ日記(最新情報?)]
■はじめに
このドキュメントは HP200LX を可能な限り UNIX 化するための情報源です。
 HP200LX 自体については → 8. 関連リンク集をごらんください。このドキュメントの更新情報は → 9. History をごらんください。最新版は下記に置いてあります。転載&リンク・フリーです。
  <http://www.st.rim.or.jp/?kimu/palm/lx-ux.htm>
  <http://www.st.rim.or.jp/?kimu/palm/lx-ux.txt>
ご注意:
無保証です。情報提供は大歓迎ですが、単なる質問はご遠慮ください。
■まずは UNIX-like Tools
新出@奈良女子大学さん <nide@e.ics.nara-wu.ac.jp> が改良を続けている
 UNIX-like Tools は、 MS-DOS 特有の事情や日本語の処理も考慮しており、とてもよくできています。UNIX 的なワイルド・カード展開を内蔵しているのもウレシイです。
1-1: UNIX-like Tools の置き場所
1998 年 7 月現在、FTP サイトには uxtl410b.tgz (98/04/10) があります。 VECTOR のサイトには、ちょっと古いバージョンがあるかもしれません。
FTP サイトはネットワーク的に細いようです。
  <ftp://ftp.ics.nara-wu.ac.jp/pub/nide/dosutil/>
  ミラーサイト <http://www.asahi-net.or.jp/?bi3t-aoym/>
  <http://www.vector.co.jp/vpack/browse/software/win95/util/sn072811.html>
1-2: UNIX-like Tools に含まれるコマンド
  --- uxtl305/readme.doc より --------------------------------------
      a) オリジナル版(後述の斎藤靖さん版)時代からあるコマンド
      b) オリジナル版を廃止して私が新製したコマンド
      c) 私が新たに追加したコマンド
      d) contributeされたもの(いずれもUNIXに該当なし)
  --- 引用ここまで ---
 
1-3: Windows95 長いファイル名にも対応
HP200LX とは直接関係ありませんが、UNIX-like tools は、Version 4.0 から
同じ実行ファイルを Windows95 の DOS 窓で使うと「長いファイル名」を扱え
るそうです。さあ、マウスを捨てて、キーボードに向かいましょう。
■GNU のツールを MS-DOS に移植したもの
フリーソフトウェアといったらやっぱり GNU ですね。残念ながらgccなどDOS-Extender を必要とするものは LX では使えません。
以下、必ずしも最新バージョンとは限りません。「file: 」に示されたファイル名は archie 検索のための目安です。ほとんどのソフトは IIJ 運営する FTP サイトの gnuish ディレクトリにあります。 → 7.
gzip 1.2.4:
        GNU 純正圧縮/展開コマンド。圧縮後の拡張子は .gz です。
        DOS の場合、圧縮前の拡張子が一文字残ります。
        % gzip -d file.tgz    ... 圧縮をといて file.tar を得ます。
        file: gzip124x.zip
GNU tar 1.09:
        GNU Tape ARchive です。複数ファイルを 1 つにまとめます。
        % tar xvf file.tar    ... file.tar を展開します。
        file: gnutar.zip
GNU RCS 5.7:
        ドキュメントのバージョン管理システム RCS 。
        このドキュメントでも使っています。1 行目そのが証拠。
        GNU diff と合わせてメモリ食い。 DOS 窓では動きません。
        生 DOS でも、扱えるファイルサイズは 100KB 以下です。
        RCS ファイルの改行コードは LF だけになるようです。
        file: rcs57pc1.zip
        Simtel 等の gnuish プロジェクトに入っています。
        (rcs57pc1.zip の bindos ディレクトリに入ってます。)
        日本の koya さんが移植したものもあります。
        こちらは man ページの日本語翻訳付きです。
        <ftp://ftp.iij.ad.jp/pub/msdos-j/Develop/gnurcs.lzh>
GNU diff 11.5:
        -a プションで、日本語も OK 。
        file: dif115ax.zip
GNU patch 1.2:
        diff 差分ファイルによるパッチ当てに使います。
        file: PAT12BN.ZIP
        (新しい GNU patch 2.12 は LX をハングさせました...)
■他の「使える」 UNIX 系コマンド
UTIL1059:「アセンブラで書かれた Utilities 」なのでディスク節約!
        仙石浩明さんの UNIX 系コマンド集
        内容: wc, du, chmod, jtos, stoj, swchar
        ちなみに du は UNIX-like Tools にないので貴重です。
        file: util1059.lzh
HistCSH 2.04a:
        ついに発見! tcsh もどきの shell プログラム。筆者愛用。
        ファイル名だけじゃなくて、コマンド名の補完もできる!
        ただし、常駐サイズは cmdedit の約 2 倍。でもオプション
        指定の工夫で減らすこともできます。
        file: hist204a.lzh
        <http://www.vector.co.jp/vpack/browse/software/dos/util/sn035845.html>
cmdedit 2.0e6:
        コマンドライン編集、ヒストリ、ファイル名補完ツール。
        tcsh もどきとして(コマンド名補完はできません)。
        cmdedit.cfg にて例えば "defs cd a:\unix\bin\chd" 
        とすると cd コマンドを入れ替えることができます。
        -i option でデフォルトで挿入モードになります。
        file: cmded2e6.zip
kmtar 2.01:
        森公一郎さんら <kmori@lsi-j.co.jp> による tar クローン
        kmtar Power-Up Kit v3.7 でさらにパワーアップ!
        (圧縮ファイル、EUC 展開、GNU tar 対応等)
        file: puk37bn.lzh
        <http://www.vector.co.jp/vpack/> のどこかにあります。
uudx 2.99, uuex 2.5:
        AssistantIO さんの uuencode/uudecode クローン
        file: uudx_299.lzh, uuex_25.lzh
less  version 123 + 6(MSDOS, SJIS, Jul 12 1990).:
        「more の反対」の日本語版。つまりバックスクロール可能。
        環境変数の設定例: set LINES=11
        file: less123.lzh
jperl version 4.036 + 1.4(MS-DOS, SJIS) Oct 31 1993:
        生 DOS、あるいは maxdos 上で動作します。
        システムマネージャ上の DOS 窓ではメモリ不足でダメでしょう。
        オプション -Llatin で、オリジナル英語モードで動くようです。
        日本語版 perl マニュアルも、別途入手可能。
        <http://www.vector.co.jp/vpack/> のどこかにあります。
JVim ( VIM 3.0 日本語版 1.3 ):
        vi クローン vim の日本語版。最新版は LX でもバッチリ。
        漢字コード自動識別!筆者愛用。ただし DOS 窓では動きません。
        NEW!  VIM 3.0 最後のバージョンアップ j1.3d (MS-DOS 版)あります。
        日本語化した土田さんのホームページはこちら:
        <http://hp.vector.co.jp/authors/VA003457/>
jstevie ( STEVIE 3.69 - 日本語版 1.3 ):
        vi クローン stevie を太田純さんが日本語化。
        /etc/termcap や、環境変数 TERM の設定が必要。
        こちらは省メモリで、DOS 窓でも動きます。
        file: jst13exe.lzh
        <http://www.vector.co.jp/vpack/browse/software/dos/writing/sn001466.html>
jelvis ( elvis 日本語版):
        vi クローン elvis の日本語版。未チェックです。
Elrond's μEMACS 4.00 J1.00 for DOS:
        NEW!  MicroEMACS は emacs 的小型エディタ。Elrond さんが日本語化。
        うれしい Undo 機能付き!LX では「小指を CTRLに」は辛いですが...
        <http://www2.gol.com/users/elrond/microemacs/>
nit 4.2:
        NitEmacs すなわち GNU emacs に「似て」いる日本語エディタ。
        S.CHIBA さん作。 T. Kuliyama さん移植。Undo できません (;_;)
        file: nitvs003.lzh
        <http://www.vector.co.jp/vpack/> のどこかにあります。
PCC; Personal C Compiler 2.1c (June 1989) ん? 1.2c とも書いてある:
        なんと LX で単独で使える Shareware の C コンパイラ。
        file: PCC12C.ZIP
■UNIX 系じゃないけど便利なコマンド
QKC Version 1.92:
        Quick KANJI code Converter Version 1.8 by K.Sato (1992) 
        例えば、
                % qkc /m unknown.txt
        で、漢字コード&改行コードを自動判別し、下記の変換をします。
                漢字コード: ShiftJIS (デフォルト)
                改行コード: MS-DOS (スイッチ /m による)
        file: qkc192.zip
        <http://www.vector.co.jp/vpack/browse/software/dos/util/sn037633.html>
maxdos Version 0.3.7:
        System Manager とその上で動作している EXM アプリを終了すること
        なく、(それらの状態をファイルに swap out することによって)
        最大限のメモリを DOS モードに与えるプログラム。
        この上で、メモリ食いの jperl 等もバッチリ動きます。
        file: 下記参照
        <http://www.vector.co.jp/vpack/browse/software/dos/util/sn038062.html>
■Tips
% プロンプトにもこだわる?
autoexec.bat に "prompt=%% " (「"」記号は含まず。 % は特殊記号なので
%% と重ねてエスケープ。最後のスペースを忘れずに)と入れると、プロンプトが
 "% " になります。パス名表示 $p は便利ですが、大文字なので却下 (^^;
# ←これをプロンプトにして root 気分を味わうのも吉(ホントか?)。
最近、発見された HistCSH は、csh っぽいプロンプトが簡単に作れます。
この場合、DOS 側のプロンプトは set prompt=$s として殺します。
■使い方サンプル集
バッチファイルにしておくと便利かも。
6-1: UNIX 的ファイル一覧(前後スクロール可能)
    % ls -al | less
 
6-2: 改行コードの変換
漢字&改行コード自動変換コマンドは → 4.
UNIX-like Tools の tr コマンドの内部改行コードは UNIX と同じ LF です。
オプション -I で入力がバイナリ・モード、 -O で出力がバイナリ・モードと
なります。バイナリ・モードでは、改行コードの変換は行われません。
- UNIX の改行コード( LF )を DOS の改行コード( CR+LF )に変換
    % tr -I < file.ux  > file.dos
- DOS の改行コードを UNIX に変換
    % tr -O < file.dos > file.ux
- マックの改行コード( CR )を DOS に変換
    % tr -I "\r" "\n" < file.mac > file.dos
- DOS の改行コードをマックに変換
    % tr -O "\n" "\r" < file.dos > file.mac
 
6-3: マックが勝手に作るデスクトップ・ファイルの削除
フラッシュカードを直接マックにマウントすると、 DOS 側から見ると
不要なファイル、ディレクトリが勝手に作られてしまいます。これを
一括して削除するには findf (本来は find だが、DOS コマンドの
 FIND.EXE と重なるので改名)が便利です。
- フラッシュディスクのルート(あるいは任意の)ディレクトリへ
    % cd /
- 確認のため、マックのファインダが残したファイルをリスト出力する。
    % findf . ( -name finder.dat -o -name resource.frk ) -ls
            ^カレントディレクトリ ^ OR(または)
- マックのファインダが残したファイルを一括消去( rm )する。
    % findf . ( -name finder.dat -o -name resource.frk ) -exec 'rm -r {} ;'
                                                          (1)  (2)    (3)
    注(1) -exec で外部コマンドを呼び出す。
    注(2) HistCSH を使っている場合、「;」を保護するため「'」で囲む。
    注(3) {} にファイル名が入る。終端を示す「;」の前にスペースを空けること。
6-4: 残り電圧は?
battlog.com の出力ファイルから最新のバッテリ電圧を読み込んで表示します。
perl script なので、生 DOS (あるいは maxdos )上でしか動きません。
    % jperl a:/bin/v.pl
    main[2.53:2.53]  sub[2.94:2.97]
Err:510
$REC_SIZE = 20;
$VOLT_OFFSET=12;
open(P,'c:\battlog.log') || die "log file not found.";
binmode P;        # binary mode (MS-DOS)
seek(P,-$REC_SIZE,2);    # seek last record (2=SEEK_END)
read(P,$buf,$REC_SIZE);    # read last record
$main_max = &char;_to_volt(substr($buf,$VOLT_OFFSET+0,1));
$main_min = &char;_to_volt(substr($buf,$VOLT_OFFSET+1,1));
$sub_max  = &char;_to_volt(substr($buf,$VOLT_OFFSET+2,1));
$sub_min  = &char;_to_volt(substr($buf,$VOLT_OFFSET+3,1));
printf ("main[%4.2f:%4.2f]  sub[%4.2f:%4.2f]",
        $main_min,$main_max, $sub_min,$sub_max);
sub char_to_volt
{
    return ( 1.57 + ((3.30-1.57)/63.0) * ord($_[0]) );
}
Err:510
 
6-5: plain text の HTML 化
 HP200LX で HTML を書くのは辛いのです。だって Netscpae で確認できない
じゃないですか (^^; そもそも HTML を生で書くのも大変ですね。
大昔、QV-10 FAQ を書き始めたときも、最初はテキスト版だけだったのです。
でも HTML 化の要望があったので、簡易 HTML 変換を行う手抜き perl script 
を書きました。原形は UNIX 上で作りましたが、その後の拡張、デバッグは、
ほとんど HP200LX 上で(通勤電車で立ったまま)行われました。
本ドキュメントの HTML 化には、下記 URL のスクリプトが使われています。
  <http://www.st.rim.or.jp/?kimu/palm/lx-ux.pl>
 QV-10 FAQ では、さらにファイル分割や<PRE>の追放がされています。
  <http://www.st.rim.or.jp/?kimu/palm/qvsec.pl>
ちなみに Web ページに置くときは、さらに改行コードや漢字コードの心配も
しなくちゃいけません。
■UNIX 系フリーソフトの主な入手先
インターネットでは archie 検索して、お近くのサイトからどうぞ。基本は IIJ の anonymous FTP サーバです。
DOS 上で動く UNIX 系ソフトの入手先:
  日本人による日本語対応したソフトなら...
        <ftp://ftp.iij.ad.jp/pub/msdos-j/>
        特に...
        <ftp://ftp.iij.ad.jp/pub/msdos-j/Unix/>
        <ftp://ftp.iij.ad.jp/pub/msdos-j/Shell/>
        <ftp://ftp.iij.ad.jp/pub/msdos-j/Editor/>
        <ftp://ftp.iij.ad.jp/pub/msdos-j/Develop/>
  gnuish つまり GNU 純正 DOS ツールなら...
  Simtel ミラーサイトの OS/2、DOS 用の GNU ツール集
    <ftp://ftp.iij.ad.jp/pub/simtelnet/gnu/gnuish/>
  フリー、シェアウェアの CD-ROM を販売している VECTOR DESIGN のサイト。
  DOS 一般のソフトを分野別に整理。説明ページ付き。
    <http://www.vector.co.jp/vpack/filearea/dos/>
    <ftp://ftp.tohoku.ac.jp/pub/msdos/>
        jgawk, sed もあります。
  NIFTY-Serve FEXT (エクステンダーフォーラム)
    DOS-Extender、TeX、GNU、UNIX のフォーラム。
    DOS 汎用ソフト( LIB 4 )なら LX で使えます。
  フリーソフト、シェアウェアを集めた CD-ROM
    GNU の CD-ROM に含まれる MS-DOS ディレクトリ
    Simtel MS-DOS
    PowerDOS
HP100/200LX 専用ソフトの入手先( UNIX 系以外も含めて):
  前述の VECTOR DESIGN のサイトには LX 専用のページも!
    <http://www.vector.co.jp/vpack/filearea/dos/util/machine/hp/>
  上記の ftp サーバ
    <ftp://ftp.vector.co.jp/common/dos/util/machine/hp/>
  その他の FTP サーバ
    <ftp://ftp.csl.sony.co.jp/pub/HPLX/>
    <ftp://ftp.kuis.kyoto-u.ac.jp/MSDOS/hp200lx/>
    <ftp://ftp.pu-toyama.ac.jp/pub/hp100lx/>
    <ftp://ftp.cs.titech.ac.jp/pub/misc/hp-lx/>
    <ftp://hpcvbbs.external.hp.com/dist/hp200lx/>
  重要なサイトのミラーサイト
    <ftp://ftp.csl.sony.co.jp/pub/HPLX/mirror/eddie.mit.edu/hp95lx/>
    <ftp://ftp.csl.sony.co.jp/pub/HPLX/mirror/ftp.monash.edu.au/palmtop/>
  NIFTY-Serve FHPPC
  ソフトバンク刊のバイブル三部作の付属 CD-ROM
    『 HP100/200LX BIBLE 』
    『 HP200LX SOFTWARE BIBLE 』
    『 HP200LX HARDWARE BIBLE 』
■関連リンク集
DOS 化モバイルギアを UNIXy だ! by しゃあるさん:
    <http://www.ufo.co.jp/?sharl/mg/dos.html#unixy>
『HP200LXを使う』 by 関沢元冶さん
    ( UNIX 系と関係なく) HP200LX のページをひとつだけピックアップ。
    画像いっぱい、丁寧な説明。リンク集も充実してます。
    <http://www.asahi-net.or.jp/?uk6m-skzw/200lx.htm>
■ History
/*
 * $Log: lx-ux.txt $
 * Revision 3.13  1998-07-10 23:14:27+09  kimu
 *   UNIX-like tools のバージョンアップ、URL 移動に対応 → 1.1
 *   jVim のバージョンアップ、URL 移動に対応 → 3.
 *   MicroEMACS のご紹介 → 3.
 * Revision 3.12  1998-01-12 12:48:48+09  kimu
 *   Typo を修正( lxtl404b.tgz -> uxtl404b.tgz )
 * Revision 3.11  1997-12-28 01:19:05+09  kimu
 *   リンク集に『HP200LXを使う』を追加。 → 8.
 * Revision 3.10  1997-12-27 22:13:09+09  kimu
 *   JVim Version 3.0j1.3 バッチリ → 3. ( URL 更新)
 *   UNIX-like tools Version 4.04b 発見 → 1-1
 * Revision 3.9  1997-12-26 17:00:23+09  kimu
 *   章番号をずらして新設 → 4. UNIX 系じゃないけど便利なコマンド
 *   今回は、qkc (漢字&改行コード変換)と maxdos を紹介。
 *   JVim Version 3.0j1.3 リリース !LX での動作は未確認 → 3.
 * Revision 3.8  1997-10-01 22:16:23+09  kimu
 *   先日より Web にて .txt を HTML と再定義して公開していたが、そのため
 *   <>で囲まれた URL が全て無視されて見えなくなっていた!誰も指摘して
 *   くれないんだから、って自分が悪いのだ。これを機に HTML 版を公開。
 *   lx-ux.txt を簡易 HTML 化する(汚い) perl script も同時公開 → 6-5
 * Revision 3.4  1997-09-21 12:34:21+09  kimu
 *   kmtar Power-Up Kit v3.7 のご紹介 → 3.
 * Revision 3.3  1997-09-21 01:41:11+09  kimu
 *   全体の整形。
 *   Vector を中心に入手先 URL の加筆 → 2. , 3.
 *   Simtel ミラーサイトの URL 変更 → 7.
 *   GNU RCS の記述の改訂 → 2.
 * Revision 3.1  1997-09-19 20:38:58+09  kimu
 *   3.1 にメジャーリビジョンアップ
 * Revision 2.13  1997-09-19 19:09:27+09  ROOT_DOS
 *   GNU RCS 5.7 DOS 版導入。 RCS ファイルの改行コードは LF だぁ。
 * Revision 2.12  97/09/17  21:16:45  ROOT_DOS
 *   関連リンク集新設。モバイルギア UNIXy ページ紹介 → 7
 *   UNIX-like tools 最新版は Win95 LFN 対応 → 1.3
 *   漢字コード自動識別 jVIM3.0 12g 動く! → 3
 * Revision 2.10  97/05/12
 *   GNU diff の日本語を扱うためのオプションは -a が正しい。
 * Revision 2.9  97/03/24  01:56:03  ROOT_DOS
 *   0. はじめに 追加。URL も明記。
 * Revision 2.8  97/03/23  23:47:36  ROOT_DOS
 *   マイナーチェンジ
 * Revision 2.7  97/03/13  23:45:27  ROOT_DOS
 *   findf の histcsh 対応(「;」のエスケープ)
 * Revision 2.6  97/02/27  20:05:25  ROOT_DOS
 *   JVIM 3.0 は LX をメモリーエラーで飛ばす!
 * Revision 2.5  97/02/25  19:35:06  ROOT_DOS
 *   入手先等に加筆、修正
 * Revision 2.4  97/02/22  01:27:12  ROOT_DOS
 *   JVim, jelvis を追加。 www.vector.co.jp 紹介。
 * Revision 2.3  96/09/16  01:20:38  ROOT_DOS
 *   rcs -c" * " lx-ux.txt で C 言語コメント風の Log を実現
 * Revision 2.1  96/09/14  20:50:42  ROOT_DOS
 *   コメントだめ。* が頭につかない。バージョン 2.1 公開版
 * Revision 1.12  96/09/14  20:43:58  ROOT_DOS
 *   History を C ソースのコメント風に
 * Revision 1.11  96/09/14  20:41:40  ROOT_DOS
 *   あちこち整理
 * Revision 1.10  96/09/14  20:25:49  ROOT_DOS
 *   PCC; Personal C Compiler を追加。
 * Revision 1.9  96/09/14  20:02:36  ROOT_DOS
 *   find の使い方に加筆。その他。
 * Revision 1.8  96/09/14  19:53:04  ROOT_DOS
 *   プロンプトの話に加筆。
 * Revision 1.7  96/09/14  19:42:19  ROOT_DOS
 *   目次作成等
 * Revision 1.6  96/09/14  19:23:35  ROOT_DOS
 *   RCS に加筆。Log を置いてみる。
 * 1996-09-13 1.1  GNU RCS 導入。バージョン 1.1 より。
 * 1996-08    1.01 UNIX-like Tools のバージョンアップを反映。
 * 1996-08-07 1.00 ホームページに置く。
 * 199x-xx-xx 0.00 原形を palmtop-pc-ml に流す。
 */
*** 目次 ***
[ 先頭へ / ぱーむとっぷ・わーるど / ホームページへ ]
0. はじめに
1. まずは UNIX-like Tools
        1-1: UNIX-like Tools の置き場所
        1-2: UNIX-like Tools に含まれるコマンド
        1-3: Windows95 長いファイル名にも対応
2. GNU のツールを MS-DOS に移植したもの
3. 他の「使える」 UNIX 系コマンド
4. UNIX 系じゃないけど便利なコマンド
5. Tips
6. 使い方サンプル集
        6-1: UNIX 的ファイル一覧(前後スクロール可能)
        6-2: 改行コードの変換
        6-3: マックが勝手に作るデスクトップ・ファイルの削除
        6-4: 残り電圧は?
        6-5: plain text の HTML 化
7. UNIX 系フリーソフトの主な入手先
8. 関連リンク集
9. History
UNIX 系ユーザのための HP100/200LX テッテー活用法 / ♪きむらかずし / kimu@st.rim.or.jp
               
♪きむらかずし
http://www.st.rim.or.jp/~kimu/palm/lx-ux.htm
http://www.st.rim.or.jp/~kimu/palm/cyber-shot-faq5.html
http://www.st.rim.or.jp/~kimu/index-j.html
http://www.st.rim.or.jp/~kimu/
http://kimux.org/
              
HP-LX World
http://www.kaduhi.com/
http://www.st.rim.or.jp/~kaduhi/
http://kaduhi.com/links2friends.html
              
              
              
              
              
              


◆pmptojpg
ソニーのデジカメ Cyber-shot独特のPMP形式をJPEG 形式に変換します。 
Perl スクリプトで、Perl が動く環境ならどこでも使えるはずです。 元祖 Cyber-shot FAQも参考にしてください。
#! /usr/local/bin/perl
#
# pmptojpg
# converts *.pmp files to *.jpg file.
#
# copyright(c) 1996 by Jun-ichiro itojun Itoh.
# all rights reserved.
# freely redistributable.  absolutely no warranty.
#
# *Id: pmptojpg,v 1.1 1996/11/18 02:59:39 itojun Exp *
# $Id: pmptojpg 1.7 1998-05-09 22:50:15+09 kimu Exp kimu $
# PMP file: Sony digi-cam "Cyber-shot" DSC-F1,2,3 original format
# JPEG file: you must know it.
#
# modified for MS-DOS and MacPerl5  by KIMURA Kazushi
#   binmode for MS-DOS
#   output file name:
# (1) same as PMP file
# (2) "YYMMDDhhmmss.jpg" (date&time)
# (3) "MDDhhmm.jpg" for MS-DOS. M (Month) =1,2,3,...,9,a,b,c
#   in case of (2) or (3), if same shot time files exist in the ARGV[] list,
# add 'a' for 2nd file, 'b' for 3rd file... (ex: 980128180000a.jpg)
#
# $Log: pmptojpg $
# Revision 1.7  1998-05-09 22:50:15+09  kimu
# *** empty log message ***
#
# Revision 1.6  1998-05-09 18:08:10+09  kimu
# check date & time for file name
#

require 'timelocal.pl';
require 'ctime.pl';

### file name mode:  Jan 24 1998  K.Kimura
###     = ""     ... filename.pmp -> filename.jpg
###     = "date" ... -> "YYMMDDhhmmss.jpg" (date&time) for the others
###     = "dos"  ... ->    "mDDhhmm.jpg" for MS-DOS
$filenamemode = "date";

### show file name for debug if not 0
$showfilename = 1;

$bufsiz = 1024 * 16;
$jpegcom = "\377\376";

if (scalar(@ARGV) == 0) {
### for MS-DOS  K.Kimura
binmode STDIN;

# magic number check
if (read(STDIN, $magic, 2) != 2) {
print STDERR "$pmpname: not .pmp file (!=2)\n";
exit 1;
}
if (substr($magic, 0, 2) ne "\020\022") {
print STDERR "$pmpname: not .pmp file (020022)\n";
exit 1;
}

# get the header
if (read(STDIN, $pmphdr, 124 - 2) != 124 - 2) {
print STDERR "$pmpname: not .pmp file (124-2)\n";
exit 1;
}
$pmphdr = $magic . $pmphdr;
### add shottime  Jan 23 1998 K.Kimura
($pmptxt, $shottime) = &convert($pmphdr);

# write out as jpeg comment
if (read(STDIN, $jpegstart, 2) != 2) {
print STDERR "$pmpname: no jpeg header in .pmp file\n";
exit 1;
}
if ($jpegstart ne "\377\330") {
print STDERR "$pmpname: invalid jpeg header in .pmp file\n";
exit 1;
}
syswrite(STDOUT, $jpegstart, 2);
syswrite(STDOUT, $jpegcom, 2);
syswrite(STDOUT, pack('n', length($pmptxt) + 2), 2);
syswrite(STDOUT, $pmptxt, length($pmptxt));

while (0 < ($len = read(STDIN, $buf, $bufsiz))) {
syswrite(STDOUT, $buf, $len);
}
exit 0;
}

bigloop:
foreach $pmpname (@ARGV) {
print "input: [$pmpname]\n" if $showfilename;

$jpgname = $pmpname;
if ($jpgname =~ /\.[pP][mM][pP]$/i) {
$jpgname =~ s/\.[pP][mM][pP]$/.jpg/;
} else {
$jpgname .= '.jpg';
}

if (!open(IN, "< $pmpname")) {
print STDERR "$pmpname: no file found\n";
close(IN);
next bigloop;
}
### for MS-DOS  K.Kimura
binmode IN;

# magic number check
if (read(IN, $magic, 2) != 2) {
print STDERR "$pmpname: not .pmp file (!=2)\n";
close(IN);
next bigloop;
}
if (substr($magic, 0, 2) ne "\020\022") {
print STDERR "$pmpname: not .pmp file\n";
close(IN);
next bigloop;
}

# get the header
if (read(IN, $pmphdr, 124 - 2) != 124 - 2) {
print STDERR "$pmpname: not .pmp file\n";
close(IN);
next bigloop;
}

$pmphdr = $magic . $pmphdr;
### add shottime  Jan 23 1998 K.Kimura
($pmptxt, $shottime) = &convert($pmphdr);

### show shot information
printf("%s", $pmptxt);

### "YYMMDDhhmmss.jpg"; date&time as file name  Jan 26 1998 K.Kimura
if ($filenamemode eq "date") {
    if ($shottime eq "-") { ### May 9 1998
printf ("WARNING: BAD DATE for file name. Use %s\n", $jpgname);
    } else {
### path/filename.jpg -> path/YYMMDDhhmmss.jpg
### directory separator ... /unix, \MS-DOS, :Macintosh
$jpgname =~ s/([^\/\\:]+)(\.jpg)$/$shottime$list{$shottime}$2/;

### same date? if so, "YYMMDDhhmmssa.jpg", "...b.jpg", ...
if ($list{$shottime} eq "" ) {
$list{$shottime} = 'a';
} else {
$list{$shottime}++;
}
    }
}
### "mDDhhmm.jpg": shot time as file name for MS-DOS
elsif ($filenamemode eq "dos") {
    if ($shottime eq "-") { ### May 9 1998
printf ("WARNING: BAD DATE for file name. Use %s\n", $jpgname);
    } else {
$dosname = sprintf("%1x%6s", substr($shottime,2,2),
     substr($shottime,4,6));
$jpgname =~ s/([^\/\\:]+)(\.jpg)$/$dosname$list{$dostime}$2/;

### same time (minute)? if so, "mDDhhmma.jpg", "...b.jpg", ...
if ($list{$dostime} eq "" ) {
$list{$dostime} = 'a';
} else {
$list{$dostime}++;
}
    }
}

print "output: [$jpgname]\n" if $showfilename;
open(OUT, "> $jpgname");
### for MS-DOS  K.Kimura
binmode OUT;

# write out as jpeg comment
if (read(IN, $jpegstart, 2) != 2) {
print STDERR "$pmpname: no jpeg header in .pmp file\n";
close(OUT);
close(IN);
next bigloop;
}
if ($jpegstart ne "\377\330") {
print STDERR "$pmpname: invalid jpeg header in .pmp file\n";
close(OUT);
close(IN);
next bigloop;
}
### JPEG START!
syswrite(OUT, $jpegstart, 2);
### comment field (shot data from PMP header)
syswrite(OUT, $jpegcom, 2);
syswrite(OUT, pack('n', length($pmptxt) + 2), 2);
syswrite(OUT, $pmptxt, length($pmptxt));
### image data
while (0 < ($len = read(IN, $buf, $bufsiz))) {
syswrite(OUT, $buf, $len);
}

close(OUT);
close(IN);
}
exit 0;

#
# get header information of PMP format
#
sub convert {
local($hdr) = @_;
local($txt);
local($year, $month, $day, $hour, $min, $sec);
local($shotdatestr, $editdatestr);
local($comment, $resolution, $shutspeed);
### shot datetime for file name  Jan 23 1998 K.Kimura
local($shottime);

# header check
return "" if length($hdr) != 124;

# get shot date
($year, $month, $day, $hour, $min, $sec) = unpack("c6", substr($hdr, 0x4c, 6)); 
if ($year < 0 || $sec < 0) { ### data check  May 9 1998
$shotdatestr = "-";
$shottime = "-"; ### "-": bad date
} else {
$shotdatestr = &ctime(&timelocal($sec, $min, $hour, $day, $month - 1, $year));
$shotdatestr =~ s/\n$//;

### shot date&time "YYMMDDhhmmss"  Jan 23 1998
$shottime = sprintf("%02d%02d%02d%02d%02d%02d",
$year,$month,$day,$hour,$min,$sec);
}

### get edit date (same as shot date, maybe)
($year, $month, $day, $hour, $min, $sec) =
unpack("c6", substr($hdr, 0x54, 6)); 

if ($year < 0 || $sec < 0) { ### data check  May 9 1998
$editdatestr = "-";
} else {
$editdatestr = &ctime(&timelocal($sec, $min, $hour, $day, $month - 1, $year));
$editdatestr =~ s/\n$//;
}

### get comment
$comment = substr($hdr, 0x34, 20);
$comment =~ s/\000//g;

### get resolution
$resolution = unpack('C', substr($hdr, 0x1d, 1));
if ($resolution == 0x08) {
$resolution = 'economy';
} elsif ($resolution == 0x17) {
$resolution = 'standard';
} elsif ($resolution == 0x33) {
$resolution = 'fine';
} else {
$resolution = sprintf("0x%02x", $resolution);
}

### shut speed
### $shutspeed = sprintf("1/%d", unpack('n', substr($hdr, 0x66, 2)));

### make text for JPEG comment
$txt = <<EOF;
Date-Taken: $shotdatestr
Date-Edited: $editdatestr
Resolution: $resolution
EOF
#Shutter-speed: $shutspeed
$txt .= "Comment: $comment\n" if (length($comment) != 0);

### add $shottime  Jan 23 1998 K.Kimura
return (($txt, $shottime));
}
               
♪きむらかずし
http://www.st.rim.or.jp/~kimu/palm/lx-ux.htm
http://www.st.rim.or.jp/~kimu/palm/cyber-shot-faq5.html
http://www.st.rim.or.jp/~kimu/index-j.html
http://www.st.rim.or.jp/~kimu/
http://kimux.org/
              
HP-LX World
http://www.kaduhi.com/
http://www.st.rim.or.jp/~kaduhi/
http://kaduhi.com/links2friends.html
              
              
              
              
              
              
              

              
              
              
              
              
              
              


              
               

0 件のコメント:

コメントを投稿