« 2006年8月 | トップページ | 2006年10月 »

2006.09.29

ようするに fontconfig だったのか

と今ごろ気づく。Rabbit の Mac 用ドキュメント でフォントの利用に関する設定を書きながら、「X もずいぶん、フォントの設定方法変わったなー」と思っていたのだ。

というわけで、fontconfig のドキュメントを読んだ。あと、書体関係 Wiki - X でのフォント設定も。

~/.fonts.conf に Rabbit用の英数と日本語の組合せフォントを設定してみた。ヒラギノ角ゴシックあたりがプレゼンテーションではスタンダードだと思うのだけど、アルファベットのグリフがちょっと気に入らないので。

 <?xml version="1.0"?>
 <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
 <!-- /etc/fonts/fonts.conf file to configure system font access -->
 <fontconfig>
 <!-- <dir>/Users/kimuraw/Library/Fonts</dir> -->
 <alias>
   <family>rabbit</family>
   <prefer>
     <family>Verdana</family>
     <family>Hiragino Kaku Gothic Pro W6</family>
   </prefer>
 </alias>
 <alias>
   <family>rabbit headline</family>
   <prefer>
     <family>Stone Sans Sem ITC TT</family>
     <family>Hiragino Kaku Gothic Std</family>
   </prefer>
 </alias>
 </fontconfig>

|

2006.09.27

最近の RubyCocoa

自分は週末にちょこっとした作業しているくらいなのだけど、Laurent が新しいapple-unstable ブランチにものすごい勢いでコミットしている。svk pull するたびにリビジョンが 3つくらい上がってる気がする。

ChangeLog だけ見た感じでは、BridgeSupport のあたりに手を入れているようだけど、まだ libffi まわりもコード見てないしなあ。テストコードはしっかり用意しているみたいだから、そこからアプローチしたほうが早く理解できるかも。

|

2006.09.25

Vi Input Manager の実装を見てみよう

MYCOM の vi GeekなOS Xユーザに! Cocoaアプリで"vi風"キーバインド で紹介されていた Vi Input Manager のコードを見てみた。

見る前に実装を想像。

  • NSTextView をポージングで差し替え
  • コマンドモードと入力モードを保持する状態値を追加
  • プロトコル NSTextInput をオーバーライドして、NSResponder のアクションを利用してコマンドモードの動作を実装

てなとこだろうか。ポージングだとインスタンス変数を追加できないので、モードの状態をどこに保存するかってのが興味あるところ。

というわけで拝見。

って vi モードで入力するのって NSTextView 上じゃなくて別ウインドウじゃん!ちゃんと記事読んでなかった。

知らなかったけど、DefaultKeyBinding.dict って勝手にアクション名追加してもいいんだね。なんとなく NSResponder で宣言されてるアクションのみが有効だと思ってた。覚えておくといつか役に立つやもしれん。

(2006/09/26 追記:お試しで EditCast 用に "editWithTextEditor:" アクションを追加してみた。いい感じ)

|

自宅 PowerBook のバッテリまわりがどうもヤバイようだ

春ごろから「なんかおかしいなー」とは思っていたのだが、やっぱりだめっぽい。

症状

  • バッテリ単体では稼働しない
  • メニューバーはずうっと「計算中…」のまま
  • ケーブルは充電を示す橙色、だけど充電はしていない(システムプロファイラでも、充電中「いいえ」)

2つあるうちのバッテリのひとつだけ充電がすごく遅い(フルまで1週間とか)ものの、どうにか動いていたのだが、ソイツが交換プログラムの対象になってしまった。新しく来たバッテリはアウト。

状況から見て本体側の問題みたいだから、入院させるのがベストだとは思うのだけど、来月の MOSA の準備はまだ終わってないしなあ。

|

2006.09.23

RubyCocoa 今日のコミット

  • svn trunk からインストールすると、アプリケーションのプロジェクトテンプレートが表示されない問題を修正

pre-config.rb での .in ファイルの展開が正しく行われないのが問題。だってさ、生成する前に

 Dir.glob('template/ProjectBuilder/Application/**/*.pbxproj')

とかしたって、ファイルないに決まってるじゃん。svn update してた & ruby install.rb clean で削除されないので気づかなかった。

とりあえず動くように修正した(diff)。

|

第20回 Cocoa勉強会 見学者締め切り

会場の最大収容数に参加者が達した(てか超えてた)ため、見学者の受付は締め切らせていただきます。あしからず。

|

2006.09.21

MOSA 湘南ミーティング (10/20-21) に参加

セッションの予定 に名前が出ているとおり、MOSA 湘南ミーティングの Cocoa勉強会出張所のセッション担当で参加することになりました。

おおむねいつものノリで LinkBack を紹介する予定。お題をなににするか悩んだのだけど、LinkBack は対応アプリが増えてなんぼ技術なので、このイベントのように開発者が集まる場所で紹介することに意味があると思うのだ。

|

2006.09.19

サヨウナラ ns_import

[rubycocoa-devel:385] の件。

