Backnumber

June, 2006
May, 2006
April, 2006
March, 2006
February, 2006
January, 2006
December, 2005
November, 2005
October, 2005
September, 2005
August, 2005
July, 2005
June, 2005
May, 2005
April, 2005
March, 2005
Feburary, 2005
January, 2005
December, 2004
November, 2004
October, 2004
September, 2004
Augsut, 2004
July, 2004
June, 2004
May, 2004
April, 2004
March, 2004
February, 2004
January, 2004
December, 2003
November, 2003
October, 2003
September, 2003
August, 2003

- HMDT archive-
November, 2004

November 30

今日も出します、シイラのビルド。シイラ Nightly build 041130。

  • 検索エンジンウィンドウのバグをいろいろ修正。
  • 「画像を新規ウィンドウで開く」メニューのバグを修正。
  • 「画像を新規タブで開く」および背面で開くためのメニューを追加。
  • コンテクストメニューの検索エンジンに favicon を追加。
  • オープンダイアログおよび D&D でローカルファイルを開くときの問題を修正。
  • ブックマークバーからサイドバーへブックマークを D&D したときの問題を修正。

バグフィックスが中心。

いま、時間を見つけては、少しずつ WWDC の DVD を見返している。やー、面白い。とってもためになる。最高の教材だね。眠くなるのが難点だが。

November 29

一週間ぶりのご無沙汰。シイラ Nightly build 041129 っす。

  • 「他のブラウザで表示」メニューの問題点を修正。
  • 「検索履歴を消去」メニューが機能しない問題を修正。

ちまちまとバグフィックスを。

ここしばらくはだいぶ更新の頻度が落ちてしまってた。だけど、いまどうにかこうにか体制を整えているので、再び開発スピードを上げることができそう。とりあえずは、毎日更新を復活させないと。

で、シイラのバグフィックスで、認証関係を調査中。シイラが「未知のルートです」とかいうダイアログを出して、接続できないやつ。あれはつまり、証明書(NSURLCredntial)の署名がまずいらしいんだけど。まずいというか、Web Kit が認識していない証明機関だから信用できないかも?ということみたい。とりあえず警告だけして、接続してしまえばいいんだよな。

接続するには、NSURLAuthenticationChallengeSender に continueWithoutCredentialForAuthenticationChallenge: を送ってやれば良い。このオブジェクトは NSURLConnection のデリゲートメソッドから取ればいいみたい。じゃ、NSURLConnection のデリゲートになるには、、、うん?どーすんだ?

NSURLConnection は Web Kit の内部で処理されてしまっているから、アプリケーションからは取れないんじゃないのか?でも Safari はたぶんやっているな。また隠しクラスか?調べてみると、WebBaseResourceHandleDelegate が NSURLConnection のデリゲートになっているようだ。こいつを取得するか継承するのか?Web Kit は、内部をハックしないとまともなブラウザが作れないなー。

November 22

シイラの新しいビルド出すぜっ!2 週間ぶりになってしまったか。Nightly build 041122。

  • 起動の高速化。
  • 新規ウィンドウ作成時に、前のサイドバーの状態を継承。
  • コンテキストメニューから「新規ウィンドウ」を選択したときの問題を修正。
  • 「タブを閉じる」と「ウィンドウを閉じる」が混同してしまう問題の修正。
  • URL コンボボックスを改良。

まず、起動の高速化。体感できるぐらい速くなったと思う。行った作業は、メインの nib ファイルを小さくして読み込み時間を短くしたのと、履歴やブックマークのメニューの作成を起動時からもう少しあとにずらした。こうやって処理を分散させることで、時間が一部に集中しないようになり、ストレスが少なくなっていく。高速化は地道な作業の積み重ねだ。

次は、新規ウィンドウのサイドバー。新しいウィンドウを開くときや起動したときに、サイドバーを開くべきかどうか?仕様を変更してみた。常に、直前の動作を継承することにしてみた。まず、サイドバーを開いてから新規ウィンドウを作ると、自動的にサイドバーが開く。そのサイドバーを閉じてからもう一枚ウィンドウを作ると、サイドバーは開かない。選択されるタブは、前のウィンドウと同じものだ。いったん終了して起動した場合は、最後の動作を継承することになる。

