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

Dock の Finder アイコンを変更する

Finder のアイコンは Mac OS X のバージョンによって異なりますが、新しい Finder アイコンが気に入らない方はお試しください (Mac OS X 10.4.7 で確認) 。

以下の情報は Terminal での作業に関する知識を十分お持ちの読者を想定しています。作業の失敗によって、大切なデータを消失したり、OS を再インストールをする結果になることがあります。カスタマイズは自己責任です。

準備

材料として、次のファイルが必要です。

  • Finder のアイコン (.png 形式) 。一般にはアルファチャネルの情報が必要です。.icns 形式をプレビュー.appで変換するとよいでしょう。

手順1:

/System/Library/CoreServices/Dock.app/Contents/Resources/finder.png を所望のアイコンファイルに置き換えます (root権限が必要です) 。

手順2:

/Library/Caches/dock.iconcache.501 (※) を削除し、Dock を再起動します。

※ .501の部分はユーザIDです。dock.iconcache はログインしているユーザごとに作成されるので、すべてのユーザについて、キャッシュを削除してください。

FileVault と Web共有 (Apache) を同時に使う

FileVault をオンにすると、http://localhost/~user/ にアクセスできなく (403 Forbidden) なります。これはホームディレクトリのパーミッションが drwx------ になっているためで、drwx---x---x (711) に直せばアクセスできるようになります。

他の人と共有している Mac ではセキュリティ上の問題が発生しますので、充分注意してください。

2009年2月27日金曜日

JUDE を Mac OS X で使う

JUDE/Community は無料で使える UML モデリングツールです。Java で書かれているので、もちろん Mac OS X でも動作します。コマンドラインから起動してもいいのですが、せっかくなので、通常のアプリケーションのようにダブルクリックで起動できるようにする方法を紹介します。

(2009-08-30追記) Mac OS X 10.6 Snow leopard でも、同じ手順で作成できることを確認しました。

準備

材料と道具として、次の 2つが必要です。

  • この記事の執筆時点 (2009年 2月 27日) 時点での JUDE/Community の最新バージョンは 5.4.1 です。JUDEの公式サイトで登録後ダウンロード (無料) してください。jude_community-5_4_1.zip というファイルが落ちてくると思うので、それをダブルクリックして展開しておきます。
  • Mac OS X の Xcode が必要です。インストーラは Mac OS X のインストールディスクの中に入っています。

手順1:

Jar Bundler を起動します。/Developer/Applications/Utilities/ に入っています。

※ Jar Bundler の実体は、/usr/share/java/Tools にあります。もしかしたら、Xcode のインストールは必須ではないのかもしれません…。手元に Xcode をインストールしていない環境がないので、確認できていません…。

手順2:

Jar Bundler の Build Information タブの中の Main Class を指定します。Choose... ボタンをクリックして、jude-community.jar を選択します。すると、Jar Bundler は jude-community.jar の中から Main メソッドのあるクラスを探してくれます。

Options は、お好みで指定してください。

手順3:

Jar Bundler の Classpath and files タブを開きます。Additional Files and Resources と Additions to Classpath のリストに、jude-community.jar が見えていると思います。これに加えて、Additional Files and Resources の Add... ボタンをクリックし、jude-api.jar、Welcome.jude および Welcome_ja.jude を追加します。

上記の操作を行うと、jude-api.jar は Additions to Classpath の中にも、自動的に追加されます。

手順4:

Jar Bundler の Properties タブを開きます。VM Options に -Xms16m -Xmx512m -Xss2m を指定します。Version は JUDE のバージョンにしておきましょう。

手順5:

Create Application... ボタンをクリックし、JUDE という名前を付けて Application Bundle として保存します。うまくいくと、以下の右のようなアプリケーションが作られています。Jar Bundler の問題だと思いますが、左のような進入禁止のアイコンになることがありますが、実際には正常に作られています。一度、アイコンをクリックすると、右のアイコンになります。

作業は以上です。おつかれさまでした。

このアイコンをダブルクリックすると JUDE が起動します。作成に使用した jude_community-5_4_1.zip や jude_community フォルダは捨ててしまってかまいません。

RAM ディスクを作成する

RAM ディスク
http://homepage.mac.com/nand/macosx/ramdisk.html

Mac OS X にはディスクキャッシュ、HDD の断片化を予防するための遅延再配置機能があるので、一時ファイルを作成するために RAM ディスクを使っても、労力に見合う効果は得られないと思います。

現在のところ、RAM ディスクのうまい使い方は思いつきませんが、メモとして書いておきます。

