|
HMDT - Back Number / June, 2003 |
June, 2003
WebObjects の紹介サイト、Life with "WebObjects" が公開されていました。WebObjects の運用、開発状況が、豊かな経験に基づいて紹介されています。 WebObjects やってみたいなぁ。
はじめてのブラウザのつくり方更新。今回は、戻る、進む、再読み込みボタン。
Safari Developer News を更新。はじめてのブラウザのつくり方も更新したよ。今回は、プログレスバーの表示。
WWDC があって色々な発表があったけど、これを記念して(?)HMDT からもお知らせがあります。 そ・れ・は、実は HMDT が本を出すことになりました!ひゅ〜! その名もずばり、
です。そのまんまじゃ。知らない人が見たら、何の本か分からないだろうに。 サブタイトルから分かる通り、Cocoa と Objective-C プログラミングの入門書です。まったくの初心者のために書きました。Cocoa がどうというよりその前に、まず Mac でプログラムを組むということがどういうことなのか?オブジェクト指向とはなに?Objective-C って難しいの?という疑問から、一つ一つ説明していきます。 丁寧ながらも正面から説明することを心掛けました。また、実践的なサンプルを数多く入れてあります。初心者から中級者まで、自信を持って勧められる本にしたつもりです。 気になる発売日は、7/20 の予定!あと一か月弱。価格は 3,000 円!技術書としては安い、と思うんですけど。BNN 新社さんから発売です。 詳細はまた追ってお知らせするよ!
Safari Developer News にて、はじめてのブラウザのつくり方更新したよ。今日は、WebKit の構造と、URL とタイトルの設定だ。
WebKit 公開を記念して、Safari Developer News のサブコンテンツとして、チュートリアル連載を開始することにしたよ!その名も「はじめてのブラウザのつくり方」。初めてブラウザを作る人を対象に(なんじゃそりゃ)、WebKit の使い方を説明するチュートリアルだ。いちおう簡単な Cocoa プログラミングの知識がある人を対象にするけど、無い人でも書かれているとおりにやれば作れるはずだ。まずは、ブラウザを作るための準備と、URL を開く、だ。ここまでで、簡単なブラウザは作れてしまうぜ。
Apple のメーリングリストの 1 つである、Cocoa 開発者用の cocoa-dev で、Xcode の憶測が流れていたよ。 あの発表から予想されることは、Xcode ではコンパイル時にはすべてのファイルをリンクしない。たぶん、main() を含むファイルだけをリンクするんでしょう。実行時には必要に応じてリンクをする。実行中にバグが見つかると、ソースコードを変更して、そのファイルだけをコンパイルする。すべてのファイルをコンパイルするわけではない。で、デバッグ中にそのファイルを差し替えることができる。 こんな感じではなかろうか、と。Java の動的クラスロードみたいなイメージか?実際問題として、実行中にバグが見つかったら、すでに抜き差しならない状態になっているだろうから、修正、差替えしても多くの場合は無駄でしょう。リスタートが必要。でも、確かにある場合には有効かもしれないね。
前から予告されていたとおり、Qt の Mac/Free 版が公開されたよ。ライセンスは GPL。さっそくダウンロードしてビルド中。なかなか終わらん。 で、これは何に使えるのか?普通に考えれば、クロスプラットフォームのアプリケーションを作る場合だよな。デスクトップアプリケーションを作るなら、Java よりもいい選択肢になるかもしれない。 あと、Safari Develoepr News の方も更新。
WWDC の基調講演の簡単なインプレッションを。
追記)
もうすぐ WWDC の基調講演が始まるけど、そんなことはおかまいなく Books HMDT の更新だ。今回は 4 冊追加。「はじめての Mac OS X Cocoa プログラミング」、「Cocoa Recipes for Mac OS X: The Vermont Recipes」、「Mac OS X Developer's Guide」、「Mac OS X Advanced Development Techniques」だ。 WWDC では、そーだなー、Safari SDK と、Panther の新しい機能のドキュメントがいくつか公開されるとうれしいんだけど。
Objective-C の特徴の 1 つは、動的束縛。late binding ってやつね。これは、メッセージを送るとき、どのメソッドが呼び出されるかは、コンパイル時ではなくて実行時に決まる、っていうことだ。これを使って、メソッドの動的な追加をやってみよう。 ここでやるのは次のようなことだ。まず、クラス Controller があるとする。このクラスに補助クラス SupportModule が持っているメソッドを追加、削除するんだ。目的は、Controller のインスタンス ctrl に対して、たとえば [ctrl showIfno:sender] を呼び出すと、SupportModule のメソッドが呼び出されるようにすることだ。 これには、Controller で 3 つのメソッドを上書きしてやる。1 つ目は respondToSelector:。これは指定したセレクタに応答できるかどうかを調べるもの。2 つ目は methodSignatureForSelector:。指定したセレクタの、メソッド・シグネチャを取得する。3 つ目は forwardInvocation:。メソッド・シグネチャを使って、実際にメソッドを呼び出す。 それぞれのメソッドの中で、SupportModule のメソッド実装状況を調べるようにすればいいんだ。では、実装のコードを。Controller クラスは、SupportModule のインスタンスへの参照 _module を持つことにした。 - (BOOL)respondsToSelector:(SEL)selector
{
if ([_module respondsToSelector:selector]) {
return YES;
}
return [[self class] instancesRespondToSelector:selector];
}
- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector
{
NSMethodSignature* signature;
signature = [_module methodSignatureForSelector:selector];
if (signature) {
return signature;
}
return [[self class] instanceMethodSignatureForSelector:selector];
}
- (void)forwardInvocation:(NSInvocation*)invocation
{
if ([_module respondsToSelector:[invocation selector]]) {
[invocation invokeWithTarget:_module];
return;
}
[invocation invoke];
}
これでオッケー!あとは、_module に値を代入するか、nil にするかで、動的に制御できる。感覚的には、C++ の仮想関数テーブルを動的に変更するようなものか。 なんでこんなことしようかと思ったかというと、メニューを動的に変更したかったんだ。Cocoa のメニューは、レスポンダチェインに入っているオブジェクトが、対応するメソッドを持っていないといけない。メニューの有効性は respondsToSelector: で調査される。でも、レスポンダチェインの外のオブジェクトに、メニューからの呼び出しを持たせたかったので、動的にメソッドを追加して、外部のオブジェクトにメッセージをフォワードさせたかったんだ。
Books HMDT に 1 冊追加。今日は「Cocoa はやっぱり!」だ。日本語で書かれた貴重な Cocoa 本。
ポセイドンのページ経由、Trolltech によると、WWDC に合わせて Qt の Mac 版を GPL でリリースするんだそうな。Qt は、Windows、Linux、Unix で動作する C++ ベースの GUI ライブラリ。いままで Mac 版は商用ライセンスしか無かったけど、GPL も出るんだって。 うっほほーい!また強力なライブラリが選択肢の中に入ったよ。WWDC に向けて、だんだん盛り上がってきたなあ。
最近は本の紹介ばっかりだけど、また新しい本が。 Mac OS X の Unix プログラミングの側面を解説した、「Core Mac OS X and Unix Programming: Master Darwin and the Core Technology」だ。つまり、Darwin プログラミング入門ということらしい。 目次(pdf 注意)を見てみるとトピックは、メモリ、ファイル、ソケット、タスク、スレッド、認証、などなど。ページ数 500 強でこれだけの内容となると、どうだろう、駆け足になるような気もするが。とりあえず、買ってみよう。 Mac OS X のプログラミング本は、Cocoa、Carbon、Java、Unix といろいろな方面から出てきて、楽しくなってきたな。 追記)これって、「Mac OS X Cocoa プログラミング」の著者である Hillegass が書いてるのね。もう 1 人、Mark Dalrymple という人との共著らしい。値段が $97.95 ってのは高過ぎじゃないか!?
てもとにある Mac OS X のプログラミング本を勝手に紹介する、Books HMDT を更新したよ! 今回は、定番の「Mac OS X Cocoa プログラミング」と、とてもハードな「Cocoa Programming」だ。どっちも個性がない名前だけど、いい本だ。
リニューアルする前の掲示板で、C99 の話で盛り上がったことがあったんだ。そのとき紹介したもらったページが、「プログラミング言語 C の新機能」。ここでは、ていねいに C99 の解説をしてる。 で、ここを眺めていたら、マクロに可変長引数をつけることができるらしい。マクロを #define macro(x, ...) と宣言して、可変引数の部分は、__VA_ARGS__ を使えばいいらしい。ほう。これは、エラーメッセージに便利そう。 たとえば、エラーメッセージに、ファイル名と行を付加するには、こうなる。 #define HMDT_ERROR(...) \
NSLog(@"File %s, line %d", __FILE__, __LINE__); \
NSLog(__VA_ARGS__);
では、実行中のクラス名とメソッド名を付けるには?Objective-C メソッドの隠れた変数、self と _cmd を使えばいいんだ。 #define HMDT_ERROR(...) \
NSLog(@"%@.%@",
NSStringFromClass([self class]), \
NSStringFromSelector(_cmd)); \
NSLog(__VA_ARGS__);
このマクロを使うと、エラーメッセージと、それが起こったクラス名、メソッド名を表示させることができる。うーん、便利。
掲示板で予告(?)した通り、Mac OS X 関連のプログラミング本の紹介ページを作ったぜ!とりあえず、手もとにある本をどんどん紹介していくページだ。書評とか、そんな偉そうなもんではなくて、買うときに何かの参考になれば、っていう程度のページです。 まず、オライリーの 2 冊を紹介してみた。「入門 Cocoa」と「Building Cocoa Application」だ。どっちも定番だね。 まだまだ、どんどん追加していくから。
テキストエディタっていうと、すごくこだわりのある人もいるみたいだけど、個人的にはぜんぜんなくて、「標準のテキストエディットでじゅうぶん!」って感じでやってました。いまでもじゅうぶんなんだけど。 でも、それも悲しいかなぁ、と思って、前から気になってた KEdit for Mac OS X を試してみることにした。リンク先の解説にもあるとおり、KEdit は BeOS についていたものを Mac OS X に移植したもの。ソースコードも公開されているので、不具合があっても自分で対処できるし。 ちなみに、KEdit の作者のページはこちら。こちらを読んでいるうちに、使いたくなったのでした。
HMDT BBS 復活させました。前のはレンタル掲示板を使っていたんだけど、今度は自宅サーバを立ててみた。iMac で動いてるよん。 サーバ立てるの始めての素人管理人なので、問題が多々あるかもしれないけど、そのときはごめんなさい、と先に謝っておくです。 掲示板では、HMDT への突っ込みや、プログラミングの質問などを受け付けます。初心者質問歓迎ですので、気楽に書き込んで下さい。
MacDevCenter.com で、メモリ管理に関する記事が掲載されているよ。Cocoa のメモリ管理である、リファレンスカウンタの考え方と、retain、release、autorelease の使い方が説明されている。 ま、この記事自体は普通に書けているんだけど、そこからリンクされている MemoryManagement.org が面白いんだ。なんとも直接的なドメイン名。メモリ管理の様々な手法を網羅しているんだけど、Glossary が充実。メモリ管理の用語解説がその数 400。うひょー。ちなみにリファレンスカウンタはこんな感じ。
WILLBE6.org さんが、libxml2 での外部エンコーダの解説と、Cocoa を使った実装のサンプルを公開しています。素晴らしい! これを見ると、エンコーディングの取り扱いに関しては、libxml2 の方が柔軟というか、素直な感じですな。エンコーダを一から実装するとしたら、libxml2 の方が手間がかかるけど、いまどきどの環境でも文字列エンコーディングの機構などそろっているはずなので、こっちの方が良さげです。
expat の話の続き。 XML パーサである expat は、デフォルトでは ASCII や UTF-8 などのデータのパースに対応しているんだ。けど、日本語エンコーディングには対応していない。そこで、Cocoa を使って外部エンコーディングを付け加えてみた。 expat の外部エンコーディングは、次のような構造体で情報を表すんだ。この情報は、指定されたエンコードから Unicode への変換を表すんだ。 typedef struct {
int map[256];
void *data;
int (*convert)(void *data, const char *s);
void (*release)(void *data);
} XML_Encoding;
map が肝だ。これは、第 1 byte を見て、コンバートが発生するかどうかを指定するものだ。たとえば、Shift JIS の場合は、ASCII はそのままエンコードされる。漢字は、2 byte を用いて表現される。このとき第 1 byte は、0x81〜0x9F か 0xE0〜0xFCだ。そこで、この map で、0x81〜0x9F か 0xE0〜0xFC の区間では、外部エンコードを使うと指定してやる(具体的には -2 を入れる)。そうすると、第 1 byte がその範囲に入ると、convert で指定した関数が呼び出される、っていう仕組みだ。 この仕組みが使えるのは、第 1 byte を見て文字の種類が判別できる場合、ということになる。だから、Shift JIS や EUC-JP ではオッケーだけど、ISO-2022 系(つまり JIS ね)は、だめじゃん。エスケープシーケンスで切り替えるから。あらま。 で、変換のための関数が呼び出されたあとはそれぞれの実装依存になるんだけど、とりあえず Cocoa を使って実装してみた。ただ、expat では変換は 1 文字ごとに行われるので、NSString を使うとものすごく効率が悪い。単に変換テーブルを見て値をかえすだけの API があればいいんだけど、どこにあるんだろう?Text Encoding Converter か?ソースを置いておくので、興味のある方はどうぞ。実行するとウィンドウが開いて、「Open...」から XML ファイルを開くと、パースされます。 ダウンロード:expatTest.tar.gz
dentom soft:ware さんが、Mac プログラム相談掲示板を作ったそうです。dentom さんは、前にあった HMDT の掲示板にもいろいろ書き込んでくれた方です。あのときは、どうもありがとうございました。 HDMT の掲示板は、忙しさにかまけてしばらくほうっておいたら削除されてしまったようで。近いうちにこちらも復活させます。 というわけで、プログラミングの問題を抱えている方は、dentom さんの掲示板に書き込んでみるといいのではないでしょうか。
きのう expat で遊んでいると書いたように、いま XML パーサを探しているんだ。XML パーサなんぞ掃いて捨てるほどあるけど、条件は、
という感じ。これだと、定番の Java の JAXP は、Java だから使うのが面倒。Apache XML の Xerces は C++ があるけど重すぎ。JDOM は軽そうなんだけど、Java だしなぁ。 Mac OS X で標準でついている、Core Foundation の XML パーサである Low-level CFXML に皮をかぶせるのもいいかもしれない。そのアプローチをしているのが Iconara DOM。これは Cocoa ベースの DOM API を提供している。なかなかいいんだけど、CFXML ってどの程度信用できるのかなぁ。前にいじったときは、けっこう落ちまくっていたんだけど。 とか考えていると、低レベルな XML パーサを使って、自分で作った方が早いかもしれない。というわけで expat で実験中。あと WILLBE6.org さんから教えてもらった libxml2 とそれにかぶせる libgdome とかもいいのかもしれない(Thnaks!)。libxml2 は expat や他のパーサを意識しているらしく、スピードの比較とかもしているから、評価してみる価値はあるかも。 ちなみに Safari は一部で expat を使っているんだけど、外部エンコーディングは利用していないみたいなんだよな。あんまり参考にならないのでした。
いま expat を使って遊ぼうとしているんだけど、うまくいかないー。 expat は、かなり昔からある XML パーサ。ローレベルなもので、XML 文書をトークンに分割してくれるものだ。動かす事自体は簡単なんだけど、エンコーディングがめんどくさい。 expat 単体では、UTF-8 とか UTF-16 とかは対応してくれる。だけどその他のエンコード、たとえば日本語のエンコードとかは外部のエンコーダを使ってやる必要がある。Cocoa を使えばエンコーディング自体は簡単なんだけど、expat のインタフェースがなんかめんどくさいんだよねー。 それよりも、expat に渡す前に Cocoa を使って Unicode に変換してやってしまえばいいのではないか?そっちの方が速いと思うし。でもなんか負けたような気がしてしゃくだ。 それにしても、Cocoa でまじめに XML を取り扱おうとすると(せめて SAX と DOM)、完璧にできあがっているライブラリってほとんどないんだな。部分的に実装されているのはあるんだけどね。Java 使うのはめんどくさいし。うーむ。
|
|
Home | Link | Download | Back Number | Speciall Issue
|