How to sync old iOS devices with MobileMe (or iCloud)?

雲の上に乗り損ねたモノたち

少し前の話になりますが、アップルのクラウドサービスである MobileMe は古い世代の OS をサポートしません、とサポート記事に記載があります。そのシステム要件を見ると、

・iPhone、iPad、iPod touch は iOS 4.2 以降。
・Mac は Mac OS X v10.6.7 以降。
・PC は Microsoft Outlook 2007 または 2010(32-bit バージョン)。Windows 用 MobileMe コントロールパネル 1.6.5以上。

となっています。2 世代サポートといったところでしょうか。PowerPC や iOS 3.1.3 以下の iPod touch は EOS であるとも言えます。

とはいえ壊れていないものを廃棄するのも名残惜しいものです。どうにかならないでしょうか。先ほどの記事を良く読むと10.5.8以前でも制約はあるものの、MobileMeとの同期が可能なようで、別記事へのリンクが存在します。手順としては

・iCal の「環境設定」を開きます。
・「アカウント」をクリックします。
・下部にある「+」ボタンをクリックします。
・「説明」と「ユーザ名」には完全な MobileMe メールアドレス (@me.com または @mac.com を含む) を入力します。
・MobileMe パスワードを入力します。
・「サーバオプション」の隣にある詳細表示の三角形をクリックします。
・「アカウントの URL」に「 https://cal.me.com 」と入力します (括弧を除く)。
・「追加」をクリックします。

となっており、要するに手動でCalDAVアカウントとして設定を行っているようです。ということはiOS 3.1.3のデバイスも同様に

・「設定」を開きます。
・「メール/連絡先/カレンダー」をタップします。
・リストの下部にある「アカウントの追加…」をタップします。
・カレンダー項目の「CalDAVアカウントを追加」をタップします。
・「サーバ」に「 https://cal.me.com 」と入力します (括弧を除く)。
・「ユーザ名」には完全な MobileMe メールアドレス (@me.com または @mac.com を含む) を入力します。
・「パスワード」にMobileMe パスワードを入力します。
・「次へ」をタップします。

でOTAな設定が可能ということになります。
仮にクライアントが10.6以降で、iOS のみ 3.1.3 のデバイスの場合には入力が面倒であれば iTunes に接続して、

・iTunes のソースリストから「デバイス」項目にある自分の iOS デバイスをクリックします。
・メインパネルにある「情報」タプをクリックします。
・「カレンダーを同期」のチェックボックスをオンにします。
・「同期」をクリックします。

この方法で行えば、接続時のみのローカル同期も可能になります。ただ、この場合は来るべき iCloud になると移行できない可能性もありますので、面倒でもCalDAV クライアントとして設定してしまうのが良いでしょう。もしくは iCloud 非対応端末を切り替えるか、という選択肢を求められているのかもしれません。信心が試されるわけですね。

0 comments

Accesses to Dozens API via Shell Script

巨人の死

無料で高性能、ダイナミック DNS まで使えた EveryDNS.net が 2011年8月末をもって終了し、DynDNS に移行します。無償プランがあれば良かったのですが、独自ドメインの運用に関しては有料とのこと。ネットでもユーザの悲鳴のようなものが散見し、EveryDNS というサービスの大きさと偉大さを思い知らされます。
かくいう我が家の場合も、ダイナミック DNS が必要な上に Google Groups や MobileMe のパーソナルドメインを運用していることもあり、レコード数も18個くらい必要でなかなかのコストになりそうです。固定 IP を取得して DNS を自宅で賄うことも考えましたが、その前にどうにかならないかと思いぎりぎりまで他のサービスを探してみることにしました。

新たな出会い

そこでぐぐってみたところ、国産のサービスに出会いました。Dozens(ダズンス)です。ちょうど EveryDNS ユーザ向けに通常12レコードまで無料のところをもう12レコードまで追加してくれるという大変太っ腹なキャンペーンも展開されており、飛びつきました。当初は「ダイナミック DNS には現在非対応」と FAQ に記載されていることもあり、ダイナミック DNS に関しては機能追加までは諦めて、外から繋がらなくなったら更新すれば良いか…くらいで考えていました。

素晴らしきかな API

ところが、サイトをよく見ると API ドキュメントがあります。しかも REST。ということは curl コマンドで行けるんじゃないかなと思い至りました。グローバル IP を取得して、指定したレコードをアップロードする。これをスケジュールを決めて定期的にアクセスすれば結果的にダイナミック DNS と同じような振る舞いができるのではないかと。Dozens の松田さんにもご協力いただき(無料ユーザなのにほんとうにお手数おかけします)、dynamicIPUpdate.sh として GitHub にソースコードを公開しました。

