!kiyoka.blog.2013_01 RSSPLAIN

Related pages: !kiyoka.blog.list
5555555222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222210222444433433333333304445555555555555555555255555555555555555555555555555555555555555555555555555555555555555555555505
5

kiyoka日記。NendoSekkaの開発や、最近思うことなど

5

最新10件!kiyoka.blog   過去記事一覧!kiyoka.blog.list

5

kiyoka.blog_header 

5

このブログを書いている人: 西山 清香(kiyoka) - twitter: @kiyokaEXT

5

5

 

5

 

2

kiyoka.2013_01_28[Xcode][MacRuby] Lion上のXcode 4.5.2でSnow Leopard用のMacRubyアプリケーションをデプロイする方法

2

Xcode 4.5.2 for Lion と MacRuby 0.13 (GitHubの最新master) を使っている。

2

10.6(Snow Leopard)のアプリケーションをdeployしたいが、なかなか成功しない。

2

ビルドに使っているマシンは 10.7 なのだが、そのマシンで 10.6 のアプリをデプロイできるかという問題だ。

2

 

2

いろいろ試してきたが、MacRubyの内部を知らないと解決しないとわかってきたので、ちゃんと腰を据えて調べることにした。

2

 

2

MacOS SDK 10.6を取ってくる

2

Xcode 4.5.2 には SDK 10.7と10.8しか付属していないので、Xcodeから取り出してコピーした。

2

古いXcodeは Apple Developer Centerから xcode_4.3.3_for_lion.dmg をダウンロードした。

2
 手順は以下を参考にした。
2
 cocoa - How to build for Mac OS X 10.6 SDK in Xcode versions that don't include it - Stack OverflowEXT
2

 

2

 

2

Snow Leopard環境にデプロイ失敗

2

Lion上でビルドしたMacRubyとXcodeを使って、アプリケーションをデプロイしたが以下のエラーが出る。

2

 

2
 crash report of PasteHub.app 0.2.0 on Mac OS X 10.6.8EXT
2
 Symbol not found: __dispatch_queue_attr_concurrent
2

このシンボルは libmacruby.dylib が参照しているらしく、動的リンク時に見つからないと言われている。MacRubyのビルド方法以外悪いのだろう。

2

MacRubyがSnow Leopardには無いAPIを使っているのだろうと思われる。

2

 

2

 

2

MacRubyのソースを読む

2

このエラーメッセージから、MacRubyのソースコードを読むことにした。

2

結果、MAC_OS_X_VERSION_MAX_ALLOWEDという関係ありそうなマクロを見つけた。

2

試しに検索してみると…

2

 

2
grep -nH -r MAC_OS_X_VERSION_MAX_ALLOWED *
2
bignum.c:995:#if defined(__LP64__) && (MAC_OS_X_VERSION_MAX_ALLOWED >= 1060)
2
dispatcher.cpp:690://#if MAC_OS_X_VERSION_MAX_ALLOWED < 1070
2
gc.c:141://#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
2
gc.c:1024:#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
2
gc.c:1050:#if MAC_OS_X_VERSION_MAX_ALLOWED < 1070
2
gcd.c:107:#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
2
gcd.c:252:#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
2
gcd.c:268:#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
2
gcd.c:519:#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
2
gcd.c:552:#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
2
gcd.c:1295:#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
2
gcd.c:1372:#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
2
gcd.c:1387:#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
2
include/ruby/defines.h:80:#if defined(__LP64__) && (MAC_OS_X_VERSION_MAX_ALLOWED >= 1060)
2

 

2

こんなにある。

2

さて、今どちらの条件でビルドされているのか調べてみた。

2

 

2

[gc.c] に #errorを入れて rake してみる。

2
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
2
#error "10.7"
2
    __auto_zone = objc_collectableZone();
2
#else
2
#error "10.6"
2
    __auto_zone = auto_zone();
2
#endif
2

 

2

ビルド。

2

 

