ラベル iCal の投稿を表示しています。 すべての投稿を表示
ラベル iCal の投稿を表示しています。 すべての投稿を表示

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をよく知らないので見ていません。

2013年3月2日土曜日

フォルダの背景の花粉情報予測マップ画像表示の自動化 (Automator編)

前の記事で、フォルダの背景に花粉飛散状況(花粉マップ)画像の表示ができるようにしました。
これで、昼休みに散歩に出るとき、見逃さない可能性が高くなりますね。ちゃんと忘れなければですが。

でも、今のままでは、花粉マップのある日本気象協会のウェブに毎日アクセスして、花粉マップ画像をダウンロードし、フォルダの背景に貼り付ける作業を手で行う必要があります。
多分忘れることも多そうですし、面倒になってやらなくなりそうです。

ということで、自動化を考えてみます。ここでは、Automatorを使うことにしたいと思います。冗長なところもあるかもしれませんが、できるだけAutomatorのアクションだけで作ってみます。


準備として、花粉マップを表示する(=普段よく使う)フォルダを決めておきます。ここでは、testとしておきます。
また、花粉マップを毎日ダウンロードするフォルダを決めます。表示するフォルダと同じにしてもかまいませんが、ここではtestフォルダの下にtest/kafunとして作成します。
また、一度だけ、Safariなどで花粉マップ(pollen)をあらかじめダウンロードしておいてください。以下は参考画像です。


処理の考え方は以下のようになります。

Automatorで、(1) カレンダーアラームとしてワークフローを作成します。
ワークフローの中では、(2) 前回の花粉マップを削除し、(3) 新しい花粉マップをダウンロードして、(4) それをフォルダの背景として設定します。
最後に、(5) カレンダー上でそのワークフローを連続イベント設定します。(Mountain Lionではカレンダーと名前が変わっていますが、Snow LeopardではiCalという名前です。)

1. Automatorの立ちあげとカレンダーアラームの選択

カレンダーアラームは、カレンダーのイベントがきっかけとなって実行されます。毎日、決まった時間に処理を行うために、この書類の種類にします。また、Mac OS Xの以前のバージョンでは、iCalアラームになっています。


2. 花粉マップ画像の削除

Finderのアクションから、「指定されたFinder項目を取得」を右側のワークフロー作成領域(ペイン)にドラッグします。ダブルクリックしてもいいようです。

「追加...」ボタンを押して、上の準備のところであらかじめダウンロードした花粉マップを指定します。


Finderのアクションから、「Finder項目をゴミ箱に入れる」を選びます。


3. 花粉マップ画像のダウンロード

Safariのアクションから、「指定されたURLを取得」アクションを右側のペインにドラッグします。