あとはいくつかバグフィックスを。「タブを閉じる」と「ウィンドウを閉じる」の問題は、Cmd + w が状況によってタブを閉じるだったり、ウィンドウを閉じるに割り当てられたりするんだけど、ときどきおかしくなっていたのでそれを修正。

November 19

昨日の続き。思い立って、AspectCocoa を使ってみた。まずロギング機能から。アスペクトのロギング機能とは、メソッドの実行前と実行後にログを出す機能。これを、既存のコードを修正することなく行える。

まず、AspectCocoa のページに行って、AspectCocoa.framework をダウンロードしてくる。そして、それをプロジェクトに加える。

アスペクトによるロギングを利用するには、どこでロギングを行うかを示すジョインポイント、実際のロギングを行うアドバイスオブジェクト、それらを利用してアスペクトを行うアスペクトオブジェクトが必要となるようだ。それぞれ、ACPointCut、ACLoggingAdivce、ACAspect というクラスで実現される。これらを使って、main あたりで設定をしてやればいい。

たとえば、NSView の initWithFrame: をロギングしようと思ったら、次のようになる。

main.m
#import <Cocoa/Cocoa.h>
#import <AspectCocoa/AspectCocoa.h>

int main(int argc, char *argv[])
{
    NSAutoreleasePool*  pool;
    pool = [[NSAutoreleasePool alloc] init];
    
    // Create join points
    NSArray*    classes;
    NSArray*    methods;
    ACPointCut* pointCut;
    classes = [NSArray arrayWithObject:@"NSView"];
    methods = [NSArray arrayWithObject:@"initWithFrame:"];
    pointCut = [ACPointCut pointCutForClasses:classes 
            andMethods:methods];
    
    // Create logging advice object
    ACLoggingAdvice*    loggingAdvice;
    loggingAdvice = [[[ACLoggingAdvice alloc] init] autorelease];
    
    // Create and load aspect object
    ACAspect*   aspect;
    aspect = [ACAspect aspectWithPointCut:pointCut 
            andAdviceObject:loggingAdvice];
    [aspect load];
    
    int     result;
    result = NSApplicationMain(argc, (const char**)argv);
    
    [pool release];
    return result;
}

まず、クラスの名前とメソッドの名前を NSString で指定する ACPointCut オブジェクトを作る。これでロギングの位置が決定する。そして、ロギングを行う ACLoggingAdvice オブジェクトを作り、アスペクトである ACAspect オブジェクトをロードしてやる。これだけでオッケー。

実行結果は、次のような感じだ。

(log)
before initWithFrame: on NSThemeFrame
after initWithFrame: on NSThemeFrame
before initWithFrame: on _NSThemeCloseWidget
after initWithFrame: on _NSThemeCloseWidget
before initWithFrame: on _NSThemeWidget
after initWithFrame: on _NSThemeWidget
before initWithFrame: on _NSThemeWidget
after initWithFrame: on _NSThemeWidget
before initWithFrame: on NSView
after initWithFrame: on NSView
...

アプリケーション起動後の、すべての NSView を継承したらクラスの初期化の様子が分かる。なるほどー。これがアスペクト指向ってやつですかい。

ACPointCut に指定する、クラスやメソッドを変更すれば、もっといろいろなログが取れる。デバッグや Cocoa のクラスの構造解析に力を発揮しそうだ。

November 18

kimuraw の日記さん経由で、AspectCocoa: AOP for Objective-C を見た。

最近、アスペクト指向、って言葉を見かけるようになったけど、正直に言って、あんまりよく知らない。なんか、アスペクト指向を実現するには、ある関数を実行するその前と後に、特定の関数を呼び出すことができる必要がある、って理解であってる?非常に的を得てない感のする文章だ。

で、そんなアスペクト指向を、Cocoa + Objective-C で実現するにはどうしたらいいか?ってのが、上のリンクにあるペーパーだ。要は、既存の Cocoa のメソッドを呼ぶ前後に、所定のメソッドが呼ばれればいいらしい。そのためには、メソッドの置き換えが必要になる。

