Tags : dev

このTagsの登録数:34件 表示 : 1 - 6 / 34

Xcode の API リファレンスを見やすくする

post : 2006-05-15 11:12 | , ,

Cocoaプログラミング必須アプリ、Cocoa Browser SNの新バージョン(2.4)が出ていた。このアプリケーション、NSDocumentを使っているのに新規にウインドウを作る方法が見当たらない。が、nibを編集するだけで複数ウインドウに対応できる。Interface BuilderでMainMenu.nibを開き、メニュー項目を作ってFirst ResponderのnewDocument:に繋ぐだけ。何か不具合があるからシングルウインドウにしているのかもしれないけれど、特に問題なさそうである。ついでにウインドウをUnified lookにしてみた。新機能のAPI検索は使いにくいな。

さて本題。XcodeにもAPIリファレンスは付いているのだが、Cocoa Browserのようにメソッドごとに切り取らず、クラスごとのHTMLをそのまま表示するため、視認性が良くない。WebKitで実装されているので、UserStyleSheetで見やすくしようという試み。以下のようなcssを書いた。

div.mach4 {  /* method name Xcode 2.2 ならこっち*/
h3.tight {  /* method name Xcode 2.3 ならこっち */ 
    margin:64px -8px 0px -8px !important;
    padding:6px !important;
    font-size: 14px !important;
    font-family: "Bitstream Vera Sans Mono", courier, monospace !important;
    border-top:1px solid #d6ddee !important;
    border-bottom:1px solid #d6ddee !important;
    background:#f0f5f9 !important;
    color:#333333 !important;
}

code {
font-size: 12px !important;
font-family: "Bitstream Vera Sans Mono", courier, monospace !important;
}

Cocoa APIのHTMLは構造が酷く、カスタマイズできる箇所は限られる。辛うじてメソッド名が<div class="mach4">で囲ってあるのでここを攻める。左右marginをマイナス値にすることで、背景色が端まで塗られるようにする。margin-topを多めにとって視認性を向上。これを適当な場所に保存して、Terminalで以下を実行。

defaults write com.apple.Xcode DVDocView.WebKitUserStyleSheetLocationPreferenceKey "/path/to/custom.css"

で、上記のCSSを適用するとこうなる。いい感じになりました。

Xcode API reference

キーボードショートカットを設定する新しい方法

post : 2006-04-30 11:37 | , ,

キーボードショートカットのカスタマイズは、環境設定ウインドウなどで行う方法が一般的。アサイン可能な機能の一覧があってショートカットを付けたい機能を選びキーをタイプする。機能→キーという遷移だ。これを逆にキーから機能を割り当てるように出来たらどうか。
未設定のキーを押した時に、そのキーで何を実行するか決めることができたらどうだろうか。機能一覧ダイアログ(もしくはフローティングパレット)が出て来て実行したい機能をその場で選ぶ。「常にこの機能を実行する」というチェックボックスを付ければ、以降そのキーの機能は固定される。機能一覧にチェックボックスを付け、「このキーボードショートカットではチェックした機能のみ表示」的なボタンを付ければ、ひとつのキーに複数の機能を関連付けられる。「選択範囲をHTMLタグで囲むのはcmd+opt+Tにまとめていたっけな」程度の記憶で把握できるようになる。

というようなことをジェフ・ラスキン著 ヒューメイン・インタフェースを読みながら思った。

Hyper EstraierをIntel Macでビルド

post : 2006-04-30 0:53 | , ,

Hyper Estraier 1.2.3がIntel Macでうまく動かない問題。
ビルド自体はできるのだが、正常に動作しない。make check-macをテストすると途中でエラーになる。実際に使ってみてもインデックスは作成されるが検索がまったくヒットしないという状態。QDBM 1.8.49のmake check-macも失敗しているのでまずはこちらから。

調べていくうち、cabin.cのcbsetvnumbuf()という関数に辿り着いた。これは数値をバッファに書き込む関数で、1バイト〜可変長に対応。数が大きい場合は128で割って、負の数値にしてまだ続きがあることを示しつつ書き込んでいる。書き込まれたバッファをダンプして見てみると、負の数値にするべきところがなっていなかった。
・Mac固有の問題を引き起こしそうなコードではない
・エンディアンの問題でもない
・ソースコードの書き方に問題はなさそうだし、あればとっくに解決されているはず
などをふまえて、「Mac OS Tiger Intelのgcc 4.0.1でこのソースコードをビルドすると、(プリプロセッサのバグだとか解釈だとかそんな理由で)意図した通りの実行コードを書き出せていないのではないか」というのが私の結論。まずはコンパイラオプションを確認するべきかとは思うがよく分からない。ソースコードの表現を変えてビルドしてみた。

static int cbsetvnumbuf(char *buf, int num){
  div_t d;
  int len;
  assert(buf && num >= 0);
  if(num == 0){
    ((signed char *)buf)[0] = 0;
    return 1;
  }
  len = 0;
  while(num > 0){
    d = div(num, 128);
    num = d.quot;
-    ((signed char *)buf)[len] = d.rem;
-    if(num > 0) ((signed char *)buf)[len] = -(((signed char *)buf)[len]) - 1; 
+    signed char fill;
+    if(num > 0){
+        fill= -(d.rem) - 1;
+    }else{
+        fill=d.rem;
+    }
+    ((signed char *)buf)[len] = fill;
    len++;
  }
  return len;
}

villa.cにもvlsetvnumbuf()という似たような関数があったのでこちらも表現を変える。これでmake check-mac完全クリア。Hyper Estraier側でもestraier.cのest_set_vnumbuf()が同じ処理をしているので編集。これでいちおう使えるようになった。なんでオリジナルのコードでは上手く行かないのかは分からないままだけど。これでもまだHyper Estraierのmake check-macの途中でこけるので完全ではないが……。

んで、使ってみた感想は、速いに尽きる。メモリをけっこう喰ってるぽいものの、内容検索に絞ればSpotlightは敵じゃない。mdimporterでブリッジしてテキストを流し込んだりしてみようかな。

SQL 逆引きパターンマッチ

post : 2006-02-04 13:57 | , ,

データベースの中にパターンマッチ用の文字列を入れておいて、任意の文字列がそのパターンにマッチするかどうかを調べることは可能だろうか。うまい検索語が思い浮かばず、そういうことが記されたwebサイトを見つけることができなかったけれど、実際に試してみた。式の左辺と右辺を入れ替えるという単純な方法だ。

まずはMySQLで試す。以下のようなTABLEを作る。

CREATE TABLE `test` (`name` varchar(32)) TYPE=MyISAM;
INSERT INTO `test` (`name`) VALUES ('%demo%'),('^a'),('abc|cde'),('____');

そしてクエリを投げてみる。

SQL文: SELECT * FROM `test` WHERE 'search_demo_string' LIKE `name`;
結果: %demo%

SQL文: SELECT * FROM `test` WHERE '1234' LIKE `name`;
結果: ____

SQL文: SELECT * FROM `test` WHERE 'abc' REGEXP `name`;
結果: ^a, abc|cde

と、どれも期待通りの結果が返ってきた。

次は(本命の)Core Data。

[obj setValue:@"http://www.apple.com/.*" forKey:@"name"];

とか作って

[NSPredicate predicateWithFormat:@"'http://www.apple.com/itunes/' matches name"];

などとしてNSPredicateを作り、fetchしてみるとちゃんと結果が返ってきた!

WebView _loadBackForwardListFromOtherView:

post : 2005-11-26 4:49 | , ,

そろそろ例の機能を付けねばと思っていたんだけれど、すごい隠しメソッドを見つけてしまった。WebView の
- (void)_loadBackForwardListFromOtherView:(WebView *)otherView;
である。何をするものなのかは WebKit のソースを見ると一目瞭然。他の WebView から backForwardList を取ってきて自分にコピー、更に表示中のページも復元する。しばらく前からごちゃごちゃと考えていたことがこれでほぼ片付いてしまう。

WebKit アプリケーションでフォームの移動先を表示

post : 2005-11-24 19:21 | , ,

input type="image" の送信ボタンを a タグで囲むとリンク先を偽装できる脆弱性があるらしい。
Secunia - Advisories - Safari Image Control Status Bar Spoofing Weakness
スラッシュドット ジャパン | Webkitにリンク先偽装が可能な問題

これとは関係なしにフォームの移動先をステータスバーに表示させたいとは思っていたので SafariStand 2.0b11 に実装した。DOMElement 系のクラスは Tiger ならば使える。Panther でも 10.3.9 にして Safari1.3 を入れていれば使えると思われる。ヘッダファイルが無い気がするが、Safari1.3 の WebCore を class-dump すると含まれていた。しかし下記のコードでちゃんと動くかは未確認。

//WebUIDelegate
- (void)webView:(WebView *)sender
 mouseDidMoveOverElement:(NSDictionary *)elementInformation
 modifierFlags:(unsigned int)modifierFlags
{
    DOMHTMLInputElement* inputElement=[elements objectForKey:WebElementDOMNodeKey];
    if(inputElement && [inputElement isKindOfClass:[DOMHTMLInputElement class]]){
        NSString* type=[inputElement type];
        if([type isEqualToString:@"submit"]||[type isEqualToString:@"image"]){
            WebFrame* frame=[elements objectForKey:WebElementFrameKey];
            NSURL* currentURL=[[[frame dataSource]response]URL];
            DOMHTMLFormElement* formElement=[inputElement form];
            NSString* action=[formElement action];
            NSURL* formURL=[NSURL URLWithString:action relativeToURL:currentURL];
            //WebElementLinkURLKey と同じように扱える NSURL をゲット。あとはお好きに。
            NSString* methodStr=[formElement method];
            ...
        }
    }else{
        //通常のコード
    }
}

マウスオーバーの通知が来たら、form を送信する element かどうかをチェックして、該当すれば element の親 form からリンク先を取得。現在の URL とからめて最終的な URL を算出している。
SafariStand では窮屈なハックにならざるを得ないので、単純な表示しかできていないが、自作アプリケーションならいろいろな情報を付加できる。例えば DOMHTMLFormElement の - (NSString *)method; を使えば get か post かを判別できる。
それから、onSubmit などで JavaScript を使っていろいろ行うフォームに関しては、正しい移動先を表示できているのか不明。この機能が付いたからといって注意は怠るな、ということです、はい。