Pages

2011-12-06

ブログを新しくしました。

新しいURLは http://takebayashi.asia/ です。

2011-09-20

Macのロジックボードを交換してもらいました

MacBook Pro Early 2008のロジックボードを交換してもらいました。タダで。

事の始まりは先々週の金曜日くらい。突然画面が乱れてフリーズするようになって、翌日には起動画面でフリーズするように。

仕方ないので先週の火曜日に渋谷のジーニアスバーに。ここで再現しなかったら恥ずかしいなーとか思いつつジーニアスな姉ちゃんに見せると起動画面フリーズを見事に再現。外付けディスクから起動するとカーネルパニックを起こすオマケ付き。

ジーニアスな姉ちゃんがいろいろ調べていくうちに、「GPUに問題がありますねえ」と一言。GPU?GPUっすか!?

私「GPUですか?」

ジ「はい」

私「GPUっていったら……アレですね?」

ジ「はい、アレですね」

アレっていったら、NVIDIAが盛大にやらかしてくれたアレのことですよね。アレ

というわけで、ロジックボードを無償交換してもらいました。先週の火曜日に預けて今日引き取ったので、ちょうど一週間。ジーニアスな姉ちゃんが「一週間くらいかかりますね」とか言ってたけどその通りでした。

ハードディスクの中身もちゃんと残ってたし、時計がリセットされてたくらいで他は元通りのMacになって帰ってきました。めでたしめでたし。

2011-07-25

LionのAppleScriptの新機能:Global script application targets

AppleScriptでは、他のアプリケーションを操作する際にtell application "Safari"といったように(ofを使わない限りは)tell構文を使う必要がありました。Lionでも基本的にこれは変わりませんが、スクリプト全体を通してtell先のアプリケーションが同じ場合、スクリプト全体のtell先を指定することでtell構文を省略できるようになりました。

この新機能を利用するためには、AppleScriptエディタの環境設定で「"tell application"ポップアップメニューを表示」というオプションを有効にします。

すると、エディタの編集部分の上に「tell cuurent application」というポップアップが現れるので、ここでアプリケーションを選択すると、スクリプト中でそのアプリケーションに対してtellする必要がなくなります。

例えば、

tell application "Safari"
 search the web for "applescript"
end tell

といったスクリプトは、先のポップアップでSafariを選択すれば、

search the web for "applescript"

だけでよくなります。

2011-07-24

ビュー・ベースのNSTableViewをさわってみたよ(その2) カスタムNSTableRowViewの設定方法

ビューベースのテーブルビューは、NSTableView → NSTableRowView → NSTableCellViewという階層構造になっています。

ところが、Xcode 4.1上のInterface BuilderでビューベースのテーブルビューはNSTableView → NSTableColumn → NSTableCellViewとなっていて、NSTableRowViewについてはInterface Builder上で直接さわれないようになっています。

NSTableRowViewのサブクラス(ここではMyTableRowViewとします)をInterface Builder上で設定するには、まずNSTableColumnの子(つまりNSTableCellViewと同じ階層)にカスタムビューを追加します。

つぎに、追加したビューを選択し、インスペクタでクラス名をMyTableRowViewにします。

最後に、User Interface Item IdentifierをNSTableViewRowViewKeyと設定すれば、カスタムクラスの設定は完了です。

わかってしまえば簡単ですが、なんともわかりにくいような……。

2011-07-23

ビュー・ベースのNSTableViewをさわってみたよ

Lionでましたね。世のCocoa系男子の皆さんはAPI Diffを見て興奮したり、新APIのGuideを眺めたり、各所をclass-dumpして廻ったりしていると思います。

さて、Lionではついに念願のビュー・ベース・テーブルビューがサポートされました。要するに、今までテーブルの中身はセルじゃないといけなかったのが、ビューを突っ込めるようになったということです。これで「プログレスバーがテーブルビューに入らない!」なんて騒ぐ必要がなくなりますね。NSCollectionView使えば同じようなことできるけど、そんなの知りません。

というわけで、ビューベースのテーブルを作ってみましょう。

