« 2007年12月 | トップページ | 2008年2月 »

2008.01.31

第27回 Cocoa勉強会 (2/16)のお知らせ

2/16(土)に行われる、Cocoa勉強会のお知らせ。見学の申し込みは勉強会のメールフォームからどうぞ。会場はいつもの初台に戻りました。ちなみに関西のほうの次回は、2/23(土)に大阪で開催の予定だそうです。

概要

  • 日時:2008年2月16日(土)13:00〜(終了は17:30くらい)
  • 会場:東京 初台 オペラシティ アップルトレーニングルーム
  • 予定されている発表(随時更新:2008.01.30 現在)
    • CGS系プライベート関数
    • Quick Lookプラグインの作り方
    • 新HID Manager
    • PDF Kit - Leopard

|

2008.01.29

MacPorts で port install ruby +universal が失敗する理由

rabbit-shockers で追求されたので記憶をたどりながら調べてみた。

MacPorts の +universal

TN2137 にあるように、CFLAGS と LDFLAGS に作成するアーキテクチャを -arch オプションで列挙していけばよい。これによって、それぞれのアーキテクチャをビルドして、lipo でファットバイナリ化するという手続きをコンパイラがやってくれる。

MacPorts では、configure && make && make install スタイルのソフトウェアには、あらかじめ universal バリアントが用意されている。universal バリアントを追加したときは、configure オプションが設定される。くわしくは、portconfigure.tclportmain.tcl を参照のこと。

universal ruby はどこで失敗するか

簡単に実験。ターゲットは素の ruby-1.8.6-p111

 % CFLAGS="-arch ppc -arch i386" LDFLAGS="-arch ppc -arch i386" \
 ./configure --enable-shared && make
   :
   :
 making ruby
 gcc -arch ppc -arch i386  -fno-common -pipe -fno-common  -DRUBY_EXPORT  -L. 
 -arch ppc -arch i386   main.o  -lruby -ldl -lobjc   -o ruby
 ld: warning in ./libruby.dylib, file is not of required architecture
 Undefined symbols for architecture ppc:
   "_ruby_options", referenced from:
       _main in main.o
   "_ruby_run", referenced from:
       _main in main.o
   "_ruby_init", referenced from:
       _main in main.o
   "_ruby_init_stack", referenced from:
       _main in main.o
 ld: symbol(s) not found for architecture ppc
 collect2: ld returned 1 exit status
 lipo: can't open input file: /var/folders/5T/5TkNBDNhGRyDkhxmhrRcOU+++TM/-T
 mp-//cca2jxgL.out (No such file or directory)
 make[1]: *** [ruby] Error 1
 make: *** [all] Error 2

となりました。libruby に ppc アーキテクチャのコードがないために ruby (コマンド)のビルドに失敗する。

原因は libruby.dylib のビルドに利用されるコンパイラフラグの LDSHARED に適切な値が設定されないため。

configure.in

 1055         darwin*)        : ${LDSHARED='cc -dynamic -bundle -undefined suppre     ss -flat_namespace'}

ちなみに --enable-shared しなければ、libruby.a および ruby はユニバーサルバイナリで正常にビルドできる。

じゃ Apple はどうしているのか

原因は LDSHARED にリンカオプションを渡せないことはわかった。じゃ、MacOSX に含まれる ruby ではどうしているのって話になるよな。

簡単なこと、configure を変更しているのだ patch-configure

ここでは、RC_CFLAGS という値を追加して LDSHARED および LIBRUBY_LDSHARED で利用するようになっている。この RC_CFLAGS が -arch オプションを含んでいる。RC_CFLAGS はMakefile(rubyソースの上階層のほう)

 22 include $(MAKEFILEPATH)/CoreOS/ReleaseControl/GNUSource.make

で、/Developer/Makefiles/CoreOS/ReleaseControl/Common.make

 48 RC_ARCHS   = $(shell for i in `file /usr/lib/libSystem.B.dylib | grep 'share    
    d library ' | sed 's|.*shared library ||'`; do $(CC) -arch $$i -E -x c /dev/
    null > /dev/null 2>&1 && echo $$i; done)

から来ているっぽいのだけど、RC_ARCHS -> RC_CFLAGS の経路が見つけられず。

(2008/1/30 追記:Tiger 10.4.11 についてもざっと確認。同じように RC_CFLAGS を追加している)

けつろん

LDSHARED をどうにかすれば、ユニバーサルバイナリの ruby を configure のオプションだけで作ることができるようになるはず。じゃ、どう解決するかがこれから考えるところ。

darwin のとき、LDFLAGS を追加するようにするだけでよいかなあ。

|

IdeoType Portfile 人柱版

ブックコンパイラ IdeoType の野良 Portfile を作ってみました。人柱募集中。

