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 ではありません。ゴミ箱、スポットライト、ログファイル、キャッシュを除くかどうかは、各自の事情により判断の分かれるところです。