2010年12月16日木曜日

MacBook Air がお亡くなりに…

MacBook Air (Late 2008) を使っていたら、画面が突然乱れ、固まりました。カーネルパニックにもならなかったというのは、かなり深刻な事態だなー、と思って再起動すると、

プー・・・・・プー・・・・・

とビープ音が鳴るのみ。画面は真っ暗なままです。10月にヒンジ割れを直したばかりなのに…。

Apple のサポート記事 HT1547 電源投入自己テストでのビープ音について - Part 2 を読んでもイマイチ分かりにくいのですが、どうやら 1回の警告音が繰り返し鳴っている模様。「RAM が搭載されていません」とのことですが、MacBook Air は RAM が基板に直付けなので、ロジックボードに異常がある模様…と推測しています。

一度は SMC リセットで復活したのですが、もう一度再起動をかけたのが失敗で、今度は起動中に画面が乱れ、そこで終了。再びビープ音が鳴り続けるだけ。まぐれで起動した時にデータを取り出しておくんだった、と後悔しても後の祭りです。開腹して SSD を取り出せればデータは無事だと思いますが…。

Mac のメモリが死んだのは実は 2回目で、忘れもしない 2003年 11月、博士論文を書いていた時のことです。当時使っていた PowerBook G4 のメモリが、私が住んでいた学生寮すぐ裏の特高変電所への落雷によって死にました。折しも、日本列島は寒波到来。やはり気付かない間に落雷があったのでしょうか…。

これはやはり…11.6inch を買えということなのか…。

2010年12月4日土曜日

MO の処分

フロッピーディスクに続き、MO も一斉処分しました。とりあえず、不要品の処分も一段落といったところです。

FireWire 接続の MO ドライブの落札に失敗して、仕方なく懲りずに USB 接続のものを落札しました。落札したのは、Logitec LMO-PBA640U2です。Mac OS X 10.6.5 でもドライバが不要で、バスパワーで動作します。なかなかよいです。結局、FireWire のものを落札するより、こちらの方が安く上がりました。

MO が 40枚あると書きましたが、箱を開けてみたら空のケースばかりで、実際には 20枚ほどでした。うち、30% ほどが読めなくなっていました。これは、ドライブの障害によりデータが破壊されたものと思います。残りのメディアは MO の面目躍如、データを無事取り出すことに成功しました。

MO ドライブとフロッピーディスクドライブは、そんなに嵩張るものでもないですし、今後、どこかに紛れているメディアが出てきたりした時のために、今しばらく手元に置くことにします。

MO から出てきたデータで、中身が何かは分かっているのですが、現在は読めなくなっているものがありました。ファイルのクリエータが jB・x で、ファイルタイプが jB1 ということから、SoundEdit 16 のデータであることは判明しているのですが、どうしたらいいのでしょう? Intel Mac でこのデータを読み込む方法をご存じの方、教えてください。

2010年12月1日水曜日

フロッピーディスクの処分

我が家に埋もれていたフロッピーディスクを一斉処分しました。

オークションで、ヤノ電器の UFD-05 を落札して、一応、処分する前に、フロッピーディスクを読み込んでみました。ちゃんと Mac OS X 10.6.4 でも読めます。MS-DOS フォーマットで、半角カナとかがファイル名に混じっていると文字化けします。この場合は、仮想化ソフトで Windows XP などを経由して読み込めば大丈夫です。

ファイルレベルでのアクセスは問題ないのですが、ディスクイメージを作りたいなど、セクタレベルでアクセスする場合については、Mac OS X 付属のディスクユーティリティではうまくいきませんでした。コピープロテクトなどもない、普通のディスクなので、UFD-05 の問題なのか、ディスクユーティリティの問題なのか、理由は不明です。

もう 15年以上前のメディアなので、データが劣化して読めない可能性は予期していましたが、ドライブに入れてもディスクが回転しないものがあるのは驚きました。

もっと驚いたのは、保存状態がそれほどよくなかった割に、読めるディスクが意外と多かったことです。ちゃんと記録していたわけではないのですが、感覚としては、読めるディスクが 60% 、データが壊れているものが 30% 、回転しないものが 10% といったところでしょうか。

元々、大半は HDD に移行した後に放置していたフロッピーディスクの山で、空のものが大部分で、全記録領域にアクセスしたものは少数です。部分的に読み込みエラーを含むディスクはもっと多いので、もしこれから同様にフロッピーディスクをサルベージしようという方は、これほどの数字を期待しない方がよいでしょう。

全部分解して、パーツごとに分別しました。今度のゴミの日に出します。記録媒体である磁性体フィルムの部分は、バラバラに切断して捨てました。

2010年11月29日月曜日

MO は既に終了していた

我が家には、光磁気ディスク (MO) が 40枚ほどあります。MO は保存特性が素晴らしいと言われますが、それを読み書きするドライブには耐久性がなく、劣化したドライブは記録データを破壊して不良セクタの山を作ります。ドライブのあまりの信頼性のなさに呆れて放置したという経緯から、中に何が入っているかも把握できていないのですが、懐かしいデータが出てくるかも…ということでサルベージをすることにしました。

とりあえず USB で接続できる MO ドライブを…ということでヤフオクで落札してきました (800円) 。届いたので、早速…と思ってつないでみると…あれ? だめじゃん…。ドライバがいるのかよ…。Mac OS 8 と 9 対応か。はい終了…。という悲しい現実。

USB だし、とりあえずつなげば動くだろう、と対応確認を怠っていたのは私です。初期の USB デバイスは、汎用ドライバに対応していないというのはありがち、というのを忘れていました。仕方ない、ちゃんと対応している MO ドライブを探すと…、ことごとく Mac OS X 10.5 までの対応。この理由は、10.5 と 10.6 の間の深い溝、つまり PowerPC モデルの切り捨てです。MO が風前の灯火であったのは知っていましたが、Intel Mac には対応できなかったのですね…。

FireWire 接続の MO はドライバが要らないようで、再度落札して試してみます。それにしても、最新の製品が 2004年って…。MO のサルベージをご計画中の皆様、ご対応はお早めに。

2010年11月4日木曜日

自炊ケーススタディ: マンガ週刊誌編

マンガ週刊誌の紙質は皆様ご承知の通り、若干アレな感じです。自炊したいと思ったところで、これを白黒 2階調でスキャンすると、とても読めるクオリティにはなりません。かと言って、カラーでスキャンするのも少し引っかかるところがあります。

要するに、カラーでスキャンすると左のような感じですが、仕上がりはグレースケールで、右のような感じにしたいのです。

※ 引用: ハヤテのごとく! 293話 chAngE

これを Automator でやってみましょう。とりあえずカラーでスキャンし、それを Automator でグレースケール化すればよいのです。

Quartz フィルタを作る

この処理では、Quartz フィルタを使います。Automator を動かす前に、ColorSync ユーティリティでフィルタを作ります。ColorSync ユーティリティは、“アプリケーション” フォルダの中の “ユーティリティ” フォルダの中にあります。起動すると、以下のようなウィンドウが表示されます。表示されない場合は、“ファイル” メニューから “新規ウィンドウ” を実行し、“フィルタ” のアイコンをクリックしてください。

ウィンドウ下部の “+” ボタンを押して、新しいフィルタを作ります。フィルタの名前の入力を求められますので、適当な名前を付けます。この例では、“Gray Tone (Comic Books)” と入力しました。

フィルタの機能を決めます。右側の黒い丸の中に下三角のアイコンをクリックするとメニューが出てきます。このメニューを使って、以下の 3つの画像処理を追加します。

  1. “カラー管理コンポーネントを追加” の中のサブメニュー “プロファイルの割り当て” を実行し、現れたポップアップメニューから、一般グレイガンマ 2.2 プロファイルを選択します。
  2. “カラー管理コンポーネントを追加” の中のサブメニュー “中間変換” を実行し、現れたポップアップメニューから、彩度を選択し、スライダーを一番左 (彩度ゼロ = グレースケール) に設定します。次に、その右側の + アイコンをクリックし、もう一つの変換を追加します。現れたポップアップメニューから、明度を選択し、明度のスライダーを下のように設定します。この設定は、よく分かっていないのですが、おそらく左のスライダーから、シャドウ、中間、ハイライトの各領域の明度を変えるものと思います。これによって、微妙な紙質の影響を受けてグレーになっている部分を白または黒の方向に寄せます。
  3. 最後に、“イメージ管理コンポーネントを追加” の中のサブメニュー “イメージの圧縮” を実行し、モードを JPEG 、品質を中間くらいに設定します。

作成したフィルタは、以下のようになります。

設定が完了したら、ColorSync ユーティリティを終了します。なお、作成したフィルタは ~/Library/Filter/ に保存されています。

Automator でサービスを作る

次は、Automator でサービスを作ります。このサービスは PDF ファイルを受け取ることとします。“Finder 項目をコピー” と “Quartz フィルタを PDF 書類に適用” の 2つのアクションを下のように配置します。 “Quartz フィルタを PDF 書類に適用” のフィルタのポップアップは、先ほど作成した “Gray Tone (Comic Books)” に設定します。

ワークフローを保存します。“PDF をグレースケール化 (Comic Books)” などと名前を付けておきましょう。

使い方

まず、ドキュメントスキャナで、カラー設定でスキャンし、PDF ファイルを作成します。再エンコードするので、なるべく低い圧縮率を選択し、ノイズが乗らないようにした方がよいでしょう。

Finder でグレースケール化したい PDF ファイルを選択し、control キーを押しながらクリック (または右クリック) すると、先ほど保存したサービスが選べますので実行します。そのファイルがデスクトップにコピーされ、グレースケール化されます。

サンプルで使用したオリジナルのファイル (合計 16ページ) は 24.5MB 、出来上がったファイルは 12.3MB でした。

色々と試してみて、お好みの設定を探すのがよいでしょう。マンガ週刊誌以外の本にも、応用の効くワークフローです。

2010年10月29日金曜日

いつの間にか住所がダダ漏れになる機能が…

ログを見ていたら気になるリファラがありました。

http://www.google.com/m/search?
    safe=images&gl=jp&source=mobilesearchapp&
    q=*&defaultloc=東京都千代田区千代田1-1&
    channel=iss&hl=ja&start=30&sa=N

上記の住所は架空のもので、実際のログにはちゃんとした住所が入っています。ちなみに、このリファラを残した方の端末は iPhone です。

どうやったらこんなリファラが送られるようになるのか、まだよく分かっていません。私のところでは再現できませんでした。mobilesearchapp とか書いてあるので、Google API を使ったアプリか何かで探すとこういうリファラが送られるのでしょうか?

気になる方は、Google のそれっぽいところの設定を確認することをおすすめします。

2010年10月26日火曜日

プログラミング教育

