Month of 3月, 2009

Leran Objective-C on the Mac

in

久しぶり洋書(「Leran Objective-C on the Mac」)を購入。小説なんかと違い技術書ですから存外平易だし、僕程度の英語力でもなんとか読めるところがいいです。iPhoneの人気でCocoa関連の日本語書籍もぼちぼち出回り始めたようですが、まだまだ数は少なくこういった微妙な苦労(楽しみ)は続きますね。

で、この本これなかなか読みやすくて良いです。値段もそこそこ安いし。Objective-Cに関しては前々から勉強し直そうと思っていたので萩原本と併せていい教材になりそう。丁寧に読んでみようかと思っています。

この本、OOPについても記述があってこちらも結構面白い。

Programmers new to object-oriented programming often make the mistake of trying to use inheritance for everything,such as having Car inherit from Engine. (...)
A car is an Engine? Huh? So,use inheritance only when it's appropriate.

とか、茶目っ気たっぷり。

Learn Objective-C on the MAC (Learn Series) Learn Objective-C on the MAC (Learn Series)
Mark Dalrymple


Amazonで詳しく見る
by G-Tools

TigerのNSData:dataWithContentsOfURLは?

in

clippyのtiger版テストをしていて気がついたのだけれどTigerのNSData:dataWithContentsOfURLはちょっと問題がありそう。

NSData   *d = [NSData dataWithContentsOfURL:
  [NSURL URLWithString:@ "http://www.yahoo.co.jp/"]];
NSString *s1  = [[[NSString alloc] 
  initWithData:d encoding:NSUTF8StringEncoding] autorelease];
NSLog(@"s1:%@", s1);

と、次のコード


NSString *s2 = 
  [NSString stringWithContentsOfURL:
    [NSURL URLWithString:@ "http://www.yahoo.co.jp/"] 
    encoding:NSUTF8StringEncoding error:&error];
NSLog(@"s2:%@", s2);

は同じ結果になることを期待していたのですが、NSLog(@"s1:%@", s1);は(nil)となります。同じコードをLeopardで実行すると正しく動作します。ん〜、なんでだろ?

Tiger環境が自由に使えないため詳細を追い切れていません。というわけで、clippy for Tigerのaliasにhttp://〜を使うとうまくありません。(ローカルのfile:///〜はOK。ここがまたわからない...)

clippy v0.5リリースします

in

気になっていたバグが取れて、気をよくしたのでリクエストのあったエイリアス機能を実装してみました。長文を定型文として登録しようとすると確かにうるさい感じがするのでちょっといい感じ。

書式は、

alias:エイリアス:URL

です。先頭にalias:、続いてメニューに表示したい名称を最後の:以降はURLです。URL指定はプログラマじゃない人にはあまり馴染みがなくて申し訳ないのですが、例えば書類フォルダの場合

file:///Users/YoureAccount/Documents/sample.txt

のような形式です。file://を除けば、UNIX上のpathを指定する場合と同じです。ただし、フルパスで指定する必要があるので必然的に、file:///という形式になると思います。:で区切る旧来のマックの形式も考えたのですが、どちらもプログラマ以外のマックユーザには関係ないしどうせ馴染みがないんだったらということでこういう形式にしています。鋭い方はお気づきだと思いますがこの形式にしておくことで、

alias:Yahoo!:http://www.yahoo.co.jp/

なんてことも一応可能です。それが何の意味があるのかと言われると困るのですが、まあ世の中定型文をどこかにWebサーバに置いている人もいるかと....ただし、こういうことやると帯域の狭い方や対象サーバが重たい時などフリーズしたかのごとくなるのでご注意を。

指定したファイルが存在しなかったりして読み込みに失敗した場合は、alias以下がそのまま表示されます。また、あまりにも大きいファイルやテキスト以外のファイルを指定したりした場合は何が起こるかわかりません。\(^o^)/

もひとつ、細かい変更ですがメールアドレスを検知した場合はこれまで無条件にMail.appを起動していましたがv0.5からは先頭にmailto:が先頭にある場合のみMail.appを起動します。mailto:がなければ普通の文字列として自動ペーストの対象になります。後、v0.5からTigerにも対応しました。そのためScriptingBridgeの使用をやめ、すべてappScriptのお世話になることにしました。have fun!

ダウンロードはこちらから

原点に進め

in

clippyには、新しいメニュー項目を追加した時、セパレータが表示されず追加前にセパレータのあった位置のメニュー項目がグレー表示されるというなんだか書いていてもよくわからないようなバグがあって、ずっと以前から気づいてはいてチマチマと修正を試みていましたのですがようやく解決しました。

clippy アップデートしました

in

コメントを頂いたのでアップデートしました。考えてみればありがちなニーズですね。

対象に<と>を含めることができるようになりました。ダウンロードはこちらからお願いします。

XCodeの64Bit対応

SmultronへのNKFCocoaの組み込み時に発見した「?」な現象。

エンコーディングリストのポップアップを作成する処理で、

NSArray      *encodingsArray = [SMLBasic fetchAll:@ "EncodingSortKeyName"];
NSEnumerator *enumerator     = [encodingsArray objectEnumerator];
id            enc;
while ((enc = [enumerator nextObject]) != nil)
  {
    if ([[enc valueForKey : @ "active"] boolValue] == YES)
      {
        [popup addItemWithTitle :[enc valueForKey : @ "name"]];
        [[popup lastItem] setTag :
          [[enc valueForKey : @ "encoding"] unsignedIntegerValue]];
      }
  }

というコードがあるんですが、このうちポップアップにsetTagするときに最初は、

strncpy_s()への修正で考えさせられた件

vs2005からCRTセキュリティ強化ということで*_s()系の関数が導入されています。でもこれ、よく考えないで修正すると痛い目にあいそう。僕の場合、既存の次のようなコードで躓きました。

typedef struct _dest { char x[3]; char y[5]; char z[5] } dest;

ような構造体にデータを読み込み、x,y,zのそれぞれを整数に変換する下記のような処理があったのですが、