Readme にも記載しましたが最初の数行に、Dozens ユーザ名、API Key、ドメイン名、更新したい A レコードのFQDN を上書きして実行権限を与えてやれば、
$ ./dynamicIPUpdate.sh
で自動更新します。
我が家はこれを launchctl でスケジュール化し、1時間おきに更新する予定です。もちろん crontab でも良いでしょう。*nix ユーザの方なら使っていただけるのではないでしょうか。

作業メモ的なもの

GitHub にシェルスクリプトを公開しているので、見ればわかるという話もありますが自分の頭の整理も含めて何をしたかを記録しておきます。
まず、最初に必要なのはグローバル IP の確認です。これは ifconfig.me を利用しています。コマンドラインでの利用を想定されており、
$ curl ifconfig.me
でアクセスすると IP アドレスだけを返してくれるのでこれを変数として利用することにします。

次に Dozens API ですが、最初に token を取得します。期限が24時間の時限制なのとリクエストするたびに新しい token をもらえるので毎回アクセス時に新しいものをもらっておくことにしました。結果は
{"auth_token":"6cfb3debbbac7d144e9eb7b701f79c2225bd6646"}
という形式で返ってくるので、sed で削って X-Auth-Token の値だけを取得します。

レコードの情報は、http://dozens.jp/api/zonename.json (zonename には実際のドメイン名)から取得できるので、
$ curl http://dozens.jp/api/record/zonename.json -H "X-Auth-Token:6cfb3debbbac7d144e9eb7b701f79c2225bd6646"
のような形式で GET すると 下記のようなJSON形式でリストが返ってきます。
{"record":[{"id":"1","name":"www.dozens.jp","type":"A","prio":null,"content":"192.168.1.80","ttl":"7200"},{"id":"2","name":"ghost_cname_auth.dozens.jp","type":"CNAME","prio":null,"content":"ghs.google.com","ttl":"7200"},{"id":"4","name":"dozens.jp","type":"MX","prio":"10","content":"ASPMX.L.GOOGLE.COM","ttl":"7200"},{"id":"11","name":"dozens.jp","type":"TXT","prio":null,"content":"v=spf1 include:_spf.google.com ~all","ttl":"7200"}]}
ちなみにこれテキストに書き出すと改行されるのですが、コマンドラインだと改行されませんでした。嗚呼…。
やむを得ないので、tr でカンマを改行コードで区切って、grep -n でターゲットの位置を取得して、sed -n に受け渡してレコード id のみを取得しました。

これで、グローバル IP と、更新するべき id が取得できたので、
$ curl -d '{"prio":"","content":"xxx.xxx.xxx.xxx","ttl":"7200"}' -H "X-Auth-Token:6cfb3debbbac7d144e9eb7b701f79c2225bd6646" -H "Host: dozens.jp" -H "Content-Type:application/json" http://dozens.jp/api/record/update/recordid.json
のような形でPOSTします。
200が返って来て、IP アドレスが更新されていればOKです。

Dozens API はこれ以外にもレコードの追加や削除なども可能ですのでこちら方面へスクリプトを拡張も可能でしょう。
個人的には、API 越しにダイナミック DNS 的な挙動をしてくれれば充分なので、好きな方が GitHub のソースをフォークしてくれることを期待します。

0 comments

Screen capture in Lion

変わりゆくもの

Lion になってからスクリーンキャプチャの挙動が一部変化しました。
⇧⌘3(ウインドウ全体)は同じなのですが、⇧⌘4(選択範囲)をスペースキーでトグルしたときに使える「ウインドウのみ」が今までは保存のシート(Powerbox)が独立してショットが取れたのですが、今回はこんな感じに一緒になってしまいます。

Window capture behavior in Lion

これはこれで便利なんですが、シートだけ欲しい時もあるのです。ところが、切り替えの手段がない…。
プレビュー.app の「スクリーンショットを撮る」メニューは全く同じ動作をしてしまいますし、グラブ.app の「取り込み」メニューはドロップシャドウが付かない。残念ながら私の愛した「シートだけキャプチャ」は無くなってしまったようです。

同志あらわる

と思いきや、志を同じくする仲間がいらっしゃいました。
@sazameki さんです。
彼はシェルスクリプトにある screencapture コマンドを利用することで古き良き「シートだけキャプチャ」ができることを発見し、アプリを作られました。
素晴らしいことにソースコードも公開され、どの引数が適当なのかもばっちりです。
僕はこれを改良し、「シートだけキャプチャしてデスクトップにpng形式で保存する」という部分までの再現を試みました。それが「Capture Window (previous style)」です。

ダウンロードとインストール

まず添付のzipファイルをダウンロードし、zipファイルのままであれば解凍してください。

ダウンロードファイル:"CaptureWindow.zip"

するとAutomatorのサービスファイルが取得できるはずです。

