** Macintoshとの出会い [#h1eca4bb] はじめてMacintosh(以下Macと書きます)に見たのは、入社して2年目でした。 Macの優れたユーザインタフェースを習得すればきっとばらしい ソフトを作れるに違いない、そう思った私は一念発起してMacを買いました (もちろんローンです)。 当時のMacは軽自動車と同じくらいの価格で、今のパソコンよりも遙かに高価 でした。 Macが届いてから、ソフトウェアの無限の可能性に胸躍らせ夢中でプログラミングを学びました。 当時は、Macのプログラミング環境はMDS(Macintosh Development System)と 呼ばれるアセンブラをベースとした開発環境とInside Macintoshのセット、 Mac PascalというPascalのインタプリタしかありませんでした。 Macintoshのプログラムは、当初Lisa上でアセンブラとPasacal言語によって 開発されていた経緯から、マックのツールボックスとのインタフェースはPascal で記述されていましたので、PascalがMacの標準言語となったのは自然な流れで した。 THINK Pascalの登場によってMac上で本格的なプログラミングが可能となりました。 その後、Appleから正式な開発環境MPW(Macintosh Programing Workbench) が提供され、UNIXライクなコマンドと汎用のエディタを使った開発環境にC言語が 本格的に導入されました。UNIXの普及に伴い、時代の流れはC言語の全盛期となり ました。 *** Macプログラミングは独特 [#d693e9b2] 開発言語とInside Macintoshiを読んだけでは、Macのプログラムを作るには 不十分でした。 少ないMacのプログラミング本のなかで、 - How to Write Macintosh Software - Macintosh Revealed - Mac Tutor をむさぼり読みました。 特に、How to Write Macintosh Softwareに紹介されていたデバッグ方法はすばらしく、 今も大切にしています。 - バグと思わしき箇所を見つけたら、すぐにバグを修正するのではなく、 - デバッガでバグの箇所を正しい値をセットし、後の処理が正常に動作することを確認してから バグを修正する というものでした。 ** RS232C(魔法の杖:クロスケーブル) [#b18e3a4e] 初期のMacには外部機器と接続するインタフェースとして、 モデム接続用とプリンタ接続用2つのシリアルポートがあるのみでした。 *** クロス変換ケーブル [#k7247513] シリアル通信では、モデムと接続する場合にはパラレルケーブル、別の PCや外部機器と接続する場合にはクロスケーブルを使用します。 私が入社して初めてハンダゴテを持ったのは、パラレルケーブルをクロス ケーブルに変換するケーブルの作成でした(写真1)。 モデムケーブルとこの変換ケーブルがあれば、すべての機器と接続する ことができるのでとても重宝しました。 *** 小型スキャナー・プリンターの接続 [#zdbed6af] 80年台にブームとなったシステム手帳ですが、多くの種類のリフィルが 売られていました。 そのような中、リコーからシステム手帳対応のハンディタイプのスキャナー ・プリンターCuvaxが発売されました。しかもCuvaxにはPCとの接続して 画像の転送ができるコントーラーがオプションとして用意されていました。 自分だけのリフィルをつくりたい、Macのデータをリフィルに印刷したいと いう私の願望とマッチし、すぐにMacとCuvaxを接続するソフトを作成しま した。これが私の最初のMacintoshアプリケーションであり、 自分の欲しいものを作った始まりでした。 *** ハード的な接続テスト [#l019af29] Cuvaxとの接続テストでは、クロス変換ケーブルが活躍しました。 もっとも簡単な通信がクリアすれば、後はコントーラーの仕様に合わせて データを交換するプロトコルを実装するだけですから、ソフト屋の私の得意 とするところです。問題を自分の領域に持ち込めば、こちらのものです! *** MacらしいGUIを付ける [#c15849ef] Cuvaxコントローラと正常に通信ができたところで、Mac風のユーザインタフェース を作成ました。 特にスキャナーで読み取った画像がリアルタイムで表示された時には、とても感動 しました。 ** Javaから制御(魔法の杖:レベルコンバータ) [#f00f55f1] 私には、2つのこだわりがありました。 - Mac上で開発できること - マシン依存しない環境を持つこと そこで、2001年から開発言語をCからJavaに切り替え、開発環境もEclipseで統一することにしました。 JVM上で動くJavaはマシンやOSに依存しないことが私には魅力でした。 *** Javaから制御 [#vdaaf93a] サンマイクロシステムズから販売されたSun Spot(写真)は、大福くらいの本体に無線、温度、加速度センサー等のセンサーを搭載した機器で、すべてJavaで制御されていました。 Sun Spotの徹底したこだわりはセンサーモジュールに搭載されたMPUをオブジェクト化し、Javaでセンサーをコントロールしているところにも現れていました。 *** ICタグをJavaから制御したい [#i338df5e] Sun Spotに刺激された私は、本棚に山積みになっている本を簡単に見つけられないかと期待して、ICタグとJavaから読み書きできるようにしたいと考えました。 組み込みプレスで掲載された「ICタグを使った書籍管理システムの構築」は、こうして作られました。 *** Javaのシリアル通信 [#i88ea345] PC上のJavaからTTLレベルのシリアルポートを制御するには、2つの問題がありました。 - Java用のシリアル通信クラスライブラリ - USBから接続できるTTLレベルコンバータ Java用のシリアル通信クラスライブラリとしては、Sunの提供する Java Communications API がありましたが、 実際に実装されているのは、SPARC Solaris/x86 Solaris/x86 Linux版のみなのでMacOSXやWindowsでは使えません。 そこで、Java Communications APIに準拠したオープンソースのライブラリRXTXを使用します。 USBから接続できるTTLレベルコンバータには、秋月のAE-UM232Rをしようしました。 AE-UM232Rは、USBから外部機器に電源(5V, 3.3V)を供給し、買ってすぐにブレッドボード に接続できるすぐれもの です。 ターミナルの通信ソフトで、ICタグとの接続を確認した後、JavaからICタグを制御するアプリケーションを 作り始めました。 実際に本を管理するには、書籍のタイトル、著者などを入力しますが、これもAmazonの検索サービスを使って ISBN番号から取り込んで処理しました。 入力GUIもEclipseのVisual Editorを使って作成したので、あっという間に書籍登録画面が完成しました。 例え不慣れな外部機器との接続でも、自分の得意なところに持ち込めれば、簡単に使いこなすことができるようになります。 レベルコンバータが、「魔法の杖」のように感じました。 ** Usb(魔法の杖:プロトコルスタック) [#c16a8392] シリアル通信の成功に勢いづいて、オリジナルのUSB装置にJavaから接続を試みました。 雑誌で紹介されているUSB制御は、ICメーカーの提供するWindows用のドライバーとVisual Basicを使った例が多く、 Macユーザの私にはほとんど役に立ちません。 そんな時「インターネット・ガジェット設計」で - libusb:オープンソースのUSB制御ライブラリ - V-USB:AVR用のUSBプロトコルスタック を使った記事が紹介されていました。 *** JavaからオリジナルUSB装置への接続 [#p169c6c8] 世の中には同じようなことを考えている人がいるもので、libusbとjavaで検索すると、 LibusbJavaというlibusbのjavaラッパーが見つかりました。 USB機器との通信は、usb_control_msgメソッドのbRequest, wValue, wIndex, wLengthの中に7バイトの情報を 埋め込んで行います。USBのルールには沿っていませんが、プロトコルスタックを使うことでJavaからも USB機器と接続できることが確認できました。 *** JavaからオリジナルHID装置に接続 [#s05e3fe4]