2009年5月27日水曜日

ThumbTacks 発売

ThumbTacks がようやく日本でも発売されました。早速買ってきました。本体はゴムなのかな、と思っていたら、固めのプラスチックでしたので、安心して抜き差しできます。

私はアキバヨドバシで 1,980円で買いました。今のところは、この値段が相場のようです。

購入したきっかけは、古い iPod で使用していたマイク (Dock コネクタ接続タイプ) と、iPod touch のケース (TUNEWEAR iPod Touch第2世代用本革ケース) が干渉するためです。ケースに入れたまま、iPod touch で録音できるようになりました。(後で写真を載せます。)

2009年5月10日日曜日

Bento 2.0.4 リリース…だが…

Mac 専用パーソナルデータベースソフト Bento 2 のバージョン 2.0.4 へのアップデータが公開されました。 iPhone / iPod Touch 版の Bento も公開され、これとのデータ同期と、Bento 2 のパフォーマンスの改善が主な改良点です。

毎度期待している AppleScript のサポート改善は、今回もありませんでした。

確認されている不具合

過去のバージョン (2.0.3 以前) には、希に iCal イベントに重複レコードが発生するというバグがありました。重複レコードが発生しているデータベースを Bento 2.0.4 に読み込ませた場合、Bento 2 を起動する度に、以下の現象が発生します。

  • エラーが発生したので終了する、というダイアログが出るが、実際には終了しない。
  • すべての iCal イベントが重複レコードとしてコピーされる。

起動する度に、iCal イベントが増えていくので、たまったものではありません。なお、重複レコードが発生した場合、Bento から削除することはできません。同様の現象は、アドレスブックでも発生するという報告もあるようです。

一時的な解決策

Bento 2 の新しいアップデータが出るのを待つのが最良の選択です。が、それまでの間、Bento 2 が使えないのは困るという人向けに、Bento 2 のデータベースを直接操作して、重複レコードを削除するスクリプトを公開します。

以下の点を理解し、同意いただける方のみご利用ください。

  • Bento 2.0.4 専用です。
  • データ破壊、データ消失の可能性がありますので、必ずバックアップを取ってから実行してください。清野は、本スクリプトを使用した結果について一切の責任を免れるものとします。
  • 本スクリプトは iCal イベントの重複レコードを削除します。
  • 重複レコードのうち、最も古い (最初に追加された) レコードを残します。そうでないレコードが関連レコードとして参照されている場合、データベースに不整合が発生します。

私の環境では、このスクリプトにより不具合は解消され、正常に使えるようになっています。

-- Delete duplicated events from BentoDB.
-- Use this script AT YOUR OWN RISK.

property sqlite3 : "/usr/bin/sqlite3"
property bentodb : "/Users/your-account/Library/Application Support/Bento/bento.bentodb/Contents/Resources/Database"

on run
 set lastUUID to ""
 repeat with e in my getEvents()
  set the AppleScript's text item delimiters to "|"
  set pk to item 1 of (text items of e)
  set uuid to item 2 of (text items of e)
  if lastUUID is uuid then
   my delEvents(pk)
  else
   set lastUUID to uuid
  end if
 end repeat
end run

on getEvents()
 set the AppleScript's text item delimiters to ASCII character of 13
 text items of my doSQL("SELECT gnpk, gn_gnExternalUID FROM gn_lib_event ORDER BY gn_gnExternalUID ASC")
end getEvents

on delEvents(pk)
 my doSQL("DELETE FROM gn_lib_event WHERE gnpk = '" & pk & "'")
end delEvents

on doSQL(sql)
 do shell script sqlite3 & " '" & bentodb & "' '" & sql & "'"
end doSQL

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

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