Download file
これをダブルクリックするとインストールするかどうかのダイアログが表示されます。「インストール」を選択するとサービスとして組み込まれます。パスは ~/Library/Services/ と、Snow Leopard と同様なので個人で使うのならこのままでOKですし、他のユーザでも使用したければ /Library/Services/ へ引っ越しすることをおすすめします。

Service installer
これでコマンドは組み込まれました。あとはシステム環境設定.appの「キーボード」項目を開いて、「キーボードショートカット」タブを選択します。「サービス」の「一般」の項目に先ほど追加した「Capture Window (previous style)」があると思います。右端をクリックするとショートカットキーを割当られるので他のショートカットと被らないように割り当てます。ここでは⇧⌘5としてみました。

"Keybotad" setting in System Preferences

あとは実行するだけ

これで設定は完了です。⇧⌘5で起動してキャプチャをとるとずばり狙い通りのショットが撮れます。ハラショー!!
ファイル名の生成ルールは scrrenshot + タイムスタンプ(UNIXTIME) +.png をデスクトップに作成するようにしています。
細かいところは Automator で再編集が可能ですのでお好きにどうぞ。

Window capture (previous style)

0 comments

iMovie '11 : File directories and role

先だっての仕分け大会で、iMovieのファイルの置き場所とその役割についてさまざまな条件があることがわかりました。そこで今回はさらに掘り下げて「iMovieが正しく動作するディレクトリ配置条件」について検証してみます。

フォルダの役割

iMovieは「iMovie イベント(iMovie Events.localized)」と「iMovie プロジェクト(iMovie Projects.localized)」という2種類のディレクトリで構成されています。

【iMovie イベント】

iMovie イベント
「iMovie イベント」にはビデオ素材が格納されます。
その他にiMovie Data / iMovie Movie Cache(合成データなどのキャッシュ) / iMovie Stabilization(手ぶれ補正の解析データ)/ iMovie Thumbnails (サムネイルをスクラブ再生する際に使用するプロシキデータ Motion JPEG形式) / iMovie Waveforms(波形データのサムネイル)が生成されていますが、これらは削除された場合にはビデオ素材だけあれば再度作り直すことが可能です。

ドロップボックスの読み込み表示
また、今回から「iMovie ドロップボックス(iMovie Drop Box.localized)」が作られました。ここにビデオファイルを追加すると、次回のiMovie '11 起動時に読み込むかどうかの確認ダイアログが表示されます。

【iMovie プロジェクト】

iMovie プロジェクト
iMovieで作成されたプロジェクトファイルが格納されています。それぞれのファイルは「雪遊び.rcproject」のような形式になっており、実態はパッケージファイルです。

rcprojectファイルの中身
この中にはプロジェクト用のプロキシファイルやBGMで使用しているファイル、どのイベントの素材のどのタイムコード長を使用しているのかという情報ファイルなどが格納されています。このように iMovie '09(バージョン7以降)プロジェクトは Final Cut ファミリー同様使用しているファイルを参照しているため、2種類のディレクトリで構成されています。

フォルダの配置
iMovie のデータのデフォルトサーチパスは
~/Movies/iMovie Events.localized
~/Movies/iMovie Projects.localized
になります。起動ボリュームではこれ以外の場所は受け付けないようです。

このほかに DAS で繋いだハードディスクのルート直下に配置した iMovie Events.localized と Movie Projects.localized をサーチパスとして認識します。仕分け大会でも検証しましたが、AFP や NFS などネットワークマウントした共有ポイントも使えません。このためネットワークホームでログインしたユーザが iMovie でイベントなりプロジェクトを作成しようとすると DAS で接続されている /Volumes/Macintosh HD/ 直下に iMovie Events.localized と Movie Projects.localized を作成しようとし、結果アクセス権がない場合にはエラーになります(ある意味正しい動作?)。ちょっと面白い挙動としては iMovie Projects.localized の中にフォルダを作ってネストするのは可能です。iMovie '11 の中に「ファイル>新規フォルダ…」メニューがありますが、これは手動でディレクトリを作成して起動しても同じように動作します。

一度整理すると理解できますが、正直 Finder で操作するよりも iMovie の GUI から全部操作ができるので、ユーザ自身で操作させた方がヒューマンエラーは極端に減ります。iLife アプリケーションも iPhoto、iTunes に引き続き iMovie も'08 以降は Finder 不要の仕様路線で確定しつつあります。iPhone 出る前からちゃんと仕込んでいたんですね。恐ろしい子です。

0 comments

iMovie '11 : Movie Trailer has small gap between Japanese and English environment

iMovie '11 のデモサンプルを見てて気づいたんですが、「映画予告編」の字幕機能が UI 表示言語が英語版と日本語版で実装が異なります。

