Month of 1月, 2009

偽SDIスタイル

in

WindowsアプリにあるMDIというインタフェースは個人的には大嫌いなので(Accessの使いにくさっていったらない)できる限りSDIとして設計するようこころがけているのですが、いま、仕掛かり中のアプリケーションは政治的理由もあってMDIテンプレートから作成しています。まぁ、プログラマが社内の政治的問題を気にしているようではおしまいですが仕方がない。状況によっては簡単に機能要件がひっくり返ってしまうのでその場合どうしても新しいWindowを作らざるを得ず最初からこっそりMDIで作っておくが得策なんで...

まあ、それで必要があるまで偽SDIスタイルにしておくためのダミーコード。

BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
{
  // TODO: CREATESTRUCT cs を変更して、Window クラスまたはスタイルを変更します。
  if( !CMDIChildWnd::PreCreateWindow(cs) )
    return FALSE;
  
  // ----------------------------------------------------
  // とりあえず必要があるまでSDIスタイルにしておく
  // ----------------------------------------------------
  cs.style &= ~(WS_MAXIMIZEBOX|WS_MINIMIZEBOX|WS_SYSMENU);
  return TRUE;
}

最初は最大小化ボタンと閉じるボタンを外せば簡単にできると思っていたのですが、子ウィンドウが最大化されている状態では、最大化ボタンは「元に戻る」のチップスがでているとおり、disableになってくれませんでした。いろいろ試してWS_SYSMENUを追加することでうまくいきました。もちろん、偽SDIスタイルですから子ウィンドウは最大化しておく必要があります。

以上、つまらないチップスメモでした。まあ、見た目ができてりゃそれでいい人たちばっかりですから...

nkf-2.0.9リリース UTF-16の判定が....

実に久しぶりnkf-2.0.9にアップデートされました。このところNKFCocoaの開発をしていたこともあってちょくちょくチェックはしていたのですが、正直アップデートされるとは思っていなかったのでちょっとビツクリ。v2.0.8ではUTF-16がBOM付きのみの判定だったのでちょっと期待したのですがリリースノートを読む限りそのあたりは修正されていないようです。ど・こ・ろ・かむしろUTF-16の判定精度が...

ためしてみたところ、これまでできていたBOM付きのUTF-16もASCII判定に...さらに ISO-2022-jpも正しく認識されない場合があるみたいです。

uncrustify(jeditxでもやっぱり使うよね)

XCodeやvimから使うようになってuncrustifyは今や手放せないツールになっていますが、前回のエントリでも書いたようにJeditからはAppleScriptを使えば利用できそうなのでトライしてみました。

AppleScriptからuncrustifyを呼び出すのに問題になるのはAppleScriptでは標準入力に対応していないという点です。アップルのドキュメントにはEchoとかで対応できるよってことになっているんだけどソースコード中にシェルが勘違いするような文字列が含まれている可能性は多いにあり得るのでこれはパスしてファイルインタフェースで処理する方が堅そう。選択している文字列をテンポラリファイルに書き出してそいつをuncrustifyに食わせればいいだけです。

Jeditにはいくつかサンプルスクリプトが含まれているのでそいつを参考にしながら

コードリーディングのためのエディタ

in

OSX以降Jeditは使っていなかったのですが先日バージョンアップのDMが来て、なんか懐かしいなーなんて思ってHP覗いたら、Jedit4もまだバージョンアップ対象だったので思い切ってアップデートしちゃいました。僕は物書きではないのでエディタの用途は99%がコードを書くことにあるのですが、実際にはJeditに限らずSmultronなどGUI付きのエディタでコードを書くことはほとんどありません。

NKFCocoa.Framework公開します

愛用のエディタSmultronのエンコーディング自動判定に手を入れはじめてからずいぶん時間が経ちますが、年末にフト「nkf使えないかな?」って思い立ってNKFCocoaなるものを作成しました。名前どおりnkfのcocoaラッパーです。Cocoaの開発では日本語関連のメソッドは相変わらずの状況なので、まあ多少の役には立つかなと思います。ベースはnkf-2.0.8です。

Smultronの場合だったら、いままでごちゃごちゃやっていたところを

NSError* error = nil;
encoding = [textData guessByNKF:&error];
if (error != nil)
  {
    NSAlert *theAlert = [NSAlert alertWithError:error];
    [theAlert runModal];
    encoding = 0;
  }

程度に集約できてすっきり。APIの詳細は、ドキュメントを参照してください。

ひとつだけショックだったのはnkfではBOMなしUTF-16の自動判定には対応していなかったですね。まあ、それ以外は概ねやりたいことはできました。お悩みの方、バグ含みですがよかったらお試しください。

Cocoaのプログラミングスタイル

in

この2日間、Error Handling Programming Guide For Cocoaを読んでいるのですがちょっと耳の痛いことが書いてありました。

NSErrorは初期化してから使いましょう(なにをいまさら)

in

ライブラリのテストケースを書いているのですが、あるテストケースが必ずエラーになるので悩んでいたのですが昨日ようやく判明しました。ケースは渡したNSErrorがnilであること(テスト対象メソッドがエラーを戻さないこと)をテストしているんですが、なんのことはないNSErrorを初期化していなかったためでした。

どこで読んだのか(あるいは勘違いなのか)"Objective-Cでは変数は宣言した時点でnilで初期化される"みたいな思い込みがあって全然気がつきませんでした。気になってアップルのError Handling Programming Guide For Cocoaを読んでみたら、

XCodeでgdbコマンドを使うと意外と快適

in

XCodeのデバッガウィンドウではgdbのコマンドが使えますが(というかモロgdbプロンプトでてます)、大抵のことはXcodeのIDE内でコト足りていたのでこれまであまり使っていませんでした。それでこのお正月に、フト思い立ってデバッグコンソールを使ってみたら意外と快適でした。

単純なことなんですが、一度n(ext)タイプすれば、しばらくは[Enter]キートントンでステップ実行できるのが一番快適。やっぱマウスに手を伸ばすのはリズムが乱れるものだし、クリック位置を間違えたりすることが多くて最初からやり直したりなんてことがなくなります。デバッグ作業も、乗ってくる(?)とリズムが大事だから僕にとっては結構重要。あと、昨日まで知らなかったんですがpo(print-object)コマンドでオブジェクトをプリントすることもできますね。対象のオブジェクトが対応していればの話なんだけれどNS**は大抵対応しているみたいだし、IDE内でスクロールして欲しい値を探すなんてことは今日からはしないかも。

まぁ、なにより"gdbコマンドを使いこなしている感"がちょっと出て、ギークっぽい気分を味わえるところがいいですよ。