suztomoの日記

2008-04-05

[][]iPod touchのAFPd便利

ごろごろしながらiPod touchでPDFやウェブサイトを見るのは素敵。でもPDFファイルなどの転送が面倒ですよね。せっかく先日MacBookを買ったのでAFPdというアプリをiPod touchに入れてみました。AFPdはinstaller.appのNetworkの項目にあります。

AFPdを起動すると、iPod touchをAFPというファイル転送プロトコルのサーバとして動かすことができます。AFPdはAFPのサーバなので、Finderの「移動>サーバへ接続」でiPod touchのディスクをマウントできる。*1このときにiPod touchのアカウント/パスワードが必要です。

一度接続できると、touchがスリープしない限りはMacintosh HDと同じようにファイルの読み書きが行えます。

AFPdでマウントできるよ

便利な使い方としては、

  • Safariのファイル>プリントからPDFで保存するものを選ぶ
  • 保存先に上のiPod touch上のディレクトリを指定する

こうすることで、わざわざWinSCPやscpコマンドで転送する必要がなくなります。

もちろんここで保存するディレクトリはLighttpdやPDFViewerで指定されたディレクトリです。

そうして今見ているウェブサイトをiPod touchに保存することで、あとからごろごろしながらページを見られるわけです。

上の写真はWikipediaのJPEGの項目をPDFにして、LighttpdのドキュメントルートであるSitesの下のdocsというディレクトリに保存したところです。WikipediaはきれいにPDFになってくれました。

*1:つまりFinderでは標準でAFPのクライアントになれる。Windowsは知らない。良いAFPのアプリありますか?

2008-03-16

[]MobileCal.appの使うデータベースを探検してみた

iPod touchのカレンダー(MobileCal.app)のデータをGoogleCalendarと同期させたいなと思ったので、中身を探ってみた。*1ソフトを組める段階にはならなかったが、いろいろわかったので、メモ。

ぐぐってみるとメモ帳やカレンダーはsqlite3を使っているらしく、sqlite3コマンドを使えばデータベースの中身を見られるらしい。というわけでsqlite3を入れて、探検してみた。

参考 > no title

# sqlite3 /private/var/mobile/Library/Calendar/Calendar.sqlitedb
SQLite version 3.4.1
Enter ".help" for instructions
sqlite> .tables
Alarm                      OccurrenceCache
AlarmChanges               OccurrenceCacheDays
Calendar                   Recurrence
CalendarChanges            RecurrenceChanges
Event                      Task
EventChanges               TaskChanges
EventExceptionDate         _SqliteDatabaseProperties

予定が作成されるEventテーブルの中身はこんなかんじ。

sqlite> select * from Event where description like "%Google%";
ROWID|summary|location|description|start_date|start_tz|end_date|all_day|calendar_id|orig_event_id|orig_start_date
2|てすてす|todai|GoogleCalendar|227397600|Asia/Tokyo|227401200|0|1|0|0

ここでstart_date, end_dateが変な数字として登録されている。数字の羅列だからunixtimeかと思ったけどそうでもなさそう。

で、とある日時から3600や86400をかけたり引いたりして調べたら2001年1月1日0時0分0秒を基準にしている秒数だった。しかもJST(日本標準時)だとさらに9時間ずれるので、9*3600を引いているのだった。

こんなのをいちいち手で計算するのが面倒なのでdateコマンドをPerlから呼び出して計算するスクリプトを書いた。Perlを選んだのはシェルスクリプトは数字の計算に向かなそうだったので。

#!/usr/bin/perl -w
# Calculate seconds of MobileCal.app

if (!$ARGV[0]) {
  exit;
}

$str = 'date --date="2008'. $ARGV[0]. '" +"%s"';
$target = `$str`;
$offset = `date --date='20010101 00:00' +"%s"`;

# For MobileCal.app seconds must be subbed by 3600*9 (Tokyo/Japan)
print $target - $offset - 3600*9;

print "\n";

シェルの出力を取り出すバッククォートを使ってみました。きっとPerlのdate関数でもいけるんだろうな。

使い方はこんなの。2008年の時間しかだせません。

/home/tsuzuki% perl date.pl "0404 10:00"
228963600

はい、どうでもいいですね。

今日はこんなスクリプトを使ってsqliteからMobileCal.appの予定を追加することに成功しました、という話です。

ちなみにMobileCal.appのデータベースに予定を追加したときは、追加したことを表すテーブル(EventChanges)や、予定のサマリーを入れているテーブル(OccurrenceCache, OccurrenceCacheDays)も更新しないといけないようです。Eventテーブルだけを更新すると、MobileCal.appの「月」タブでは表示されている予定が「リスト」タブでは表示されない、などといったことが起こります。逆に言えばsqliteを使ってデータベース内の必要なテーブルを変更してしまえば、カレンダーのデータをいじくることができます。

*1:SyncML2iPhone.comというそれっぽいソフトがあったのだが、うまく動かないので自分で作ってみようかなと思ったり。

2008-03-11

[]iPod touch で Package download failed!

iPod touchをJailbreakした友達が困っていました。

ZiPhone*1を使って1.1.4、Installerのバージョンは3.0で、パッケージをインストールしようとすると

Package download failed!

という表示が出る。どのアプリをインストールしようとしてもこのエラーが出る。

エラーメッセージを検索しても古い情報だったり別の話ばっかりであてにならない。ipod touchのJailbreakは数週間の単位で情報が古くなってしまう。

というわけで外国のサイトを見つけて解決しました。

答え

Installerを起動させたのち、Homeボタンを7秒間長押ししてInstallerを落とせばおk。

*1:「Jailbreak」ボタンの連続クリックの方法を5回やったらようやく成功しましたよ