« June 2001 | Main | November 2001 »

G弾劾凰


えー、G弾劾凰、キッズステーションでの再放送見ました。本放送のときはところどころしか見てなかったんだけど。こりゃみんな怒るわ。最終回のひどいことったら。マジンガーZ最終回、あるいは「マジンガーZ対暗黒大将軍」のネタを持ってくるんだったら、主役メカの側の誇りを尊重する演出(「マジンガーZ、これを使え!!」)も持ってこなきゃ。「お前たちの出番はここまでだ」はないでしょう。結局これまでの話は、雑魚を片付け、敵の目をそらす囮の少年少女達が、使い捨てにされた悲しい物語ということになってしまった。しかも最終回後半の敵が馬場、猪木、ブッチャーじゃねえ。

グレートのメインパイロットは最初から謎の人物として「これキーマンね」って感じで出ていたのだが、けっきょく何の説明もなし。サングラス取ると目つき悪かったってとこだけが明かされた秘密かなあ。あ、ヒロインが「大切な人のために戦っている」と言った「大切な人」がこいつだったんだよね。もうそれだけでガッカリ。こいつについてったら苦労するって。まあ、グレートおよびこいつ自身の戦闘能力は異常だから、そばにいれば弾劾凰(仮)に乗ってるより安全かもしれんけど、こいつ他人の気持ちとか絶対考えないし。

ミア・アリスも、バンガーの情報と弾劾凰(&グレート)製造のノウハウを聞き出したらもういらないキャラだったわけだ。後生大事にかこって、忍者の末裔に発見させたりしてたけど、個々の作戦の役には立っていないようだし、最後まで寝っぱなし。クライマックスでミア・アリス覚醒!というシーンが欲しかったなあ。寝ているミアを見る限り昔の平野キャラのまんまなので、目をあけると影の濃い今のAICキャラと相性悪いのか?

| | Comments (0) | TrackBack (1)

Cocoa Tips : NSArray

配列の要素全部について何かをするとき、Cなら


for ( i=0; i < array_count ; i++ ){
if (array[i] == hogehoge ){
...
}
}

みたいにやるけど、NSArrayでこれをやるとすると

int max = [array count];
int i;
for ( i = 0; i< max; i++){
if( [[array objectAtIndex:i] isEqualTo:hogehoge]){
...
}
}

ってな感じで、あんまし効率が良くない。そういう場合のために、NSEnumeratorというクラスが用意されている。ちなみに、enumerateは「数え挙げる」「列挙する」という意味。発音はイニュマレイターでいいのかしらん?

NSEnumerator *enumerator = [array objectEnumerator];
id theObject;
while( theObject = [ enumerator nextObject] ){
...
}

ってな感じ。-nextObjectメソッドは順番に配列に格納されたオブジェクトを返す。nilが返ってきたら終わり。ちなみに、逆順にオブジェクトを調べたいときは、
[array reverseObjectEnumerator];
を使えばいい。
配列の中の、オブジェクトのインデックスを知りたい場合。
[array indexOfObject:theObject];
を使う。forループ組んで、objectAtIndex:にisEqualTo:を送っていると結構時間がかかるのでやめた方がいい。これでループ処理がかなり速くなる。注意点として、-indexOfObject は、オブジェクトが見つからなかった場合

enum {
NSNotFound = 0x7fffffff
};

を返すということ。これはMacOS Xのgccにおけるintで、正の値になっている。見つからなかったら負の値を返すものとまるで根拠なく思っていて、
if (result >=0){
	...
}
みたいな判断をしてはまった。ちゃんとドキュメント読めよ。

| | Comments (0) | TrackBack (0)

Interface Builderと文字コードとバックスラッシュ

天気: 晴れ
観測場所: 相模原

Cocoa アプリケーション全般に言えるのだが、バックスラッシュと円記号が一つの書類に同居するようになっている。キーボードメニューでことえりを有効にしていると円記号が、U.S.モードにしているとバックスラッシュが入力される。TextEditの場合これを欧米(MacOS Roman)形式で保存するとバックスラッシュの部分が0x5cとして保存され、円記号は0xb4になっている。日本語(Mac OS)形式で保存すると、バックスラッシュが0x80、円記号が0x5cになる。これは、もともと昔からのMacのフォント配列を反映した素直な変換だ。ちなみにUTF-8で保存すると、円記号は0xc2a5、バックスラッシュは0x5cである。
ところで、Cなどでプログラムを組む際。円記号やバックスラッシュがどういうコードで扱われるかは重要である。\nとかが気軽に使えないとなにかとやっかいだ。日本では歴史的にASCIIコードとJIS X 0201-1976 の前半をあまり区別しないで使っていた。そのため、0x5Cが日本では円記号として扱われ、C言語の入門書などでもこのコードを円記号として印刷しているものが多い。
Interface Builderの組み込みエディタでは、欧米(MacOS Roman)でも日本語(MacOS)でも、円記号とバックスラッシュをいっさい区別せず、0x5cとして保存するようだ。入力時は別々に表示されるが、一旦保存して開き直すと、すべてバックスラッシュになる。ただし、UTF-8ではコードが別々に保存される。この場合、円記号はエスケープ記号としての意味を失うので注意が必要だ。

