Pages

2011-07-05

SafariというかWebKitのWebArchiveについて

Safariで閲覧中のページを保存しようとしたとき、保存形式に「Webアーカイブ」ってのが選べますよね。そのページで利用されているリソース一式が1つのファイルを保存できる便利なアレです。

CocoaでWebアーカイブを扱う方法

そのWebアーカイブをCocoaで扱うには、WebKitのWerArchiveというドンピシャな名前のクラスを使います。次のようにすることでWebViewで表示中のページのWebアーカイブを取り出すことができます。

WebArchive *archive = [[[webView mainFrame] dataSource] webArchive];

ここで得られたWebArchiveオブジェクトは- dataというインスタンスメソッドを持っていて、そこで返されるNSDataオブジェクトをファイルに書き込むことでWebアーカイブファイルを作成することができます(拡張子を.webarchiveにすればSafariでちゃんと開けます!)。

また、WebアーカイブファイルをNSDataとして読み込めば、そこからWebArchiveオブジェクトを生成してWebViewに読み込ませることができます。

WebArchive *archive = [[[WebArchive alloc] initWithData:webArchiveFileData] autorelease];
[[webView mainFrame] loadArchive:archive];

Webアーカイブの中身

Webアーカイブの中身はバイナリplistです。試しに.webarchiveファイルをProperty List Editorにドロップしてみればちゃんと中身を見ることができます。plistということは、中の構造さえわかってしまえばWebKitを使わなくてもCocoaからあんなことやこんなことができちゃうわけです。というわけでplistの内容をチェックしていきましょう。WebアーカイブplistのルートはDictionaryになっています。

WebMainResource
Dictionary。周辺リソースではなくそのページ本体について、以下のキーをもちます。
WebResourceData
Data。本体のデータです。HTMLページの場合はそのHTMLをNSData形式にしたものが入ります。
WebResourceFrameName
String。ここでは空欄。WebSubframeArchives絡み(後述)で使います
WebResourceMIMEType
String。そのまま。text/htmlとか。
WebResourceTextEncodingName
String。UTF-8とか。
WebResourceURL
String。その本体リソースが本来あったURL。
WebSubframeArchives
Array。後述。
WebSubresources
Array。ページに埋め込まれている画像やスクリプト等の外部リソースについて、(WebMainResourceと同じように)WebResourceData、WebResourceMIMEType、WebResourceURLのキーを使ってDIctionaryを作り、Arrayに追加していきます。SafariやWebKitが作ったWebアーカイブにはこれらの他にもリソース取得時のNSHTTPURLResponseインスタンスがWebResourceResponseというキーでアーカイブされているのですが、これを消しても正常に表示できるようなので、要調査。

WebSubframeArchivesは、frame、iframe、objectといった要素で埋め込まれた外部ページのWebアーカイブをそのまま追加します。つまり、a.htmlの中のフレームにb.htmlが読み込まれている場合、a.htmlのWebアーカイブしようとする場合には先にb.htmlのWebアーカイブを作成し、その結果をこのWebSubframeArchivesのArrayの要素として追加する必要があります。このときのb.htmlのアーカイブは、さっきは空欄にしたWebResourceFrameNameにa.htmlでのフレーム名が入ります。

おわりに

上で見たように、WebアーカイブはただのplistなのでCocoaから簡単にいじることができるので、単なるファイル保存用途にとどまらず、いろいろな活用法があるかもしれません。CocoaじゃなくてもWindowsならCFLiteを使えば多分plistを扱えるとおもうので、ここはおひとつ試してみてはいかがでしょうか。

2011-06-21

Xcodeのビルド完了をサウンドで知らせる

突然ですが、MSDNからWindows Azure公認キャラクターのイラストやサンプルボイスが入手できるようになったことが一部で話題になってたりするので、せっかくなのでこのサンプルボイスをXcodeでのビルド完了時に自動的に鳴らすようにしてみましょう。

手順1:MSDNからサンプルボイスが入ったzipをダウンロードして展開。

手順2:Xcodeでビルド完了を通知したいターゲットを選んで「新規ビルドフェーズ→新規スクリプトを実行」を選択。スクリプト欄に以下を入力

afplay {サンプルボイスへのパス}

ちなみに33build.wavにすれば「ビルド完了!」って言ってくれる。作ったビルドフェーズは一番下においておく。こんな感じ↓

Claudia Xcode build

あとは普通にビルドすれば、完了時に「ビルド完了!」ってお知らせしてくれます。

