2013年6月8日土曜日

icalBuddyをバージョンアップ [追記: 6/8 18:00]

icalBuddyというコマンドラインプログラムを使って、GeekTool, NerdToolで予定やTo Doを表示しています。
でも、Mountain Lionにしてから予定(カレンダーのデータ)が表示されなくなっていました。やっと重い腰を上げて解決することにしました。といっても結局バージョンアップしただけですが。
icalBuddyは、http://hasseg.org/icalBuddy/ で、Ali Rantakariさんが公開されています。
まず、動作しない原因ですが、icalBuddyがAddress book (連絡先)のデータにアクセスするときに拒否されてクラッシュしているためのようです。

2013-06-08 06:01:53.330 icalBuddy[99070:2623] Address book access is denied for executable at path: /usr/local/bin/icalBuddy
2013-06-08 06:01:53.331 icalBuddy[99070:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'NSConcreteMutableAttributedString initWithString:: nil value'

上記のエラーメッセージと共にスタックダンプも表示されます。想像ですが、アドレスブックにアクセスしようとして拒否され、そのデータが取れずにnilになってicalBuddyが終了というかクラッシュしたように見えます。
icalBuddyのウェブを見るとFAQにエラーメッセージを表示させないための解決方法が載っていました。
  1. icalBuddyにAddress bookのアクセス権を与える
  2. エラーメッセージを/dev/nullに送る
のどちらかを実行すればいいと書いてありますが、2番目はクラッシュを回避できないように思います。
気になったのは、カレンダーのデータを表示するのになぜAddress bookにアクセスする必要があるのかですが、特に記述はありませんでした。誕生日データを参照しようとしているのでしょうか。

1番目の解決策を試す前に、現在使っているバージョンが1.7.19と古いので最新版(1.8.8)にアップデートすることにしました。
今まではコンパイル済みのバイナリをインストールしていたのですが、ソースコードも欲しいと思い上記サイトのgitのアドレスから入手、コンパイルすることにしました。

念のためですが、以下の手順は普通にicalBuddyのサイトからコンパイル済みのバイナリ入りZIPファイルをダウンロードすることで全然かまわないです。

あらかじめ、Xcodeとcommand line toolをインストールしておく必要があります。
ビルド、インストールは以下のようにしました。

$ git clone http://hasseg.org/git-public/icalBuddy.git/
$ make 64BIT=1

単純なmakeだと32bit バイナリが生成されたので、気分的に64bitを指定してみました。
すると、今度はuniversal binaryになったので、上記makeのコマンドをコピペして、-arch i386を削って直接実行しました。複数行になっていますが、一行です。

$ clang  -O3 -Wall -std=c99 -force_cpusubtype_ALL -mmacosx-version-min=10.5 -arch x86_64 -framework Cocoa -framework CalendarStore -framework AppKit -framework AddressBook -o icalBuddy icalBuddy.m icalBuddy[ABCDEFGHIJKLMNOPQRSTUVWXYZ]*.m ANSIEscapeHelper.m HG*.m IcalBuddy*.m *+HGAdditions.m

元のi386のままでも構わないのですが気分の問題でこうしてみました。
[* 次の文は、修正しました。クラッシュはなくなったのですが、system.logにaccecc deniedというメッセージは出ていました。6/18 18:0]
icalBuddyを実行してみるとエラーが出なくなっています。FAQの1番目のアクセス権を与えることも必要なさそうです。
その後インストールしようと思ったらMakefileの中にinstallターゲットがありません。
packageターゲットでZIPファイルを作り、そこから展開してインストールすることにしました。

$ mkdir deployment   # あらかじめ作っておく必要があるみたい
$ make package # 最後にエラーが出ますが関係なさそうなので気にしないことにします
$ cd deployment/1.8.8/
$ unzip icalBuddy-v1.8.8.zip
$ ./install.command    # /usr/local以外の場合はこのコマンドを修正する必要があります
=================================

This script will install icalBuddy and related files:

(icalBuddy installation found in:
 /usr/local
 -- using same path for updating:)

/usr/local/share/man/man1/icalBuddy.1
/usr/local/share/man/man1/icalBuddyLocalization.1
/usr/local/share/man/man1/icalBuddyConfig.1
/usr/local/bin/icalBuddy

We might need administrator privileges to install to
this location so please enter your password if prompted.

Input y to continue installing, c
to change the installation path or q to quit.
[y/c/q]: y
- Copying icalBuddy.1 to /usr/local/share/man/man1
Password:
  copied.
- Copying icalBuddyLocalization.1 to /usr/local/share/man/man1
  copied.
- Copying icalBuddyConfig.1 to /usr/local/share/man/man1
  copied.
- Copying icalBuddy to /usr/local/bin
  copied.

icalBuddy has successfully been installed.

以上で、icalBuddyがクラッシュしないようになりました。
ソースコード(何故連絡先にアクセスする必要があるのか)は、Cocoa, Objective-Cをよく知らないので見ていません。

0 件のコメント:

コメントを投稿