2017年9月14日木曜日

私の本棚(2):プログラミング言語 Perl


── プログラミング言語 Perl


私の本棚を紹介します。


 第二回は、Perlを取り上げます。
 プログラミング言語 Perl 関連の本が9冊並んでいますが、ご覧の通り高さが不揃いです。こういう不揃いの本をまとめて一か所に置くのは空間の無駄なので、普段は三か所に分散して置かれています。


 「私の本棚」の内容を紹介する晴れの舞台(?)ですから、一か所に集めて写真を撮れるよう上掲のような舞台を設定しました。両側に無関係な本のタイトルが見えませんから記念写真を撮る場所としては最適でしょう。今後はこのスタイルで紹介することにします。


 上掲写真で、右から順に、
(1)「Perlプログラミング」(通称「ラクダ本」と呼ばれている)
(2)「Perl 5 デスクトップリファレンス第3版」、
(3)「Perl書法」、
(4)「Perlの国へようこそ」、
(5)「Perlプログラミング for CGI」、
(6)「プログラミング言語Perlマスターコース」
(7)「Perlモジュール活用ガイド」、
(8)「Effective Perl」、
(9)「スクリプト言語Perl入門以前」


となっています(詳細は【解説欄】を参照してください)。クリックすると拡大され、より詳細に観察することができます。本の汚れまで見えてしまうかもしれません。

 私は、通常(1),(2),(9)の3冊を使って Perl のプログラム作りに励んでいますから、普段はこれらは「私の本棚」には置かれていないことが多いです。




【解説欄】
▼なぜ、Perlなのか
 最初に、なぜ私が Perl に入れ込んでいるのかを説明したいと思う。

 昔、大型機が主流であった頃、Multicsシステム環境下でソフトウェア開発に取り組んでいた時代があった。使用する端末はテレタイプ方式であったため、コンピュータの入出力はロール紙上に記録される。多くの研究者によって共用される端末機の周辺には、直前まで使っていたアメリカ人研究者の出力結果が沢山残されていた。私はそれを拾ってきて、彼らがこの先進的なコンピュータをどのように使いこなしているかを調べ参考にしようとしたのである。

・シェル
 そこで学んだことの一つは、彼らは「シェル」を多用して効率的に仕事をこなしているということであった。長い時間端末の前に座って膨大なデータを入力しているのではなく、自分のやりたいことをあらかじめコマンドの形で記述したファイル(コマンドスクリプトという)を用意しておいて、ただそれを起動するだけでよい。コマンドスクリプトのチェックが終われば、起動させて直ぐ端末を離れ部屋へ戻ってしまう。あるいは帰宅した後(休日でも構わない)、家から電話回線を通じてそういったファイルを起動することもできる。端末の前で一番長く時間を費やしている者が一番よく働いている、と考える日本人の発想とは異質のものであった。これは見習わねばならない。

・エディタ
 プログラム作りに使っているエディタはラインエディタであった。ラインエディタというのはデータを行単位で扱うから、現在主流のスクリーンエディタとはかなり異なる。まるで「真っ暗闇の中で、手探りで編集か所を見つけ出し、それを編集する」という感じである。手探りであるから、見つけたと思ったものが似て非なる別の場所であったりもする。したがって、暗闇の中でも的確に対象を見つけ出す能力が自然と養われていった。

 そのようにして、ラインエディタを使うプログラム編集自体もシェルと組み合わせてスクリプトファイル化され、大量のソースプログラムを一挙に編集してしまうという使い方も可能になったのである。極めて効率の良い使い方をしている。

 その後、端末はビデオ表示端末へと変わっていった。その結果エディタはスクリーンエディタへと進歩していくのだが、それは時間的にもう少し先のことである。

・パソコン環境
 日本に帰国してから間もなくパソコンの時代となり、私もその開発の一端を担うことになった。当時のパソコン環境は、大型機のソフトウェア環境と比べて恐ろしくお粗末な状態であったが、少しずつ使い易くなり CP/M から MS-DOS へと発展していった。

 しかし Multics や Unix の世界を知ってしまった私にとっては、到底満足のできるものではなかった。MS-DOS も Unix を参考にして進化していったが、もともと設計思想が異なるから外見だけ似せても使い難いことは変わらない。

・スクリーンエディタの欠点
 MS-DOS には、シェルはないがバッチファイルというものがあったので、私はこれを工夫して何とかシェルプログラムらしきことはできるようになった。しかし、まともなラインエディタがない!!

 エディタはほとんどのものがスクリーンエディタになってしまっていた。スクリーンエディタは常に画面に表示された部分を編集の対象にしているから使い勝手が良いように思われるが、シェルプログラムを重視する私のような利用者には向いていなかった。画面を見ながらの編集ではなく、暗闇の中で手探りでの編集が可能でなければシェルプログラムには使えないからである(*1)