2
bash-4.2$ env CC=/usr/bin/gcc CXX=/usr/bin/g++ rake
2
plblockimp/gentramp.sh plblockimp/x86_64/blockimp_x86_64.tramp x86_64 plblockimp/
2
plblockimp/gentramp.sh plblockimp/x86_64/blockimp_x86_64_stret.tramp x86_64 plblockimp/
2
/usr/bin/gcc -std=c99 -I. -I./include -pipe -fno-common -fexceptions -fblocks -fwrapv -g -O3 -Wall -Wno-deprecated-declarations -Werror -arch x86_64  -I./icu-1060 -I./plblockimp -c gc.c -o .objs/gc.o
2
gc.c:1025:2: error: #error "10.7"
2
rake aborted!
2
Command failed with status (1): [/usr/bin/gcc -std=c99 -I. -I./include -pip...]
2
Tasks: TOP => default => all => macruby => macruby:build => macruby:dylib => rbconfig => miniruby
2
(See full trace by running task with --trace)
2

 

2

なるほど、10.7のほうを通っている。

2

 

2

10.6側のコードが条件コンパイルされれば、__dispatch_queue_attr_concurrent を参照しなくなるのではないかという推測。

2

それには、MacOS 10.6 SDKが選択すれば良いはず。

2

XcodeからSDKをUIでBase SDKを選択するかのごとく、コマンドラインでgccを起動する場合でも動的にSDKを切り替えられるのではないかと思って調べてみるとあった。

2

どうやら、-isysroot -syslibroot を使えば良いらしい。

2
 例)
2
  -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.6.sdk
2

 

2

しかし、無理やり isysrootでMacOSX10.6にしても、コンパイルエラーになる。

2

 

2
bash-4.2$ env CC=/usr/bin/gcc CXX=/usr/bin/g++ rake
2
plblockimp/gentramp.sh plblockimp/x86_64/blockimp_x86_64.tramp x86_64 plblockimp/
2
plblockimp/gentramp.sh plblockimp/x86_64/blockimp_x86_64_stret.tramp x86_64 plblockimp/
2
/usr/bin/gcc -std=c99 -I. -I./include -pipe -fno-common -fexceptions -fblocks -fwrapv -g -O3 -Wall -Wno-deprecated-declarations -Werror -arch x86_64  -I./icu-1060 -I./plblockimp --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.6.sdk -c gc.c -o .objs/gc.o
2
cc1: warnings being treated as errors
2
gc.c: In function ‘Init_PreGC’:
2
gc.c:1025: warning: implicit declaration of function ‘objc_collectableZone’
2
gc.c:1025: warning: assignment makes pointer from integer without a cast
2
rake aborted!
2
Command failed with status (1): [/usr/bin/gcc -std=c99 -I. -I./include -pip...]
2
2
Tasks: TOP => default => all => macruby => macruby:build => macruby:dylib => rbconfig => miniruby
2
(See full trace by running task with --trace)
2

 

2

原因は、Lion環境用のXcodeをインストールすると、/usr/include 以下のヘッダには

2
#define MAC_OS_X_VERSION_MAX_ALLOWED 1070
2

と定義されているので、isysrootを指定してもMacRubyの ビルド時に 10.7 API を使う条件でコンパイルされてしまう。

2

従って、isysrootは、SDK の切り替えにしか影響しないので、isysrootでは解決にならない。

2

MacRubyをSnow Leopard環境でビルドすれば良いのだろうが、このためだけに自分のOSをダウングレードするのはイヤだ。

2

 

2

ソースを改変

2

 

2

そこで、無理やりマクロを API として 10.6 までしか使わないように抑え込む。

2

そのローカルパッチを当てたものが、こちら。

2

 

2
 It can be built macruby for 10.6 on Lion(10.7) enviroment with 10.6 SDK. ·  c7963b4 · kiyoka/MacRuby · GitHubEXT
2

 

2

 

2

 

2

Xcodeでのデプロイ設定も変更が必要

2

 

2

問題はまだある。

2

Xcode 4.5.2 for Lion上で Base SDKを10.6 に設定してアプリケーションをデプロイしようすると次のリンクエラーが出る。

2

 

2
 Undefined symbols for architecture x86_64:
2
  "_objc_retain", referenced from:
2
     ___ARCLite__load in libarclite_macosx.a(arclite.o)
2
     (maybe you meant: _objc_retainedObject)
2
 ld: symbol(s) not found for architecture x86_64
2
 clang: error: linker command failed with exit code 1 (use -v to see invocation)