Xcode 4.1内のInterface Builderでxibを開き、適当なウインドウにテーブルビューを追加します。そして、インスペクタの中にContent Modeっていう項目があるので、View Basedを選択します。

すると、NSTableColumnの直下にNSTableCellViewなんていうセルだかビューだかどっちなんだよって感じの名前のビューが追加されます。このビューがセルの代わりにテーブルコンテンツの表示を担います。

このNSTableCellViewをInterface Builderで適当にデザインしてあげましょう。ここでは画像とテキストを一つずつ表示するビューにしました。

次に、テーブルビューのコンテンツを保持するNSArrayControllerを追加し、これに対してバインディングを設定します。

まず、NSTableViewのcontentをNSArrayControllerのarrangedObjectsにバインドします。注意したいのは、従来のセルベースのテーブルではNSTableViewではなくNSTableColumnをNSArrayControllerにバインドしてたんだけど、ビューベースではNSTableViewにバインドしなければならないという点です。忘れがち。

次に、ビュー上のアイテムをバインドする必要があるわけですが、バインド先はNSTableCellViewにします。

あとは、NSArrayControllerに適当なコンテンツを設定するよよう実装してビルドして実装すれば、ビューベーステーブルの出来上がり。


ここで使ったプロジェクトをGitHubにおいておきます:ViewBasedTableSample

2011-07-06

libxml2を使って強引にWebアーカイブを作成する

前回のエントリで、WebArchive *archive = [[[webView mainFrame] dataSource] webArchive];とすることでWebアーカイブを得ることができると書きましたが、これはOSXにおけるWebViewの話で、iOSのUIWebViewではそもそもWebFrameやWebDataSourceにアクセスできないのでこの方法ではWebアーカイブを取得できず、別の方法でやってやる必要があります。

というわけで、libxml2です。Webアーカイブはplistで、その構造もわかっているので、必要なのはWebページの周辺リソースを洗い出すことなわけですが、これをlibxml2でやってやります。libxml2はOSX/iOSの両方で利用でき、非整形なHTMLでもある程度パースできるので、XPathで外部リソースの在り処を探し出してplistにくるんでやれば一応Webアーカイブができ上がります。ちなみに今回は下の3つのXPath式で探すことにしました。

//img[@src]
//script[@src]
//link[@rel='stylesheet'][@href]

これで外部の画像、スクリプト、スタイルシートを探し出し、前回のエントリで紹介したフォーマットでアーカイブすれば完成です。

一応動くものをGitHubに置いておきました。 stake/STWebArchiver - GitHub

ただしこの方法には欠点があって、HTML本体から直接参照されているリソースしか取得できません。たとえば、img要素で埋め込まれている画像は取得できますが、CSSで指定されている画像は取得できません。要するに中途半端です。じゃあ使いどころがないかといえば、そんなこともないです。CSSで画像を使った派手な装飾がされていなくて、テキスト中心で、たまに本文中に画像が埋め込まれてるようなページ(InstapaperとかInstapaperとかInstapaperとか)をアーカイブする時なんかには普通に有用な気がします。

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

2010-06-22

Safari機能拡張の紹介サイトいろいろ

Safari 5の公開から2週間ほどが経って、多くの機能拡張が公開されるのと一緒に多くの機能拡張まとめサイトが登場しました。有名どころも含めて私が見ているサイトをいくつか紹介したいと思います。

おそらく上3つはメジャー、下3つはマイナーなんじゃないかなと思ってます。safari-extensions.netなんかは(更新頻度は低いですけど)見やすいのでなかなか気に入っています。上記以外で「ココがオススメだよ!」みたいなのがあれば是非教えてください。

2010-06-18

s-take Blog は Takeba.me になりました

突然ですが、s-take Blog はURLとブログタイトルを新しくします。

新URL
http://blog.takeba.me/
新ブログ名
Takeba.me

5年ほど前にBloggerのアカウントを取得して以来ずっとblogspot.com上にブログを公開していたわけですが、.meドメインのセールに惹かれてしまってつい取得してしまい、どうせだからということでこのブログの公開に使うことにしました。

ブログ名はドメイン名と同じにしました。安直だけど、個人的にこれが一番覚えやすいと思ったので。