とりあえず、エスケープ記号を入力したい場合、U.S.モードにしてバックスラッシュを入力するのが確実のようだ。

| | Comments (122) | TrackBack (43)

Cocoa VS Carbon

macosx-dev-jp-mlで話題に出てたけど、CocoaとCarbonの位置付け、Classic MacOSとの互換APIであるCarbon、NeXT由来のCocoa、位置付けとしては横並びで、好きな方使ってねって感じなんだけど、メニューのハイライトからなにから自分でやらなきゃ行けないCarbonと、巨大なアプリケーションフレームワークであるCocoaじゃあ月とスッポン、アセンブラとBASIC、新規のMacOS X用プロジェクトだったら、フレームワークと言語そのものを勉強してでもCocoa使った方が楽だと思う。Objective-Cは覚えにくい言語じゃないしね。
ただ、件のMLでも出ていたのだけど、Cocoaは良くも悪しくもUNIXの上にのっかっている。飯森さんが力説していたけど、パス名を使ってファイルアクセスするのはMacOS的には邪道中の邪道なんだよね。MacOSでは、ファイルの位置を指定するのにフルパスは極力使うなと言う事が昔から言われていた。実際、ファイルをアプリケーションから開くのに通常パスを意識する必要はない。設定ファイルを置いておくべき場所はOSに問い合わせて取得するし、開いたファイルの履歴をとっておく必要があればAliasレコードを作って保存する。Aliasは内部的にはファイル名、ファイルID、相対パス。親ディレクトリのID、ボリューム番号など、ファイルを指定するための情報をいくつも保存しておく仕組み。これがあれば、ターゲットのファイルが移動してしまっても追跡可能な、優れたシステムだ。まあ、MacOSはもともとPascalのためのAPIで構成されていて、文字列の長さが255bytesしかなく、そのうえファイル名が31bytesまで使えたので、フルパス主体にファイルマネージャを作ったら、すぐに限界を超えてしまうと言う問題もあったと思うけど。
さて、Cocoaではなにかとパス名を使う。NSStringクラスにはパス文字列を操作する便利なメソッドがてんこもりだ。確かにMacOSのノリだと気持ち悪いけど、便利だからつい使っちゃう。世の中Mac以外が90%で、それらがパス主体のファイル操作で困ってると言う話も聞かない。ならいいんじゃないか、と思うのだけど、意外な所に問題が潜んでいるのだった。
MacOS Xでの、パス文字列の長さは、最大1024bytesと決まっている。一方、HFS+ファイルシステムはUnicode文字で255文字までのファイル名を許している。ファイルシステム上ではUCS2かなにかで保存されており、原則的には一文字あたり2byteになっている。MacOS XのPOSIX APIではこのファイル名をUTF-8に変換して使っているようだ。UTF-8は欧米系の文字はほぼ1文字=1byteで表現されている。つまりファイル名は最大255byte程度と考えられる。限界までの長ーい名前を付けたフォルダを4つ入れ子にすれば、もう5階層以下は参照不能となってしまう。プログラムによってはバッファオーバーランでクラッシュするだろう。現実には、長い名前はあまりフォルダにはつけないと思うので、そうそう限界に達する事はないが、UTF-8で日本語などはだいたい文字あたり3byte以上になってしまうため、見た目以上にパス文字列にしたときのバイト長はのびている可能性がある。
飯森さんなどは、MacOS XのアプリケーションはFSRefを中心につかえと言う忠告をしている。確かにCarbon呼び出しをラップしてうまくカテゴリなどでクラスを拡張してやるやり方を取れば、さほど苦労しなくてもいけるかもと思うけど、それはそれでなんか納得行かないものがあるのも確かだ。