userguide.ja.pdf に書かれている依存パッケージでまだ不足しているもの(mendex, okumura-clsfiles などなど)もあるけれど、とりあえず手元では動いた。

(2008/06/22: リンク切れ直しました)

 % tar -xf ideotype-portfile-0.0.15.tar.gz
 textproc/
 textproc/ideotype/
 textproc/ideotype/files/
 textproc/ideotype/files/patch-Makefile
 textproc/ideotype/Portfile
 textproc/xhtml-math11-dtd/
 textproc/xhtml-math11-dtd/Portfile

中身についてちょっと説明

Makefile にちょっと手を入れた。変更点は以下のとおり

  • date, mkdir, cp のオプションを調整。Mac のこれらのコマンドは GNU coreutils じゃないので、Makefile のままだとうまくいかない
  • nkf --guess の出力で "UTF-8 (LF)" などのように、(LF) の改行文字部分がいらないので無視するように
  • PREFIX を指定できるように(${prefix} を渡す)
  • doc ターゲットの生成時の xsltproc のオプションに --novalid を追加

最後のは苦肉の策、ってーかあてずっぽう。

 % make doc
 xsltproc --nonet --nodtdattr lib/iecompat.xsl doc/customization.xhtml | xsltproc --nonet --nodtdattr --stringparam charset `nkf --guess doc/customization.xhtml | sed 's/(.*)//' ` lib/resetcharset.xsl - > doc/customization.html
 xsltproc --nonet --nodtdattr lib/iecompat.xsl doc/format.xhtml | xsltproc --nonet --nodtdattr --stringparam charset `nkf --guess doc/format.xhtml | sed 's/(.*)//' ` lib/resetcharset.xsl - > doc/format.html
 -:1: parser error : Content error in the external subset
 -force-conventional-resolution</code> option in <code>ideotype.rb</code>.</span>
 ^
 -:353: parser error : Opening and ending tag mismatch: code line 352 and p
 </p>
     ^
 -:396: parser error : Opening and ending tag mismatch: span line 352 and body
 </body>
 ^
 -:397: parser error : Opening and ending tag mismatch: li line 351 and html
 </html>
 ^
 -:398: parser error : Premature end of data in tag ul line 346
 
 ^
 -:398: parser error : Premature end of data in tag body line 14
 
 ^
 -:398: parser error : Premature end of data in tag html line 3
 
 ^
 unable to parse -
 make: *** [doc/format.html] Error 6

出力に xmllint かけたりしてもさっぱり。なにがマズイのだろう。

|

2008.01.27

Objective-C メソッド呼び出しほか、各種パフォーマンスの比較

Performance Comparisons of Common Operations, Leopard Edition という、Leopard 上での各種操作のパフォーマンスを調べた一覧がでてた。

Objective-C のメソッド呼び出しでは、IMP-cached message send > Objective-C message send > NSInvocation message send で高速という、順当な結果。RubyCocoa でもまだ一部使っている NSInvocation は、思っていたほどには遅くはないなあ。

調査に利用したコード を見てみると、Objective-C message send は 2回目以降の呼び出しがキャッシュされる(メソッドキャッシュをクリアしていない)はずだし、IMP-cached は IMP の関数ポインタを実行しているだけなので、ちょっと名前がまぎらわしい。

実行回数を減らして測定してみるとこんな感じ。結果の値は Time per (ns)。環境は MacBook2,1 MacOSX 10.5.1。

IterationsIMP-cached message sendObjective-C message send
10000000001.06.5
100000001.06.5
1000001.26.5
10001.46.7
1021.726.6

|

2008.01.26

ファイルをコピーするだけの Portfile は意外とめんどう

IdeoType がおもしろそうなので、作者の人のところ を参考にしながら野良 Portfile の作業中。

現行の元データとなる XHTML を処理するための DTD ファイルはローカルにおいておいたほうがよいらしいので、docbook-xml を参考に

  • インストール先は ${prefix}/share/xml/
  • カタログを ${prefix}/etc/xml/catalog に作成
    • システムに入ってる /usr/bin/xsltproc を使うなら、環境変数 XML_CATALOG_FILES の指定が必要
    • macports の xsltproc (port:libxslt に含まれる) を使うなら不要

としてみた。

おおざっぱに言って MacPorts でのソフトウェアインストールは

  1. fetch
  2. extract
  3. configure
  4. build
  5. destroot
  6. install
  7. activate

という流れになっているのだけど、今回はファイルをとってきて目的の場所に置くだけなので、

  • extract で展開せず、コピーだけする
  • configure でなにもしない
  • build でなにもしない

ということになる。

