ラベル ?Unix OS の投稿を表示しています。 すべての投稿を表示
ラベル ?Unix OS の投稿を表示しています。 すべての投稿を表示

2021年6月19日土曜日

[OS][OC] EDVAC~OSの登場(1950)


[OS][OC] EDVAC~OSの登場(1950)
OSの登場
前回とりあげた、MEMEX から NLS の間というのは非常に長い期間になっています。
今回は、前回と同じ期間で、MEMEX から NLS に至る流れとは別の流れ、「OS の登場」を追ってみようと思います。
■BSD
1950年のEDVAC の登場で、コンピュータは「技術」の問題ではなく「学術」的研究という俎上に乗せられることになりました。目指すべき方向性が明確に示されたことの影響は大きく、その方向にしたがってさまざまなアイディアが出されます。
こうして、ハードウェアはすぐに安定し、実用的になります。しかし、同時に新しい問題が出てきました。
プログラムの問題です。それまではハードウェアさえ出来ればさまざまな計算に使えると信じられていたのですが、ここに来てプログラムが想像以上に難しいことがわかったのです。
■自動プログラミング
当時、プログラムを動かすには機械語コードと1対1で対応するアセンブリコードという物を使ってプログラムを行い、人間が自分の手で対応表を引いて数字からなる機械語コードに変換して、それをパンチカードに穿孔してからコンピューターに入力する、という作業が必要でした。
プログラムが難しいのは、このアセンブリコードがあまりにも単純なことしか出来ないためです。そのため、これを英語のような「人間にわかりやすい言葉」で指示することでコンピューターを動かせないか、というアイディアが出てきました。
これは、後に「自動プログラム」と呼ばれるアイディアです。
コンピューターが、自分自身のプログラムを作り上げる。これは夢のようなアイディアです。人間にも難しいことを、人間が作り出した機械にさせることが可能なのでしょうか?
自動プログラムについては、可能論と不可能論が激しく対立しました。
しかし、IBM にとっては、これは同社の有力商品である「コンピューター」の普及のためにも、ぜひ可能であって欲しい技術でした。
そこで、IBM 内で自動プログラムの研究がスタートしたのです。
最初は、とにかく「自動プログラムは可能である」ことを証明することが重要でした。証明と言っても、数学的な証明なんかは必要ではありません。実際に動くシステムを作ればいいだけです。
そこで、もともとコンピューターの得意分野である「数学計算」に的が絞られました。変数を含む複雑な数式を入力し、変数の値を決定してやると、計算結果を表示するプログラム。それが目標でした。
いまでは電卓でも出来るような簡単なことですが、可能かどうかもわからない状況では、十分すぎるほどの研究テーマだったのです。
1957年、システムは完成しました。
数式(FORMULER)を変換(TRANSLATION)するという意味から、「FORTRAN」と呼ばれるその言語は、確かに人間にとってわかりやすい言語を、自動的に機械コードに翻訳(コンパイル)することを可能としたのです。
初期の FORTRAN は制御構造を持たない単純なものでした。
パンチカード1枚に入れられる文字数が 80文字以内に限られていたため、1行は80文字以内に限られました。(現在でも、コンピューターで1行を 80 文字以内にすることが多いのはこの名残)
また、行の先頭に C が来た行は「COMMENT」を意味するなど、文法とは関係のない「決まりごと」も沢山ある言語でした。
それでも、FORTRAN の登場により自動プログラミングが可能であることが示され、COBOL や BASIC 、PL/I などの言語を生み出していくきっかけとなるのです。
■FORTRAN モニター
FORTRAN は、パンチカードの1枚を1行(1命令)として、すべてのカードを読み込ませてから機械コードへの翻訳(コンパイル)を行い、その後翻訳された機械コードを実行させることでプログラムを動作させる仕組みになっていました。
そのため、プログラムの動作まで手間がかかります。それに、まだ当時はコンピューターは高価でしたが、これらの作業をしているあいだ、他の人はコンピューターが空くのを待っていなくてはならなかったのです。
1950 年代末から 60年代前半にかけて、これらの制御もコンピューターにやらせてしまおう、というアイディアが生まれます。
カードの束をセットしてプログラムをスタートさせれば、読み込み・コンパイル・実行を自動で行い、紙テープに結果を出力します。
紙テープ出力後は、すぐに次のカードの束の読み込みにかかります。このため、コンピューターを使いたい人はカードの束をセットしたら、しばらくたって結果を受け取りにいけばいいだけになります。
こうした仕組みは、FORTRAN モニターと呼ばれました。そして、これがいわゆる「OS」の最も原始的な姿です。
MULTICS
1960 年代になると、マサチューセッツ工科大学(MIT)の学生達が、非常にユニークなしかけをソフトウェアで実現します。
タイム・シェアリング・システム(時分割システム。以下 TSS と略称)と呼ばれるそのソフトウェアは、コンピューターの動作を非常に短時間で区切って複数のソフトウェアを動かすことで、複数のプログラムを同時に動かすことが可能でした。
高価なコンピューターを、1台で何台分にも使うことの出来るこのシステムは非常に注目されます。
ここで、MIT の TSS は国防総省高等技術研究局(ARPA)からの援助も受けて、GE(ゼネラル・エレクトリック)や AT&Tなどコンピューターに携わる多くの企業が技術を出し合う一大プロジェクトに発展します。
実際にハードウェアを作成していたのは GE だけなので、GE のコンピューター(GE-635)を改良し、MULTICS に必要な機能を持たせ(GE-645)、その機種をターゲットとして OS として作成が開始されます。
さまざまな最新技術・思想が取り入れられたこのシステムは、1台のコンピューターを複数人数で使うことを目標とし、「複数の」という意味の MULTI から、MULTICS と名付けられていました。
MULTICS は今見ても非常に先進的です。その一例をここに記しておきましょう・・・
すでに、当時は外部記憶装置が実用化されていました。MULTICS では、この外部記憶装置を使いやすくするために、データを「ファイル」という単位で管理する方法を取り入れており、しかも同種のファイルを管理しやすくするための「階層化」の概念まで導入されています。
さらに、ファイルを記憶装置だけではなく、システムを制御するすべての構造に適用するようになっています。たとえば、キーボードやディスプレイと言った装置も「特殊なファイル」という位置づけで、プログラムの入力や出力は、すべて自由なファイルに対して行うようになっていました。
これにより、複数人数で使う際に複数のキーボードやディスプレイを接続していても、システムからは「入出力ファイルが異っている」というだけの扱いで済ませることが出来ます。また、出力をファイルに保存しておいたり、ファイルに収められたデータを処理したりするのにも、特別なプログラムは不要になりました。
さらに、MULTICS では、「すべての記憶領域は、プログラムから見れば同じものである」という、先進的な概念を導入していました。単一レベル記憶、と呼ばれます。
いわゆる RAM で構成されたメインメモリも、外部に接続されたハードディスクも、それをバックアップするテープドライブも、「メモリ」であることに変わりはありません。
これらすべてに連続したメモリアドレスが割り振られ、同じようにアクセスすることが可能です。
ただ、アクセスの際に速度が違ったり、電源を切った時に消えるメモリ/消えないメモリがある、というだけのことです。
もちろん「プログラムから見て」同じであっても、特性は違います。
MULTICS では、動いているプログラムは RAM のアドレスに配置され、何らかの理由で停止するとディスクのアドレスに移動するような仕組みが作られました。これで、メモリを効率よく使えます。
先に書いた「すべてのデバイスはファイルである」ことと組み合わせ、ここに壮大な「単一化」が図られることになります。
全てのコンピューター資源へのアクセスは、メモリへのアクセスと同じように行えるのです。
これにより、TSS の問題点を解決することも出来ました。
たとえば、プログラムが停止したとき、TSS 以前ならば停止した状態のプログラムのメモリを調べることで、異常の原因などを探ることが可能でした。
しかし、TSS 以降は複数人数で限られたメモリを使用するため、停止したプログラムをメモリに留めておくことが難しく、原因調査が行いにくくなっていました。
しかし、先に書いたように MULTICS では、プログラムが停止するとメモリ内容を低速なアドレス…ディスク装置に書きだします。現代的に言えば「コアダンプ」と同じことです。
これにより停止した原因を調査し、修正した後で、もう一度プログラムを「起動」すると、高速なアドレス…内部 RAM にプログラムが移動して動き始めるのです。
メモリとディスク間でのプログラムの移動は、OS が自動的に行うものです。高速なメモリが足りなくなると、一時停止中のプログラムなどは低速なメモリに移動されました。
逆に言えば、メモリが足りないと判っているときは、実行中のプログラムを「一時停止」すれば、OS が適切に処理してくれることになります。
現代的な意味での「仮想記憶」とは異なりますが、きわめて原始的な形の仮想記憶が実現されていたことになります。
仮想記憶は、実際の搭載以上のメモリが存在しているように見せる技術です。アドレス上は存在しますが、実際には存在しないため、余りアクセスがないメモリ内容をディスク上に置くことになります。
MULTICS では、アドレスの位置によって内部メモリやディスクを区別できましたが、仮想メモリではどのアドレスが RAM で、どのアドレスがディスクに割り当てられているのか、単純には区別できません。
TSS では、複数人数で使うにもかかわらず、セキュリティ対策は全くされていませんでした。
TSS を作成した MIT の「ハッカー」たちの倫理では、すべての資源は共有するのが当たり前でした。また、他人に危害を加えることは恥ずべきことでした。
ですから、TSS ではセキュリティなど考慮する必要はなかったのです。
しかし、それはハッカーが狭いコミュニティに住んでいたから大丈夫だっただけの話。MULTICS では、セキュリティにも非常に気を使っていました。ファイルはアクセス制限がつけられ、自由な閲覧を許可することもできる一方、誰にも見せないことも可能でした。
結局、MULTICS では、「メモリ」「外部記憶」「周辺機器」などの、コンピューターを構成するさまざまな要素を「ファイル」という、仮想的な単一要素にまとめてしまい、さらにそのファイル単位でのアクセス制限機能を付けたことになります。これは、近代的な OS の最初の形でした。
MULTICS には先進的で非常に優れた機能が多数盛り込まれました。そのため、開発も難航していました。
開発は 1964年に始まりましたが、5年たっても終わりません。そして、その5年目には AT&T が見切りをつけ、プロジェクトから手を引きます。
さらに翌1970年には、GE のコンピューター部門がハネウェル社に売却されます。
世間的には、「MULTICS プロジェクトは失敗した」ように思われました。
僕もそう思っていました。このページは 1999 年に記述しましたが、その後 2013年まで、「MULTICS は失敗だった」との記述のままでした。
2013年以前に記述が間違いであることを知ったのですが、忙しくて修正しないまま、不正確な風説を流し続けていたことをお詫びいたします。
(さらに追記:2015年まで、MULTICS が GECOS に変化した、という記述でしたが、これも誤りでした)
MULTICS に関与した会社が次々手を引いたため、「MULTICS は開発に失敗し、出荷されなかった」という風説を産んでいます。
実際には、ハネウェルは GE のコンピューター部門を合併した直後から MULTICS システムを販売しています。
ハードウェアは GE-645から、後継機であるハネウェル 6180に変更されています。
これは 6080 に、GE-645 に施したのと同じような改良をしたマシン。
MULTICS は、最終的には大学や政府機関、会社など、85個所程度で使われた、とのこと。
当時の大型コンピューターとしては、まずまずの「成功」です。
1985年には NSA (国家安全保障局)が認める「安全な OS」の第1号に選定されています。
しかし、その1985年に、ハネウェルは MULTICS の販売を終了。それまで使用していた機関などは、Unix などにシステム変更していきました。
ヨーロッパではライセンス供与を受けたフランス企業「ブル」が 1975年から MULTICS の販売を始め、ハネウェルの販売終了後の 1991 年にはコンピューター部門を買い取り、2000年までサポートを続けました。
2000年10月30日、カナダの国防総省で使われていた「最後の MULTICS システム」が停止されます。これで、サポートも終了。
現在、ブルは MULTICS をオープンソース化しています。
以下は余談になりますが、以前に「MULTICS は GECOS として販売されていた」と書いてしまっていたので。
MULTICS の「経験を活かして」、GE が作った別 OS が GECOS です。
GECOS は、ハネウェル買収後に GE の名前を外され、GCOS となります。
MULTICS が動作した GE-645 の一部機種には、メモリアドレスの扱いを変更するための、ハード的な切り替えスイッチがついていたそうです。
これで、GE-635 互換モードを選ぶと、GECOS も動作します。そのほかの後継機種でも GECOS が動作します。しかし、MULTICS は GE-645 以外の機種では動きません。
ハネウェル売却後も事情は同じで、6000シリーズでは GCOS が動きますが、6180 でのみ、MULTICS が動きます。
また、日本ではハネウェルと提携していた NEC と、GE と提携していた東芝が、共同で GCOS 互換の ACOS を作成し、販売しています。GCOS は OS の名前ですが、ACOS は GCOS 互換の OS を動作させるコンピューターの名前にもなっています。
東芝と NEC が共同作業をしたのには深いわけがあって、ここら辺の話も面白いのですが、話題を逸れてしまうので割愛。
気になる人は「三大コンピューターグループ」を検索してみましょう。
東芝はすでに撤退しましたが、NEC の ACOS シリーズは続いています。
まとめると、GCOS ≒ ACOS ですが、GCOS ≠ MULTICS です。
■UNIX
1969年 AT&T ベル研究所のKen Thompsonが、自分の趣味で中古のミニコンピューター PDP-7 を買ってきました。
AT&T はMULTICS の開発が長引いたため、撤退を決めました。しかし、AT&Tから参加していた Ken は、MULTICS に未練を感じていました。
なぜなら、彼は MULTICS で作成した「宇宙旅行ゲーム(Space Travel)」を非常に気に入っていたのです。MULTICSプロジェクトから撤退してしまった今では、あの面白いゲームが遊ぶことが出来ません。
宇宙旅行ゲームではなく、宇宙戦争ゲーム(Spacewar!)とする説もあります。
しかし、UNIX 開発者の一人、デニス・リッチーのホームページには、問題となるゲームが宇宙旅行ゲームであり、宇宙戦争ゲームとは異なるゲームだとはっきり書かれています。
もっとも、宇宙旅行ゲームとほぼ同時期に宇宙戦争ゲームの UNIX 移植も行ったとも書かれていますので、UNIX 開発メンバーが宇宙戦争ゲームのことを知っていたのは事実のようです。
買ってきた PDP-7 は、このゲームをなんとか移植して遊ぶための物でした。しかし、ここで彼は問題に気づきます。PDP-7 には、MULTICS のような優れたシステムが無かったのです。
彼は、ゲームのために MULTICS のようなシステムを PDP-7 で作ることにしました。しかし、MULTICS ほどのものは必要ありません。どうせ趣味なのですから。
そこで、彼は MULTICS のなかから気に入った機能だけを選び出して、小さな一人用システムを作り上げ、UNIX と名付けます。UNI とは、「ひとつの」という意味で、MULTI の対義語でした。つまり、このシステムは MULTICS のパロディ版なのです。
UNIX には、TSS や階層化ファイルシステム、周辺デバイスをすべてファイルに見せる仕組み、コアダンプなどが取り入れられました。
その反面、複数人数で使うためのセキュリティ機構などは無視された作りとなっていました。もともとゲームが遊べれば十分でしたから、セキュリティなんて不要なのです。
しかし、この UNIX システムは、彼一人で使うにはもったいないシステムでした。彼は快く仲間の研究者にシステムを開放します。彼らのグループはこのシステムに手を加え続け、十分実用になるシステムに育て上げます。そして、セキュリティは甘いながらも、結局複数人数が同時に使えるシステムへと発展を遂げるのです。
UNIX の開発を開始してからまもないうちに、UNIX を PDP-11 に移植することになりました。PDP-11 は PDP-7 の後継機で、性能もずっと上がっています。みんなが使い始めたシステムをいつまでも中古の PDP-7 で動かしているよりも、性能の良いマシンに移植しよう、というアイディアでした。
しかし、PDP-11 は PDP-7 の後継機とはいっても、まったく同じプログラムが動くわけではありません。プログラムには大幅な手直しが必要です。
彼らのグループは、ここでちょっと工夫を凝らすことにしました。
FORTRAN から始まった「プログラム言語」は、その後の研究で必要な機能が整理され、「構造化言語」というブームを興していました。構造化言語の特徴は、コンパイラのプログラムが作りやすく、その言語で書かれたプログラムが非常に整理されていてわかりやすいことです。
そこで彼らは、この構造化言語の流れを汲む言語を新たに作り、UNIX をその言語で書き直すというアイディアを思いつきました。
まず、構造化言語 BCPL の機能を単純化した「B」という言語を UNIX 上で作り、その機能を強化して「C」言語を作ります。
ついで、C 言語を C 言語自身で書き直します。ここまでは PDP-7 上の UNIX で作られました。ここまでが第1段階。
次いで、UNIX 自身を C 言語で書き直します。まずは、単純でも良いから PDP-7 で動く UNIX とほぼ同等なものを。
C 言語は UNIX 上で C 言語を使って開発され、UNIX は その C 言語で開発される。とにかくこの関係がちゃんと動くようになるまでが第2段階です。
これで、新しい言語である「C」と、この言語で書かれた UNIX ができ上がりました。
ここまで来れば後は簡単です。C 言語を改良して、PDP-11 の機械語コードを出力できるようにします。そして、UNIX と C 言語自身を PDP-11 用にコンパイルし直せば作業は終了です。
こうして、UNIX は、そのシステムがターゲットとしたシステムから別のシステムへ、無事に移植が終了したのです。そして、この開発方針を守っていけば、いつかさらに強力なコンピューターに移植することも可能だ、という保証を手に入れたことにもなります。
これまでは、プログラムというのはあくまでも「ハードウェアのおまけ」でしかありませんでした。しかし、ここでついにプログラムがハードウェアからの独立を果たしたのです。
■BSD
AT&T は、この UNIX システムを商売に出来ないか、と考えました。当然のことです。
しかし、AT&T は大企業過ぎる余り、反トラスト法(日本の独占禁止法)によって、電話事業以外への事業展開が禁じられていました。
そこで、AT&T はこの優れたシステムを、公共機関にかぎって無料で配布することにしました。とにかく広めておけば、あとでコンピューター業界に乗りだすことが可能になったときに、商売につながるかもしれません。
そんなとき、ちょうど ARPA が、政府と研究機関を結ぶ新しいコンピューターネットワーク「ARPA-NET」の研究を開始していました。
ARPA-NET は、従来のように中枢コンピューターにデータを蓄積するのではなく、ネットワークで結ばれたコンピューターそれぞれが協調して動作するシステムです。これは、核兵器によって、1つの基地が壊滅的な打撃を受けたときでも残りのネットワークが動作できるようにするための、重要な研究でした。
そして、ARPA は、この研究をカリフォルニア大学バークレー校に依託します。
追記 2020.5.27
このページ、20年以上前に書いたもので、間違った記述多いです。すみません…
上に書いてある「核攻撃に耐えられるネットワーク」は、実際に研究されたのですが、ARPA-NET とは別のものです。
詳細は、ポール・バランの誕生日記事に書いてあります。
バークレー校では、この研究を行うために UNIX を使用することにしました。無料で入手でき、わかりやすい言語でかかれたこの OS ならば、必要に応じて独自に改良することも可能だったのです。
こうして、バークレーの学生達によって、UNIX にさまざまなネットワーク機能が付け加えられました。
こうして作られた UNIX は、「Barkley Softwear Distribute UNIX」、略称 BSD UNIX と呼ばれるようになります。(現在のBSD)
この後、BSD の先進機能は本家も真似するようになり、AT&T UNIX (System V) と BSD という二つの流れを作るようになるのです。
こうして、現在でも広く使われている UNIX OS が生まれ、次いで さまざまな OS が生み出されていくことになります。
AT&T はこの後分割され、UNIX のライセンス供給を開始します。それは同時に、BSD UNIX を「海賊版」としてしまうことでもありました。BSD は、AT&T UNIX の派生品でありながら AT&T のライセンスを受けていないのです。
実際には、BSD もライセンス供与のもとで作成されていました。ただし、AT&Tがコンピューター事業をできなかったことから、教育機関向けに非常に安価なライセンスで許可されたものでした。
AT&T分割後は、コンピューター事業を行えるようになったため、ライセンス料を引き上げようとして訴訟となります。
このときの騒ぎが、AT&T の UNIX に反対し、同等品を作り上げてしまおうという活動、「GNU」(GNU is Not UNIX の略)の開始にも関係してきます。また、BSD が「UNIX」という名前を捨てた直接原因でもあります。
BSD とともに始まった ARPA ネットは後の インターネットに成長するのですが、この段階ではまだ Ethernet などは使われておらず、まだ「原形」としての形すら見えていません。
ここら辺の話は、また別の機会に。
参考文献
林檎百科?マッキントッシュクロニクル?
FORTRAN 77
TransTECH 創刊号
前ページ 1 2
(ページ作成 1999-06-09)
(最終更新 2020-05-27)
第3版 …他の版 初版 2版

魔法使いの森
https://www.wizforest.com/
https://www.wizforest.com/OldGood/







 

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