そういえばApple的にはCocoaでのファイル特定にパスにかわってNSURLを使わせようとしているきらいがあるな。NSURLでの指定にはパス長は関係しないのだろうか。"file://localhome"を削って下位APIに渡しているだけだったら同じ事になっちゃうけど。

| | Comments (1) | TrackBack (0)

JPEG Comment.app

MacOS X Cocoaプログラムの悩み。
NSImageViewはイメージファイルのドロップを受け付けるのだけど、JPEGだけ受け付けるようにしたいと思い、サブクラス作ってメソッドをオーバーライドすることにした。


- (unsigned int) draggingEntered : (id<NSDraggingInfo>) sender;
{
NSPasteboard *pb = [ sender draggingPasteboard ];
NSArray *ar = [ pb propertyListForType : NSFilenamesPboardType ];
NSString *filePath = [ ar objectAtIndex : 0 ];
if ( [JCutility isJPEG:filePath] || [JCutility isDirectory:filePath] ) {
NSColor *col = [NSColor controlHighlightColor];
[self lockFocus];
[[col colorWithAlphaComponent:0.2]set];
NSRectFillUsingOperation([self visibleRect],NSCompositePlusDarker);
[self displayIfNeeded];
[self unlockFocus];
return( NSDragOperationGeneric );
}
return NO;
}.

(註)JCutilityは自前のクラス。クラスメソッドだけで構成されているので明示的にインスタンス作成しないで使っている。っつーか、単純にCの関数書けばいいじゃんか>俺。
問題は、NSImageViewの野郎、内部でイメージのドロップに対応してハイライト表示しているくせに、highlightメソッド持っていないって事だよなあ。自前でやろうと思っても、面取り長方形で、中がえぐれた影付きコントロールなもんだから、正確な形とれないとちょっと不格好になっちゃうじゃないか。しょうがないのでvisibleRect全体を暗めの色で半透明に塗りつぶす事にする。こういう場合controlHighlightColorでいいのか?それに、アルファを適当に調整しないと真っ黒になっちゃうので、0.2なんて勝手な数字をいれちゃったけど、これでいいのか?そもそもこういうやり方が間違い?NSButtonかNSCellを使うべきだったのかなあ。

| | Comments (9) | TrackBack (0)

ナジカ電撃作戦

ナジカ弾丸よりも美しく、愛よりも危険なナジカ電撃作戦。Aikaのスタッフによるパンツアニメ第二弾だね。
見せる見せる。これでもかとばかりにパンツが見えるアングルの連続。世界設定がAikaのまんまだけど、ひょっとしてそのうちAikaのキャラが出てきたりするのか知らん?
今回の作品では、常識を持たないヒューマリットのリラがキモだな。「こぼしたら拭く」と教わったからと、風呂から出て体拭かずぼたぼた垂れる液体を、裸のままオシリ振り振りふき掃除しながら進んでいく。よくあるアレをここまで露骨にやるか?って感じだ。こういう行き過ぎたお色気の演出が、まるで存在しないかのように淡々とお話が進む違和感も健在。暇があったらまた見よう。

| | Comments (2) | TrackBack (0)

バットマン・サブゼロ「凍り付いた愛」

天気: 晴れ
観測場所: 相模原

チャンネル:カートゥーン・ネットワーク
TVレギュラー版と違って3DCGを多用した作画も画面が暗いだけに無理がなくてなかなかGoodだし、ストーリーが泣かす。冒頭、心ない原潜の浮上(笑)で、北極に隠れていたミスター・フリーズの奥さんのカプセルが割れてしまう。フリーズの奥さんといえば、初登場以来ずーっとカプセルで眠りっぱなしだったから、あれが割れるとこっちも「大変です!!」(ガオレンジャーのナレーション)って感じになっちゃっうよね。カプセルの冷凍保存液を失った奥さんは二週間以内に臓器移植を受けないと助からない。で、彼女に臓器を提供できる特殊な血液型の持ち主がバットガールことバーバラ・ゴードンなわけだね。フリーズは知り合いの医師を買収してバーバラを誘拐し、ドナーにしようとする。
この作品はアクションシーンがとにかく見事。さらわれたバーバラを取り戻そうと追い掛けるロビンのバイクアクション、バーバラの立ち回り、そして爆発の中を駆け回るバットマン。もういいっちゅーのに「間に合わなかったら先に行け」とかいってフリーズを助けに戻るバットマン。
ラストは奥さんの手術が成功したというニュースを聞いて、ひとり涙するフリーズ。いけるぞ悲劇の男。

| | Comments (1) | TrackBack (0)

« June 2001 | Main | November 2001 »