【注】(*1)その後、エディタにマクロを追加する形で、手探り編集も可能になった。
・救世主 Perl の出現
 そこに登場したのが Perl だったのである。Perl はもともとは Multics や Unix 環境で使われていた awk, qed sed ... などのテキスト変換ツールから発展してきたものである。これが、MS-DOS の世界でも使えるようになったのだ。gnu のソフトとして登録されたものを MS-DOS 版に焼き直してくれた奇特な人がいたのである。

 最初は英語版だけだったが、その後日本語版も作られ jperl と呼ばれていた。このソフトの凄いところはフロッピーディスク1枚に収まる程コンパクトな作りだったことである。しかも無料で使えたのだ。この無償で使わせるという Perl の開発者 Larry Wall の考え方は真に尊敬に値する。私にとっては神様のような方である。

Larry Wall
(Wikipedia から引用)

 私がこのソフトウェアに飛びついたのは当然の成り行きであった。今でも私のコンピュータ上には、この初期の版が保存されている。そして立派に動く。
 システム全体の圧縮ファイルは、jperl14.lzh / 385,605Bytes。実行ファイル jperl.exe はたったの 424KB である。

 以来、インターネットの時代を迎え、一度は古いソフトウェアとみなされていたツールがウェブソフトの開発用ツールとして再び脚光を浴びるようになった。それとともに、オブジェクト指向の機能も追加され新たなプログラム言語として発展し続けているのである。

・Perl を教える
 その後、教師になったとき、たまたま1枠あるからプログラミングの授業なら何でも良いからと任されたとき、私は迷わずPerlの授業をやろうと決心した。資料の(9)「スクリプト言語Perl入門以前」は、その授業で用いるテキストとして作成したものである。いまでは、Perlで分からないことがあると直ぐ参照するようにしている。

▼本の詳細
(1)UNIX Programming 「Perlプログラミング」:1994年2月10日 第3刷発行 Larry Wall and Randal L. Schwartz 著, 近藤嘉雪 訳, \4,500 ソフトバンク株式会社(なお、最新版は 2002年9月発売の「プログラミングPerl第3版(全2巻)」\5,724 です)

(2)Perl 5 Pocket Reference, 3rd Edition 「Perl 5 デスクトップリファレンス第3版」:2000年11月21日 初版第1刷発行, Johan Vromans著, 歌代和正 監訳, 三島純子 訳, 発行/オライリー・ジャパン, 発売/オーム社 \1,200

(3)「Perl書法」:1994年5月21日 第1版第2刷発行, 増井俊之著, \3,200, 発行/株式会社アスキー

(4)「Perlの国へようこそ」:1993年5月25日 初版第2刷発行, 著者 前田薫, 小山祐司, 斎藤靖, 布施有人, \2,472, 発行/株式会社サイエンス社

(5)「掲示板・アンケートで覚える Perlプログラミング for CGI」:2000年8月10日第5刷発行, 増田若奈著, 発行/株式会社ディー・アート, \2,000

(6)「プログラミング言語Perlマスターコース 構文からオブジェクト指向まで」:2000年12月15日 初版第1刷発行, アンドリュー・L・ジョンソン著, 星睦訳, 発行/株式会社ピアソン・エデュケーション, \3,400

(7)「Perlモジュール活用ガイド かんたんオブジェクト指向プログラミング」:2000年5月10日 初版第2刷発行, エリック・フォスター・ジョンソン著, 三島俊司監修, アーク・シンク・タンク訳, 発行/株式会社翔泳社, \3,800

(8)「Effective Perl - Programming Writing Better Programs with Perl」:1999年3月21日初版発行, Joseph N. Hall / Randal L. Schwartz著, 吉川邦夫訳, \2,800, 発行/株式会社アスキー

(9)「スクリプト言語Perl入門以前」:2003年9月 初版発行, 東京理科大学 応用プログラミング論テキスト, 木下恂著, \2,000, 発行/エース出版


2017年9月1日金曜日

私の本棚(1):手塚治虫


── 手塚治虫ワールドのすべて


私の本棚を紹介します。
   

 第一回は、手塚治虫関連の本を取りあげることにします。先ず、好き勝手に覗いてみてください。4つの書棚の各ブロック上にカーソルを置くと内容の概略が表示されます。クリックで画像の拡大表示ができます。最後に解説欄があります。興味のある方は読んでください。

書棚A(クリックで拡大表示されます)
(6)
(5)
(4)
(3)
(2)
(1)

