[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