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

2009年8月30日日曜日

ここが非互換 Mac OS X 10.6 -- iCal

Mac OS X 10.6 Snow leopard が発売になりました。

当サイトでは、よく iCal 関係の AppleScript を扱っていますが、Mac OS X 10.6 では、少し挙動が変わりました。試しに、iCal でカレンダー「テスト」に「テスト」というイベントを作って、AppleScript から観察してみます。

tell application "iCal"
  tell calendar "テスト"
    properties of event 1
  end tell
end tell

以下は 10.5.8 (iCal 3.0.8) の結果です。

{
  allday event:false,
  class:event,
  description:missing value,
  end date:date "2009年 9月 2日 水曜日 1:00:00 PM",
  excluded dates:{},
  id:"C0DC5F01-4183-412E-95AB-9414FD8111C6",
  location:missing value,
  recurrence:"",
  sequence:2,
  stamp date:date "2009年 8月 30日 日曜日 2:27:03 PM"
  start date:date "2009年 9月 2日 水曜日 10:00:00 AM",
  status:none,
  summary:"テスト",
  url:missing value,
}

以下は 10.6 (iCal 4.0) の結果です。

{
  allday event:false,
  class:event,
  description:missing value,
  end date:date "2009年9月2日水曜日 16:00:00",
  excluded dates:{},
  id:"6A5888C1-D872-4C5F-B053-09CD8FC5067D"
  location:missing value,
  recurrence:missing value,
  sequence:2,
  stamp date:date "2009年8月30日日曜日 14:20:48",
  start date:date "2009年9月2日水曜日 13:00:00",
  status:none,
  summary:"テスト",
  url:missing value,
}

プロパティリストの結果は、比較しやすいように辞書順に並べ替えています。以上のように、recurrence に値が設定されていない時の結果が違います。description に "" (空文字列) を設定した時の挙動も違い、iCal 3.0.8 では "" になりますが、iCal 4.0 では missing value になります。

なお、missing value を文字列に変換して扱ってはいけません。AppleScript では missing value as string は "missing value" という文字列になるというよく分からない仕様なので、気をつけましょう。

2009年5月1日金曜日

iCal: event オブジェクトの location プロパティ

iCal の event オブジェクトの location プロパティは、ちょっとクセがあります。

場所が指定されていないとき、location プロパティの値を変数に代入しても、その変数の値は未定義となります。変数に触ったとたんにエラーになるので、以下のように、ヌル文字列に正規化して使うのがよさそうです。

 set loc to location of theEvent
 try
  loc
 on error
  set loc to ""
 end try

知らないとハマる箇所です。その他のプロパティには、こんな変なクセはないんですけどね…。

2009年2月28日土曜日

Web ページ巡回スクリプト (更新チェック付き)

AppleScript で書いた Web ページ巡回スクリプトです。毎日、指定曜日、特定日に巡回する URL をスケジュールできます。簡単ですが、更新チェックの機能があります。ブラウザで一気にどばっと開きますので、たくさん URL を指定すると、大変なことになります。うまく曜日で散らしてください。

巡回 URL リストの作り方

巡回リストは、iCal の “巡回” という名前のカレンダーに保存します。まずは、iCal に “巡回” という名前のカレンダーを作ってください。

巡回したい Web ページごとに、終日イベントを作成し、URL を、イベントの URL 欄に記入します。イベントの繰り返しは、毎日、毎週 (複数の曜日を選ばないでください) を指定できます。繰り返しイベントの終了には対応していません (※) 。

※ ここら辺の iCal のサポートがとても poor なのです…。

更新チェックは、イベントごとに指定できます。チェックをしたい場合は、イベントのメモ欄に“/bin/cat”と入力してください。HTML のハッシュ値を保存し、前回の訪問時とハッシュ値が異なるときのみ、Web ブラウザで表示されます。カンのいい方はお分かりでしょうが、この箇所は、UNIX 流のフィルタになっています (※) 。ハッシュ値の計算対象を HTML 全体としたくない場合は、別のフィルタを実行させることができます。更新チェックのデータは、~/Library/Preferences/patrol script.plist に保存されます。

※ /usr/bin/curl -s URL | 指定されたフィルタ | /sbin/md5 を実行しています。

以下は、毎日巡回する Web ページを指定する例です。

以下は、毎週土曜日に巡回する Web ページを指定する例です。加えて、更新チェックを行うことが指定されています。

コード

コードの掲載をやめ、スクリプトを配布することにしました。

patrol web pages.zip (12k)

できれば、コメントなどをいただけるとうれしいです。

スクリプトは、現状のまま提供され、使用した結果の責任については、すべて使用者の責任とします。再配布はご遠慮ください。

清野の使い方

私は、毎朝一回、これを動かして、コーヒーを入れに行きます。コーヒーを入れて戻ってくると、全部のページのロードが完了している、という感じで使っています。

Safari の環境設定の「一般」の一番下に「アプリケーションでリンクを開く場合」という設定があります。これを「既存のウィンドウの新規タブに開く」にしておく方がよいと思います。タブにしておかないと、画面がウィンドウだらけになります…。

2009年2月25日水曜日

iCal の終日イベント作成時のバグ

AppleScript から iCal の終日イベントを作成した時に、時間帯の扱いについてバグがある模様。iCal の環境設定の「時間帯サポートを有効にする」を変更しても、同じ結果となった。

実験環境

  • Mac OS X 10.5.6
  • iCal 3.0.6
  • スクリプトエディタ 2.2.1
  • AppleScript 2.0.1
  • 時間帯 Tokyo - Japan

テストコード

次のようなスクリプトを動かしてみると、(a) だけ昨日のイベントとなる。

tell application "iCal"
  tell calendar "テスト"
    set d to current date
    set hours of d to 8
    set minutes of d to 0
    copy d to d8  -- 今日の 08:00
    set hours of d to 9
    copy d to d9  -- 今日の 09:00
    set hours of d to 10
    copy d to d10  -- 今日の 10:00
  
    -- (a) 本日 8:00 - 9:00 の終日イベントを作る
    make new event at end with properties {summary:"テスト終日 (a)", start date:d8, end date:d9, allday event:true}
    -- (b) 本日 9:00 - 10:00 の終日イベントを作る
    make new event at end with properties {summary:"テスト終日 (b)", start date:d9, end date:d10, allday event:true}
    -- (c) 本日 8:00 - 9:00 の通常イベントを作る
    make new event at end with properties {summary:"テスト通常 (c)", start date:d8, end date:d9, allday event:false}
    -- (d) 本日 9:00 - 10:00 の通常イベントを作る
    make new event at end with properties {summary:"テスト通常 (d)", start date:d9, end date:d10, allday event:false}
  end tell
end tell

実行結果

この通り。多分、バグでしょう。

対策

今後、バグが直る可能性もあるので、対策としては、終日イベントを作るときは、開始時間を正午にしておく、ということでよさそうです…。

iCal 4.0.3 (Build 1388) では修正されていることを確認しました。(2010-09-05 追記)