ちょっと前にふじもとさんから聞いた、lazy import による問題を修正。これがどんな問題かっていうと、

  • 現在の svn trunk (apple-unstable のマージ後) では、OSX::NSFoo とすると、const_missing を経由して、自動的に Cocoa のクラスが定義される(一種の autoload)
  • じゃあ、OSX.ns_import いらねーじゃん! -> そうでもない

どういう状況で OSX.ns_import が必要なのかを説明しよう。

   module OSX
     class NSURL
       def some_method()
       end
     end
   end

このコードを書いた人は、きっとこんなことを考えるはずだ。

「これで OSX::NSURL クラスに some_method() という新しいメソッドを追加したぜ」

でも、そうじゃあない。ここでは OSX::NSURL という *新しい* Object のサブクラスが定義されて、そのクラスに some_method() というメソッドを定義しているだけだ。実際の Cocoa クラスの NSURL にメソッドを追加するには、class NSURL と宣言する以前に、OSX.ns_import :NSURL として名前空間に OSX::NSURL を呼び出しておかないといけない。

これじゃ、autoload の価値も半減(は言い過ぎかも)だよな。

というわけで強引に解消。ここでの作戦は、

  • OSX::NSFoo といったクラスが定義されたら、ns_import したものと差し替え

というもの。ここでは、Object.inherited() をオーバーライドすることで実現した。詳しくは、svn の diff 参照。Module#const_set() でクラスの定義をフックできれば、もうちょっと簡単に書けたんだけどねえ。

もう、なんつーか Ruby のメタプログラミングはいろいろできすぎてオソろしい。

|

2006.09.18

第20回 Cocoa 勉強会のお知らせ

9/30(土) に、Cocoa 勉強会 やります。

予定されている発表はこんなもの

  • アクティブアプリケーションの選択情報取得
  • NSTextViewをHTMLにする
  • IOKit入門
  • Growlプラグインの作り方
  • QuarzComposerをCocoaアプリから制御
  • Xgrid入門
  • CoreDataの限界に挑戦!〜最終回か?

ゲストに Jedit X などの アートマン21 の松本さん。

今回は立候補者多数のため、自分の発表は落選でした。予定されてる発表の中では、「CoreDataの限界に挑戦!」が楽しみ。あのチカラ技っぷりがすばらしい。見学希望のひとは、勉強会の質問フォーム から申し込みどうぞ。

|

RubyCocoa 今日のコミット

簡単なの 2件。

  • Xcode の「新規ファイル」で Ruby のファイルに .svn ディレクトリが表示されてしまう問題を修正
  • [rubycocoa-deve:375] をコミット(static libruby でも構築できるように)

|

svk patch って?

前から気にはなっていたのだけど、svk には patch というサブコマンドがある。ある程度の変更は、コミットする前にパッチ(diff)を ML に投げるって手順が多いので、このコマンドの機能が気になっていた。

まずは help。

 % svk patch help
 NAME
 
     patch - Manage patches
 
 SYNOPSIS
 
      patch --ls    [--list]
      patch --cat   [--view]       PATCHNAME
      patch --regen [--regenerate] PATCHNAME
      patch --up    [--update]     PATCHNAME
      patch --apply                PATCHNAME [DEPOTPATH | PATH] [-- MERGEOPTIONS]
      patch --rm    [--delete]     PATCHNAME
 
 OPTIONS
 
      --depot DEPOTNAME      : operate on a depot other than the default one

…って、パッチを作成する方法がないじゃん!なんだよ --regen って?

というわけで CPAN のドキュメント SVK::Command::Patch。ついでに SvkHelp - GCC Wiki。さらに svk patch - SVK Book

  • パッチの作成は svk push -P(--patch) PATCHNAME で作成
  • パッチは PATCHNAME で depot に保存される

ということがわかった。

GCC Wiki の例を見る限りでは、push -P でミラー先が更新されることはないようだけど、少し不安。RubyCocoa を修正するときに試してみるか、と思ったところ

 % svk sync -s HEAD //mirror/rubycocoa_sf/trunk
 RA layer request failed: REPORT request failed on '/svnroot/rubycocoa/!svn/bc/10
 87/trunk': REPORT of '/svnroot/rubycocoa/!svn/bc/1087/trunk': 200 OK (https://sv
 n.sourceforge.net)

というわけで、ローカルリポジトリ作れず。

(2007.02.12 追記)svk が利用している perl モジュールの問題のようです。コメントくれた人、ありがとうございます。

ついでに。10月に svk patch の動作まとめ たのでここに書いておく。

|

RubyCocoa の svn trunk でテンプレートが正しくインストールされない?(未解決)

ひ日誌の Cocoa-Rubyテンプレートが選べない について調査。

とりあえず、

  1. 自分の /Library/Application Support から RubyCocoa のテンプレートを削除
  2. Xcode を起動して、新規プロジェクトで RubyCocoa のアプリケーションが表示されないことを確認
  3. Xcode を終了
  4. RubyCocoa (svn trunk:r1078) をインストール
  5. Xcode を起動して、新規プロジェクトで RubyCocoa のアプリケーションが表示された(=>再現せず)

失敗。初期インストールのディスクつくらないとだめかなあ。