2

 

2

XcodeのデフォルトではLion用のObjective-C Runtimeをリンクしようするが、10.6 SDKには無いらしくエラーとなる。

2

SDK 10.6を使う場合は、ARCのライブラリはいらないはずなので、Implicitly link Objective-C Rumtie YES => NO に変更してデプロイする。

2

 

2
 objective c - _objc_retain&quot;, referenced from:__ARCLite__load error in Xcode 4.4 - Stack OverflowEXT
2

 

2

これでMacRubyのアプリケーションはデプロイ可能となる。

2

 

1

COMMENTSharon

This infomratoin is off the hizool!

0

comment (disabled)

2

2

 

2

 

4

kiyoka.2013_01_21[iDVD] 備忘録:スライドショーに複数のビデオを入れる方法

4

 

4

iDVDでホームビデオをiDVDで作っているが、久しぶりにiDVDをさわると、どうやっても思いだせない操作がある。いつも10分ほど探しまわる。

4

DVDプレイヤーにDVDを入れたらいきなり再生する部分のことをiDVDではスライドショーと呼ばれている。

3

スライドショーに複数のムービーを入れるには、スライドショーアイコンをダブルクリックする。

3

そうすると、スライドショーに入ったムービーのリストが出てくる。

4

 

3

でもなかった…

3

 

3

ここからが難しいところ。

3

スライドショーアイコンに1つのムービーを入れると、中をリスト形式でするためにダブルクリックすると、そのスライドショーが再生されてしまう。

3

二個以上のムービーを入れると、再生されずにリスト形式で表示される。

3

つまり、スライドショーに入っているムービーの数によって、ダブルクリックの挙動が変わってしまうわけだ。

3

これは、メモしとかないと絶対に次には操作できなくなっているはずだ。

3

というわけで、今回もこの操作にたどりつくまで20分ほど使ってしまった…

3

 

0

comment (disabled)

4

4

 

4

 

5

kiyoka.2013_01_18[MacRuby] コマンドラインRubyスクリプトをPasteHub.appにデプロイしてみた

5

 

5

PasteHub.netというクリップボード同期サービス用にMacRubyとXcodeを使ってMacOS X用のクライアントアプリケーションを作っている。 kiyoka/pastehub · GitHubEXT

5

PasteHub.appというMacOS Xで起動する普通のUIアプリケーションがとりえあず開発できた。しかし問題が…

5

 

5

問題点

5

 

5

PasteHubクライアントにはpastehubPostとpastehubDumpというコマンドライン起動するスクリプトがある。

5

これらのスクリプトはEmacsなどの外部アプリとの連携用だ。

5

Emacsからクライアントから新規のペーストデータをPostしたりローカルの同期済みデータベース(gdbm)を参照する時に使う。

5

 

5

問題はそれが含まれないこと。

5

※ MacRubyのバージョンは本エントリ執筆時期なので、MacRuby 0.13 の開発版での話。

5

 

5

問題1

5

 

5

gemに含まれるbinディレクトリの中身はdeployされない。(Xcodeからのgemのデプロイはmacruby_deployのオプションで制御する)

5
 参考
5
  Embedding MacRuby in your application · MacRuby/MacRuby Wiki · GitHubEXT
2
 #(img http://a248.e.akamai.net/camo.github.com/17c3b48661abd0e58f979b0237319f7a4c67982f/687474703a2f2f776174736f6e313937382e6769746875622e636f6d2f4d6163527562792d446f4a6f2f696d616765732f656e2f696e74726f2d6465706c6f796d656e742f6465706c6f796d656e745f6f7074696f6e2e706e67)
5

 

5

問題2

5

 

5

macruby本体はdeployされない。

5

macruby本体はdeployされないので、コマンドライン起動スクリプトを処理できない。

5

 

5

実験1: 手でmacruby本体とスクリプトをコピーしてみる。

5

 

5
Dropboxのtenmpフォルダ内で作業した。
5

 

5
$ cd /Users/kiyoka/Dropbox/temp/
5
$ ls -al | grep -i pastehub.app
5
drwxr-xr-x   3 kiyoka         staff          102  1 18 23:00 PasteHub.app
5

 

5
試しにmacrubyをコピー
5

 