メモリが慢性的に足りないノートブックタイプの Mac では、利用する価値はないでしょう。SSD の環境と組み合わせると、何か可能性が使い道があるかもしれません…。(2010-07-17追記)例えば、ATOK のユーザ辞書のように頻繁に読み書きするファイルを RAM ディスクに置くことで、SSD の劣化を防ぎパフォーマンスの改善ができるようです。

2009年2月26日木曜日

フォルダアクションを作るとき

フォルダアクションのスクリプトハンドラ adding folder items は、.DS_Store や Icon^M のような、Finder が自動的に作成するファイルの存在を考慮に入れて作らないといけない。

除外するファイルを考慮に入れた adding folder items ハンドラのサンプル。

-- 今日の日付のサブフォルダを作って、追加された各項目をそこに入れる

-- フォルダアクション (項目追加時) のハンドラ
on adding folder items to this_folder after receiving these_items
  -- フォルダアクションで操作対象外とするファイル
  set excludes to {".DS_Store", ".localized", "Icon" & (ASCII character of 13)}
  set results to my preparation(this_folder, these_items)
  try
    -- メインループ
    repeat with this_item in these_items
      tell application "Finder"
        -- 処理対象外のファイルは、ハンドラを invoke しない
        if name of this_item is not in excludes then
          my itemHandler(this_folder, this_item, results)
        end if
      end tell
    end repeat
  on error error_message number error_number
    display dialog error_message
  end try
end adding folder items to

-- 準備
on preparation(this_folder, these_items)
  -- ファイル移動のための準備
  set today_foldername to my getCurrentDate()
  tell application "Finder"
    -- 今日の日付のフォルダがない時は作る
    if not (exists folder today_foldername of this_folder) then
      make new folder at this_folder with properties {name:today_foldername}
    end if
    folder today_foldername of this_folder
  end tell
end preparation

-- 各項目に対する処理
on itemHandler(this_folder, this_item, target_folder)
  -- 追加された項目を今日の日付のフォルダに格納する
  tell application "Finder"
    considering application responses
      move this_item to the target_folder
    end considering
  end tell
end itemHandler

on getCurrentDate()
  -- yyyy-mm-dd のフォーマットで日付を取得する
  do shell script "date +%Y-%m-%d"
end getCurrentDate

2009年2月25日水曜日

Mac OS X のスリープ

Mac OS X のスリープモードは 3種類あります。これらの違いを以下の表に示します。

No名称スリープモードへ移行時、メモリをHDDにスリープモードから復帰時、HDDからメモリへスリープ中の電源
0スリープ待避しない読み込まない省電力モード
1ハイバネーション待避する読み込む
3セーフスリープ待避する読み込まない省電力モード

No は pmset というコマンドでスリープモードを指定する時の数値です。

  • 0 は最もオーソドックスなスリープで、スリープ状態への移行およびスリープからの復帰が高速であるが、スリープ中にバッテリがなくなる等、電源が切れた時は、システムはクラッシュする。
  • 1はメインメモリの内容をHDDに書き出してからスリープし、復帰時にはHDDからメモリへ書き戻す。スリープ中は電源を必要としないが、スリープ状態への移行および復帰は最も遅い。
  • 3は0と1の中間で、万が一の電源断に備えてメインメモリの内容をHDDに書き出すが、スリープ中もメインメモリの内容を保持し続ける。スリープ状態への移行は 1 と同じ時間を要するが、スリープからの復帰は 0 と同様に高速である。

工場出荷時では、デスクトップマシンは 0 が、ノートブックでは 3 が指定されています。

運用からスリープを考える

ノートブックタイプのマシンで、バッテリを節約しなければならない局面は多いものです。しかし、デフォルトのセーフスリープでは、こまめなスリープが却って仇になります。

セーフスリープでは、スリープの度に、メモリの内容を HDD に書き出します。このために 30秒くらいかかります。この間、HDD は回りっぱなしです。これでは、本体を動かすのも恐いですね。

また、移動や睡眠などで長時間使わないのが分かりきっている時には、ハイバネーションさせて電池の消耗を抑えたいものです。

こうした要求から、スリープモードを使い分けられると便利です。

以下には、お使いの Macintosh を安全でない設定に変更する方法が書かれています。自己責任で設定を変更してください。

切り替えるには、Terminal.app から、次のようにタイプします。

% sudo pmset -a hibernatemode 0

root 権限が必要です。0 の部分を、上記の表の数字にしてください。

つぶやき

公開していない (リンク張っていない) はずなのに、なぜか旧サイトの中でもこのページは大人気でした…。なぜ公開していないかというと、間違いが含まれていたからです。それにしても、どうやって見つけたんでしょう?

スリープさせるためのスクリプトについては、別の記事で紹介します。

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 追記)