最近、色々な人から大学でのプログラミング教育について話を聞く機会がありました。「最近の学生は C言語を教えると構造体が理解できない」から始まって、「物を順序立てて説明するということができる人とできない人がいる」「プログラムを書ける人と書けない人の間には超えられない壁がある」と聞き、色々調べてみると、全国的な規模でかなり深刻な事態になっているということを知りました。

プログラムなんてのは、どうと言うこともないことで、小学生だって独学でプログラム組めるようになるんだよ ── というのが今も変わらない私の認識です。実際、私がそうでしたから。

なんせ、情報工学出だろうが、情報系の専門学校出だろうが、文系大学出だろうが、新人で採るならひとしく無能だと思わなければならない。そんな出身校よりも、ホビーでプログラムするかどうかを問う方が当りの人材を引き当てれるということは、現在のプログラミング教育がプログラミング能力を育てることにおいてはほとんど用をなしていないことを示唆するだろう

まったくもって異論を差し挟む余地もありませんです。この問題は、少し考える必要がありそうです。

2010年10月21日木曜日

MacBook Air 11.6インチモデル登場に寄せて

まだ現物を見れていないのですが、仕事用パソコンは MacBook Air に統一すると決めた私にとって、新モデルの登場は重大なイベントです。

今回の MacBook Air のラインナップを見て感じたことは、「サブノートとして持ち運ぶ人からメインマシンとして使いたい人まで、幅広くカバーしたなあ」という点です。ライトな作業しかしないけどサブノートとして携帯性を重視する人は 11インチの最安モデルを、持ち運べるメインマシンとして使いたい人は 13インチモデルを最大拡張 (メモリ 4GB、SSD 256GB) で、という選択ができます。両者ともデュアルリンク DVI 出力を持ち、その気になれば 30インチ Cinema Display にも接続できます。明確な利用像を持ち、MacBook Air というコンセプトに賛同する人にとって、幅広い選択肢が提供されたという点は、大いに評価してよいのではないでしょうか。

私は、というと、11.6インチモデルにするか、13インチモデルにするか、決めかねています…。11.6インチのメモリクロック 1066MHz、フロントバス 800MHz というスペックが少し引っかかっています。現物を触ってみてから決めます。

2010年10月15日金曜日

iPhoto の写真にジオタグを設定するスクリプト

iPhoto '09 は写真に埋め込まれたジオタグで地図上に撮影地をプロットできます。とても面白い機能なのですが、私の Canon EOS KISS X2 には GPS なんて便利なものは付いてないので、何とかして手動で付けてあげないといけません。Google マップで撮影地を指定して、その場所に設定できたら便利だなーってことで、調べていたら、いとも簡単にできました。

こちらからダウンロードできます
iPhoto_set_geotag_to_photos.zip (3k bytes)

“iPhoto で選択中の写真の撮影地を設定” というスクリプトが入っています。使い方は以下のとおりです。

  1. iPhoto でジオタグを付けたい写真を選択します。複数選択してもかまいません。
  2. Safari で Google マップを開き、撮影地として指定したい場所を真ん中に持ってきます。ダブルクリックするとよいでしょう。
  3. この状態で、ダウンロードしたスクリプトを動かします。特に反応はありませんが、撮影地が設定されています。

※ Safari で複数のタブで Google マップを開いていると正しく動作しません。

スクリプトは、$HOME/Library/Scripts/Applications/Safari に入れて、スクリプトメニューから呼び出すと便利です。

配布には Dropbox を使っています。まだご利用でない方は、こちらから登録してください (無料、2GB + 250MB のボーナスディスクスペースがもらえます。) 。

2010年10月7日木曜日

Todo 4.0 アップデート

iPhone 用の To Do 管理ソフトの定番 Appigo 社の Todo 4.0 と、その iPad 版 Todo for iPad 4.0 がリリースされています。

今回のアップデートのポイントは iCal との同期処理が安定したことです※。以前は 2回くらい同期しないと、ちゃんと反映されませんでしたが、このバージョンからは大丈夫です。次のように、進捗状況がダイアログに表示されるようになり、安心感が増しました。

※ 同期処理には Appigo Sync の最新版をインストールする必要があります(無料)。

iCal で設定したアラームにも対応し、通知音・バイブレーションとともに表示されるようになりました。アプリが起動していなくても、設定した時間になると iPhone がスリープ状態でも、次のように通知してくれます。これは便利です。

これまで以上に使用頻度が上がりそうなソフトです。

2010年10月6日水曜日

Touch Diamond やめました

1年ちょっとでしょうか。いい機会なので、Touch Diamond やめました。しばらくは iPhone 一本でいきます。

Touch Diamond を使ったイー・モバイル 3G 回線のテザリングですが、色々なテザリングアプリを試してみて、結局、全部だめ、という惨憺たるものでした。どうしようもなく不安定です。全部だめ、というのは、テザリングアプリ側の問題ではなく、OS レベルの問題なのでしょう。

通信していると、いつの間にかソフトが落ちているとか、回線が切れているとかは日常茶飯事です。突然、Web サーバにつながらなくなって、メールがいつまでたっても送信完了にならなくて、何が起こった? とふと見ると、回線が切れている、という感じです。何度かこうなった後、最終的に OS レベルでの再起動が必要になります。ちょっと…使い続けるのは無理です。

前も書きましたが、AC アダプタにつないでいるのに、3G−WiFi でテザリングしていると電池が減っていくのも閉口しました。これもいつも間にかつながらなくなっているという原因の一つです。

半年に一回くらい、OS レベルでどうにもならなくなって、出荷時状態に戻す → 再設定をしないといけなくなるのも困ったものです。Windows Mobile 端末は、仕事で使うデバイスではないですね。

2010年10月4日月曜日

Mac OS X のマウスカーソルの動きが変?

Mac OS X のマウスカーソルの加速曲線がおかしいという指摘や、それを解決するソフトがあるのは知っていましたが、私には意味のない話でした。別段、何も不自由を感じませんでしたし、「加速曲線がおかしいのは Windows の方だろう、全然滑らかに動かないじゃないか」と思っていました。

今日、不覚にも愛用の Apple Bluetooth Mighty Mouse を忘れてきてしまい、仕方なく近所の電気屋さんから Windows 用の USB マウス (エレコム M-M3URBK) を買ってきて使いました。すると…「!? 何だこれ?」 確かに使いづらい。マウスが急激に動いてしまいます。ゆっくり動かしても、狙った場所に止まらず、行きすぎてしまいます。ゆっくり等速で動かすと、ガクンガクンとぎこちなく動きます。これは確かにひどい。いくら「軌跡の速さ」の設定を変えてみても、決して満足のいく設定にはなりませんでした。

これを実験としてみると、デバイスを変更し、Mac OS X の設定は何も変更していないのに、これだけ違う点に着目てきます。様々な可能性が考えられます。

  • Mac OS X ではなく、Windows 用のマウス側に問題がある。この手の指摘をしていた人たちは、Mac へのスイッチャーで、愛用の Windows 用マウスを Mac でも使い続けているのではないか。
  • Mac OS X が Apple 製のマウスに特化したチューニングになっているのではないか。USB の HID デバイスのマウスプロファイルも調べないと、Mac OS X が悪いのかデバイス側が悪いのかの判定はできないのですが、マウスのスキャン速度とか、物理的にマウスが動いた距離に対して、デバイスとしてどう評価するかとかも問題になりそうです。
  • この記事では「Mac OS 9 までは問題なかった」としていますが、それは ADB マウス※だったからではないのか。「Apple が Mac OS X でマウスカーソルの加速曲線を修正した」という指摘には疑問が残る。

※ Apple Desktop Bus 。マウスやキーボードをつなぐための Mac 専用ポート。

逆に、Apple 製の USB マウスを Windows につないだらどうなるかという点も非常に興味があります。

印象としては、Windows 用のマウスに比べると、Apple のマウスは反応が早いと感じる一方、Windows 用のマウスはワンテンポ遅れて動いているように感じます。これは iPhone と Andoroid 携帯のタッチパネルの問題によく似ています。スキャン速度が適切に設定されていないのでしょう。

Mac OS X が悪いと決めつけるのは早計で、結論はちゃんと調査した後です。とりあえず、この問題に対応するには、USB オーバードライブをインストールするか、Apple 純正のマウスを買うか、どちらかを選ぶことになりそうです。でも、今から買うならマジックトラックパッドも捨てがたいですね。

2010年9月29日水曜日

成果物に関する責任の所在はツールに在らず

一年くらい前に、母が Microsoft 検定 (?) とやらを受験して、合格したと言ってました。どれくらいのグレードなのか、よくは知らないのですが、要するに、Microsoft が作った出来の悪い GUI を、Microsoft の想定通りに (つまり上部に並んだアイコンをクリックして) 使わないと合格できないのだそうです。ショートカットキーは使ってはいけないのだそうです。ちょっと信じられないのですが、国の補助金でやっている職業訓練の実態はこんなものです。

一方で、大手 SIer から出てくるドキュメントは、とりあえず格子状になった Excel シートにレイアウトしたものとか、滅茶苦茶です。町内会のチラシを作るならともかくとして、仕事で使うドキュメント、レポートや論文を書くための教育がこれでいいのか、というのは常々疑問に感じます。主婦のカルチャースクール的なリテラシー教育を、大学を含む色々なところでやっているのが現実のようです。

どうしようもない現実に対する処方箋がこれらの本です。おせっかいな機能がてんこ盛りな Word ですが、「Word が勝手にこうするんですよ」と言う人は「Eclipse が勝手にこうするんですよ」とも言います、というくだりは妙に説得力があって、笑ってしまいました。バグ出しといて、そんな言い訳されたら張り倒しますよ。要らないアイコンは表示しないで画面を広く使うとか、文書の見た目と論理構造を分離するためにきちんとスタイルを使い、アドホックな文字修飾は使わない、などの具体的な指南が書かれていて、一読の価値があります。

エンジニアのための再入門とありますが、文系・理系を問わず、自分が書いた文章に責任を持たないといけない人は、Microsoft Office を使うならこれくらい知っておいてほしいという本です。

2010年9月27日月曜日

キーボードを有線化しました

Mac mini で使っていた Apple Wireless キーボードを壊してしまいました。汚れをウェットティッシュで拭いていたら、中に水分が入ってしまったようです。乾かしたりして様子を見ていたのですが、結局復旧せず、諦めてキーボードを新調することにしました。

悩んだ末、選んだのが Apple Keyboard (USB 接続) です。自腹なので、結局値段で決めた部分もあります。「無線から有線に戻るのは不便」という考えがなかなか捨てられなかったのですが、使ってみると、そうでもないです。USB ケーブルは十分に長くできますし (延長ケーブルが付属している) 、思ったより邪魔になりません。