古いURLにアクセスした場合は自動的に新しいURLにリダイレクトされます。個別のエントリやRSSフィードもリダイレクトされるはずです。

今後ともTakeba.meを宜しくお願いします。

2010-06-17

Mafuyu 1.2とその他諸々

Googleの検索結果ページを拡張するSafari機能拡張Mafuyuをv1.2にアップデートしました。今までMafuyuはGoogle Sites上にホストされていましたが、今回Bitbucket.orgに移行しました。ダウンロードや使用方法等、Mafuyuに関するものはMafuyuのプロジェクトページからアクセスできます。

v1.2の新機能として、controlを押しながら数字をタイプすることで新規タブで検索結果を開けるようになりました。また、今まではgoogle.comとgoogle.co.jpのみの対応でしたが、今回からは計10ドメインに対応します。

なお、v1.2の注意点として、旧バージョンからの自動アップデートはできません。これはバンドル識別子の変更によるもので、環境設定パネルのアップデート画面にMafuyu 1.2の名前は表示されますが、失敗します。v1.2をインストールする際は、旧バージョンをあらかじめアンインストールしてから手動でv1.2をインストールしてください。

2010-06-10

Googleの検索結果からワンタッチで移動するSafari機能拡張

MafuyuというSafari機能拡張を作りました。これをインストールすると、Googleの検索結果の各項目に番号が表示されて、その番号をキーボードでタイプするだけでその検索結果を開くことが出来るようになります。例えば、検索結果のタイトルの隣に「1」と表示されていれば、1をタイプするだけでマウスを使わずにそのリンクを開けるようになります。

Mafuyu

当然ながらSafari 5が必要です。また、いまのところgoogle.comとgoogle.co.jpでしか動作しません。

2010-06-12追記

Mafuyu v1.1を公開しました。「検索結果を開く」以外にも、「前/次のページを開く」「検索フィールドにフォーカスを当てる」アクションを追加しました。

2010-06-08

ページ中のリンクから直接2chブラウザへ飛ぶSafari機能拡張

Safari 5が公開されましたね。もちろん目玉は機能拡張(エクステンション)のサポートです。FaceTimeなんかより全然目玉です。

機能拡張の作り方はSafari Dev Centerで公開されています。早い話がHTML5+JavaScriptです。色々な設定をするplistは機能拡張ビルダーを使えば簡単に編集できます。

というわけで、ページ中にある2ちゃんねるのスレッドへのリンクをクリックすると自動的に2ちゃんねるブラウザが起動してそのスレッドを開く機能拡張を作ってみました。

Minatsu

ThousandとBathyScapheに対応しています(環境設定で切り替えられます)。やってることは2ちゃんねるのスレッドと思われるURLのスキームをthousand:やbathyscaphe:に書き換えているだけです。

すでに同じような機能を実現するBookmarkletsがありますが、機能拡張にすることによってわざわざBookmarkletsをクリックしなくてもページを開いた時点で自動的にリンクを変換します。

初めての機能拡張の開発で色々と引っかかったところとかは後々どこかでまとめたいなあ…

2010-06-12追記

Minatsu v1.1を公開しました。公式p2を暫定的にサポートしました。

2010-02-12

Twitterによる簡易版OAuth: "xAuth"

最近にわかにTwitter APIのxAuth認証が話題になっています。これは主にデスクトップアプリケーション向けに用意される認証方式で、簡潔に言うと「Webブラウザで認証画面を開く必要のないOAuth」といったところです。

従来のOAuth認証ではまずアプリケーション(OAuthコンシューマ)がTwitterに接続してRequest Tokenを取得し、認証画面を開いてRequest Tokenを承認させ、承認されたRequest Tokenを使ってAccess TokenとToken Secretを取得することによって各APIにアクセスできるようになります。しかしこれはアプリケーション側の実装が複雑になる上、デスクトップアプリケーションの場合はわざわざWebブラウザへ切り替えなければならず(ブラウザを内包するものもありますが)、ユーザにとっても面倒なものです。