書棚Aの内容:手塚治虫漫画全集(講談社)#1 ... #90
 (1)ジャングル大帝(#1)~スリル博士(#20)
 (2)0マン(#21)~きりひと賛歌(#34)
 (3)アポロの歌(#35)~ハトよ天まで③(#49)
 (4)夜明け城(#50)~ふしぎ旅行記(#59)
 (5)ファウスト(#60)~アリと巨人(#72)
 (6)化石島(#73)~アラバスター②(#90)


書棚B
(11)
(10)
(9) 
(8) 
(7)

書棚Bの内容:手塚治虫漫画全集(講談社)#91 ... #174
 (7)ダスト8(#91)~三つ目がとおる⑧(#108)
 (8)三つ目がとおる⑨(#109)~タイガーマスク⑤(#125)
 (9)タイガーマスク⑥(#126)~バンパイヤ③(#144)
 (10)ぼるぼら①(#135)~ブラック・ジャック⑦(#157)
 (11)ブラック・ジャック⑧(#158)~鬼丸大将①(#174)


書棚C
(16)
 (15)
(14) 
(13)
(12)

書棚Cの内容:手塚治虫漫画全集(講談社)#175 ... #258
 (12)鬼丸大将②(#175)~ミクロイドS③(#185)
 (13)マグマ大使①(#186)~ナンバー7③(#195)
 (14)ナンバー7④(#196)~ザ・クレーター③(#220)
 (15)鉄腕アトム①(#221)~鉄腕アトム⑱(#238)
 (16)ショート・アラベスク(#239)~雑巾と宝石(#258)


書棚D
(20)
(19)
(18)
(17)

書棚Dの内容:手塚治虫漫画全集(講談社)#259 ... #300, 絶筆、その他
 (17)地球をのむ①(#259)~ふしぎなメルモ(#280)
 (18)新宝島(#281)~ブッダ⑭(#300)
 (19)陽だまりの樹(一)~(七)(小学館)、
   ネオ・ファウスト(絶筆)(朝日新聞社)、
   手塚治虫はどこにいる(筑摩書房)
 (20)手塚治虫物語(オサムシ登場)、
   手塚治虫物語(漫画の夢、アニメの夢)(朝日新聞社)、
   その他:少年クラブ、冒険王、少年画報



【解説欄】
▼はじめに
 最初に、なぜ「私の本棚」という欄を作ることになったのか を説明することにしよう。

 全国で書店の数が激減しているというニュースが流れている。紙の本を読まない世代が増えたからだろうが、それだけではなく雑誌や週刊誌などは駅売りやコンビニ店で買うのが普通で、わざわざ書店まで行くまでもなくなった。あるいは、通販を利用して購入する世代が増えたのも一因であろう。そういった生活基盤の変化が、結局は多くの昔ながらの書店経営を続けられない状態にしてしまったのだと思う。

 書店の書棚から本を取り出すときの、あの“未知の本との出会い”を期待する「トキメキ感」を経験してきた世代の私めには、甚だ残念なことである。私は電子書籍も利用しているが、やはり紙の本の方が圧倒的に多く、かつ思い出して再読する機会も多いような気がする。

 私は、誰でもよいが自分の書籍棚の前に座って撮影された写真などを見つけると、その人物が普段どんな本を読んでいるのか興味を持ち、背後に写る書棚の本を観察するのが好きである。その中に私が読んだことのある本を見つけたりすると、途端にその人物に親近感を持つようになったりする。

 そういう訳で、私は「自分が他人の書棚の中身を見たいのだから、他人も私の書棚を見たいに違いない」と勝手に思い込んでしまった。そして「私の本棚」をここに紹介することにしたのである。もし私の勘違いだったら、・・・許されよ。

▼手塚漫画の思い出
 私が手塚治虫の漫画(*1)に初めて接したのは、小学生の頃に読んだ少年向けの雑誌が最初ではなかったかと思う。しかし私の記憶に残っているのは「新宝島」を買って読んだときのことである。斬新な表現と内容に圧倒されてしまった。
【注】(*1)最近は「漫画」のことを「マンガ」、「アニメ」などと表現することの方が圧倒的に多い。
 お小遣いをためて、やっと本屋で購入した新宝島を、私は家に帰るまで待ち切れずに歩きながら読んでいた。そのとき突然、大声で叫んでいる声が私の耳に飛び込んできたのだ。何んと! 私は小田急線の駅の近くの遮断機の降りた踏切の真ん中にいたのである。そして遮断機を操作する踏切警手が旗を振りながら、必死に早く踏切の外に出るよう叫んでいるのに気が付いたのであった。それほど子供を夢中にさせるものがあったのだ。この私の失敗を今まで誰にも(親にすら、いや親だからこそ!)話していない。歩きスマホを注意する資格は私にはないのである。

 そして、そうです! 私はあの新宝島初版本の持ち主となったのです(過去形なのが悲しい)。今なら数万円はすると思うが、残念ながら学友の兄に盗られてしまった。「貸して欲しい」と私の家にまで押しかけて来たので いやな予感がしたのだが、年上の子に言われるといやとは言えなかった。その後、返却を求めると「無くしてしまった」と言って返してくれない。結局そのままになってしまった。当時からいじめはあったのだ。今でも思い出すと悔しい。

 大人になってから手塚治虫漫画全集が刊行されると知って、私は再び新宝島を読みたくて買うことに決めたのである。最初の配本は、ジャングル大帝(#1)で 1977年6月15日発行だった。そして最後の配本が、その新宝島(#281)で 1984年10月3日発行となっていたから、購入申込みをしてから実に7年間も待たされたことになる。この一冊を手に入れるために7年間に渡って300冊を買い続けてきたのである。

全300巻完結!!


パンフレット:手塚治虫漫画全集 全3期 1977年6月 - 1984年10月


パンフレット:第1期 1977年6月 - 1979年8月


パンフレット:第2期 1979年10月 - 1981年11月


パンフレット:第3期 1982年2月 - 1984年10月
 

 手塚治虫の死後、第4期として1993年1月から1997年12月までの間に新たに100冊が刊行され全400巻となったが、私は新宝島を手に入れてしまったのでもう買うことはなかった。

▼書棚について
 300冊の手塚本を大切に保管するために今まで大変な苦労をしてきた。私の書斎(あるいは私が常時居る場所と言った方がよいかもしれない)の移動、家の改築、引っ越し、家の建て替え・・・ などで何度も移動を繰り返してきた。

 その経験から、最も保管し易い書棚を造ることにした。B6判(高さ約18センチ)なので棚の高さを21センチ~22センチにして空間を無駄にしないよう設計した。棚の奥行は十分とってあるので本を前と後ろに二重に置くこともできたが、手塚本だけは取り出しやすいよう二重にはせず、4個の書棚を手塚治虫本の専用にした。
 書庫の入り口から見て左右の最上段2段をこれに当て、書庫A、Bと書庫C、Dとを作った。台の上に乗って手を伸ばせば、手塚本の取り出しと収納は難なくできるようになっている。

 しかし今回写真を撮る際には、カメラを両手で支えながら頭の上まで持ってゆき、更に腕を伸ばさないと最上段の撮影ができないことが分かった。出来上がった写真でピントが甘かったり、画面が歪んでいたりで良いできとは言えない。許されよ。

 なお、この文中では書棚A、B、C、Dで表示して本物らしく表現してあるが、実際は別物であり縦の区切りはない。

▼過去の遺物
 書棚Dの(20)には、古い 少年クラブ、冒険王、少年画報等が一緒に置いてある。これは私の投稿作品が掲載されているので捨てられず、今に至るまで保存されているのだ。
 手塚治虫氏の影響を強く受け漫画家になりたいと思っていた頃の遺物であるから、私にとっては手塚治虫と密接に関係のある物、としてここに置かれている。■

2017年8月21日月曜日

今こそ、プログラマの時代


── プログラミングの勧め

▼小学生へのプログラミング教育
 小学生への「プログラミング教育」必修化が検討されているという。
 私が育ったアナログ世代とは異なり、デジタルネイティブ世代を相手にする教育だから、教え方にもそれなりの創意・工夫が必要になるのではないかと思う。どのような教え方をするのか興味のあるところだが、そう簡単にベストの方法が確立されるとは思えない。失敗を繰り返しながら少しずつ良い教育方法が築かれていくことになるのだろう。

 どの世代が相手であろうと「プログラム作りに必須の技能」としてプログラマなら身に付けなければならないものがある。そういうものは適当な時期を選んでしっかりと教え込んで欲しいものだ。

▼分かりやすい文章
 たとえば「分かりやすい文章」を書く能力が求められる。プログラム作りに限らず最も基本的で必須の能力であるが、小学生が直ぐ身に付けられる類いのものとは思えない。

 どんな言語でも構わないが、日本語、英語、あるいはコンピュータ言語、何でも良いから「自分の考えを抜かりなく、誤解の余地なくしっかりと相手に伝える」ことができるようになってほしい。それができなければ、相手がであろうとコンピュータであろうと思い通りに動かすことなどできる筈がない。

▼誤解を与える
 政治家はよく「誤解を与えた」という表現を使って弁解しようとするが、これは「相手が間違って解釈したのだ」と主張し責任の大半を相手側に押し付けようとするものである。

 しかしそんな身勝手な言い分けはプログラミングの世界では通用しない。プログラムの記述で「誤解を与えた」としたら、それは自分の表現方法が間違っていた、あるいは自分の説明が足りなかったということを意味している。全責任は自分の側にあると知るべきであろう。

▼定年という壁
 ところで、私が定年を迎えて技術者としての職を辞さねばならなくなったとき、自分ではまだまだ技術者として生きていけるのに、と悔しい思いをしたことを覚えている。しかし今の社会はそういう制度になっているのだから仕方がない。更に続けたければ自分で会社を興すしかないのだろう。そういう才覚のない私めは、定年がなく長く続けられる仕事として芸術家の道を選べばよかったと思ったものだ。あるいは小説家になるという手もあった。たとえ売れない作家であっても、定年がなければ自分の気の済むまで仕事を続けられる。

 私はこれまでの経験から「プログラミングというのは文章を書くのと同じことだ」と思うようになっていた。「自分の考えを抜かりなく、誤解の余地なくしっかりと相手に伝える」ことができればよいのだと。それなら私にも続けられる。小説家になろう。いや、小説家にならなくても、プログラミングの道があるじゃないか。

▼昔プログラマ
 これ以後、私は大学教師としての職についたのだが、同時に「昔プログラマ」を自称するようになった。昔はプログラマだったが、今はもうプログラマではありませんよ、という意を込めた積りだった。しかし本当のところは「プログラマ」という肩書に執着していたのかもしれない。

(図:名刺)

 大学教師というのは実は世を忍ぶ仮りの姿であって、本当のところはこっそりとプログラマの積りになって、プログラム作りを続けてきたのである。教師としての自分の身辺で発生するいろいろな問題の解決にコンピュータを利用してきた。しかし誤解の無いように記しておくが、自分の身辺に係わる問題だけが対象であって、他人のための仕事をしてきた訳ではない。

 教材として使うテキストの作成、課題提出システムの構築、その他自分の趣味に関係するゲームプログラム(!)の作成も含まれている。金儲けが目的ではないから、自分に関心のあることだけを、誰の許可を得るまでもなく自分だけの判断でできるのだ。これほど自由な仕事はない!
 その間、いろいろなプログラム言語を勉強し活用してきた。C/C++, Perl, Javascript, VBA, ...

▼ソフトウェア危機
 昔「ソフトウェア危機」という言葉が叫ばれるようになった時代があった。コンピュータが強力になり、大きなソフトウェアの開発が必要になってきたのである。この調子で進むと沢山のプログラマを養成しなければならない。いや、日本の全国民をプログラマにしてもまだ人数が足りなくなると予想される事態になったのである。全国民であるから当然、赤ん坊も人数に含まれていた。

 赤ん坊プログラマをどうやって教育しようと考えていたのか、そこのところは明らかでないが、この問題提起のお蔭で「ソフトウェア工学」という分野が切り開かれ、当面の危機を免れることができたのである。

 このときは赤ん坊プログラマが話題になったが、流石に高齢者をプログラマにするという発想は出てこなかったと記憶している。何となれば、当時コンピュータの世界では「38歳定年説」というのがあって、ソフトウェア技術者が40歳以上でも務まると思っている人はいなかったからであろう。

▼高齢者プログラマ
 しかし今や、高齢者の雇用促進が求められている時代である。定年後も年金受給が可能になるまでの期間、どのように生活していったらよいかも問われている。たとえ雇用されなくても、有意義に過ごすテーマが必要ではないかと思う。

 私は、高齢者もプログラマを目指したらよいのではないかと提案したい
 定年後もプログラミングをしたいというような酔狂な人は少ないかもしれないがゼロではなかろう。昔、ソフトウェア技術者だった高齢者にもプログラマとして復活する道があっていいのではないか。

 高齢になっても小説を書き続けている作家は沢山いる。評判になるのはほんの一部の作家だけで、その陰には売れない作家も沢山いるに違いない。
 昔のプログラマにもプログラミングの道があるじゃないか。小説家に劣らず、プログラマになれる人材は沢山いるに違いない。売れない小説家がいるのなら、売れないプログラマがいてもいいじゃないか!
 しかも、プログラミングはボケ防止に最適なんですよ。

▼高齢者プログラマの心構え
 高齢者プログラマを目指すなら、次のような注意が必要である。

(1)金儲けは考えない
 高齢者は電話詐欺の餌食になりやすい。自分が作ったプログラムが他人に評価されるのはうれしいことではあるが、他人からの「いいプログラムですね。売れますよ!」とか「買ってくれる人を紹介しますよ」などという甘言に乗ってはならない。したがって金儲けをしたいという考えがあったら止めておくことです。

【注】私は公開するプログラムはすべて無料で使ってもらうことを前提としています。すべてのプログラムには「Copyleft」のマークを付けることにしています。

(2)短編小説をねらう
 企業でソフトウェア開発の経験があったからと言って同じような大型物件の開発に挑戦したりはしない方がよい。あれは大河ドラマのような大長編小説であって、一人で作るのなら短編小説、あるいはショートショート程度にしておくことである。

(3)手頃なプログラム言語を用いる
 使用するプログラム言語は、若い時代に使用した言語が馴染み易くていいかもしれない。しかしできるだけ無料で手に入るものに限定すべきである。

【注】私は60歳代になってからPerlを勉強しました。文法規則を守り厳密に記述しないと受け付けないモードと、いい加減に書いて「良きに計らへ」とシステムに任せられる怠け者向きのモードがあって、私のような怠惰な男には最高の言語なんです。お奨めしますよ。

▼作品の公開
 私の作品は、以下の場所に公開されています。参考にしてください。

 「Perl Program集

「昔プログラマ」改め「昔も今もプログラマ


2017年8月16日水曜日

(昔プログラマの) プログラミング奮戦記(その2)


── JPEGファイルの解剖と解析

▼JPGファイルの解読
 先の「JPEG画像から縦横のサイズを取り出す(昔プログラマのプログラミング奮戦記)」で紹介したようにデジタルカメラに記録された画像データから、付随する情報を読み取るプログラムをPerl言語で記述しようと試みてきた。この種のファイルはJPEGファイルと呼ばれているが、いろいろな形式がある。ここでは、Exifファイルフォーマットと呼ばれ規格化されているものを対象としている。

▼Perlプログラムでの処理
 先に紹介したプログラム(*1)の中で使われている GetJPGsize という関数を使うことにより、画像の横の長さ縦の長さを求めることができるようになった。

 これが使えると、手作業によらないで沢山の画像ファイルに対し一括して適用できるようになり大変な省力化になる。しかし残念ながらこの関数の記述では、複数のJPGファイルに対し繰り返し適用しようとすると2度目以降はうまく動作しないという不都合が発生してしまう。つまりこの関数では、繰り返し同じ機能を発揮してくれないのである。
 プログラミングの世界では、こういう状況を「reusableでない」と言う。reusableでない関数は、全くとは言わないまでもほとんど利用価値がない。
【注】(*1)これまで、GetJPGsize.pl というファイル名にしてきたが、関数名とファイル名を区別するため、以後ファイル名は AnalizeJPG.pl とする。
 不都合が発生する原因をいろいろと追究してきたが、原因は未だに解明されていない。文字コードを扱うのが専門のPerlという言語で、無理やり処理しているのが原因なのかもしれない。Perlでこの種のデータをただやみくもに読み込んだりすると、データの一部が壊される可能性があるからである。たとえばデータの中に改行コードがあると、Perl処理系は実行環境に合わせて変換するのが普通である。

 Perl では改行は '\n' と表現されるので,一文字から成るように見えるが、実行環境によっては1文字(CR)の場合、あるいは2文字(CR+LF)の場合と違いがある。それぞれに実行環境に合うよう自動的に置き換えられる。したがってただ無暗に読み込んだりすると、たまたま制御コードと同じパターンのデータがあれば、誤って変換され結果としてデータが壊されてしまうことになる。そういうことにならない様、ここではライブラリ関数の read ではなく sysread の方を用いることにした。更に、データ構造をしっかりと確認し、画像を構成する本来のデータ部分はできるだけ触れない(読まない)ようにすることにした。

▼JPGファイルの構造を学び直す
 ここで、JPGファイルの構造をしっかりと学び直すことにした。
 インターネット上で「JPGファイルの構造」とか「Exifファイルフォーマット」を指定して検索すれば有益な情報が得られる。

 現時点で公表されている資料では、Exifファイルフォーマットのバージョンは v2.1 と記されているものが最新のようである。残念ながら私の使っているカメラでは、Exifファイルフォーマットはv1.1であるから古い仕様であることが分かった。

 素人カメラマンの私にとって、ファイルフォーマットが古いからと言ってそう簡単にカメラを買い替える訳にはいかない。したがってここでの説明は最新の仕様に沿うものではないので、もしかすると互換性がない部分があるかもしれない。以下は考え方だけを理解してもらえばよいので簡単な説明で済ますことにしよう。

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

 JPGファイルでは、本来の画像データの前に情報セグメントが複数個置かれている。
(図2: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],...
に保存されていく。

▼解析プログラム(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)

を参照してください。

2017年7月20日木曜日

新【悪魔の辞典】(8) 総理の友人

総理の友人
(1)こまったちゃん

(2)自分の言いたいことだけ言って、相手の話は聞かず、質問には答えないで逆に個人攻撃で返す、そういう性格の持ち主と(例外的に話ができ)頼み事さえも聞いてもらえる人

(3)「総理夫人の友人」とほぼ同義

(4)罪を犯しても訴えられることはない、と当初は信じていられる人

(5)中には、借りた金百万円を返そうとしても受け取ってもらえないという幸運な人もいる


【注】「総理の友人」に相応しい“意味” を募集したところ、残念ながら応募はありませんでした。多分、官邸の方から何らかの圧力があったのではないかと思います。


2017年6月30日金曜日

マンホールの蓋が新しくなった

 家の周辺道路で、最近マンホールの蓋が新しいものに交換されつつある。今日、いよいよ我が家の前の道路上でも、その交換作業が始まったようである。

  私は直前になって、記念のため古い蓋の写真を撮っておきたくなった。家の前ではもう作業中なので、隣の家の前にあるまだ交換作業に取り掛かっていない場所にあるマンホールの写真を撮ることにした。


 すると作業主任らしき人が近づいてきて挨拶をしてくれた。いい機会だと思い、いろいろ聞いてみた。

 新しいマンホールの蓋の文様を尋ねたら「普通のものですよ」とのこと。あの「ツツジ」と「ツバキ」の川崎市の新しいバージョンを期待していたのでちょっとがっかりしたが、途中用事があり外出から帰宅すると新しいものに交換されていた。見ると、やはり「ツツジ」と「ツバキ」の新しいバージョンだった。作業主任は「カラー版ではない普通のもの」という意味で言ったらしい。



 中央にある市の花「ツツジ」を、市章と7つの市の木「ツバキ」が囲んでいる。ツバキの数は7つの区を表しているらしい。花には7つの穴があるので雨水用マンホールであることが分かる。下部に「傘のマーク」と「16-M01」の文字が入っている。

 その下にある白いものがカギらしい。古いマンホールは自由に開けられたが、これは特別な工具がないと開けないようになっている。テロ行為に利用されないよう配慮されている。大雨でマンホールの蓋が飛ぶ事故がよくあるが、そういう心配はなくなったことになる。


 最近は、地域ごとに斬新なデザインのマンホールを作り互いに競い合っている。その写真を蒐集しているマニアもいるようだ。以下に示すようにカラー版にもいろいろなバージョンがある。私も蒐集してみようかな、とふと思った。


2017年6月24日土曜日

新幹線を利用して

── 自動改札・券売機と格闘する

 名古屋での法事に出席するため新幹線で日帰り往復することになった。恥ずかしながら、私にとっては久しぶりの新幹線利用だったので自動改札や券売機と格闘することになった。その顛末を記しておこうと思う。


▼乗車ルート
 私は、新幹線で東京から関西方面に行くときは何時も新横浜駅から乗ることにしている。これが一番早くて運賃も安い。先ず、家の近くのJR南武線の駅から乗車し、武蔵小杉経由で東横線に乗り換える。そして菊名駅からはJR横浜線で1駅の新横浜駅で降り新幹線に乗車するというコースである。


 会社勤めをしていた頃は、先ず菊名までの乗車切符を買い、新横浜で乗り越し精算をしてから切符売り場の窓口で駅務員から直接新幹線切符を購入していた。手際よくやればこれで十分に間に合っていたのである。


▼切符とICカード

 その後、技術が進み切符に代わってICカードを使う時代となった。しかし頑固な私めは、それでもずっと切符を買うことに拘ってきたのである。
 消費税が上がり1円単位で運賃に付加されるようになったとき、何故か切符購入者だけは10円の単位まで切り上げられるという差別を受けることになった。その結果、ICカード利用者よりも損をする立場になってしまったのだ。頑固な私めもさすがにこの差別には耐えられず、諦めてICカード利用者へと寝返ることになった。


 さて、話が本論からそれてしまったように思われるかもしれないが、実はこのICカードと自動改札の相性の問題について私は触れたかったのである。切符を利用する場合は問題ないのだが、ICカードでこの「私の新幹線乗車ルート」を利用するとき、果たしてうまく通過できるかどうか少し心配になってきたのである。


▼自動改札という関所
 周知の通り、ICカードでは自動改札から入場したときに料金計算がスタートするが、未払い状態のまま乗車していることになる。降車駅の自動改札から退場するときに初めて料金が確定し支払い完了となる。乗り継ぎで利用する自動改札という 関所 でも同様に処理が行われている。途中の関所をいいかげんに通過することは許されない。


 一方、切符の場合は最初から前払いされているから、今までは途中の関所の通過がそれほど厳密にチェックされることはなかった。どんなルートを取ろうとも、最終的に降車駅で切符を見せれば不足分は精算されるから何となく心理的には楽であった(こちらは別に不正行為をはたらいている訳ではないのだが)。新たなICカード利用者にとって、乗り継ぎで関所を通過する際は未払い状態のチェックが必要になるから切符の場合よりも緊張を強いられるのは避けられない。自分の行為に何かミスがないか、常に注意していなければならなくなったのである。


▼不正行為の扱い

 実は、私は企業での在職中、自分の守備範囲の中に自動改札システムのソフトウェア開発を担当するグループを(一時的だが)抱えていた時期があった。私は技術的な詳しいことは知らないが、耳学問でいろいろな知識を得ていた。
 自動改札では、どんな種類の不正行為も必ず発見することができるという。ただ、不正を発見しても常にそれを指摘して乗客を捕まえる訳ではない。不正行為の回数がある程度の限界を超えたとき、初めて駅員が後ろから「もしもし」と肩を叩きながら呼び止めて事情を聴くことになるのだそうである。


 部下がそういう仕事をしていると、上司である私も自動改札を通過するときは常に「模範的な乗客」を演じる必要があった。「不正行為など以ての外」と心して通るようになったのである(もちろん普段でも不正行為はしていませんけどね)。自動改札の周辺で挙動不審者とみなされることも避けなければならない。そういう訳で、私にとって自動改札とは「模範的な態度」で、流れに乗って「素早く通り抜ける」べき場所だったのである。


▼切符を予約
 出発当日は朝の早い時間に出掛けるので、ラッシュアワーの混雑に不慣れな年寄りが新横浜の駅で新幹線切符を購入するというのは少し無理がある。そう考えて安全のため前日に切符を予約することにした。


 前日の午前中に隣り駅の「みどりの窓口」へ行くと、既に長い行列ができていて13名ほどの人達が並んでいた。やれやれと思ったがこれは私も並ぶしかない。しばらくすると、若い駅務員が回ってきて列に並んでいる人達に順に行き先を聞いてはメモしてくれている。手続きを迅速に済ませるためなのであろう。私も行き先を伝えると、ルート間に私鉄が入るので1枚の切符にはできないと言う。菊名から名古屋までの切符だけになります。それなら、あちらの自動券売機で簡単に買えますよ、と外にある切符売り場の方を指さすのであった。


▼自動券売機に挑戦
 そう言われると「できません」とは言えないので、私は外に出てタッチパネル式の券売機に挑戦してみることにした。


 やってみて驚いた。何でも指定できるようになっているではないか(当たり前だが)。色々な選択肢があるので今までは敬遠し、人の居る窓口で口頭で自分の意思を伝えていたのだが何でも指定できるようだ。座席指定では座る位置まで含めてすべて自分で指定できるようになっていた。今までは、回数券とか、観光地で利用すると便利なフリーキップとか、割引で得することが分かっているものでなければ決して手を出さなかった機器が、かなり身近なものに感じられるようになった。


 こうして無事に名古屋までの片道切符を手に入れることができた。ただ、支払いを「クレジットカードで」と指定したところ、パスワード入力を求める画面があの大きなタッチパネル画面に大写しになったときは驚いた。多くの人々が後ろから見ている前で、私は自分の「極秘!のパスワード」を入力しなければならなかった。初めての経験であった。


▼関所を通る(往路)
 さて、いよいよ当日になった。菊名までは順調であった。私が心配していたのは、東横線の菊名駅から横浜線へ通じる自動改札がどうなっているか、ということだった。ICカードと新幹線切符をどう扱えばよいのか分からなかったのである。表示を確かめながら無事に横浜線に通じる専用の自動改札の場所を見つけた。


 何やらアナウンスされているようだ。改札機へ投入する順番を教えてくれているらしい。日本語の堪能な!私めは「最初に切符を」、「次にカードを」と言っていることを素早く察知したのである。自分の予想とは逆だったが、そんなことは先刻承知と何食わぬ顔をして「先ず切符の投入」、「次にカードの接触」の順に対応することにより無事に関所の第一関門を通過することに成功したのである。


 人の流れに乗って素早く自動改札を通過しながら私は考えていた。なるほど、こうすればよいのか。帰りの関門通過も同じ要領でやればよいのだな、と。


▼関所を通る(帰路)
 法事も無事に終り、3時過ぎに帰路についた。
 名古屋駅に戻り新幹線の切符売り場で再びタッチパネル式の券売機の前に立った。今度は「名古屋から新横浜、更に横浜市内(つまり菊名)まで」という指示をして座席指定の切符を無事に手に入れることができた。いいぞ、この調子だ。こういうことをスマートにできなくなると、やがてボケが始まるのだろうなどと考えていた。


 新横浜駅には5時過ぎに到着し無事に下車。横浜線で再び菊名駅の東横線に乗り換えるための自動改札という関門前にやってきた。帰宅する人々で改札前は混んでいるが、今度は、今朝学んだばかりのことを応用すればよいのだと気楽に考えていたのである。


 先ず自動改札に新幹線切符を挿入した。すると何んとしたことか! ゲートが音を立てて強制的に閉じられてしまった!! そして切符の排出口から、私が投入したばかりの新幹線切符と、更に何故か普通の乗車切符(140円分)が1枚添えられて出て来たではないか!!! 何だ、これは?


 私は大いに動揺してしまった。排出されたばかりの新幹線切符には赤で何か印刷されているように見えた。しかし自動改札という関所は常に 素早く通り抜ける を信条としている私めは、それを確認する余裕はなく排出された切符類を掴み取ると素早く自動改札の流れから離れることにした。そして5メートル程横にある駅務員がいる窓口へ持っていくことにした。


 駅務員は心得たもので、私が何も言わないうちから素早く新幹線切符だけを回収し、140円の乗車切符の方を手近な自動改札機の挿入口に入れて、私に向かってさあ通ってくださいと合図したのである。私は、ここでICカードをタッチすればよいのですね、と確認してから通り抜けたのである。


▼私の推測
 しかし分からない。何がどう処理されたのか理解できないままであった。以後、家に着くまでの間今の出来事をどう解釈すればよいのか考え続けることになってしまった。あのとき新幹線切符に赤で何か書いてあったような気がするのだが確かではない。しっかりと確認すればよかったと思ったがもう後の祭り。後は推測するしかない。


 多分、こういうことではないかと思う。
 JR側はこの関門で新幹線切符を回収しなければならない。しかし乗客(私)に何か菊名駅通過の証明書となるものを持たせる必要がある。乗客が東横線に乗って行くのなら、到着駅で清算できるように菊名駅通過を証明できる140円切符(使用済み!)が必要になる。あるいは、東横線に乗らずにそのまま菊名駅の改札から外に出ることもできる。そのための証明書だったのではないか。


 もしこの推測が正しいとすれば、私が最初に新幹線切符を挿入したときそのまま回収し、排出口からは証明書として140円切符を排出すればよいのではないか? 何故そうしなかったのか。分からない。


 多分、その小さな切符の排出に気が付かずそのまま証明書なしで通過する乗客が出るのを恐れたのかもしれない。つまり乗客を信頼していないのであろう。どんな乗客にも対処法がすぐ分かるようなシステムであって欲しいものだ。


 そう言えば、あのときの140円切符はどうなったのだろう。全く忘れてしまっていた。私はICカードを持っていたから不用だったが、・・・。そうか、こういう不注意な乗客が多いことを考慮して作られたシステムだったのかもしれない。


 いずれにしても、これから東京五輪・八輪(ゴリン・パリン)のために来日するであろう諸外国の人々に容易に理解できるようなシステムであってほしいと思う。それが本当の「お・も・て・な・し」というものであろう。■