予想外に便利だったのは、キーボードの左右についている USB ポートです。この位置にあるのは、元々はマウスを接続するためでしたが、USB メモリのように、ちょっと付けたり外したりするデバイスを使う時も、手元で操作できるので断然便利です。

Mac mini は USB ポートが 5つ並んでいて不足はないのですが、狭い場所に集中しています。付けっぱなしにするのは問題ないですが、頻繁に付けたり外したりするには不便な構造です。iMac もディスプレイ部分の裏側に USB ポートがあるので、同じような問題を抱えています。

USB ハブを付けるのも一手ですが、Apple Keyboard を USB ハブ代わりに使うとよいのではないでしょうか。Mac のデスクトップ機を使っている方には、有線のキーボードをおすすめしたいと思います。

2010年9月26日日曜日

“シェルスクリプトを実行” アクションのメモ

Mac OS X に標準で入っている “シェルスクリプトを実行” アクションの使い方のまとめです。実はスクリプトからエラーを返してワークフローを停止させることができるなど、undocumented な機能があったり、知らないとおかしな挙動になったりする部分があるので、まとめておきます。

以下の記述は “シェルスクリプトを実行” アクションのバージョンは 2.0.1 を元にしています。

実行可能なシェルおよびスクリプト言語

  • bash / csh / ksh / sh / tcsh / zsh
  • perl / python / ruby

ユーザスクリプト実行時の環境

カレントディレクトリは、ホームディレクトリに設定される。

環境変数は、基本的には各シェルに依存する。ホームディレクトリの rc ファイルはシェル起動時に読み込まれる。Terminal で実行した場合の差異として、Automator は環境変数 LANG を設定しないので注意が必要である。

アクションとユーザスクリプトの間の規約

前段のアクションからの入力はテキストのみ、ユーザスクリプトは標準入力または引数から受け取る。

続行のアクションへの出力はテキストのみ、ユーザスクリプトは標準出力へ引き渡す。

ユーザスクリプトは実行終了時に終了ステータスを返さなければならない。0 の場合は、正常終了を意味し、ワークフローの制御が後続のアクションに渡る。それ以外の場合は、異常終了を意味し、Automator は ワークフローの実行を停止し、ユーザにエラーが発生したことが通知する。この際に、標準エラー出力に書き出された 1行目が、エラーメッセージとして使用される。

逆に言うと、ユーザスクリプトは、実行する各コマンドの標準エラー出力を放置してはならず、各コマンドの標準エラー出力は、適切な場所にリダイレクトするなどの対応をしないといけない。また、標準エラー出力には 1行を超えて書き出さない方がよい。エラーメッセージが正常に返せない場合がある。

エラーを返す場合のサンプル

perl で書いています。標準エラー出力にエラーメッセージを書き出し、終了コード 1 を返します。

Automator からエラーの発生が通知されます。

2010年9月24日金曜日

“シェルスクリプトを実行” アクションの標準エラー出力

標準で入っている “シェルスクリプトを実行” アクションですが、標準エラー出力絡みでバグ(仕様?)があるようです。動かしているスクリプトが標準エラー出力に 16384バイトを超えて出力すると、アクションがストールします。

実験

“シェルスクリプトを実行” アクションのバージョンは 2.0.1 です。

perl で書いています。標準エラー出力に 16384文字の空白文字 (0x20) を出力してみます。最後に "OK" を返します。これは一瞬のうちに、正常に終了します。

次に、1文字増やして、標準エラー出力に 16385文字の空白文字を出力してみます。あとは一つ前のコードと同じですが、これは結果が返ってきません。

tcsh で同様のコードを動かしてみても、結果は同じです。

@ i = 1
while ($i <= 16385)
echo -n " " > /dev/stderr
@ i ++
end

echo "OK"

考察

標準エラー出力のバッファが溢れたときの処理がおかしいようです。

対策としては、“シェルスクリプトを実行” アクションで動かすシェルスクリプトでは、標準エラー出力には、文字を出さないようにするか、あらかじめ /dev/null などに接続しておく方がよさそうです。また、“AppleScript を実行” アクションから同じスクリプトを実行した場合は、特に問題なく動作しますので、少々面倒ですが、こちらを使うのも手です。

ちなみに、標準出力には、以下のように 10万くらい出してもへっちゃらでした。

2010年9月23日木曜日

iWork for iPad 1.2 アップデート

iWork for iPad の各アプリ KeynotePagesNumbers のアップデートがリリースされました。

Keynote の改善点

Keynote については、かつて指摘した点 (グループ化図形のサポート、グループ化図形のアニメーション、表のセルの背景色のサポート) が改善されています。セル結合については、残念ながら未対応です。

試しに読み込ませてみると、見た目は何となく結合しているように見えていますが (それでも、“結合”の文字は、縦方向にセンタリングしてあるので場所がおかしい)

やっぱり結合できていません。下のように、真ん中のセルが選べてしまいます。見た目がそれなりなら、まあいいというのであれば、これでも OK でしょう。

PowerPoint 形式 (.ppt) で書き出せるようになった点も、歓迎です。この形式で欲しいという人は多いので、Mac がなくてもこの形式に変換して渡せるようになったのは便利です。

ファイル交換の方法の改善点

iWork for iPad と外部とのファイル交換の方法として、指定した WebDAV サーバにアクセスする機能が加わりました。WebDAV サーバからファイルを読み込んだり、WebDAV サーバへファイルを書き出したりできます。

ファイルビューワー系の iPhone アプリなどで、WebDAV サーバ機能を持っているものはたくさんあるので、iPhone に WebDAV サーバを上げておき、iPad と iPhone とのやりとりだけで完結できます。外部ネットワークの力を借りなくても済むようになった点は大きいです。ただし、HTTP については 80番ポート、HTTPS では 443番ポートでないと接続できないようです。

こうした要件を満たす WebDAV サーバ機能を持つアプリの一つは、Air Sharing です。

2010年9月13日月曜日

NSRange オブジェクト

AppleScriptObjC では Cocoa が呼び出せるので、Cocoa クラスのインスタンスを作成する時は alloc() すれば済みます。 ところが、NSRange のように、インライン関数 NSMakeRange() を使ってインスタンスを作成するものは、undocumented な部分が多く、よくわかっていません。なお、AppleScript で range と言うと … n thru m … のことですが、これは NSRange ではありません。

NSRange を使うサンプルコードを示します。このコードは、ファイル名のディレクトリ部分を得る ("/usr/local/bin/script.sh" が渡されたとき、"/usr/local/bin" を取得する) ものです。UNIX のコマンドで言うと、dirname に相当します。

property NSString : class "NSString"
property NSFileManager : class "NSFileManager"