Objective-C は動的結合だし、C を使ってランタイムもがしがしいじれるので、その辺は簡単にできる。このペーパーでは、4 つの方法を紹介し、そのうちの 3 つを検証している。

1 つ目は、メソッドの IMP を置き換える方法。IMP ってのはメソッドの実装で、平たい話が C スタイルの関数ポインタだ。これを置き換えることで、メソッドの実体をすげかえることができる。この手法を method swizzling と呼ぶらしい。知らんかった。

2 つ目は、転送を使う方法。forwardInvocation:methodSignatureForSelector: をオーバーライドしてやって、特定のメソッドをヘルパークラスの方に投げてやる。これですげかえができる。

3 つ目は、class_poseAsclass_poseAsを使えば、自動的にクラスを置き換えることになる。これでもできるが、動的にスイッチできないのが、致命的。

4 つ目は、mach_override を使う方法。これは、Mach 上で動的に C 関数をオーバーライドするもの。ここまでやれば、そりゃ問題ないというか、何でもできるんだけど、Objective-C でのアスペクト指向ではここまでいらんでしょう。

ということで、始めの 3 つの実装とパフォーマンスの比較を行っている。結論から言うと、1 つ目がよろしいんではないかということだ。そしてそれを用いて、AspectCocoa の実装を行ったらしい。ただ個人的には、そこにはあまり興味が無いので、実際に動かしてはいない。

ということで、アスペクト指向に興味がある人にはとても実りある、または Cocoa をハックする方法を探している人にもヒントがある、というペーパーでした。

そういえば、もう数ヶ月前になるけど、アップルが Objective-C プログラミング言語の日本語版を公開していた。ほんと、やっとでたのかい!といった印象だった。

このドキュメント、入門用ではぜんぜんない。Objective-C のディープなドキュメントだ。言語仕様からランタイム関数の解説まである。Objective-C プログラミングに慣れた来た方は、ぜひ一読を。面白くて目からうろこがぼろぼろ落ちるよ。

November 15

週末の金、土曜日と、MOSA 湘南ミーティングに参加してきました。参加された皆さん、お疲れさまでした。声かけて下さった方々、ありがとうございました。楽しかったっす。

で、そこで Web Kit とシイラの講演をしてきました。Web Kit の方は簡単なプログラミング入門。シイラの方は、プロジェクトの現状と、将来について。シイラは最後はほとんど放談で、言いたいこといってやって、すっきりしたぜ!てな感じでした。

講演で使ったスライドをこちらに置いておくので、興味のある方はどうぞ。内容に関する質問、コメントなどは、メールでも掲示板でもコメント欄でも、どこでも構わないので、お待ちしてます。ただ、内容に関して一言だけ。シイラの将来に関しては、無保証です。なんの保証も無く、言いたい放題です。でもやる気だけはあるので。

MOSA での講演:
「Web Kit プログラミング解説と、その実例としてのシイラプロジェクト紹介」

ShiiraAtMOSA.key.zip(Keynote 形式)
ShiiraAtMOSA.pdf

November 8

シイラ Nightly build 041108。

  • 起動時にホームページが開かない問題の修正。
  • 検索エンジンメニューの階層化。

1 つ目は、新規ウィンドウ作成時にホームページを開くにしておくと起きる問題のバグの修正。2 つ目は、検索エンジンメニューで、階層化対応。検索エンジンの登録ウィンドウで、フォルダや区切り線を追加できるようにした。ファビコンも表示するようにしたけど、まだ問題があるので調整中。

階層化に対応するために NSOutlineView を使ったので、Cocoa バインディングが使えなくなってしまった。手で全部実装し直しました。しくしく。

November 5

Apple が Tiger のテクノロジー・プレビューとして、Spotlight に関する情報を公開している。掲示板で教えてくれた poo さん、Thanks。

今年の WWDC で、Jobs がいちばん力を入れてデモをしていた Spotlight だけど、ただの検索じゃないの?という疑問もあったと思う。公開された文書から、技術的な背景を知ることができる。