5
$ find /Library -name macruby | grep bin
5
/Library/Frameworks/MacRuby.framework/Versions/0.13/usr/bin/macruby
5
$ find ./PasteHub.app -name usr
5
./PasteHub.app/Contents/Frameworks/MacRuby.framework/Versions/0.13/usr
5
$ mkdir -p ./PasteHub.app/Contents/Frameworks/MacRuby.framework/Versions/0.13/usr/bin
5
$ cp /Library/Frameworks/MacRuby.framework/Versions/0.13/usr/bin/macruby ./PasteHub.app/Contents/Frameworks/MacRuby.framework/Versions/0.13/usr/bin
5

 

5
$ ./PasteHub.app/Contents/Frameworks/MacRuby.framework/Versions/0.13/usr/bin/macruby --version
5
MacRuby 0.13 (ruby 1.9.2) [universal-darwin11.2, x86_64]
5

 

5

動いた!

5

 

5
試しにpastehubDumpをコピー
5

 

5
$ cp /Users/kiyoka/work/github/pastehub/bin/pastehubDump ./PasteHub.app/Contents/Frameworks/MacRuby.framework/Versions/0.13/usr/bin
5
$ ./PasteHub.app/Contents/Frameworks/MacRuby.framework/Versions/0.13/usr/bin/macruby -I  ./PasteHub.app/Contents/Frameworks/MacRuby.framework/Versions/0.13/usr/lib/ruby/site_ruby/1.9.2 ./PasteHub.app/Contents/Frameworks/MacRuby.framework/Versions/0.13/usr/bin/pastehubDump 
5
clientDump [command] [arg]
5
  1) clientDump  list
5
  2) clientDump slist
5
  3) clientDump get  key
5
  4) clientDump top
5
  5) clientDump latest
5

 

5

動いた!

5

どうやらファイルは足りているらしい。

5

 

5

 

5

実験2: PasteHub.appをアプリケーションフォルダにドラッグしてみる。

5

 

5
ここに入るようだ。
5

 

5
 /Applications/PasteHub.app/Contents/Frameworks/MacRuby.framework/Versions/0.13/usr/bin/macruby
5

 

5
フルパスで実行してみる。
5

 

5
$ /Applications/PasteHub.app/Contents/Frameworks/MacRuby.framework/Versions/0.13/usr/bin/macruby -I  /Applications/PasteHub.app/Contents/Frameworks/MacRuby.framework/Versions/0.13/usr/lib/ruby/site_ruby/1.9.2 /Applications/PasteHub.app/Contents/Frameworks/MacRuby.framework/Versions/0.13/usr/bin/pastehubDump 
5
clientDump [command] [arg]
5
  1) clientDump  list
5
  2) clientDump slist
5
  3) clientDump get  key
5
  4) clientDump top
5
  5) clientDump latest
5

 

5
$ /Applications/PasteHub.app/Contents/Frameworks/MacRuby.framework/Versions/0.13/usr/bin/macruby -I  /Applications/PasteHub.app/Contents/Frameworks/MacRuby.framework/Versions/0.13/usr/lib/ruby/site_ruby/1.9.2 /Applications/PasteHub.app/Contents/Frameworks/MacRuby.framework/Versions/0.13/usr/bin/pastehubDump  list
5
1358516202=2013-01-18.13:36:42=07d9393429f2447c1004e00ee528d93ad10438f0
5
1358516169=2013-01-18.13:36:09=98cd22944898489579a9aa7d537c6b82e768bd06
5
1358515920=2013-01-18.13:31:59=187d2122d1013dbd3124166289ffd92e5aa511e7
5
1358515901=2013-01-18.13:31:41=d25de6b859b209e96657f5179e4ad942c22e23fb
5
1358515899=2013-01-18.13:31:38=4219c8d13df8bc8654e6de8806e00a36260b82e2
5

 

5

動いた! gdbmで保存しているデータを開くこともできている。

5

ということは、このパスを外部アプリから調べて同じコマンドラインを実行すれば良い。

5

なんとか解決しそうだ。

5

 

5

追記: いやまてよ…  MacRubyをインストールした環境でしたうまく動かないという可能性があるな… MacRubyを消して動かしてみないと…

5

 

0

comment (disabled)

5