アドレスは、apple.comになっていると思いますので、それを選択してから削除ボタンで削除します。
続いて、追加ボタンで日本気象協会の花粉画像ファイルのURL(http://season.tenki.jp/component/images/pollen_mesh_large.jpg)に変更します。

その際、Safari で、花粉マップの画像を開いておくと、自動的にそのURLが設定されます。

Safariのアクションから、「URLをダウンロード」アクションをドラッグします。

ダウンロードする場所は、上の準備で決めたフォルダ(ここではkafunフォルダ)に変更します。


4. 花粉マップをフォルダの背景へ貼り付け

Finderのアクションから、「指定されたFinder項目を取得」をドラッグします。このアクションは、2回目ですね。
パスは、フォルダの背景を設定したいフォルダを指定します。ここでは、testフォルダです。

Finderのアクションから、「Finder項目にフィルタを適用」アクションをドラッグします。そして、種類をフォルダに設定します。
その種類を限定する理由は、Finder項目として、ダウンロードした花粉マップ画像と上で選択した、背景を設定したいフォルダの両方が選ばれているためです。このままですと、後の処理でエラーが出る場合があります。Mac OS Xのバージョンによってはエラーが出ない場合もあります。

Finderのアクションから、「フォルダ表示を設定」アクションをドラッグします。

右側の背景の欄をピクチャに変更し、準備段階でダウンロードしておいた花粉マップ画像を設定します。

これで、フォルダの背景に画像が設定できているのですが、対象のフォルダを開いたままにしてAutomatorを実行した場合、フォルダの背景の変更がすぐに反映されません。フォルダを開き直したり、表示形式をカラムやリスト形式からアイコン形式に変更したら、背景画像が設定されているのが確認されます。

ここで、それと同じ効果をAutomatorで得るため、もう一度、「フォルダ表示を設定」アクションをドラッグします。

今回は、「常に次の項目で並び替える」を「変更日」に変更します。また、背景は、もう一度、花粉マップ画像を設定します。
このような設定は二度手間なので、本当は何かいい方法があるのかもしれませんがわかりませんでした。

やっとAutomatorの部分の最後になりました。ここでワークフローを保存します。
私は、名前を「花粉マップ」にしました。
動くかどうかをここで確認するのもいいと思います。右上の「実行ボタン」や「コマ送り」ボタンを押して実行と確認をしてください。


5. カレンダーでイベントを修正

カレンダーアプリを立ちあげると、Automatorというカレンダー項目と「花粉マップ」(または自分でつけたワークフロー名)イベントが登録されています。

この「花粉マップ」を選んで編集メニューから「情報を見る」を選びます。command + Iでも同様です。

登録した時間に1回だけ実行されるようスケジュールされています。
このイベントを毎日実行されるよう設定を変更していきます。
まず、開始時刻を適当な時間、例えば6時55分に変更します。朝、6時に日本気象協会の情報が更新されますのでそれより後で、Macを立ち上げている時間がいいと思います。

また、繰り返しを毎日に変更します。通知の時間が指定時刻ではなく、0分前になっていることも確認してください。
Snow Leopardの場合、指定時刻(将来の日時から見ると過去の時間)に固定されている場合があるので注意が必要です。

これで適用を押して情報ウインドウを閉じてみると、カレンダー表示が次のようになります。

これで終了でもいいのですが、毎日表示されているのが多いと感じた場合は、左上のAutomatorのチェックをオフにすることで、毎日の表示を隠すことができます。その場合も、花粉マップのダウンロードとフォルダの背景への設定更新はされます。

ずいぶん長くなりましたが、これで終わりです。画像の明るさや透明度を変えたり自分なりに工夫ができるかもしれません。試してみてください。

2013年2月17日日曜日

Snow Leopard, Mountain Lion, iPhoneでのカレンダーなどの共有について

何台かMacや(PCでもいいですが)iPhoneなど複数のマシンを使っていると、それらの間での情報共有について戸惑う場面があると思います。

例えば、休日明けの出張が決まった時に忘れないように自宅のMacにもその情報を入れるとか、会社の帰りに買い物を忘れないようにしたりとかいうことも多いのではないでしょうか。

iCloudが使えるようになる前は、自宅でも会社でも使えるGmailアカウントにメールを送付していました。それをApple Mailで受信すれば、iCalへのイベント追加も簡単にできるからです。また、QuicksilverのCalendar Moduleもお手軽なのでよく使っていました。今でも使います。Googleカレンダーは少しの間使っていたのですが、iCalに比べるとお手軽ではないのですぐ使うのを止めてしまいました。

その後、Mac mini 2012やiPhone5を買って状況が少し変わって来ました。Mounain LionやiOS6では、iCloudで情報の共有ができるからです。


使うのは基本的にはカレンダーです。リマインダーはあまり使いません。メモは、Mac上ではDropBoxとQuicksilverを組み合わせて使っているので、メモアプリはMacからは使わずiPhoneから外にいるときだけ使っています。これは別の記事にしたいと思います。

会社でメインに使っているSnow Leopardでは、iCloudをSafari経由でしか使えないので、カレンダーへのイベントの入力が少し面倒という問題があります。
Snow LeopardのiCalで、iCloundのCalDAVサーバを指定するといいらしいのですが、不必要なカレンダーデータを同期させたくないので、まだ調査中です。家のマシンに打ち合わせ情報などが入っても仕方ないので。

ただ、ほとんどの連絡事項(打ち合わせなど)は、会社(Snow Leopard)の中で閉じているので、自宅マシンに入れたい情報の頻度は多くないのと、情報管理の面では、今のままある程度分離されている方がいいのではという気もしています。

2012年10月7日日曜日

growlnotifyをiCalのアラーム代わりに使ってみる

iCalにイベントを登録して、時間が来たら知らせてくれるようにアラームを設定しています。朝など忘れやすいので、結構便利に使っています。

ただ、毎日決まった時間にやらないといけないことをiCalに繰り返しイベントとして登録していると、iCalの画面が同じイベントで溢れて、その他のイベントが見づらくなってしまいます。下の図はそれほどでもないですが。

iCalのカレンダーの種別を追加して、「定期的(隠す)」ためのイベント用を登録して普段は表示しない設定にすれば、隠すこともできますが、別の方法はないか考えてみました。

イベントの通知といえばGrowlですがそれに含まれているgrowlnotifyを使うとスクリプトベースで画面に通知を表示できそうです。環境はSnow LeopardとGrowl 1.2.2で試してみました。
全体の流れは、(1) growlnotifyのインストール、(2) 表示用スクリプト作成、(3) crontabへの設定となります。

(1) Growlのインストールだけでは、growlnotiryはインストールされませんので、Growlのインストールの後に、growlnotiryをインストールします。Growlのインストール用ディスクイメージをマウントすると、Extraフォルダの下にgrowlnotify.pkgというインストールパッケージがあります。
そのパッケージをインストールすると、/usr/local/bin/growlnotifyに実行ファイルがコピーされます。(Suspicious Package qlgeneratorより)
grwolnotifyのmanページもインストールされるので、それを見ると使い方は大体わかります。

(2) manページなどを参考にスクリプトを作成します。以下に例を示します。(ブログ用にちょっと簡略化していますが)

#!/bin/sh
/bin/date "+今日の%H:%M%n金魚にえさ" | /usr/local/bin/growlnotify -s -a iCal -d feed crontab

このスクリプトに、kingyo.shのような名前をつけて実行権限を付けて( chmod +x) おきます。
このスクリプトを実行すると、次のように表示されます。
growlnotiryの-sオプションは、表示がタイムアウトしないようにします。左上に現れるクローズボックスで表示を消せます。

-aオプションは、アプリケーションアイコンを指定します。iCalを指定したらiCalのアイコンが表示されます。なくてもかまいませんし、他のアプリケーションを指定することもできます。
-dオプションは、現在発行しようとしている通知にIDを付けるものです。既に同じIDのGrowlのウィンドウが開いていると、新たにウィンドウを開かずに、既に開いているウィンドウの内容が上書きされます。
最後の引数のcrontabは、ウィンドウの一行目に表示されるタイトルです。自分はcrontabで表示させるのでこうしましたが、これもiCalや他の好きなタイトルにすればいいと思います。
また、dateコマンドの+オプションで日付を含むメッセージを表示できます。それぞれ、%Hが24時間表示の時間、%Mが分、%nが改行を示します。

(3) 上で作ったgrowlnotify用スクリプトがちゃんと表示されるのが確認できたら、crontabに登録して定期的に実行できるようにします。最近の流儀に合わせてlaunchdで自動起動を指定してもいいと思います。(ここではcrontabを説明します)
crontabの現在の登録内容を確認するためのコマンドは、
$ crontab -l
です。出力内容をリダイレクトしてバックアップをとっておくといいでしょう。
crontabでデータベースを直接編集する場合のコマンドは
$ crontab -e
です。vimではなく、nanoやemacsを使う場合、環境変数EDITORにそのコマンドを設定してください。emacsを使いたい場合は以下のとおりです。

$ export EDITOR=emacs

朝7時30分に実行する場合は、以下のようになります。
30 7 * * * $HOME/bin/kingyo.sh
既に他の定義がしてある場合は、最後の行にでも追加するといいと思います。
crontabのデータベースのフォーマットは、タブコード区切りで、順番に分、時間、日、月、曜日(0が日曜日)、コマンドとなっています。
現在の時間に近い時間を設定してテストするといいと思います。

以上ですが、実はiCalにも通知の頻度は落としていますが(毎日ではなく、何日に一回とか)、同じイベントを記入したままにしています。
今のところ、スケジュール関係のデータベースはiCalをメインに考えていますので、データとして残しておきたいため、そのようにしています。