Spotlight の肝はメタデータ。ファイルの中身だけではなくて、メタデータを利用した検索ができるのが Spotlight だ。メタデータとは何か、と問われれば、iTunes にとても良い例を見ることができる。iTunes では、MP3 や AAC といった音楽ファイルを、アルバム名やアーティストといったそのファイルを表す情報を使って管理、検索しているでしょ。これがメタデータだ。

メタデータ検索のために Tiger では、メタデータをためておく場所である Spotlight Store と、そのデータにアクセスするための Meta data API が提供されるんだ。

Spotlight Store は、メタデータのためのデータベースだ。存在するすべてのファイルのメタデータをためこんでおく。このデータベースに対してクエリーを投げることで、ファイルの迅速な検索が可能になる。

Spotlight Store のメタデータの操作を行うのが Meta data API だ。C 言語ベースの低レベル API と、Cocoa に統合された高レベル API が提供されるようだ。ちなみに、低レベル API は接頭子 MD を持つみたい。Meta data API には、想像通りデータベースへのクエリーを作成するものがある。それに加えて、標準的なファイルフォーマットからメタデータを抽出する、メタデータインポータがある。これにより、JPEG や TIFF といった画像ファイル、MP3 などの音楽ファイル、さらに Word や Excel ファイル、PDF ファイルなどは、デフォルトでメタデータが Spotlight Store に追加される。このメタデータ抽出ソフトウェアが、Spotlight の要だ。これにより、アプリケーションベンダの対応を待たずに、ユーザは Spotlight の機能を使うことができる。またこのソフトはプラグインになっており、Apple 以外のデベロッパも作れるようだ。

さて、このような技術的背景をふまえて、Spotlight で何ができるか考えてみよう。まず、WWDC で Jobs がデモしたようなファイル検索システム。あれは Meta data API が公開されるので、Apple だけではなくて、普通のデベロッパも作ることができる。なるほど。でも、あんまり新味はないな。

こういうのはどうだ。たとえば HTML ファイルの編集をしていて、あるファイルへリンクを貼りたくなったとする。いままでだったら、オープンダイアログを開いて、ファイル階層をたどって、目的のファイルを指定する、っていう方法をとらなくてはいけなかった。ここに Spotlight を使うと、ファイルの名前や、ファイルの特徴、たとえば 16 x 16 の gif ファイル、を指定するだけで、目的のファイルを探すことができる。うーむ、地味だけど、少し便利になるかも。

さらにこういうのはどうだ。画像ブラウザを作ることを考える。いままでの画像ブラウザでは、始めに画像が入っているフォルダを指定していた。だが、Spotlight 対応画像ブラウザでは、起動するといきなりすべての画像ファイルを表示する。そのシステムにあるすべての画像だ。そこから、ファイルフォーマットや、デジカメ画像だったら撮影日時を指定して、目的の画像を絞り込んでいく。おぉ、これは新しいかも。使いやすいかどうかはちょっと不明だけど、ファイルブラウズへの新しいアプローチを提起できる可能性が見えてくる。

November 3

シイラのビルド出しまーす。疲れたっすー。Nightly build 041103 になります。

  • ターゲットを指定したリンクを開く際の問題を修正。

リンク先をタブで開く設定にしているときの問題を、いろいろと修正しました。これで、空白ページが開いてしまう問題がかなり解消されたと思うんだけど、どうでしょう。

November 1

久しぶりにシイラのビルドを出そうと、作業をしていた。またバグも一つ潰したし、さぁて出そうかなー、と dmg イメージを作ったら、致命的な問題を発見。これでは出せないー。明日に延期。しくしく。


[Home] [Download] [Archives] [BBS] [Cocoa Programming Tips 1001] [Core Foundation の秘密] [Safari Developer Center] [はじめてのブラウザのつくり方] [Sketch BP] [スクリーンセイバーを作ろう] [Objective-C 最適化] [Authorization API 完全理解] [Mac OS X Programming Books Review] [オブジェクト指向の言語比較論] [panther-dev]

mailto: mkino@xd5.so-net.ne.jp