……いや、だって、「ビルド完了」なんて言ってるボイスってこれくらいしか使い道がないじゃないですかこれ。

2011-03-18

MSN Japan提供の計画停電カレンダーをGoogleカレンダーで利用する方法

MSN Japanが東京電力の計画停電カレンダーを公開しました。OutlookやWindows Live用と書かれていますが、普通のWebCalなので他の対応アプリでも使用することができます。そこで、私が常用しているGoogleカレンダーで利用する方法を記しておきます。

  1. 東日本大震災(東北地方太平洋沖地震)情報サイト - MSN Japanへアクセスし、「OutlookやWindows Live Hotmail で利用できるカレンダーをダウンロード」という見出しの下にある該当するグループの「Outlook に追加する」というリンクのURLをコピーします。

    110318-0002

  2. Googleカレンダーにアクセスし、右下の「他のカレンダー」と書かれている下にある「追加」をクリックし、「URLで追加」を選択します。

    110318-0004

  3. URLの入力欄が現れるので、さきほどコピーしたURLを貼り付け、「カレンダーを公開」をクリックします。

    110318-0005

以上の手順でGoogleカレンダーに停電予定を追加できます。

2010-12-10

iCalと連携するカレンダーアプリ “Caliander"

Little Marauderが、CalianderというOSX用アプリのβ版を公開していました。iCalとデータを共有するカレンダーアプリで、横方向に伸びるバーで視覚的に予定を確認することができます。正式版はシェアウェアになるそうです。

Caliander 1

Calianderの特徴は、簡単に予定を作成できることです。cmd + Nをタイプすると、予定作成のためのパネルが現れます。

Caliander 2

ここで、Descriptionフィールドにフォーカスがあたっているので、そこにそのまま“tomorrow 13:30 - 14:30 会議"と入力します。すると、パネル上部の日時欄やタイトル欄が自動的に埋まります。

Caliander 3

OKボタンを押すと、その予定が登録されます。

Caliander 4

長々と書いてしまいましたが、予定を登録するために行ったことは、cmd + Nをタイプして“tomorrow 13:30 - 14:30 会議"を入力し、returnをタイプしただけで、iCalよりも大分手順が短縮されていて、すばやく予定を追加することができます。開発元は5倍早いと謳っています。

予定は横方向の棒状に表現されますが、この縮尺はマウスをドラッグすることで変更できます。このときの動きもなかなか気持ちいいです。

Caliander 5

なお、現バージョンでは、iCal上で「委任」と表示されるカレンダーは扱えないので、Googleカレンダーをバリバリ使っているような人には使い辛いかもしれません(おそらくCalendarStoreフレームワークの制限によると思われます)。

2010-10-19

Favstarが数ヶ月以内にAPIを公開(かも)

Favstar.fmというTwitterのFavoritesを集計してくれるサービスがあります。いわばふぁぼったーの海外版ですが、iPhoneの公式クライアントから見られたり、RT数も確認できたりするので使ってる人も多いんじゃないでしょうか。そのFavstarからAPIの公開に関するツイートが。

Developers, if you voted for a Favstar API to be introduced, I have just sent you an email if your email is correct. http://bit.ly/akDWzdless than a minute ago via Tweetie for Mac

「フォーラム内にあるAPI公開を求めるスレッドに投票すればとりあえずメール送るよ」ということなので、早速投票してみました。

するとすぐにFavstarからメールが送られてきて、それによるとFavstarはAPI公開に前向きであるとこのと。内容を簡単にまとめるとこんな感じ。

  • 数ヶ月以内に実装したい。でもその前にTwitterの許可が必要。無断でツイートを再配信することは禁じられてるからね。
  • 実は前にもTwitterに頼んだことがあるんだけど、いい反応はなかったんだ。
  • だからFavstarのAPI公開がTwitterのエコシステムにも好影響を与えることをわからせる必要があるんだ。だから色々手伝って欲しい。
    • FavstarのAPIに興味を持ってる人がいたら、ぜひフォーラムへの投票を呼びかけて欲しい。
    • もしAPIを使ってなにか作るつもりなら、ぜひこっそり教えて欲しい。Twitterとの交渉材料にしたいからね。
    • ていうかTwitterを説得させる方法を知ってたら教えて欲しい。
    • もしツイートの再配信をしているAPIを提供しているサービスを知っていたら、是非教えて欲しい。

FavstarのAPIが公開されれば色々と面白いサービスが出てきたりするかもしれませんし、興味のある人はフォーラムに投票してみてはどうでしょうか。