ついでに、ファイルテンプレートで .svn 以下のファイルも表示されてるのに気づいた。これはインストールから除外するようにしたほうがいいな。

(2006/09/26 追記 9/23 修正済み

|

2006.09.15

Rabbit の MacPorts によるインストールガイド

ようやく書いた。INSTALL.macosx-macports.ja (EUC テキストファイル)。MacPorts 1.3.2 のディスクイメージ版が見当たらないんだけど、どうなってるんだろ?

英語も書かなくちゃね。

|

2006.09.14

MacPorts では ruby 関連のモジュールのインストールに RubyGems が使える

Ruby-GetText-Package の新しいバージョンがリリースされたので、rabbit の Portfile を更新しようとした。で関連して調べものをしていたら、Rake の Portfile では gems を使ってインストールするようになっていることに気づいた。

 ruby.setup        rake 0.7.1 gem {} rubyforge:9498

こんな感じ。

gettext のほうは rabbit-0.4.2 だとうまく動かなかったので、更新は保留。(2006/09/14 追記 自分の環境で、LANG=ja_JP.eucJP にしてみていたのが原因。ゴメンナサイ)

|

2006.09.08

まわり道な方法で CoreData の属性の初期値を設定する

CoreData のモデルをコードから変更する 件の検証も兼ねて実験。

通常 CoreData で固定値以外の初期値を設定するには、NSManagedObject#awakeFromInsert を使うのが定石だ。ちなみに固定値は、NSAttributeDescription#defaultValue により設定されている。このへんは HMDT 3rd(赤) のChapter 7を読めば書いてある。

じゃあさ、NSAttributeDescription のサブクラスで defaultValue をオーバーライドしてやって、それをモデルが持つようにすればその defaultValue が呼ばれて好きな初期値が設定できるんじゃない?と考えた。ここで検証したいのは

  • NSAttributeDescription#defaultValue は毎回呼ばれるのか。NSManagedObjectContext にキャッシュされてればアウトだ。
  • コード上で本当に NSManagedObjectModel が変更できるか

の2点だな。

結論から先に言うと、両方とも問題なしだった。じゃ、今回の実験内容。

Objective-C だとめんどうなので、RubyCocoa でやった。

まずは、NSAttributeDescription のサブクラス

 class MyAttrDescription < OSX::NSAttributeDescription
   def defaultValue
     return OSX::NSDate.date
   end
 end

こんだけ。現在日時が初期値になるものだ。

次はドキュメント。これは NSPersistentDocument#managedObjectModel をオーバーライド。なんかぐだぐだだけど気にしない。

 class MyDocument < OSX::NSPersistentDocument
   # snip
   @@model = nil
     
   def managedObjectModel
     unless @@model
       @@model = super_managedObjectModel
       @@model.entities.each do |ent|
         # 元の属性の定義を削除
         attr_org = ent.attributesByName['createDate']
         props = ent.properties.mutableCopy
         props.removeObject(attr_org)
         # 新しい属性の定義を追加
         attr_new = MyAttrDescription.alloc.init
         attr_new.setName('createDate')
         attr_new.setAttributeType(OSX::NSDateAttributeType)
         props.addObject(attr_new)
 
         ent.setProperties(props)
       end
     end
     return @@model
   end
 
   # snip
 end

これで createDate という名前の属性は初期値が現在日時になる。今日の実験はこれまで。

|

2006.09.07

rabbit のリポジトリから graphics/cairo を削除

なんとなく確認してみたら MacPorts 公式が 1.2.4 になってたので、svn remove。

|

2006.09.05

テキストサービスにまつわるあれやこれや

ひ日誌のコンテキストメニューに項目追加したいに反応して調べてみた。選択した文字列についてのコンテキストメニューを追加する手段について。

まずは Cocoa 使いとして考えるのは、

  • これって NSTextView の機能なんだ(たぶん)からコイツを拡張してやればいいんだよな
  • NSTextView の menuForEvent: をポージングや AspectCocoa などの方法で拡張してやればいいよな

ということ。ちなみに EditCast の ECTTextView がポージングによる拡張を採用している。

でも、この手段には InputManager などの方法で拡張用のコードをロードさせる必要がある、というめんどくささ満点の欠点がある。そもそも OS の標準的な手法として、「/System/Library や /Library になんかバンドルを置いとけばいい」というようなものはないのか?と探索したものの頓挫。

で、コード側からのアプローチとして WebKit のソースコードを見てみると、すっごく地道に書いてある。コンテキストメニュー個別に実装かよ!Carbon 系の関数で一発、みたいのを期待していたのに。

というわけで、簡単に拡張する方法は見つからなかった。

ただ WebKit のコード見ていて NSPerformeService() 関数 を知ったのは収穫。これはプログラムからサービスメニューを呼び出すことのでき関数だ。サービスに渡すデータを NSPasteboard で用意しないといけないのがやや手間がかかるものの、活用次第ではいけそう。

サービスメニューはなあ、カスタマイズが弱いのが難点。試しにインストールしたアプリケーションなんかはいらないのだ。

|

« 2006年8月 | トップページ | 2006年10月 »