検証方法としては

  • システム環境設定で「言語とテキスト」パネルの「言語」タブから優先順位を変更
  • iMovieを起動
  • 新規プロジェクトを作成
  • テーマを「映画予告編」の「ブロックバスター」を選択
この手法で英語や日本語に切り替えてチェックしまいした。その結果。

日本語環境では字幕がですが…


英語環境ではこの二行表示できるように分かれています。一部では分かれているテーマもあるのでバグではなく仕様のようですが。回避策としては行ったん英語に切り替えて「映画予告編」を作成し、日本語環境に戻せばそのまま使用できます。これ、英語版でも日本語入力できるので揃えてほしいなあ…。


一番良いのを頼む。

0 comments

iPhoto '11 : What's change about Slideshow for "Share to iDVD" behavior?

iPhoto '11になってから変更された挙動のひとつにスライドショーの書き出しがあります。

Send to iDVD以前はこのメニューを実行すると、~/Pictures/iPhoto Slideshow/にムービーデータが書き出されてiDVDで利用されていましたが、今回のバージョンからこれが無くなっており.qtzファイルをそのままMPEG-2にレンダリングしているようです。お陰でiDVDへの転送時間が劇的に短くなっています。


テンポラリファイル
一瞬フォルダにテンポラリファイルが作成されますが、iDVDがそれを読み込むと削除しています。このmtgファイルは中身はバイナリで、Stringsコマンドで覗いていましたがQuartz Composerの設定ファイルのようなものが書いてありました。


プロジェクト
メディアとして読み込まれる素材もこんな感じで、このタイミングではまだエンコードされません。iDVDのバージョンが上がったのはここに理由があるのかもしれません。


0 comments

Performance tuning for $ asr in depth.

ここに 10.6 上で $ asr コマンドでのパフォーマンスチューニングを行う際に起きている問題について語り合うスレッドです。

Update Information
10.6.3 にアップデートしたところ $ asr に新しいオプションが追加されています。
About 10.6.3 Update
カタログファイルが断片化されているイメージを復元するために asr コマンドで「 --allow fragmented catalog 」オプションを使用出来るようになりました。詳細については、ターミナルで「 man asr 」と入力してください。

オプションの種類について

$ asr のオプションには大きく分けて 3つのグループがあります。
■ imagescan
配布するディスクイメージを作成・調整するために必要なオプショングループです。
■ restore
復元を実行するオプショングループです。後述する server オプションと対で使う場合にはクライアント制御に使用します。
■ server
ディスクイメージをマルチキャストで配布するための asr server を設置・実行するためのオプショングループです。

イメージの最適化

(準備中)

マルチキャストサーバの最適化

マルチキャストサーバを実行するには任意の名前を持つ config ファイルが必須になります。これは plist 形式で作成します。
コマンドで生成するならば
$ defaults write ~/Library/Preferences/com.example.asr [paramater]
のような形式になります。

次に必須パラメータですが、これは2つになります。
■Data Rate
これは -int で指定します。バイト単位なので 8Mbps で配布したい場合には 1000000 になります。
この場合は
$ defaults write ~/Library/Preferences/com.example.asr 'Data Rate' -int 1000000
のように記述します。

値の論理的な上限は特に無いようですが、イメージのサイズ(リストア時間?)によって最適な数字が変わるようです。
・5GB のイメージの場合 -int 50000000(50MB / 400Mbps)までは設定可能でした。
・200GB のイメージの場合 int 15000000(15MB / 120Mbps)まで落とさないと失敗し続けます。
長時間化すればするほどパケットの取りこぼしが出るようです。このデバッグは tcpdump でログが取れるレベルではない(テキストベースで数GBになります)のでクライアント側で取得するオプションで解析するのがベターです(具体的な手法は後述)。

■Multicast Address
使用するマルチキャストアドレスを指定します。グローバルスコープの範囲は 224.0.1.0 から 232.255.255.255 の間が安全域です。
この場合は
$ defaults write ~/Library/Preferences/com.example.asr 'Multicast Address' 224.0.1.0
のように記述します。
オプションパラメータがあります。
■Client Data Rate
ターゲットとなるクライアントのディスク書き込みの最低速度を指定します。この値を設定すると、asr は Data Rate と Client Data Rate から最適なビットレートを計算する、とマニュアルには記述があります。

■DNS Service Discovery
Bonjour による検索を許可するかの bool 値になります。デフォルトは true です。

■Loop Suspend
マルチキャストはパケットの取りこぼしに対する「再送」を行いますが、その上限回数を設定します。デフォルトは0(永続的にマルチキャスト再送)です。

■Multicast TTL
パケット取得のための Time to Live を設定します。デフォルトは3です。

■Port
デフォルトで指定されている7800を利用できない/したくない際に設定します。

リストア(クライアント側)の最適化

(準備中)

オンラインで読める man asr : manpagez

0 comments