そこで提案されたのがxAuthで、これはRequest Tokenの取得と認証という手順を省きます。アプリケーションはユーザからユーザ名とパスワードを受け取り、それを用いてTwitterに問い合わせることでAccess TokenとToken Secretを直接取得することが出来ます。xAuthを用いればアプリケーション側の実装は簡単になり、ユーザもわざわざWebブラウザを使って認証する必要がなくなります。

OAuthにくらべてアプリケーション側もユーザ側も作業を簡略化できるxAuthですが、当然デメリットがあります。OAuthの利点の一つ、ユーザがアプリケーションにパスワードを預けなくても良いという点が完全に失われます。xAuthでは一度Access Tokenを取得してしまえばそれ以降パスワードは使用しませんが、アプリケーションがパスワードをちゃんと破棄したかどうかはユーザにはわかりません。もしかしたらこっそりパスワードを保存していて、裏でこそこそと悪さをしてしまうかもしれないのです。つまり、Basic認証によるAPI利用の欠点(のひとつ)をxAuth認証も抱えているわけです。(まあ、認証したらすぐにパスワードを変えちゃうってのもアリですが、Twitterのパスワード変更は色々と面倒なので…)

パスワードを預けるという性質上、Webアプリケーションでは採用の余地はありません。素直にOAuthを使いましょう。必然的に、xAuthを採用できるのは(精神衛生的にパスワードを預けやすい)デスクトップアプリケーションになります。毎回パスワードをほぼ平文で垂れ流すBasic認証よりは間違いなくセキュアなので、ユーザの利便性を考えるなら採用を検討する価値は大いにあります。

Twitter APIのBasic認証は今年6月に廃止予定で、Basic認証を利用しているアプリケーションはこれに対処する必要がありますが、xAuthを使用することが出来ればアプリケーションへの変更がより少なくて済むんじゃないでしょうか。

2009-12-09

Google Chrome for Mac β を試してみました

ついにGoogle Chrome for Mac betaが公開されたので、早速試してみました。以前からあった非公式ビルドを試した方も多いとおもうので、Chromeの特徴的な機能を紹介するのはやめておいて、今回のβ版で気になった点を2つ書いておきます。ちなみに今回のβ版はv4.0.249.30となっています。

拡張機能(エクステンション)非対応

SafariにはないChromeの特徴として拡張機能がありますが、現時点ではMac版はこれに対応していません。chrome://extensions/にアクセスすると「ギャラリーから探しますか?」と聞かれてChrome Extensions Galleryに飛ぶことができますが、そこで "Google Chrome Extensions are not supported on Mac yet. We are working to enable them soon." と言われてしまいます。将来的には利用できるようになりそうです。

Chrome Mac not support Extentions

表示が崩れる

SafariもChromeもレンダリングエンジンにWebKitを採用しているのでほとんど表示は同じになりますが、ChromeのWebKitはGoogleが独自に手を加えたものなので、微妙に違う結果になることがあります(Chromeの結果が崩れる)。

Safari & Chrome difference

これはTwitterのサイト上の一部のスクリーンショットで、上がSafari、下がChromeです。Chromeではこんな感じで表示が崩れる箇所が少なからず見られます。まあ実用上はあまり問題ありませんが。

まあ悪い点2つを挙げてしまいましたが、基本的にはいいブラウザです。Gmailがメチャメチャ早くなります。とりあえず試してみてはいかがでしょうか。Intel専用、Leopard以降のMacに対応しています。

2009-12-06

Save Panel Extender 2.0公開

しばらくアップデートしていませんでしたが、Save Panel Extender (SPE) 2.0を公開しました。今回のバージョンではシステム環境設定のパネルが追加されています。

SPE v2.0 Screenshot

この環境設定で設定できるのは、SPEを読み込むアプリケーションの制限。SPEはアプリケーションをハックして実現しているものなので、中には不具合が生じるアプリケーションもあります(OpenOffice.orgなどが既に確認済み)。そういうアプリケーションはSPEを読み込む対象から除外しておくことで不具合を回避することが出来ます。

当然、不具合回避だけが目的じゃなくて、「俺はテキストエディットでは絶対に追加オプションは使わないんだ!」的な場合にも役に立つ設定になっています。