on foo(filename)
  set str to ((NSString's alloc())'s initWithString_(filename))'s autorelease()
  set pc to str's pathComponents()
  set rng to {0, (pc's |count|()) - 1}
  set cwd to NSString's pathWithComponents_(pc's subarrayWithRange_(rng))
  set mng to NSFileManager's defaultManager()
  mng's changeCurrentDirectoryPath_(cwd)
end foo

このコードは、以下のように動きます。

  1. ファイル名の文字列 filename を NSString にして、変数 str に代入します。AppleScript で扱っている文字列は NSString ではないことがあるので、NSString の機能を使いたいときは、このような変換をします。
  2. pathComponents() で、str を / ごとに分解した文字列の入った NSArray を取得し、変数 pc に代入します。"/usr/local/bin/script.sh" は [ "/", "usr", "local", "bin", "script.sh" ] に分解されます。
  3. 変数 pc に入っている配列から、最後の要素 "script.sh" を取り除いた NSArray を作ります。この範囲 (0 から、配列の要素数 - 1) を NSRange で指定します。とは言え、単なるリストを作るだけです。リストの第一要素が開始位置、第二要素が長さを表しています。作成したリストを rng に代入しています。
  4. subarrayWithRange_() で、3 で作ったリストで範囲を指定し、配列から必要な部分を取り出します。これを元に新しい NSString を pathWithComponents_() で作成し、変数 cwd に代入します。
  5. NSFileManager を使って、カレントディレクトリを cwd に変更します。

結局、subarrayWithRange_() を呼び出す時に、AppleScriptObjC が強制的に型変換のようなことを行っているようなのですが、この辺のルールがよくわからないのです。とりあえず、動いているのでよしとします。

なお、Cocoa のメソッドを呼び出した時に、NSRange オブジェクトが返却された場合、AppleScriptObjC からはレコードとして見えるので、開始位置は |location| of aRange 、長さは |length| of aRange のようにアクセスします。

2010年9月9日木曜日

iOS 4.1 リリース

iOS 4.1 がリリースされました。早速アップデートしました。iPhone 3GS では、Game Center のアイコンが現れた以外、別段変わった感じはしません。

私は iPhone 用のヘッドセットとして、ソニーの DRC-BT30P を使っています。DRC-BT30P は USB 接続で充電できること、イアフォンは好みのものが使えることなど、よくできています。DRC-BT30P 本体には音量と次曲・前曲ボタンがあるのですが、今までは音量しか使えませんでした。iOS 4.1 をインストールしたら、ちゃんと次曲・前曲ボタンが機能します。これで便利になります。

Game Center は、ちょっとだけ使ってみました。Game Center そのものは SNS アプリの機能しかなく、対応ゲームを別途購入しないといけないのですね…。プラットフォームとしては面白いですが、あまりゲームをしなくなってしまったので…。ちょっと微妙です。

それよりも iPad 対応の iOS 4.2 が待ち遠しい! 一番欲しい機能は、iPad Camera Connection Kit を使って、USB 端子経由で写真だけではなく、PDF (できれば、Word や Excel 等の Office ファイルも) を iPad に取り込める機能です。

2010年9月2日木曜日

javari に見る小売業の未来

やたらに amazon から javari とかいうメールが届くと思ったら、靴屋さんを始めていたのですね。javari という単語から、靴を連想できなかったので、思いっきりスルーしていました。靴の通販で、フィットしなかった時などに返品可、というのも画期的です。ネットビジネスでも靴屋さんが成立するんですね。

靴を検索できるというのは、とても便利です。時間と交通費をかけてお店に行って、気に入ったのがないなー、ということはよくあります。javari なら家に居ながら選べますし、実際に手に取って確認もできるので、これでいいや、と思います。返品しないといけないのは少々面倒ですが、靴屋さんに出向くための時間とお金を考えたら、全然いいです。

ハッシュパピーのスエード靴。ゴテゴテしてないシンプルなところが好きです。色違いで持っています。黒を履き潰してしまったので買おうと思っていたのですが、どこにも在庫がなくて困っていました。靴底の張り替えサービスもやってくれるとうれしいんですけどね。

Mac OS X のバックアップ

Mac OS X の特徴の一つは、起動可能なバックアップを簡単に作成することができる点です。通常、ハードディスク故障の際には、ハードウェアを交換した後、バックアップから書き戻す必要があり、復旧にはそれなりの時間を要します。外付け HDD や USB メモリなどに作成した起動可能なバックアップがあれば、そこから起動することができるので、素早い復旧が可能です。バックアップをこのように使うことについては異論があると思いますが、個人使用のレベルでは、現実的な解の一つであると思います。大抵、壊れるのは〆切り間際とか、時間がない時ですよね?

バックアップというと、OS 標準で提供されている機能は Time Machine です。全自動で履歴付きバックアップを作成してくれるなど、大変便利ではあるのですが、Time Machine のバックアップは起動可能ではありません。起動可能なバックアップを作成するには、OS 付属のディスクユーティリティの“復元” 機能を使うのが便利です。サードパーティーのツールでは、Carbon Copy Cloner が有名です。

フルバックアップはディスクユーティリティでよいのですが、毎回フルバックアップでは時間がかかって困ります。常に起動可能なバックアップを維持するために、一度作成したフルバックアップへ、前回バックアップ時から更新があった分だけ同期させることにします。rsync 3.0.7 をインストールして使います (執筆時点での最新版) 。

OS X 10.6 付属の /usr/bin/rsync はやや古い (バージョン 2.6.9) のですが、新しい版を入れたくない人は、こちらでもいいでしょう。ただし、オプションの指定が違う (--xattrs → -E) のと、ちょっと遅いという問題点があります。

フルバックアップと動作中のシステムを rsync で同期させるには、以下のようなシェルスクリプトを実行します (管理者権限が必要です) 。

#!/bin/sh
BACKUP_STORAGE="Backup HD"
RSYNC=/usr/local/bin/rsync

sudo $RSYNC --dry-run \
            --progress --delete --xattrs \
            --exclude-from=/dev/stdin \
            -a / "/Volumes/$BACKUP_STORAGE" << EOF
/.dbfseventsd
/.hotfiles.btree
/dev/
/home/
/net/
/private/etc/cups/certs/
/private/tmp/
/private/var/audit/
/private/var/db/
/private/var/folders/
/private/var/run/
/private/var/samba/
/private/var/spool/
/private/var/tmp/
/private/var/vm/
/Volumes/
.com.apple.timemachine.supported
.com.apple.timemachine.donotpresent
.fseventsd/
.TemporaryItems/
Desktop DF
Desktop DB
.DS_Store
.Trashes/
Library/Caches/
Library/Logs/
/private/var/log/
.Spotlight-V100/
EOF

シェル変数 BACKUP_STORAGE は、バックアップ先ディスクのボリューム名です。各オプションの意味は、ここでは説明しませんので、各自調べてください。rsync は間違えると痛い目に遭うので、期待通りに動くかどうかを確認 (--dry-run オプション) した方がよいです。ちゃんと動くことを確認したら、上から --dry-run オプションを外してください。

/.dbfsevents と書かれている行から EOF までは、同期の対象としないファイル・フォルダの指定です。バックアップする必要のないファイルや、バックアップした Mac OS X を起動した際に悪さをするようなファイルを除いています。.DS_Store 以下の除外設定は、must ではありません。ゴミ箱、スポットライト、ログファイル、キャッシュを除くかどうかは、各自の事情により判断の分かれるところです。

2010年8月9日月曜日

MacBook Air (SSD) が時々フリーズする

Console.app を睨みながら作業をしていた時のことです。MacBook Air がフリーズ。CPU の Load は低い状態が続いており、I/O 周りでおかしくなっていることは容易に想像できます。うーん、急いでいるのに…と思いながら、しばらくすると回復。その直後に Console に出力されたのがこのメッセージです。

10/08/05 19:15:55 smartd[53]
  Device: IOService:/AppleACPIPlatformExpert/
    PCI0@0/AppleACPIPCI/SATA@B/AppleMCP79AHCI/
    PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/
    IOAHCIBlockStorageDevice,
  failed to read SMART Attribute Data

smartd は、S.M.A.R.T. 値を監視しているデーモンで、私が管理している Mac では原則動かしています。

2ちゃんねるのサーバを SSD 化するプロジェクトでも同様の現象に遭遇しているようです。

今のところ確信は持てないのですが、SSD モデルでは smartd を動かすのは控えた方がよさそうです。このメッセージを見た直後に smartd を停止しましたが、それ以後、フリーズするという現象には遭遇していません。

2010年8月3日火曜日

真のガラパゴスとは何か

その考えがガラパゴス − 記者の目:ITpro

非常に違和感を感じる記事です。ガラケーの本質とは、日本ローカルな環境なのをいいことに、恐ろしく使いにくかったり、貧乏臭いやり方でしか使えず、要らない機能てんこ盛りでバカ高い端末を、利用者にさも当たり前であるかのように強いてきたこと、でしょう。

Windows Mobile もスマートフォンではなく、Windows 独自の環境のガラケーでした。カスタマイズすればいい、などと言うのではお話になりません。ガラケーという言葉が iPhone とともに出現したことを考えれば、これは明らかです。みんなが、今までのやり方は恐ろしくダメで、ああやればいいと気付かされたのです。iモードメールが読める sp モードを付けるとか、iアプリをオープンにするとか、それでガラケーじゃなくなったというのは、あまりにも…ひどい話です。

Xperia がさっぱり売れてないのも、華々しく CM を流した割に、店頭で試しに使ってみると、やっぱりガラケーと変わらない使い勝手しか持ってなかったからです。社内システムをそれで作っちゃったから、キャリアを変えたくないからというしがらみだけで使い続けられるスマートフォンだってやっぱりガラケーです。

Apple は FLASH を禁止したり、テンプレートアプリを AppStore から締め出したりして、必死にユーザ体験の悪化という「ガラパゴス化」を防いでいます。そこが違うんですよ。iPhone のアプリを Mac でしか作れないという方針も正解です。Windows や Linux を使っていては、やっぱりガラパゴスな UI しか作れないですからね。

2010年7月29日木曜日

iPhone テザリング事情

噂の HandyLight を買うことができました。この機会にテザリング機能について調べたので、まとめておきます。

iOS 標準機能のテザリング

(日本ではキャリアの都合で使えませんが) まずは iOS が標準で提供しているテザリングです。以下の情報は、実際に確認できていないので、理論的にはこうだ、というものになります。

  • 3G 回線を Bluetooth PAN でブリッジ (複数クライアント共有可)
  • 3G 回線を USB 接続でブリッジ

Bluetooth の速度は 1Mbps なので、これ以上の速度は出ません。PAN (Personal Area Network) を構成するので、複数の Mac/PC を接続することができます。また iPad は Bluetooth PAN には対応していないようですので、将来的にテザリングが解禁されても、iPad から iPhone のテザリングを利用することはできません。

USB で接続した場合は、もっと速度が出ますが、複数の Mac/PC を接続することはできません。有線での接続になるので、煩わしいかもしれません。Mac 本体のハイパワー USB ポート※に直接接続していない場合、充電しながらの利用はできないかもしれません。

ハイパワー USB ポートはデバイスからの要求により +5V 1100mA を供給できる。最近の Mac および Cinema Display に搭載されている。

Wi-Fi でのブリッジは対応していないようです。他のスマートフォンでもそうですが、Wi-Fi と 3G 回線を同時に使用すると、バッテリーの消費量が大きくなります。Touch Diamond S21HT では、AC アダプタで接続していてもバッテリーの残量が減っていくという、ひどい有様です。Apple はこうした事態を嫌って Wi-Fi ブリッジを避けたのかもしれません。

そういえば、iPhone の脱獄は合法という判断が出ましたが、目的が勝手アプリを起動するためであれば OK で、テザリングを有効にするために脱獄するのは今でもグレーなのでしょうか…。

NetShare、HandyLight、iProxy

NetShare は老舗のテザリングアプリ、HandyLight は懐中電灯アプリに偽装したテザリングアプリです。この 2つは App Store で配布されたものです。iProxy はいわゆる勝手アプリです。

この 3つに共通するのは、いずれも SOCKS サーバを立ち上げているということです。実装が簡単なのでしょうか?  Wi-Fi での接続が別途必要ですが、Mac/PC からは iPhone 上のSOCKS プロキシを経由するように指定すれば使えます。複数の Mac/PC を接続することができます。通信速度は使用する Wi-Fi 接続の速度に依存しますが、3G回線より遅くてボトルネックになるということはないでしょう。

当然ですが、アプリが起動していないといけないので、その間、iPhone は使えないことになります。また、バッテリーの消費も気になります。私の Touch Diamond S21HT はテザリングしまくっていたら、バッテリが半年でだめになりました。充電していても残量が減っていくというのはバッテリに相当負荷をかけるのでしょう。運良く HandyLight が手に入った方でも、テザリングをしていると同じような目に遭うかもしれません。自己責任でご利用ください。

私はバッテリへの負荷がとても気になっています。私は HandyLight をインストールして接続できることを試しただけで、それ以来使っていません…。

2010年7月22日木曜日

ユースケース: iPad でプレゼンをしてみる

iPad で 1時間程度のプレゼン (講義) をしてみました。

準備編

Mac 上の Keynote でスライドを作成します。iPad の Keynote には色々制約があります。iPad の Keynote に読み込んだときに、あれやこれや警告が出ます。いくつか気になった点や Tips などを列挙します。

  • フォントは限られたものしか使えません。日本語フォントはヒラギノ角ゴProN-W3とW6がある※ので、とりあえず十分です。英語フォントは、Mac OS X で広く使われている Lucida Grande が使えません (コピペすると大抵このフォントになっている) 。Courier New 、Helvetica 、Times New Roman は使えるので、通常の用途には十分です。
  • グループ化図形がサポートされていません。つまり、グループ化した図形に対してトランジションが設定できません。代替の方法としては、スライドのページをコピーして、ページ単位のトランジションを設定するという方法があります。
  • 表のセルの結合や塗りつぶしが無効になってしまいます。これでは表が役に立ちません。この点は早急に改良してほしいです。
  • ベクトル画像は Adobe Illustrator で作成した PDF ファイルをスライドに貼り付けています。ビットマップ画像は PNG にして貼り付ければ表示されます。

新規に作成するスライドは、上記のような点に注意しておけばよいのですが、既存のスライドを読み込むと、画像が表示されなかったりして、調整が必要になります。

※ Mac OS X 10.5 から導入された。それ以前の (Nが付いていない) ヒラギノ角ゴPro-W3とW6ではないので注意。
※ バージョンアップにより、現在は改善している箇所については取り消し線を入れています。

プレゼン編

プロジェクターに iPad をつないで、Keynote を起動してスライドの再生を始めます。プロジェクターにはスライドが表示されていますが、手元の iPad の画面には簡単な UI が表示されているだけです。iPad の画面にもスライドを表示してほしいのですが、難しいのでしょうか。

再生中に iPad の画面を長めにタッチしていると、プロジェクターにレーザーポインタっぽいカーソルが表示されます。iPad の画面にはスライドが表示されていないので「大体この辺」という感じでタッチします。ですが、iPad を机などに置いたままでこの操作を行うのは難しいという印象を受けています。仕方なく、iPad を左手に持ち、右手で「この辺」とタッチすると案外うまくいくのですが、プレゼン中 iPad をずっと抱えているのは、かなり疲れます。

iPad を使った標準的なプレゼンスタイルは、まだまだ試行錯誤の段階なので、他の皆様がどのようにされているのか、とても興味があります。

2010年7月17日土曜日

ATOK の辞書を RAM ディスクに置く

ATOK 2010 が発売されました。ATOK 2009 と Mac OS X 10.6 の組み合わせで発生していた、ATOK で入力した文字がテキストの最後尾に追加する形でしか入力できない、という致命的なバグが解消され、再び快適な環境が帰ってきました。

それと前後して、MacBook Air の SSD が老朽化したようで、プチフリーズが発生し、文字入力中 (ATOK の学習辞書書き換え中?) に数秒程度待たされるという、見過ごせないパフォーマンス劣化が継続的に発生していました。S.M.A.R.T. 値は以下の通りで、そんなに悪くはないのですが…。(2010-08-09 追記) ATOK は無実です。

ATTRIBUTE_NAME          VALUE WORST THRESH TYPE
Used_Rsvd_Blk_Cnt_Chip  088   088   011    Pre-fail
Used_Rsvd_Blk_Cnt_Tot   098   098   010    Pre-fail
Unused_Rsvd_Blk_Cnt_Tot 098   098   010    Pre-fail

Mac OS X には RAM ディスクの機能があります。学習情報や登録単語情報が頻繁に更新されますので、これを RAM ディスクに移すことにします。私の場合 ATOK 2010 のユーザ辞書もろもろ (~/Library/Preferences/ATOK23/) で 2MB 程度です。

RAM ディスクを作成し、ATOK のユーザ辞書を RAM ディスクにコピーし、動作中の ATOK を強制終了するスクリプトは、以下の通りです。

#!/bin/sh

# Parameters
SIZE=4194304
MOUNTPOINT=/Volumes/ramdisk
ATOK=ATOK23.app/Contents/MacOS/ATOK23

# Initialize a RAM disk
NUMOFSECTOR=`expr $SIZE / 512`
RAMDISK=`hdid -nomount ram://$NUMOFSECTOR`
newfs_hfs -v ramdisk $RAMDISK
mkdir -p $MOUNTPOINT
mount -t hfs $RAMDISK $MOUNTPOINT

# Copy contents to the RAM disk
cp -R $HOME/Library/Preferences/ATOK23 $MOUNTPOINT

# Kick ATOK
kill `ps -ef | grep ${ATOK} | grep -v grep | awk '{ print $2; }'`

このスクリプトを、システムを起動する度に実行します。Automator を起動し、アプリケーションとしてワークフローを作成し、ログイン項目に登録しておけば OK です。本来の順番としては、RAM ディスクを作成 → 初期化 → 辞書をコピー → ATOK 起動にしないといけないのですが、私の環境では FileVault を使っているなど、諸々の事情で起動順序をうまく制御することができません。ATOK を強制終了するというのは、あまり気持ちよくないのですが、ATOK 起動後にしかこれ以外の方法がないのが現状です。

Mac OS X の RAM ディスクはうまくできていて、4MB の容量を指定して初期化しても、実際にファイルをコピーして使用した分だけメモリを確保します。ですので、容量をどうするか試行錯誤しなくても、若干大きめに設定しておけば大丈夫です。

あとは、ATOK の環境設定で、RAM ディスクのユーザ辞書データを参照するように設定します。

“ATOK省入力学習データ” も時々更新されますので、これも RAM ディスクのファイルを参照するようにしたいのですが、設定する GUI がありません。仕方がないので、設定ファイルを直接いじります。現在使用中の設定ファイル (私の場合は “環境移行設定 (ATOK 2009)” でした) をテキストエディタでで開き、“ATOK省入力学習データ” を検索し、以下のように変更します。

<key>ユーザーデータ</key>
<dict>
  <key>パス種別</key>
  <integer>1</integer>
  <key>辞書ファイル名</key>
  <string>/Volumes/ramdisk/ATOK23/ATOK省入力学習データ</string>
</dict>

同様に、“ATOK再変換ユーザー辞書”も RAM ディスクのファイルを参照するようにしたいのですが、こちらは設定箇所がわかりません。どうしたらよいのでしょうか?

RAM ディスクなので、電源を切ると内容が消えてしまいます。辞書のデータをどうバックアップするかは、今後の課題です。

2010年6月28日月曜日

自作アクションでエラーを返す

AppleScriptObC で書いた Automator の自作アクションでエラーを返すには、次のようにやればよいようです。

script ErrorTest
  property parent : class "AMBundleAction"
  property NSDictionary : class "NSDictionary"
 
  on runWithInput_fromAction_error_(input, anAction, errorRef)
    my fatalError(-1750, "your own error message", errorRef)
    return missing value
  end runWithInput_fromAction_error_

  on fatalError(errorNum, msg, errorRef)
    set objsArray to {errorNum, msg}
    set keysArray to {current application's OSAScriptErrorNumberKey, current application's OSAScriptErrorMessageKey}
    set contents of errorRef to NSDictionary's dictionaryWithObjects_forKeys_(objsArray, keysArray)
  end fatalError
end script

errorRef は NSDictionary のポインタのポインタなので、contents of を使って、作ったオブジェクトを渡すところがキモです。

エラー番号 -1750 は MacError.h に errOSASystemError と宣言されていて、それを使うのがベストです。AppleScriptObjC の定数参照の要領で、current application's errOSASystemError とか書いてみたのですが、だめでした。MacError.h は CarbonCore のヘッダファイルなので、Carbon Framework をリンクしてみたのですが、やはりだめでした。

情報をお持ちの方がいらっしゃいましたら、コメントをください。

2010年6月24日木曜日

iPad × Apple Wireless Keyboard

iPad で Apple Wireless Keyboard (JIS) を使ってみました。iPad と Wireless Keyboard のペアリングは iPad に表示されたパスコードをキーボードから入力し、特段問題なく完了しました。

キーボードをつなげてうれしいのは、キー配列がいつも通りなこと、カーソルキーが使えることです。Shift キーを押しながらカーソルキーを操作すると、テキストが選択状態になります。この状態で、Command + X / C / V でコピペもできます。Command + A の全選択、Command + Z の Undo も効きます。長いテキストも、ソースコードすらストレスなく入力できます。サードパーティ製のキーボードでは、JIS 配列として認識しないなどのトラブルが報告されていますが、Apple 製のキーボードは大丈夫なようです。

日本語変換はクセが強く、特に補完機能のせいで、必要ない文字まで入力されてしまうことが多いです。かなりアホな辞書なので、辞書登録機能が待ち遠しいです。ことえりは Control + K でカタカナ変換だったと思いますが、この手のショートカットキーにも対応して欲しいです。ATOK 風に Control + I にも変更できれば完璧です。

バッテリの消費は早いです。Bluetooth キーボードを操作してスリープからの復帰もできるので、頻度は低いながら、常時通信しているのは間違いないでしょう。

スリープ復帰後、4桁のパスコード入力も Bluetooth キーボードから行えます。これはこれで便利なのですが、ちょっと危険かもしれない、と思いました。Bluetooth キーボードはペアリングする必要があるのでまだよいのですが、Dock タイプのキーボードからも同様にスリープ解除できるとしたら、パスコードのブルートフォースアタックで簡単に破られてしまう可能性もあります(Dock タイプのキーボードを装ったデバイスを作るのは簡単ですし、ブルートフォースアタックの自動化も簡単です)。iPad には、パスコードを10回間違えたらメモリを消去する設定がありますが、これをオンにしておく方がよいと思います。

2010年6月22日火曜日

iBooks 1.1 と自炊本事情

iPhone用の iOS 4 と iBooks 1.1 がリリースされ、iBooks でも PDF が閲覧できるようになりました。iPad 用の iOS 4 はまだですが、iBooks の新バージョンは iPad でも今日から使用できます。ようやく純正アプリで、所謂「自炊本」の PDF を閲覧できるようになりました。

早速試してみると、EPUB の本と違って、PDF の閲覧時はページをめくるアニメーションはありません。単に横にスワイプするだけで、やや味気ない感じです。しかも、スキャンをしただけの自炊本は結構もたつきます※。解像度や元の本の大きさなども関係あるかもしれませんが、文庫本で試してみても、若干もたつく感じです。TeX などからコンパイルして作った PDF はスムーズにページ送りできますが、ちょっとごちゃごちゃした図が貼ってあるページは、やはりもたつきます。

普通に本を読み進めるときは、文庫本サイズの本であれば、若干もたつくものの問題ありません。A4 くらいの本だと、かなりひっかかりを感じます。パフォーマンスについては、ページを先読みするなどの手法を導入して改善されるかもしれません。ざーっとページを送ってみたいという要求に対しては、かなり難あり、という印象です。

PDF の表示速度で比較すれば、CouldReaders などの同様の機能を持つサードパーティー製アプリと大差ありません。ファイルを転送するという観点で言うと、iTunes で PDF ファイルを「本」と認識させて iPad と同期できる点では iBooks が優れており、閲覧という観点では、CouldReaders は縦書きの本などに対応するために、ページ送り方向を変更できる点が優れています。

※ ScanSnap を使って、ファインモード (カラー 200dpi / 白黒 400dpi 相当, SnapSnap 仕様) でスキャンしています。()

関連記事

自炊ケーススタディ: マンガ週刊誌編

2010年6月20日日曜日

Automator アクションでの子プロセスの扱い

Automator のアクションで子プロセスを走らせたとき、子プロセスを管理するのはアクション側の責任になります。Automator のワークフローはユーザの操作によって停止することがありますが、その場合、子プロセスを終了させるのは、アクションの実装者の責任です。

AppleScriptObjC で自作アクションを書けますが、ナイーブに do shell script を使って子プロセスを起動させると、停止させる術がありません。NSTask を使って自分で管理するのが良さそうです。

ユーザの停止操作によって、AMAction から継承した stop メソッドが呼ばれますので、そこで動いている子プロセスを停止させます。テンプレートとしては、こんな感じでしょうか。

script my_Automator_Action

  property parent : class "AMBundleAction"
  property NSTask : class "NSTask"
  property NSFileHandle : class "NSFileHandle"
  property task : missing value
 
  -- @override
  on runWithInput_fromAction_error_(input, anAction, errorRef)
    ...
    set command to POSIX Path of "..."
    set args to {}
    set the end of args to "argument 1"
    set the end of args to "argument 2"
    ...
    my runExternalTask(command, args)
    ...
  end runWithInput_fromAction_error_

  -- @override
  on |stop|()
    if task is not missing value then
      task's terminate()
    end if
  end |stop|
 
  -- Instead of 'do shell script', use this method to prepare for abortion by user operations.
  on runExternalTask(command, args)
    set nulldev to NSFileHandle's fileHandleWithNullDevice()
    set task to (NSTask's alloc)'s init()
    task's setLaunchPath_(command)
    task's setArguments_(args)
    task's setStandardInput_(nulldev)
    task's setStandardOutput_(nulldev)
    task's setStandardError_(nulldev)
    task's |launch|()
    task's waitUntilExit()
    task's autorelease()
    set task to missing value
  end runExternalTask

end script

気付いた点をいくつか。

  • NSTask の setArguments: は NSArray を受け取ることになっていますが、以下のようにAppleScript の文字列のリストをそのまま渡しても問題ないようです。ただし、リストの中に数値などが入っていた場合、自動的に文字列に変換してくれず、エラーになります。
  • 標準出力と標準エラー出力を /dev/null へつないでおかないと、コンソールに全部出てしまいます。
  • do shell script は一旦シェルを経由するので、リダイレクトやパイプの指定ができます。同様のことを行うには、NSPipe や NSFileHandle 等を使って自力でやるか、一旦シェルを呼び出すようにします。
  • do shell script は標準出力の内容を戻り値として取得できますが、NSPipe を使って自力で取得する必要があります。

iPadで仕事をしてみる

セミナーに参加する機会があったので、ノートをとるのにiPadを使用してみました。

iPadの標準メモアプリを縦位置で使いました。縦位置ではキーボードがやや狭いので、使いにくいかと思ったのですが、特にストレスなく使えました。タッチパネルに指で触れるだけなので、キータイプの音がしないので、静かな会場ではよいと思います。机の上に iPad をべたっと置いて使うと、暗い会場では下から顔が液晶バックライトで照らされる格好になるので、もしかすると異様な光景になっているかもしれません。

日本語の変換精度が悪く、iWork などのレビューでも散々に書かれています (iWork は全然関係ないですが…) 。iOS 4 ではユーザ辞書登録機能が追加されるなどのロードマップが示されているので、今後、改善されていくものと思います。

2010年6月18日金曜日

VLC は諦めて HandBreak にします

しばらく前に、VideoLAN、OSX版VLCプロジェクト終了の危機 - 開発者不足が原因と報じられていましたが、いよいよこれが現実のものになったようです。VLC 1.0.6 がリリースされていますが、Mac OS X 版のバイナリは一向に公開されません。

VLC は巨大なソフトウェアで、ソースコードから自分で make するのは途方もなく大変です。正直、そこまでやる元気はないです。

また、私が使用していた VLC 1.0.3 から 1.0.5 までMPEG4-AAC エンコーダのバグ (※) で、音が割れるという障害が発生していましたが、これも一向に修正される気配がありません。

※ 同一の .ts ファイルから MPEG2 Video + MPEG Audio の設定で MPEG2 プログラムストリームを生成したときは、音は割れませんでした。

生 .ts を保存し続けるには HDD の容量が厳しくなってきたので、これからはHandBreak というソフトでエンコードすることにします。日本語版もあります。コマンドライン版も配布されているので、こちらを使えば Automator を使ってエンコードできます。

HandBreadkCLI は /usr/local/bin にインストールされているものと仮定します。以下のようなサービスを Automator で作って、「iPhone 用にエンコード」とでも名前を付けて保存しておきます。

以下はコピペ用のコードです。お好みで、ビットレートをいじるなり、2パス解析をやらせるなりしてください。

HANDBRAKE=/usr/local/bin/HandBrakeCLI
SIZE='--width 480 --height 272'
VIDEO='--format m4v --vb 896'
AUDIO='--ab 128 --arate 48'
FILTER='--deinterlace slow'
ENCODER='--encoder x264 --aencoder faac'
X264_OPTS="--x264opts 'level=30:cabac=0:ref=2:mixed-refs=1:analyse=all:me=umh:no-fast-pskip=1'"

while [ $# -gt 0 ] ;
do
    FN=`basename "$1" .mpg`.m4v
    DIR=`dirname "$1"`
    cd "$DIR"
    $HANDBRAKE $ENCODER $VIDEO $X264_OPTS $SIZE $AUDIO $FILTER -i "$1" -o "$FN" \
        > /dev/null 2> /dev/null
    shift
done

2010年6月13日日曜日

iPad 在庫あったー!

品薄が続いているiPadですが、幸運にも予約なしで購入することができました。16GB WiFiモデルです。

使い方については、まだこれといったアイデアはないのですが、一応、持ち歩くことを想定しています。結局、iPhoneも同時に持ち歩くので、音楽やムービーはiPhoneに任せることにしたので、iPadの容量は16GBで十分と判断しています。MacBook Airを持ち歩かないで一週間くらい過ごす、というのもやってみたいと思います。

地鎮祭として、例によってパワーサポートのアンチグレアフィルムを貼り、保護ケースを付けました。ケースは BELKIN の Grip Vue クリアを選びました。背面と周辺部分を覆うタイプのものです。Apple 純正ケースのような、二つ折りのタイプのものも考えたのですが、横向きでは使いにくいのではないか、という懸念が払拭できず、やめました。

まだ必要なアプリが出揃ってない感じです。とりあえず、iOS 4 のリリースを待ちたいと思います。

2010年6月9日水曜日

WWDC 2010 の感想

Apple の WWDC 2010 が開催中です。大方の予想通り iPhone 4 が発表されました。これまで iPhone の弱点と言われていた、マルチタスク機能、液晶解像度、電池の持ちなどを改良し、より魅力的な端末になりました。一番驚いたのは、値段です。このスペックで 32GB モデルが $299 は安い。ガラパゴスケータイ陣営の皆様はどうするんでしょう、本当に。

Safari もアップデートされました。Safari 5 になって、より軽くなりました。意外なことに Flash アプリも軽くなりました。Flash プラグインは 10.0r42 のままなので、Safari 側で何かがんばったのでしょう。それでも処理や内容に比べて CPU を占有しすぎの感は拭えませんが…。

一番ショックだったのは Mac 本体や次期 Mac OS X について、何のアナウンスもなかったことです。新型 MacBook Air を期待していたのに…。

以上、WWDC 2010 に対する感想でした。

2010年5月30日日曜日

SONY デジタル一眼 NEX-3/NEX-5

世界最小、最軽量、フルハイビジョン動画も撮れるデジタル一眼。というフレコミのミラーレスの一眼レフ?です。6月3日発売予定、久しぶりに物欲を刺激されるカメラです。
http://www.sony.jp/ichigan-e/products/NEX-5D/

機動力

NEX-5D は 16-55mm のズームレンズ付き (35mm換算) ですので、通常のスナップ撮り中心なら十分です。メモリーカードとバッテリ装着状態で、本体が 287g、ズームレンズが 194g、合計 481g です。確かに軽い。今使っている EOS Kiss X2 と比べても半分くらいです。本体が激薄なので、これなら持ち運べるという感じがします。

27-300mm のズームレンズ (35mm換算) も登場予定です。こちらは 524g で本体と合わせて 811g です。このズームレンズ 1本があれば、常用範囲を十分カバーできます。今、Canon 製のほぼ同スペックのレンズを持っていますが、レンズ自体の重さはそう変わりません。

光学ファインダー

標準では光学ファインダーがありません。液晶ファインダーではピントがどこに合っているかわかりにくいですし、ワンテンポ遅れてしまう液晶ファインダーで流し撮りをするのは無理でしょう。

300mm のズームレンズはかなり重たいですが、光学ファインダーは両手と目の 3点支持になるから、この重さでもギリギリ手持ちで撮れるのです。光学ファインダーはデジカメであっても重要な機能です。

NEX-5D では、光学ファインダーが別売りで登場するようです。これを買うと二眼レフのように使えるという理解でいいのでしょうか。光学ファインダーは 34g とさほど重くないです。

対象ユーザ

ホワイトバランス、ISO感度などの設定ですが、ややストレスを感じる UI となっているようです※。対象ユーザーはコンデジでは不満だけど、一眼レフはちょっと、カメラにおまかせで撮る人、を対象にしているようです。

私は自分で設定したいので、少し不安が残ります。これは実際に触ってみないと何とも言えません。

他の懸念としては、手ブレ補正機能があります。Canon の手ブレ補正機能はとても優秀で、流し撮りの時はそれを検知して、流れていない方向だけ手ブレ補正してくれるます。こうしたサポートがなくなって、どれくらい使用に耐えるのか、と思いますが、そもそも対象ユーザーとしては想定されていない使い方なのでしょう。ただ、色々な懸念を差し引いても、常用カメラとしての魅力を感じます。

ミラーレスα、ソニー「NEX」を丸裸にする(後編) ── ITmedia
  ミラーレスα、ソニー「NEX」を丸裸にする(後編) ── ITmedia

2010年4月16日金曜日

実験中の電波は出さないで

WiFi で使われている 2.4GHz 帯は規制は緩いですが、

研究施設だから実験をするのは仕方ないですが、

変な電波を出さないでいただけないでしょうか。マルウェアを仕込まれたかと疑ってしまいました…。

不幸なことに、Touch Diamond & WiFiSnap が調子悪かったという偶然と重なったため、原因を特定するまでに時間がかかってしまいました。調子悪い原因も、実験中の電波が出ていたせいなのかもしれませんね…。

2010年3月28日日曜日

コンセントもすっきりと

新生活をスタートさせる人も、そうでない人も。電源周りをすっきりさせて気持ちよく新年度を迎えましょう! ということで、電源周りの整理ネタを 2つ。

壁際をすっきりと

まずは根本からです。ヤザワコーポレーション のタップを買いました。壁のコンセントに付けると、下方向へ3本のタコ足ができるので、同一方向に配線がまとめられてスッキリします。

普通のタコ足タップでは、3方向とかに配線が広がってしまって、ごちゃごちゃした印象になります。とても気に入ってます。

机の隅もすっきりと

こちらはサンワサプライのクランプ付きタップ TAP-B25 です。

集中電源スイッチ付きで、節電もバッチリです。この手のスイッチ付きタップはよくありますが、せっかく買ってきても腰をかがめないと操作できない場所に設置することになりがちで、ついつい億劫になってしまいます。これなら机の隅にクランプで止められますので、簡単に操作できて、便利です。

ハンダごてなど、常設でない電化製品をちょっと使うときの電源にも重宝します。

2010年3月26日金曜日

まもなく登場!? 3つのリモコンソリューション

RedEye mini

iPhone/iPod touch のイヤフォンジャックに差し込むタイプです。2010年 4月発売らしいです。イヤフォンジャックは、iPhoneは本体上部、iPod touchは本体下部なので、アプリの画面が回転するでしょう、きっと。

それにしても、単純そうなものの割にデカいですね。UiRemoteが製品化されたと考えたらいいのでしょうか? こんな回路だと思いますので、買わないで作っちゃうのも手です。

イヤフォンコネクタがふさがるので音が鳴らなくなりますが、Dockコネクタが空いているので、常時充電しておきたい人向けでしょうか?。

L5 remote

(↑サイトに移動すると音が出ます) Dock コネクタに取り付けるタイプです。2010年 2月発売ということですが、未だに動きがありません。

Dock コネクタは iPhone/iPod touch ともに本体下部にありますので、使用時は本体を逆さまに持って使うことになります。イアフォンジャックが空いているので、音楽を聴きながら、リモコンとしても使いたいという人向けでしょうか。

iPhone Universal Remote Case

最近流行のケースに内蔵しているタイプです。iPhone と iPod touch で本体の形状が違いますし、今後、iPhone の形が変わったりすると使えなくなります。デメリットが大きい気がします。

充電をどうする?

RedEye mini も、L5 remote も機能としてはそう変わりません。あとはアプリの出来を見て、どちらにするか、ということになるでしょう。

充電をどうするかは問題です。L5 remote は充電する時に外す必要があります。iPhone と RedEye mini の組み合わせだと、本体上部に付くので常時充電は簡単ですが、iPod touch は本体下部に付くので、RedEye mini を付けた状態では Dock に入りません。一工夫必要ですね。

私は iPod touch に付けたいのですが、このアルミスタンドを買って、イアフォンジャック部分にドリルで穴を開けることにしましょうか…。

2010年3月22日月曜日

iPhone デビュー

ついに我慢できなくなって、iPhone 買いました。やっぱり自立した通信回線を持っていると、便利です。iPod touch での運用経験から、TUNEWEAR iPhone 3GS/3G対応レザーケース PRIE Ambassador for iPhone 3GS/3G と、パワーサポート アンチグレアフィルムセット for iPhone 3G PPC-02を一緒に買いました。iPod touch に比べると、ちょっと分厚くて重い、という印象はあります。

iPod touch からの移行はスムーズで、基本的には iTunes で同期するだけで終了です。バックアップから復元という選択肢もあったのですが、iPod touch のデータを書き戻すのは何となく不安だったのでやめました。サードパーティーのアプリのデータは、クラウドの中にあるもの (Evernote や Google RSS) については、そもそも移行の必要がありません。2〜3のアプリについては移行作業が発生しましたが、これは私の使い方に起因するもので、特に問題はありませんでした。ゲームのデータは移行できなくてもかまわないので捨てました。これなら今後の機種変更も安心です。

電話としては不便という話は聞いていたのですが、私は特に不便さを感じていません。GPSとカメラは思いの外便利で、色々使っています。カメラをメモ的に使っている方は多いと思いますが、そういう使い方では撮影後に撮影日時がすぐに確認できない点が不便と感じています (アプリを入れれば何とかなりそうですが…) 。

ドコモのケータイがなくなって、持ち歩くガジェットが減ったのは清々しく感じています。義務的に持ち歩いていたドコモのケータイは、結構ストレスだったようです。ガラパゴス操作系がなくなった影響で、Windows mobile (Touch diamond) のダメさ加減が際だってきました…。これは「スマート」フォンではないですね。もはや、鈍くさいフォンと呼んでいます…。

とりあえず、ファーストインプレッションを書いておきます。

2010年3月14日日曜日

音声ケーブルは無線化しないと…

今まで、iPod touch の音声ケーブル (兼簡易リモコン) としてオーディオテクニカの AT335i BK を使っていたのですが、この製品、3回買って、3本とも一ヶ月程度で壊れてしまいました。プラグの付け根の部分が非常に脆く、その部分で断線したり、ひどいときは千切れたりしました。私の扱いが悪いというのもあるのでしょうが、首都圏の混雑した通勤電車では、ケーブルが他の人の荷物に絡まったりして、無理な力がかかってしまいます。有線接続を通勤電車で使うのは無理、という結論に至りました。

iPhone・iPod touch ラボさんの記事を参考に、ソニーの DRC-BT30P を買って、Bluetooth で無線化することにしました。選定の理由は、USB からの給電で充電できること、好みのイアフォンが使えることです。

サンワサプライの USB充電タップ型ACアダプタ ACA-IP14 でちゃんと充電できました。電源 (+5V) だけが供給されていれば OK のようです。

DRC-BT30P は複数の機器とペアリングできるのですが、接続できるのは同時に一つだけで、複数の機器の音声をミキシングというわけにはいかないようです (当たり前) 。

AT335i BK の簡易リモコンとしての機能は、ボリューム、一時停止、次曲と前曲がありました。DRC-BT30P ではボリュームと一時停止は OK ですが、選曲は iPod touch 側の問題でうまくいきません。回避法はあるのですが、お金がかかるのでこれは素直に諦めます。

DRC-BT30P はヘッドセットとしても使うことができるので、もしやと思って試してみましたが、iPod touch 用のボイスレコーダ用のマイクとしては使用できませんでした。こちらは引き続き ThumbTacks を使うことにします。

ちなみに、AT335i BK の相方を務めた首かけ型のイアフォンは、オーディオテクニカ製で、今も快調に使えています。オーディオテクニカに恨みがあるわけではないので、念のため。

2010年3月7日日曜日

Wi-Fi バリュープラン (i)

ソフトバンクの Wi-Fi バリュープラン (i) が発表されました。これで契約すると月々 3,785円で iPhone が使えるという理解でいいのでしょうか? 正直、安い…と思います。

常に持ち歩くガジェットの数は減らしたいという欲求はあります。今は、ドコモとイーモバイルの携帯電話、iPod touch の計3台。ドコモの携帯と iPod touch を iPhone で置き換えれば 2台に減らせる…という悪魔のささやきが聞こえます。

iモードのサイトとかはハナから利用していないので、ガラパゴス携帯の機能とかはどうでもいいのですが、ドコモの携帯電話を残している理由はおサイフ機能です。モバイル SUICA は使いたい。でも VIEW SUICA カードメインになったので、モバイル SUICA の利用シーンはグリーン車に乗る※ときくらいで、現在では存在意義が薄れているなあ…と思っているところに、Wi-Fi バリュープラン (i) の発表があったわけです。

※ 首都圏の普通列車に連結されているグリーン車のグリーン券をモバイル SUICA で購入できます。着席してから車内でアテンダントさんから買うと事前購入より高いのですが、モバイル SUICA なら着席してから事前購入と同額で買うことができます。

理想は 1台で iPhone に集約したいですが、現状、ソフトバンクがテザリングを許さない以上、そこは現実味がありません。多分、6月に新型が出るんだろうなあ…。やはり今はタイミングが悪いのか…。うわー悩む…。

2010年2月17日水曜日

FruitMenu が帰ってくる!

Mac OS X 10.6 Snow Leopard で動作しなかった FruitMenu ですが、Twitter で Snow Leopard 対応のβ版を配ってテストしているようです。

Haxies の公式ブログ (英語) Quick Status Update (2010-02-12) や Betas, Twitter and WTF (2010-02-16) などの記事を見ると、リリースが近そうです。

待ち遠しい!

2010年1月24日日曜日

メモ: オリジナルの Automator アクションを作る

Mac OS X 10.6 では、Xcode 3.2 を使います。Mac OS X 10.6 から AppleScript Studio が deprecated になり、AppleScriptObjC を使うことになりました。簡単に言うと、AppleScript で Objective-C のクラスを書けるように、うまいこと対応を付けたものです。これによって、Automator の実行速度が上がったり、ユーザにとってはいいことずくめですが、問題は、今までの Automator アクションの作り方と大幅に変わってしまったことです。現時点では Google 先生が教えてくれる情報は、あまりアテになりません。Apple もドキュメンテーションをサボっていて、手探り状態です。

まず、知っておかないといけないのは、Xcode 3.2 が作ったテンプレートの違いです。Mac OS X 10.5 用のアクションは、以下のように、単に run ハンドラに input と parameters が渡されるだけでした。

on run {input, parameters}
  -- Add your code here, returning the data to be passed to the next action.

 return input
 
end run

これからは、myaction.script にはこんなコードが生成されます。

script myaction
 property parent : class "AMBundleAction"

 on runWithInput_fromAction_error_(input, anAction, errorRef)
  -- Add your code here, returning the data to be passed to the next action.

  return input
 end runWithInput_fromAction_error_
end script

script 〜 end script は見慣れないブロックです。これは、Objective-C のクラス定義で、myaction というクラスを宣言しています。2行目の property parent の行は AMBundleAction を継承をしていることを宣言しています。これにより、NSObject → AMActionAMAppleScriptActionAMBundleAction → myaction という継承ツリーを持ちます。on runWithInput_fromAction_error_ 〜 end runWithInput_fromAction_error_ はメソッドの定義です。オリジナルのアクションは、runWithInput:fromAction:error: をオーバーライドして作るという形になります。

AppleScript しか知らなくて、ピンと来ない人は、まずは、以下のようにテンプレートを埋めましょう。

script myaction
 property parent : class "AMBundleAction"
 
 on runWithInput_fromAction_error_(input, anAction, errorRef)
  -- Add your code here, returning the data to be passed to the next action.
  set input to input as list
  set output to {}
  repeat with i in input

   -- do something for i

  end repeat
  return output
 end runWithInput_fromAction_error_
 
end script

これで、入力ファイルに対して、順番に何かをする、という処理が書けると思います。アクションの出力は、ここではファイルと仮定しますが、POSIX File の文字列を output のリストに詰め込んで返却すれば OK です。

パラメタの参照

パラメタは以前は run ハンドラの引数に渡されていました。これからは、AMBundleAction から継承した parameters() メソッドを使って、パラメタの値が入ったレコードを取得します。個々のパラメタには AMDefaultParameters (Info.plist にあります) に設定したキーでアクセスできます。例えば、foo というキーを持つパラメタは foo of parameters() でアクセスできます。ただし、取得した値は、as text や as number などで、型をきっちり指定してください。パラメタと GUI のバインディングなどは、これまでと同じなので省略します。

アクションのバンドル

アクションのバンドルの中のファイル (リソース) の参照には path to resource は使えません。これだと Automator.app のバンドルを参照してしまいます。AMBundleAction から継承した bundle() メソッドを使って、一旦 NSBundle オブジェクトを取得したあと、NSBundle のメソッドを使ってアクセスします。名前の衝突を防ぐために、縦棒 (|) で囲って |bundle|() とやるとアクションのバンドルオブジェクトが取得できますので、それに対して、pathForResource:ofType:等を使ってリソースのパスを取得します。具体的には、以下のようになります。

set action_bundle to |bundle|()
set aPath to action_bundle's pathForResource_ofType_("image", "tiff")

エラーの返却方法などは、まだよく分かっていません。この辺になにやら書いてありますが、NSNumber と NSString を NSArray に突っ込んで返してるけど、NSError を返却するんじゃないの? という疑問が…。この情報も古いのかもしれません…。

2010年1月18日月曜日

Automator 雑感

サービスの作成プリントプラグインの作成ワークフローの作成、そしてGUI 付きのオリジナルのアクションの作成と、Automator を一通り使ってみました。

Automator が登場した当初、GUI で操作できるのは良いのですが「どうせおもちゃしか作れないんでしょ?」「オリジナルのアクションが作れるかもしれないけど、本当にしたいことは、Objective-C で書かないといけないんでしょ?」と思っていました。これは誤りでした。一通り使ってみた現在では、生産効率の高いソフトウェアプラットホームとして、十分使えるというのが認識です。「AppleScript を実行」や「シェルスクリプトを実行」で使い捨てで書けますし、必要に応じて GUI 付きのアクションに仕立てて、再利用することもできます。

これからも積極的に Automator を使っていきますよー!

2010年1月17日日曜日

サブフォルダを再帰的に辿って、ファイルにナントカする

指定したフォルダに含まれるすべてのファイル (サブフォルダも含む) に対して、何かを行うというのはよくありますが、AppleScript で書くと、意外と面倒だったりします。

Automator なら一発です。

最初に指定するテンプレートは、「ワークフロー」です。ワークフローは、Automator を起動して、実行ボタンを押して動かします。

空のワークフローに、以下のアクションを追加します。

  • 「指定された Finder 項目を取得」アクションは、選択している GUI でファイルやフォルダを選択し、そのリストを次のアクションへ渡します。上の例では、2つのフォルダを選択しています。※
  • 「フォルダの内容を取得」アクションは、受け取ったフォルダに含まれるファイルやフォルダの一覧を取得します。ここでは、サブフォルダに含まれるファイルやフォルダも再帰的に取得してほしいので、「見つかったサブフォルダからも取得」にチェックを入れておきます。
  • 「Finder 項目にフィルタを適用」アクションは、受け取ったファイルやフォルダの一覧を、指定した条件でフィルタリングします。上の例では、拡張子とファイル名の 2つの条件を追加しています。「結果」ボタンを押して、何がヒットしたかを表示させています。4つのファイルのリストが次のアクションに渡されます。
  • 最後に AppleScript で実際に何をするかを書きます。input には、ファイルのリストが渡されます。parameter は、とりあえず無視で OK です。もし、この後、別のアクションを実行したいなら、run ハンドラで次のアクションに渡すデータ (ファイルのリストや、文字列) を返却してください。

AppleScript が使える人は、今日から Automator で幸せになれますよ。シェルスクリプト、Perl、Ruby、Python でも同様に書けます。

※ サービスやアプリケーション (ドロップレット) の形で作ると、ユーザによって起動時にフォルダが指定されますので、この部分は不要になります。

2010年1月14日木曜日

PDF を Web Receipts フォルダに保存

Automator のお題をもう一つ。今度はプリントプラグインです。プリントプラグインとは、印刷ダイアログの左下にある「PDF ▼」で実行するワークフローです。このワークフローは、プリントシステムから PDF ファイルを受け取り、それに対する処理を行うものです。

プリントプラグインは、かつて PDF ワークフローと呼ばれていたようで、Mac OS X 10.6 に付属の「PDF を Web Receipts フォルダに保存」は現在のプリントプラグインとは違う形式で作られています。これをプリントプラグインで作り直してみます。ただ作り直すだけではつまらないので、Web Receipts フォルダに印刷を実行した日の日付のフォルダを作って、その中に PDF ファイルを保存する仕様に変更します。

Automator で、プリントプラグインのテンプレートを使い、「シェルスクリプトを実行」のアクションで、以下の Python スクリプトを実行させます (ポップアップのシェルを /usr/bin/python にする) 。

オリジナルの「PDF を Web Receipts フォルダに保存」の実体は Python で書かれています。これが、同じファイル名で上書きしないなど、色々気を遣ってよくできているので、これをパクって作ります。PDF ワークフローとは異なり、ファイル名が渡されるだけですので、安全なファイル名に変換するルーチンは削除してあります (/tmp に保存されているのだから、既に安全なファイル名のはず) 。適当に手直ししてますが、清野は Python を使ったことがないので、変なことを書いているかもしれません。

#!/usr/bin/python
#
# This script is stolen from
# /Library/PDF Services/Save PDF to Web Receipts Folder.pdfworkflow/Contents/tool

import os
import shutil
import sys
import time

def main(argv):
    (title, ext) = os.path.splitext(os.path.basename(argv[0]))
    pdfFile = argv[0]

    today = time.strftime("%Y-%m-%d", time.localtime())
    destDirectory = os.path.expanduser("~/Documents/Web Receipts/" + today + "/")

    # Create the Web Receipts folder if necessary.
    try:
        os.makedirs(destDirectory)
    except:
        pass
    
    # Build a file path pointing into the web reciepts folder
    # using the document's title and a PDF extension.
    destFile = title + ".pdf"
    destPath = os.path.join(destDirectory, destFile)

    # If the filename we want is already in use then start
    # appending numbers until we get a unique name.
    i = 2
    while (os.path.exists(destPath)):
        destFile = title + "." + str(i) +".pdf"
        destPath = os.path.join(destDirectory, destFile)
        i = i + 1

    # Move the file if possible otherwise copy it.
    shutil.move(pdfFile, destPath)

if __name__ == "__main__":
    main(sys.argv[1:])

これを、~/Library/PDF Services/ に保存します。Automator の画面は、以下のようになります。

清野は、Files lite との同期用スクリプトを少しいじって、Web Receipts フォルダの内容を iPod touch へ転送するようにしています。ちょっと気になった Web ページなどを保存しておき、後で iPod touch でゆっくり読むためです。

2010年1月13日水曜日

エンコードスクリプトをサービスにしてみる

動画をエンコードするのに Terminal を起動するのが面倒なので、Automator を使ってサービスにしてみます (Mac OS X 10.6 以上) 。

サービスにすると、このように、コンテストメニューから呼び出せます。便利便利。

手順1

Automator を起動し、サービスのテンプレートを選びます。テンプレートに沿って空のワークフローが作成されます。

手順2

ウィンドウ上部のサービスは、次の選択項目を受け取ります:のポップアップからムービーファイルを、検索対象:からすべてのアプリケーションを選択します。

手順3

左側のライブラリから、ユーティリティを選びます。次に、その隣のカラムに出てきたシェルスクリプトを実行を、右の広いエリアにドラッグ&ドロップします。

シェル:のポップアップから/bin/shを、入力の引き渡し方法:から引数としてを選択します。

以下のスクリプト書きます。

VLC=/Applications/VLC.app/Contents/MacOS/VLC
SIZE="width=480,height=270"
ASPECT="canvas-aspect=1:1"
FPS="fps=29.97"
CROPPADD="cropbottom=2,paddtop=2,paddbottom=2"
X264_OPTS="profile=baseline,level=30,keyint=30,bframes=0,ref=1,nocabac"
VIDEO="venc=x264{$X264_OPTS},vcode=h264,vb=1280"
AUDIO="acodec=mp4a,ab=128"
OPTS="deinterlace,audio-sync"
MUX="mux=mp4"

while [ $# -gt 0 ] ;
do
 FN=`basename "$1" .mpg`.mp4
 DIR=`dirname "$1"`
 cd "$DIR"
 $VLC --intf=dummy \
      --sout="#transcode{$SIZE,$FPS,$ASPECT,vfilter=croppadd{$CROPPADD},$VIDEO,$AUDIO,$OPTS}:standard{$MUX,dst='$FN',access=file}" \
      "$1" \
      vlc://quit > /dev/null 2> /dev/null
 shift
done

手順4

ワークフローを保存します。通常は ~/Library/Services/ に保存します。完成すると、以下のような画面になっているはずです。

複数のムービーファイルを選択して、サービスを実行してもちゃんとエンコードされます。

実際に作業をするとお気づきになると思いますが、Perl や Ruby などでもスクリプトを書けます。色々な用途に使えそうな Automator 。侮れません。

blogspot で自作したワークフローファイルとかを配布したいのですが、どのようにしたらいいのでしょうか??? よい、知恵をお持ちの方、コメントを付けてください。

2010年1月10日日曜日

iPod touch 導入一周年

もういつだったか忘れてしまったのですが、iPod touch を手にして、そろそろ一年が経ちます。その間、何が変わったかを振り返ってみたいと思います。画像は、私の iPod touch のスクリーンショットです。

iPod touch の購入にあたり、通勤時間を有効に使うというテーマを設定しました。自宅や職場でしている作業が iPod touch によって通勤電車の中でできるようになれば、成功したと言えます。そうした観点から、今使っているアプリを紹介します。

メール

iPod touch 導入後しばらくして、MacBook Air で読むメールアドレスと、iPod touch で読むメールアドレスを完全に分離しました。職場で読むメールと、通勤電車の中で読むメールを分離するためです。Dock の Mail.app に出ている未読メール数は仕事中でも気になるもので、これは予想以上に効きました。今後もこの方針で行きます。

Byline (450円)

RSS リーダの決定版。画像も含めてオフラインで読めるというのがうれしいです。RSS での情報収集は極めて有用ですが、案外時間を取ってしまうものです。Safari のブックマークバーから RSS のエントリを取り除いたことで、メール同様にすっきりしました。この方針も堅持します。

Todo (1,200円)

通勤電車の中で、その日やることを整理しています。だいたい、アイデアは TODO 項目に関連が付くもので、ふと思いついたら TODO 項目を作って、そこに書きます。MacBook Air の画面が狭いので、iCal には TODOリストを表示せず、iPod touch だけで管理することで、画面を広く使うという副次的な効果もありました。iPod touch を用途限定のサブディスプレイとして使うというのは結構イケます。ちょっと高いアプリですが、今では必須です。

Files lite (無料)

PDF ビューワーとして使っています。MacBook Air との同期には sitecopyを使っています。ケータイの PDF ビューワーと違って、高速かつ精彩に出るので、かなりのドキュメントが読めます。ちょっと変わったところでは、コンビニの払込票のバーコードを表示して、読み込んでもらったことがあります。ちゃんと読めるのに驚きました。

ビデオ

録画した番組を見るのに使っています。このための方法は色々調べて、他のエントリなどで書きました。予約録画後、編集、エンコード、同期といった手間が必要なので、その部分を自動化できればもっといいのですが…。

これだけやることがあると、通勤時間の方が足りなかったりします…。