いま手元の svn に入ってるのは、こんな Portfile。extract をいじるところがムダに記述が多い気がする。もっとスマートに書けないものだろうか。

 % port cat xhtml-math11-dtd
 # $Id: $
 PortSystem		1.0
 
 name			xhtml-math11-dtd
 categories		textproc
 version			20010221
 description		A prototype extension of XHTML 1.1 incorporating MathML 2.0.
 
 maintainers     kimuraw
 
 set yyyy_vers [string range ${version} 0 3]
 master_sites	http://www.w3.org/TR/${yyyy_vers}/REC-MathML2-${version}/dtd
 distfiles		xhtml-math11-f.dtd
 dist_subdir		${name}-${version}
 
 checksums		md5 4ef2a51a44492ec4e29897384b4684dd \
 				rmd160 a6b5fcf50e43263efb5c219fc60e9f1b6068777d \
 				sha1 0139a871a902f533f991c39f106acdcfa8741ac5
 
 extract.mkdir		yes
 extract.cmd			cp
 extract.pre_args	{}
 extract.post_args	${worksrcpath}
 
 use_configure	no
 build			{}
 
 set xml_destdir ${prefix}/share/xml/xhtml/1.1
 
 destroot {
 	xinstall -d ${destroot}${xml_destdir}
 	xinstall -m 0644 ${worksrcpath}/${distfiles} ${destroot}${xml_destdir}
 }
 
 depends_run port:xmlcatmgr
 
 # copy from textproc/docbook-xml-4.5
 post-activate {
     set catalog.xml ${prefix}/etc/xml/catalog
     set dtd_file ${xml_destdir}/${distfiles}
 
     # Make the directory if it doesn't exist
     if {![file exists ${prefix}/etc/xml]} {
         xinstall -m 755 -d ${prefix}/etc/xml
     }
 
     # Create the catalog file if it doesn't exist
     if {![file exists ${catalog.xml}]} {
         system "xmlcatmgr create -c ${catalog.xml}"
     }
 
 	set xml.id "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN"
 
     # Add the uri entry to the catalog if it doesn't exist
     if {[catch {exec xmlcatmgr lookup ${xml.id}}]} {
 		ui_msg "add catalog ${dtd_file}"
         system "xmlcatmgr add public \'${xml.id}\' file://${dtd_file}"
     }
 
     # Once MacPorts does get a post-deactivate hook, this should change to
     # auto-detect whether or not the user's installed version has the hook, and
     # only print the message if it doesn't.
     ui_msg \
     "######################################################################"
     ui_msg "# As MacPorts does not currently have a post-deactivate hook,\
         \n# you will need to ensure that you manually remove the catalog\
         \n# entry for this port when you uninstall it.  To do so, run\
         \n# \"xmlcatmgr remove public \'${xml.id}\'\"."
     ui_msg \
     "######################################################################"
 }
 

|

2008.01.09

円とバックスラッシュのキー入力を入れかえる(Cocoaアプリ限定)

splhackの「不思議なこと1つ解決」を読んでいて思い出したのでメモ。

Mac の JIS キーボードでバックスラッシュを入力するには Option + ¥ キーなんだけど、プログラム書くような人には逆のほうがたぶん便利。Cocoa アプリケーション限定だけれど、~/Library/KeyBindings/DefaultKeyBinding.dict で設定ができる。

 {
   "¥" = ("insertText:", "\\");
   "〜¥" = ("insertText:", "¥");
 }

(円記号、バックスラッシュ、チルダはほんとうは半角)

10.4と10.5で動作確認した。 JTerminal から Leopard 付属の Terminal.app に乗り換えするときに調べたもの。

DefaultKeyBinding についてはマイコミジャーナルの OS X ハッキング! (103) Cocoaアプリのキーバインドにこだわる(1) を、実行可能なメソッドと機能については NSResponder のリファレンス を見るとどういうことをしているのかの参考になると思う。

しかし DefaultKeyBinding で TextView(TextInput のメッセージ送信先) のメソッドが呼び出せるってのは便利なのだけど、どうしてこんな機能があるのだろう。ずいぶん昔からあるよな。

|

2008.01.08

Rabbit 0.5.4 の MacPorts 対応しました

リリースからしばらくたってしまったけど、ようやく更新。

Ruby/Gtk による素敵プレゼンテーションツール Rabbit の port を最新の 0.5.4 に更新。インストール・アップグレードの手順については INSTALL.macosx-macports.ja を参照のこと。

とくに問題もなく、バージョンとチェックサムを更新しただけ。MacPortsWikiJP のページが編集できないので、アーカイブはとりあえずこっちに。

(2007/01/10 追記。手元のキーチェーンが壊れていたためログインできなかったもよう。MacPortsWikiJP にもアップロードしました)

|

« 2007年12月 | トップページ | 2008年2月 »