このページは私がMacOS XのFrameworkであるCocoaを使ってアプリケーションを作る際に得たTipsを備忘録的に掲載しているものです。しっかりCocoaを修得したければ、まずこちらのLinkを訪れて勉強してね。
Cocoaはやっぱり!HAPPY Macintosh Developing TIME!
Cocoa Dev Central
さて、現在私が作製しているのは、講演会でPowerBookを使用してプレゼンをするときのアプリである。PowerPoint使えばいいじゃんという声が聞こえてきそうだが、
PowerPointはいわずと知れたMicrosoft社製なのである。だから、
肝心な時にフリーズ
一つ前のバージョンの書類を開いたら強制終了する
いらない機能てんこ盛りなのに画像ファイルがDrag&Dropで登録できない
等、究極のアホなアプリなのだ。Appleも5年前にMSから金をせしめて会社を立て直した時代は過ぎ、最近は脱MSを図っているらしい。根っからのMacエバンジェリストを自称する私としてはここは奮起せねばなるまい。(誰も期待してねえよ)
こうして「自分が使いたい機能が入っていれば良い」という究極のワガママコンセプトに基づき、Project Builderとにらめっこの日々を送ることとなったのである。
と、勢いは良かったのだけど、2003年1月にAppleがKeynoteというプレゼンテーション用ソフトを発表した。なんと、Steve Jobsが自らのために開発させ、一年間ベータテスタをしていたという代物である。いやいや、出ましたね〜、IEキラーでSafariを出したと思ったら、次はPower Pointキラーですか。
自分が作ろうとしたソフトはKeynoteみたいなソフトだったのだが、12,800円とリーズナブルな値段も幸いして、Apple Storeでポチッとしてしまった。
現在Keynoteを使い込んでみて、今となっては低速なマシンになってしまったPower Book G3(Firewire)のメインマシン快適に使えるように、データをいじり倒している。てなわけで、自作第2弾はおそらくKeynote関連のユーティリティになるだろう。
下の方には私のプログラミング遍歴(?)をつらつらと綴ってみた。暇な人は読んでね。
私が経験したプログラミング言語について
以下の言語は、チャレンジした(が挫折した)もしくはお世話になった、現在使用しているものを含めて、時期の古いものから順に並べています。
・BASIC (^_^;)
大学に進学してから、アルバイトでお金を貯め、最初に買ったパソコンは、NEC PC9801M2であった。FDが1.2Mになって感動したものである。しかし、よく出入りしていた口腔細菌学研究室の98はF2(FDの容量が640kbytesのとき)であったので、データのやりとりが出来なかったとさ。
このころは、パソコンには開発用言語がついているのが当たり前で、当時はBASIC全盛の時代であった。98は、N88BASICがROMに入っていたのだ。
学校祭の頃になると、2〜3日は明け方近くまでプログラムし、あやしげな血液型判定、性格診断、相性占いなどでお金を儲けた。
客の学生たちには「乱数で適当に出しているんだろう」などと言われたこともあったが,市販の占い本を腕力で入力し,そこそこのテストを行って条件分岐していたので,結構当たると評判であった.
メモリが足りないところを無理に動かしていたので、BASICのオーバーレイをやっていた。(確かMainRAMは 384Kbytes (!)だったと思う(しかも増設した後で)。標準は256Kbytesだったのである。現在所有してるPowerMac G4は796MBytesのメモリを積んでいるから隔世の感である。
そのBasicのプログラムはやっつけ仕事&行き当たりばったりの拡張を重ねていたので、当然スパゲッティプログラムと化した。当時出てきたJXWord一太郎(もちろんVer1.0)のように禁則処理をするため、句読点の追い出し処理をやったりとか、見えないところに手間暇をかけたものだ。
いたずらしてプログラムを強制停止しようとするガキがいて,対抗するためにSTOPキーを無効にし,あるキーの組み合わせでないとプログラムが停止しないようにしたものだ(なつかし〜)
・いわゆるC言語(Think C & Micro$oft社製Quick C2.0(こっちは番外編じゃ〜))
大学の確か5年目くらいだったと思う(別に留年した訳じゃないよ。歯学部は6年制なのだ)。MicroSoft社製のQuick C2.0を買ってしまった。このころから、「これからの時代はCだっ!!」という雑誌記事が目立っていたように記憶している。
しかしながら、QCを使用してうまく動作した自作プログラムはなかった。そのころは、構造体やアドレス、ポインタの何たるかがよくわかっていなかった.
またQCは統合環境を謳っていたにも関わらず、このデバッガが全く使えなかった。(少なくとも私には)ステップ実行していってもすぐに落ちしまい,どこが原因なのか追究しようがなかったからだ。
時は流れて、無事大学を卒業し、勤務についてから2年目にして、病院でMacintosh IICXを買ってもらった。主に、講演用のスライドを作成する傍ら、雑誌記事の中でかっこいいThink Cの統合環境の記事を目にし、これだっと思い、一度あきらめていたプログラミングの道へまたもやはまることとなった。
MacintoshでToolBoxを用いたプログラミングは、いやでも構造体やポインタなどが理解する必要があったので、やみくもに本を読んで勉強した。
ちなみに当時はバイブルといわれていた(MacOS9 の時代を終えてとうとうreferenceとして地位は引退してしまったが)Inside MacintoshをI,II,Vは日本語版,III,IVVIは英語版を全部揃えた.
幸運なことに、Think Cの環境は優れていて、タコなプログラムでもマシンがフリーズすることはほとんどなく、システムエラーを起こすようなコードでも、きちんとデバッガで止まってくれた。しかしながら、MacintoshのToolBoxの全貌を把握するのは、到底当時の私の力ではおもいっきり不足しており(今でもとてもムリだけど)、しょうもないサンプル程度が多かった。確か、ネットから画像をダウンロードしてきてそれを高速に表示するプログラムなどを書いていた.オフスクリーンにDrawPictureしてCopyBitsで転送するだけなんだけど.
・HyperTalk
確か、Quadra 700を手に入れた頃に、Hyper Card のフルセット版を買ったのが事の始まりだったと思う。きっかけは東京に仕事で研修に行ったとき必ず寄る秋葉原でつい衝動買いしてしまったような気がする。そのころは、付属していたHyper CardはMagicコマンドを使うと、Scripting出来るという事を知らなかったのだ。
でも、このフルセット版はデバッガがついていたので、開発するのは確かに都合が良かった。でも、遅いのにはいつもイライラされられた。
これで、歯が失われた際に、残った歯を利用してかみ合わせを回復するBridgeという治療の構造設計のスタックを作ったが、あまりに動作が遅くて、仕事には役に立たなかった。
でも、このときのHyperTalkは良くできたオブジェクト指向環境だったので、その後のC++のアプリケーションフレームワークにおける開発には役に立ったと思う.
・C++(Symantec 社製のもの)
HyperTalkに限界を感じてしまってから、やっぱりCに戻ろうと決意し、Think C5.0が出たのを機にバージョンアップした。
このときから、クラスライブラリによるプログラムがスタートした。ただし、TC5.0はnew , deleteの実装を理解不能なマクロでやっていて、予約語の中に含まれていなかった。このときのクラスライブラリはいわゆる第一世代と呼ばれているもので、総てのクラスはメモリの割り当てを受け持つCObjectというものから派生していた。
その後、Think CはSymantec社に買収され、Symantec Cとなった。クラスライブラリはTCL2.0。インターフェースをビルドし、スケルトンのコードをはいてくれるツールが付属していた。でも、これに対応しようとして、ライブラリが肥大化し、ちょっとした小さなプログラムを書いても、やたらとでかいコードサイズになってしまった。
このときから、カルテを記述するためのコードを書き始める(といっても未だ完成はしていないが...)。友人のために、患者管理用の小さなプログラムを書いて使用してもらう。実用になる最初のプログラムである。つまり、クラスライブラリを利用してやっとものになったというわけだ。
・Java
と、ちょっとここでJavaに浮気をする。といっても、ほとんどサンプルプログラムを走らせてみた程度である。直接のきっかけは1996年に仕事の関係でアメリカに行った際、購入してきたRoasterのデモ版とその解説本である。アメリカのパソコン関係の販売店はあまり商品を置いていなかった.(通販主体だからだろうか,プログラミング関係の言語やToolは皆無であった)英語にも関わらず、比較的分かり易い内容ではあったが、いかんせん実行速度が遅いのと、日本語が使えないのが難点だった。ただ、C++の良いところをうまく取り入れているようなので、日本語がうまく使えるようになったら、ぜひ使ってみたい言語である。
・C++(Metrowerks 社製のもの)
Javaがまだ時期尚早であると判断した頃は、ちょうどNiftyのFMACPROフォーラムで、MetrowerksのCode Warriorへの乗り換え組が、だんだん多くなってきていた。
ある日、一念発起してCode Warriorを購入。
「おっ、速いぞ。」というのが、第一印象。CWの統合環境であるIDEはPower Plantと呼ばれるMetrowerks社製のクラスライブラリを使って作られているそうだが、動作は快適である。早速、クラスライブラリのDemoプログラムを片っ端からCompileして走らせてみる。
Power Plantは多重継承を用いているいわゆる第二世代のクラスライブラリと言われており、機能を付加していくのが、比較的簡単に出来る。
時代はすでにJavaが登場してきた頃であるが、やはりNativeな環境で走らせるのではないので、動作速度がいま一つであるのと、日本語がうまくハンドリング出来ないのが難点で、Power Plantを用いて、友人に書いたプログラムを書き換えた。多少難儀したところはあったが、なんとか無事に書き換えに成功。特にアルゴリズムを改善したわけではないのだが、Profileを取ると、20パーセントくらい速度が向上していた。
この小さな成功に味を占め、次なる作品にとりかかる。LibBuilderである。これに関しては、こちらを参照頂きたい。
・Objective C(Apple社製)
時は過ぎ、2001年春、ついにMacOS X public betaがリリースされた。MacOS XはBSD系のUnix環境であり、Apple製のProject Builderという統合環境が提供されたことによって、コンパイラはgcc、デバッガはGNU debuggerがGUIで実現された(もちろんコマンドラインでも使える)。Objective CはMacOS Xの前身であるNEXT Stepで採用されていた言語である。NEXT社がApple社に買収され、新しいMacのOSとして10年以上先進性を保ち続けていたObjective Cが使えるようになったのである。
現在はProject BuilderもOSのアップデートに伴って進化を続け、公開当初よりも格段に安定し、使いやすい環境になってきた。最初はCode Warriorの高機能なIDEデバッガの使い勝手と比較して文句たらたらだったが、今はObjective Cの文法にも慣れてきたし、なんといってもApp KitとMacOS Xとの親和性が高く、Drag & Dropなども比較的簡単に実装できるのが嬉しい。この言語は現在進行形である。
私が愛用していたPower Plantについて
現在私が所有しているCWPro3においてはPowerPlantのバージョンは1.8.1である。OS8のAppearanceに対応するために、クラスが増えた。LibBuilderの1.3.5までは、それまでのGAクラスべったりで書いていたものが、修正を余儀なくされた。現在、公開しているLibBuilder1.3.6bはAppearance Manager(J1 1.0.1)に対応したものだ。
OS8上では,アピアランス機能拡張の機能を用いてコントロール関係を表示し,それ以前のOSのバージョンでは,GAクラスを用いて表示している.そのため,ライブラリのサイズは大きくなってしまっている.
外観上の変更はともかく、Power Plantには役に立つThreadクラスを備えている。
これは、MacOS 7.5以上に標準で備えているthread 機能拡張をクラスでラッピングしたものだ。これにより、プログラム内で並行処理が可能になる。LibBuilderでは、このThreadクラスを多用している。
Inside LibBuilder
netscape navigator or communicatorのCacheファイルはデフォルトで初期設定フォルダ中にあるNetscape トのCache トというフォルダ中に蓄えられる.
このフォルダ中のCCache logというファイルがキャッシュファイルの情報を蓄えているデータベースファイルである.
Webページを閲覧しているときは,そのページそのもののHTMLファイルやgifやJPEGなどの画像ファイル,オーディオファイル等が読み込まれると同時にキャッシュに蓄えられていく.ファイル名は同一階層上にたくさん蓄えられる関係上,ユニーク(同じものがないという意味)な数字と拡張子で構成されている.
この状態からLibBuilderの仕事が始まる.今,あなたのハードディスク上にlibというフォルダを作成し,そこにlocal Server's locationを設定したとする.(ハードディスクのボリューム名はMacintosh HDとする)
さらにキャッシュフォルダ中に1177.htmというHTMLファイルがあり,そのURLは
http://www6.plala.or.jp/doc-hiro/intro.htmlであるとする.(その今貴方が見ているファイルだ!!)このファイルをローカル上に再構築するためにlibBuilderは以下の手順を踏んでいる.
・CCache logを調べ,1177.htmというファイルのURL,日付,Contents-typeなどを取得する.
・URLをMacintoshのファイルシステムで使用できるよう,/を:に変換する.:は-に変換する.最後のファイル名部分は63文字以内という制限に当てはまるよう適宜短くする事もある.最初のhttp://はカットする.
このようにして,www6.plala.or.jp/doc-hiro/intro.htmlという文字列を得る.
・上記の文字列から階層順に従ってlibの中にwww6.plala.or.jpというフォルダ,その中にdoc-hiroというフォルダを作成する.
変換作業後のファイル名はintro.htmlとなる.
・cacheフォルダの中の1177.htmlをオープンし,メモリ上に全部読み込む.
・Tagの中の<A HREF = http:// ...>という絶対パス指定や相対パス指定をlibフォルダ内での位置関係に修正していく.
・変換の終了した文字列をバッファ内に蓄える.
・無事に変換を終了したら,intro.htmlにすべて書き込む.
以上の手順を複数のThreadを用いながら,やっているのだ.