2009年12月25日金曜日

HDD の Load_Cycle_Count が異常

研究室で 24時間稼働させている MacBook Pro の HDD は、smartmontools によって監視しています。Load_Cycle_Count が悪化していることに気付いたため、ここ数日注視していました。ちなみに、Load_Cycle_Count は、HDD のヘッドが待避領域へ移動し、再度ディスク上へ移動した回数です。

データが 4日分しかないのですが、記憶を総合すると、VALUE (100 で正規化されており、THRESH の値を下回ると寿命) が 1週間ほどの間に 33 → 31 へ変化していました。100で正規化されているので、このペースで行くと、あと3ヶ月ほどで寿命を迎えることになります。

ID# ATTRIBUTE_NAME   VALUE THRESH RAW_VALUE (日付)
193 Load_Cycle_Count 031   000    690701    (2009-12-25)
193 Load_Cycle_Count 032   000    688884    (2009-12-24)
193 Load_Cycle_Count 032   000    687067    (2009-12-23)
193 Load_Cycle_Count 032   000    685243    (2009-12-22)

このデータは、毎日指定時刻に自動的に収集したものです。RAW_VALUE の増分を見ると、1日あたり、1800程度増えています。1800を24で割ると、1時間あたり75回のヘッド待避・再ロードが繰り返されています。何か、とても臭う増え方をしています…。SMC リセット、P-RAM クリア、バッテリの交換、緊急モーションセンサーの無効化などを試してみたのですが、ことごとくダメでした。

結論から言うと、hdapm を使うとピタリと止みます。HDD のパワーマネジメントを変更するツールだそうです。と言っても、完全に 0 になるわけではないようです。今のところの計測では、1時間あたり15回程度にまで削減されました。1日あたり360回、現在の主流の 2.5インチの HDD は 60〜100万回程度は耐えられるようですから、5年くらいの寿命という計算になります。妥当な線でしょう。

インストールは、上記のページから .dmg を落としてきて、マウントした後、Terminal から以下のようにタイプします。Finder でファイルをコピーすると、ファイルオーナーの関係でうまく動作しません※。

sudo mkdir -p /usr/local/bin
sudo cp /Volumes/hdapm/hdapm /usr/local/bin
sudo cp /Volumes/hdapm/hdapm.plist /Library/LaunchDaemons

インストールしたら、再起動してください。

国内のブログで hdapm を紹介している記事を読むと、この問題について HDD からクリック音がしてうるさいとか、HDD のアクセスが一瞬止まると言った観点から取り上げられていますが、そういう「感覚」の問題ではありません。これは HDD の寿命を確実に縮めます。

※ /Library/LaunchDaemons から起動されるプロセスのオーナーは root です。このため、.plist ファイルのオーナーは root:wheel 、パーミッションは rw-r--r-- でなければなりません。launchd はオーナーやパーミッションが異常な .plist ファイルを無視します。

2009年12月22日火曜日

WMWifiRouter は悪くない?

WMWifiRouter 1.6.0 がリリースされましたが、DMZ をオフにできない問題は解消されていません。

しばらく前から、WifiSnap に乗り換えたのですが、WifiSnap でも DMZ をオフにできません。こちらも問い合わせているのですが、調査をするので時間をいただきたい、というメールが返ってきて、音沙汰なしです。難航しているのでしょうか。

2つの同種のソフトで、同じ問題が発生しているところを見ると、ソフト側の問題ではないのかもしれません。Touch diamond S21HT の問題か、Windows Mobile のセキュリティホールなのか、Windows Mobile が既にクラックされているのか…。

早くイーモバイルの回線で iPhone が使えるようになりませんかねぇ…。

2009年10月31日土曜日

iPhone / iPod Touch 用動画を作る (VLC 1.0 対応版)

VLC 1.0 以降を使って、iPhone / iPod Touch 用動画を作成するシェルスクリプトです。Mac OS X 10.6.1 と VLC 1.0.3rc (Intel, 32bit 版) で動作を確認しています。64bit 版の VLC 10.0.x は、今のところうまく動作しないようです。

以下のシェルスクリプト mpg2mp4 にまとめました。入力には、1440x1080 29.97fps の MPEG-PS 動画を想定しています。

#!/bin/sh
VLC=/Applications/VLC.app/Contents/MacOS/VLC
OUTPUT=`basename $1 .mpg`.mp4
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=1536"
AUDIO="acodec=mp4a,ab=128"
OPTS="deinterlace,audio-sync"
MUX="mux=mp4"

$VLC --intf=dummy --sout="#transcode{$SIZE,$FPS,$ASPECT,vfilter=croppadd{$CROPPADD},$VIDEO,$AUDIO,$OPTS}:standard{$MUX,dst=$OUTPUT,access=file}" $1 vlc://quit

X264_OPTS から始まる行は、長いので折り返して表示されていますが、nocabac" まで 1行で入力してください。同様に $VLC から始まる行は、vlc://quit まで 1行で入力してください。

使い方

foo.mpg を入力とし、foo.mp4 を作るには、シェルから以下のようにタイプします。

mpg2mp4 foo.mpg

VLC がコマンドラインモードで動作し、しばらくすると、カレントディレクトリに foo.mp4 が吐き出されます。

注意事項

iPhone / iPod Touch で再生できる H.264 形式の動画は、ベースラインプロファイル 3.0 以下である必要があります。上記シェルスクリプトの設定を変更する場合は、VLC の出力するメッセージの以下に示す箇所を見て確認してください。メインプロファイルになると、再生できません。例えば、CABAC を有効にすると、とたんにメインプロファイルになってしまいます。

[0x5012f8] main interface error: no interface module matched "globalhotkeys,none"
[0x5012f8] main interface error: no suitable interface module
[0x20a218] main libvlc error: interface "globalhotkeys,none" initialization failed
[0x28c3f8] dummy interface: using the dummy interface module...
[0x100f8a8] a52 packetizer: A/52 channels:2 samplerate:48000 bitrate:256000
No accelerated IMDCT transform found
x264 [info]: using threads=3
x264 [info]: using cpu capabilities: MMX2 Cache64
x264 [info]: profile Baseline, level 3.0)

こちらではAutomator を使って、簡易な GUI を付けてる方法を紹介しています。

2009年9月28日月曜日

シリアルポートようやく全廃

連休中、思い出したようにハンダゴテを持って電子工作をしていました。後片づけをしている時、ふと「シリアルポート関係の機材要らなくなってね?」と気づきました。今回の工作のために購入した機材と、出来上がった作品で、USB への置き換えが済んでいたのです。単純な置き換えではなく、機能向上が目的だったので、全然意識していませんでした。iMac が USB を採用してから、10年くらい経ったでしょうか。我が家でもようやくレガシーインターフェースが無くなりました。

それにしても、意外とレガシーインターフェースしぶとかったです。アヤシゲな自作品とかが USB に対応できなかったことが原因です。外付けUSB-シリアル変換器は持っていましたが、改めて秋月電子からUSB-シリアル変換モジュール FT232RLを買ってきました。950円です。Mac OS X 用のドライバもあります。なぜ変換器がダメかという理由は明確で、シリアルポートポート用のケーブルやら変換アダプタやらを相変わらず必要とします。それに電源の供給がないので、別途 AC アダプタが必要になります。変換モジュールで組み込んでしまえば、実態はともかく見た目は USB ですし、USB から給電される電力が使えるので、全体としてはスッキリした構成になります。

最後まで残っていた、こいつらは、全部退役です。今までありがとう。そしておつかれさま。

2009年8月30日日曜日

ここが非互換 Mac OS X 10.6 -- iCal

Mac OS X 10.6 Snow leopard が発売になりました。

当サイトでは、よく iCal 関係の AppleScript を扱っていますが、Mac OS X 10.6 では、少し挙動が変わりました。試しに、iCal でカレンダー「テスト」に「テスト」というイベントを作って、AppleScript から観察してみます。

tell application "iCal"
  tell calendar "テスト"
    properties of event 1
  end tell
end tell

以下は 10.5.8 (iCal 3.0.8) の結果です。

{
  allday event:false,
  class:event,
  description:missing value,
  end date:date "2009年 9月 2日 水曜日 1:00:00 PM",
  excluded dates:{},
  id:"C0DC5F01-4183-412E-95AB-9414FD8111C6",
  location:missing value,
  recurrence:"",
  sequence:2,
  stamp date:date "2009年 8月 30日 日曜日 2:27:03 PM"
  start date:date "2009年 9月 2日 水曜日 10:00:00 AM",
  status:none,
  summary:"テスト",
  url:missing value,
}

以下は 10.6 (iCal 4.0) の結果です。

{
  allday event:false,
  class:event,
  description:missing value,
  end date:date "2009年9月2日水曜日 16:00:00",
  excluded dates:{},
  id:"6A5888C1-D872-4C5F-B053-09CD8FC5067D"
  location:missing value,
  recurrence:missing value,
  sequence:2,
  stamp date:date "2009年8月30日日曜日 14:20:48",
  start date:date "2009年9月2日水曜日 13:00:00",
  status:none,
  summary:"テスト",
  url:missing value,
}

プロパティリストの結果は、比較しやすいように辞書順に並べ替えています。以上のように、recurrence に値が設定されていない時の結果が違います。description に "" (空文字列) を設定した時の挙動も違い、iCal 3.0.8 では "" になりますが、iCal 4.0 では missing value になります。

なお、missing value を文字列に変換して扱ってはいけません。AppleScript では missing value as string は "missing value" という文字列になるというよく分からない仕様なので、気をつけましょう。

2009年8月25日火曜日

XSLT で属性値に中括弧 {} を書く

XSLT の <xsl:value-of select="..."/> などで、属性値 select の値に中括弧 { ... } を使うと、その中は XPath 式として評価されます。それはそれで便利なのですが、中括弧自体を出力したい時は、以下のように中括弧を二重に書くことで、エスケープできます。

  <xsl:value-of select="{{1234}}"/>  

このように書くと {1234} が出力されます。

先日、困ったので、メモ書きしておきます。

2009年8月23日日曜日

Bento 2.0.5 リリース

Bento 2.0.5 アップデータがリリースされました。

Bento 2.0.4 の、アドレスブックや iCal のイベントが増殖する問題は、今回のアップデータで解決されたようです。

AppleScript のサポートは依然として改善されてません…。

2009年8月14日金曜日

POCKEPRE は福音となるか?

iPhone/iPod Touch を使ってプレゼンをするためのアプリ POCKEPRE が登場しました。Mac 本体を持ち歩かなくても、プレゼンをしたいという人にとっては福音となるのでしょうか?

ソフトウェアの機能については、メーカーのプレスリリースを読んでいただくとして、iPhone/iPod Touchから、コンポジットAV出力を出すケーブルを買う必要があります。この手のケーブルはたくさんの種類があるように見えますが、iPod Video 専用で iPhone/iPod Touch では利用できなかったりするものがあるので、意外と選択肢は少ないです。

もう一つ気になるのは、次世代 iPhone では、iPod dock ケーブル端子が廃止され、mini USB-B 端子になるという噂がある点です。これになっちゃうと、せっかく買ったケーブルは使えなくなっちゃいますね。

2009年7月26日日曜日

地デジ完全移行 2年前

地デジ完全移行 2年前である 2009年 7月 24日を過ぎました。ここらで、一旦現在の状況をおさらいすることにしました。

地デジの陰に隠れた真の狙い

地デジ移行の真の狙いは、貴重な電波帯域である VHF帯や UHF帯の一部を、テレビ以外の他の用途 (例えば、高速モバイルインターネットサービス) に振り向けることです。これは、移動体通信がさらに重要になるであろう今後のことを考えると、大変価値のあることです。テレビ放送のデジタル化は、これを実現するための手段にすぎません。テレビ局にアナログ放送とデジタル放送の両方の設備を負担させていること、および電波帯域再配分ができなかった時の国際競争力低下を考えると、完全移行を行わないとか延期するという選択肢はありえないと言っていいでしょう。あらゆる手段 (無料チューナーバラマキとか) を用いて、移行することになります。

デジタルコンテンツの著作権保護

デジタル化されることにより、コンテンツのコピーが簡単なので、コンテンツの保護が必要になります。ですが、現状の方式は、視聴者の利便性低下 (要するに自由に録画ができない) を招いていること、コンテンツ保護の方式が B-CAS 社一社の独占状態にあることなど、重大な問題が指摘されています。2008年 7月 4日からダビング10制度が開始されましたが、実質的にあまり意味のない制限緩和でした。

元々、B-CAS 方式によるコンテンツ保護は、カジュアルコピーを防ぐことを目的としているものの、フリーオなどコンテンツ保護機構を無視する機器が販売されるに至り、B-CAS によるコンテンツ保護は事実上無効化されています。国産の一部の製品でも、コンテンツ保護機構を無効化する方法などが知られています。総務省は高まる批判を受けて、B-CAS カードの小型化、チップ化、ソフトウェア実装方式の採用などを打ち出していますが、根本的な解決に至っていません。

なお、総務省はこの問題についてのパブリックコメントを実施中です (8月 28日 17:00 必着) 。パブリックコメントの案を見る限り、B-CAS は存続させ、無反応機への B-CAS カードの供給を絶つ、という方針のようです。もはや、B-CASカードをインターネットで共有する技術が確立されており、無反応機では B-CASカードは無用の存在です。このような措置に何の意味があるのでしょう? B-CASカードもカードリーダも無料ではないので、無意味なものに金を払わさせる消費者の立場はすっかり無視されています。

私の移行状況

地デジ視聴については、昨年地デジ対応テレビを購入し、既に移行済みです。私の居住地では、電波が弱いことがあり、新たにブースターが必要になりました。

地デジ録画については、移行方法検討中です。一度、地デジ対応の HDD レコーダを購入したものの、コピーワンスが重大な問題になり、デジタルでの録画を諦めました。私の場合、録画したものは、CM カット編集、iPod touch 対応再エンコードおよび大容量 HDD による集中保管の 3点を満たす必要があります。リムーバブルメディアによる保存は断固拒否です。メディアで部屋が散らかってしまいます。これはライフスタイルの問題なので、譲れません。

地デジ録画は、フリーオを真剣に検討しています。別に、権利者の著作権を侵害しようという意図はまったくなく、著作権法に定める私的利用を目的とした複製権の範囲内で、私のライフスタイルに合った視聴環境と保存環境を確保したいだけです。上記三点が満たされるのなら (例えば iTunes Music Store で番組が販売されるとか) 、私はそれで十分満足します。

2009年7月18日土曜日

WMWifiRouter 1.5.2 の DMZ は全面的に挙動不審

WMWifiRouter は思ったより出来の悪いソフトのようです。現時点では WMWifiRouter の NAT を使って外からの攻撃を防ぐことは不可能です。WMWifiRouter 経由でインターネットに接続する場合は、ファイアーウォールを有効にするなど自衛措置をとりましょう。金取ってるんだから、きっちりサポートしてほしいところです…。

DMZ を無効にできない

WMWifiRouter では、いくら設定を変えても、DMZ を無効にできません。

DMZ ホストの IP アドレスを指定しても無駄

WMWifiRouter の設定で、DMZ を有効にし、静的に DMZ に配置するホストの IP アドレスを指定しても無駄です。設定直後はうまくいったのですが、いつの間にか指定していないはずの DHCP プールのアドレスをもらってるマシンが DMZ に配置されていました。

2009年7月11日土曜日

WMWifiRouter の設定

WMWifiRouter 1.5 (執筆時点での最新バージョンは 1.5.2) がリリースされました。International 版では、日本語リソースがあらかじめ含まれています。

アップデートは、設定を再点検する良い機会です。気をつけないといけないのは、WMWifiRouter は DMZ に対応していて、デフォルトで有効になっている点です。普通の人には要らないので (むしろ危険) 、ちゃんと設定を確認しましょう。WMWifiRouter で外からの攻撃を遮断しているつもりになっていると、痛い目に遭います。

以下は設定値一覧です (イーモバイル回線−WiFi ブリッジ関連のみ) 。

ツール

  • WiFi
    • 電源: (バッテリの寿命に影響。お好みで。)
    • 接続モード切替: アドホック接続のみ

構成

  • 言語: 日本語
  • 接続方法: (EMnet 未加入なら emb)
  • WiFiネットワーク
    • 管理方法: 設定済 (速度重視)
    • 接続モード: アドホック (推奨)
    • WiFiネットワーク名: (お好みで)
    • 暗号化タイプ: WEP/Open (推奨)
    • WEPキー: (設定しましょう)
    • 暗号化キーインデックス: 1
    • WiFiチャンネル: 1
  • IPアドレス範囲: 192.168.3.x (デフォルトで OK)
  • バッテリ (バッテリ消耗時や過熱時の設定。デフォルトで OK)
  • キープアライブ (接続を維持するための設定。デフォルトで OK)
  • 詳細設定 (後述)
  • ポートマッピング (意味がわからない人は、いじってはいけません)

詳細設定

  • ベース (デフォルトで OK)
  • プロファイル
    • 携帯電話から WiFi
      • NAT (デフォルトで OK)
      • DNS (デフォルトで OK)
      • DHCP (デフォルトで OK)
      • DMZ (有効: 無効, 最終DHCPリース: 無効, 静的IPアドレス: (空欄))
      • 共有 (デフォルトで OK)

(2009-07-17追記) 残念ながら、この設定でも攻撃パケットは止められないようです…。

2009年7月8日水曜日

friio

今、送料込みで 19,800円で買えるんですねー。 いいなぁ。

2009年6月29日月曜日

Touch Diamond S21HT で HSUPA は×

Touch Diamond の隠し設定で、HSUPA を有効にできますが、実際には使えないようです。

今日、東京駅で新幹線に乗る間際に試してみましたけど、DNS が引けない等、正常に接続できませんでした。なお、接続先は emb です。






ま、ぶっちゃけ、ブログにこんなこと書いていいんかな、とは思いますが…。

2009年6月27日土曜日

Touch Diamond & イーモバイル回線の実力

回線速度は Radish Networks Testingで測定した結果です。本体側は MacBook Air (Intel Core 2 Duo 1.86GHz) , Mac OS X 10.5.7 です。

接続方式下り上りデータ通信中着信バッテリ持続時間
Bluetooth PAN601.4kbps44.8kbps可能未計測
Bluetooth DUN854.5kbps19.81kbps可能未計測
2時間くらい?
WiFi2.127Mbps 318.2kbps可能約1時間?

全体としては、やはりパフォーマンスは WiFi がダントツです。下り 7.2Mbps で、2Mbps 出るので、ちょっと電話局から遠い ADSL を使っている感じです。データ通信中の着信が OK なので、私の用途では十分です。WiFi 接続時は、バッテリ消費が激しいので、モバイル運用は厳しいです。とはいえ、iPod touch は WiFi でつながないといけないので、こまめに OFF にするとか、工夫が必要です。

※ WMWifiRouter で WiFi 出力を full power に設定した状態での測定です。low power にして、もう一度測ってみようと思います。

Bluetooth 接続は、Bluetooth の速度自体がボトルネックになるので、こんなものでしょう。Bluetooth PAN は、私の用途では、あまり利用価値はないです。

モバイル運用時は、Bluetooth DUN と WiFi を目的に応じて切り替えて使うことになりそうです。Bluetooth DUN の上り速度がやけに遅いですが、これは測定時の回線の影響と思います。実際の使用感は、この数字ほど悪くはありません。先日、東京−新潟で新幹線に乗ったので、接続可能な区間は Bluetooth DUN でつなげていましたが、下車時には、バッテリ残量が厳しい状態でした…。

2009年6月26日金曜日

Touch Diamond 設定メモ

導入ソフトウェア

必須なのは、以下の 2つです。

  • WMWifiRouter
    有料, データ通信を Wifi 経由で使用するために必要。
  • WM6 BT DUN
    無料, Bluetooth DUN を使えるようにするために必要。

あとはお好みで…。

  • Diamond TF3D Config
    TouchFLO を設定するソフトです。使い勝手は多少改善します。

touchkeysip とか入れると、iPod touch のような入力が可能になりますが、iPod touch のような快適さは実現できません。残念ながら。

これ以上、時間を費やしたところで、投資効果が回収できないと思うので、私はここまでとしました。

先人たちの知恵

とても参考になりました。

2009年6月25日木曜日

Touch Diamond ファーストインプレッション

今更ながら、Touch Diamond の第一印象です。iPod touch を使っているので、当然比べてしまうわけですが…。

大きさ、重さは概ね満足。もう少し横幅がある方が手にフィットすると思います。それにしても…安っぽい…。実際には Touch Diamond の方が高いんだけど、安っぽい…。本体もそうだし、付属の USB ケーブルも大きく角張っていて、安っぽい…。イアホンとか付属ですが、あまり使う気にはなれないですね…。

次、タッチパネルを利用したインターフェースです。iPod touch は 320×480ピクセル・静電式に対して、Touch Diamond は 480×640ピクセル・感圧式です。はっきり言って、ものすごく使いにくいです。Touch Diamond では、指で操作するのは絶望的で、スタイラスペンが必須です。ですが、揺れる満員電車で立ちながらスタイラスペンで操作するのは無理です。Windows Mobile が、マウス + GUI をほぼ再現していますが、これが諸悪の根源です。GUI のパーツが小さすぎます。こんなに小さくては、スタイラスペンで狙ったところをタップできません。iPod touch は本当によくできているなあ、と改めて実感します。

Windows Mobile のモッサリ感も困ったものです。電話とモデム以外には元々期待していませんが、やはり PDA として使うのは無理です。四苦八苦しながら、電話帳を入力しています。Windows Update は ── モバイルでもこのオチですか ── エラーになります※。いい加減、何とかならないんですか? こんなことだから、世界中にパッチが当たらない Windows が溢れかえるんですよ。Windows を仕事で使うなんて、信じられない!

※ 私の Touch Diamond に電話番号が登録されてそうな方は、電話番号の流出を防ぐため、清野に Windows Update を成功させる方法をレクチャーしてやってください。

私が iPhone を買わない最大の理由はキャリアです。イー・モバイルと iPhone の組み合わせなら、即買いなんですが…。考え直してくれませんかねー、Apple さん…。

データ通信・音声通話の一本化

今まで、データ通信には B-mobile の PHS データカード、音声通話にはドコモの携帯電話を使っていたのですが、イー・モバイルの S21HT Touch Diamond で一本化しました。

主に、以下のような効果を狙っています。

  • 通信速度速度アップ 64kbps → 7.2Mbps (理論値、実測 2Mbps くらい)
  • 通信可能場所の増加 (新幹線乗車中でもトンネル内以外は概ね可能)
  • 荷物が減少
  • 通信費の節約

データカードと携帯電話を一本化するにあたり、データ通信中に通話ができるかどうかが重要です。S21HT では、パソコンからデータ通信を行うには、Bluetooth PAN、Bluetooth DUN および WiFi の 3つの接続方式が利用できます※。これら 3つの各接続方式で接続中に、電話をかけて着信可能かどうかを試してみました。結果は…データ通信中でも着信可能です。実際に通話したらどうなるか、発信はどうかについてはまだ試していませんが、とりあえず一本化しても大丈夫と判断しています。

※ USB 直結も可能ですが、たぶん使わないので、ここでは無視します。

2009年5月27日水曜日

ThumbTacks 発売

ThumbTacks がようやく日本でも発売されました。早速買ってきました。本体はゴムなのかな、と思っていたら、固めのプラスチックでしたので、安心して抜き差しできます。

私はアキバヨドバシで 1,980円で買いました。今のところは、この値段が相場のようです。

購入したきっかけは、古い iPod で使用していたマイク (Dock コネクタ接続タイプ) と、iPod touch のケース (TUNEWEAR iPod Touch第2世代用本革ケース) が干渉するためです。ケースに入れたまま、iPod touch で録音できるようになりました。(後で写真を載せます。)

2009年5月10日日曜日

Bento 2.0.4 リリース…だが…

Mac 専用パーソナルデータベースソフト Bento 2 のバージョン 2.0.4 へのアップデータが公開されました。 iPhone / iPod Touch 版の Bento も公開され、これとのデータ同期と、Bento 2 のパフォーマンスの改善が主な改良点です。

毎度期待している AppleScript のサポート改善は、今回もありませんでした。

確認されている不具合

過去のバージョン (2.0.3 以前) には、希に iCal イベントに重複レコードが発生するというバグがありました。重複レコードが発生しているデータベースを Bento 2.0.4 に読み込ませた場合、Bento 2 を起動する度に、以下の現象が発生します。

  • エラーが発生したので終了する、というダイアログが出るが、実際には終了しない。
  • すべての iCal イベントが重複レコードとしてコピーされる。

起動する度に、iCal イベントが増えていくので、たまったものではありません。なお、重複レコードが発生した場合、Bento から削除することはできません。同様の現象は、アドレスブックでも発生するという報告もあるようです。

一時的な解決策

Bento 2 の新しいアップデータが出るのを待つのが最良の選択です。が、それまでの間、Bento 2 が使えないのは困るという人向けに、Bento 2 のデータベースを直接操作して、重複レコードを削除するスクリプトを公開します。

以下の点を理解し、同意いただける方のみご利用ください。

  • Bento 2.0.4 専用です。
  • データ破壊、データ消失の可能性がありますので、必ずバックアップを取ってから実行してください。清野は、本スクリプトを使用した結果について一切の責任を免れるものとします。
  • 本スクリプトは iCal イベントの重複レコードを削除します。
  • 重複レコードのうち、最も古い (最初に追加された) レコードを残します。そうでないレコードが関連レコードとして参照されている場合、データベースに不整合が発生します。

私の環境では、このスクリプトにより不具合は解消され、正常に使えるようになっています。

-- Delete duplicated events from BentoDB.
-- Use this script AT YOUR OWN RISK.

property sqlite3 : "/usr/bin/sqlite3"
property bentodb : "/Users/your-account/Library/Application Support/Bento/bento.bentodb/Contents/Resources/Database"

on run
 set lastUUID to ""
 repeat with e in my getEvents()
  set the AppleScript's text item delimiters to "|"
  set pk to item 1 of (text items of e)
  set uuid to item 2 of (text items of e)
  if lastUUID is uuid then
   my delEvents(pk)
  else
   set lastUUID to uuid
  end if
 end repeat
end run

on getEvents()
 set the AppleScript's text item delimiters to ASCII character of 13
 text items of my doSQL("SELECT gnpk, gn_gnExternalUID FROM gn_lib_event ORDER BY gn_gnExternalUID ASC")
end getEvents

on delEvents(pk)
 my doSQL("DELETE FROM gn_lib_event WHERE gnpk = '" & pk & "'")
end delEvents

on doSQL(sql)
 do shell script sqlite3 & " '" & bentodb & "' '" & sql & "'"
end doSQL

2009年5月1日金曜日

iCal: event オブジェクトの location プロパティ

iCal の event オブジェクトの location プロパティは、ちょっとクセがあります。

場所が指定されていないとき、location プロパティの値を変数に代入しても、その変数の値は未定義となります。変数に触ったとたんにエラーになるので、以下のように、ヌル文字列に正規化して使うのがよさそうです。

 set loc to location of theEvent
 try
  loc
 on error
  set loc to ""
 end try

知らないとハマる箇所です。その他のプロパティには、こんな変なクセはないんですけどね…。

2009年4月30日木曜日

第○何曜日を計算する

PHPで書かれていたものの移植です。y年m月の第nd曜日の date オブジェクトを返します。

-- y年m月の第nd曜日の date オブジェクトを返す。
on getWhatDayOfWeek(y, m, n, d)
 -- 指定した年月の1日の曜日を取得
 set f to current date
 set year of f to y
 set month of f to m
 set day of f to 1
 set dd to d - (weekday of f) + 1
 -- 1週間を足す
 if dd ≤ 0 then
  set dd to dd + 7
 end if
 set day of f to dd
 -- 第n曜日まで1週間を足し込み
 set day of f to (day of f) + (n - 1) * 7
 return f
end getWhatDayOfWeek

。例えば、2009年 4月の第二水曜日を得る場合は、以下のように使います。

my getWhatDayOfWeek(2009, 4, 2, Wednesday)

すると、以下のような date オブジェクトが返ります。時刻は無視してください。

date "2009年 4月 8日 水曜日 10:44:00 AM"

なお、valid でない日付を指定した場合でもそれなりに動いてしまいます。例えば、2009年 13月は2010年 1月と読み替えられます。また、2009年 4月の第5金曜日は 2009年 5月 1日が返ります。意図した結果となっているかどうかは、呼び出す側で確認してください。

2009年4月26日日曜日

Files / Files lite のドキュメントを同期する

Mac で作成した様々なファイルが iPod Touch 上で閲覧できる FilesFiles liteのようなソフトはとても便利です。ここでは、これらのソフトを使う上で、ファイルを簡単に同期する方法を紹介します。

運用

運用の前提は次のとおりです。

  • Files では、ドキュメントの閲覧・削除を行います。
  • Mac 本体に Files に転送するファイルの原本を置きます。原本は、/Users/user/Documents/Files Documents 以下のフォルダに置くものと仮定します。
  • iPod Touch の名前は、iPod_touch_name と仮定します。

運用の流れは次のとおりです。

  • (1) Mac で原本を更新します。更新は、Finder または手動で動かすスクリプトによって行われることを想定しています。
  • (2) 原本の更新内容を iPod touch へ転送します。
  • (3) iPod touch でドキュメントの閲覧および不要なドキュメントの削除を行います。
  • (4) iPod touch の削除を Mac 上の原本へ反映します。
  • (5) (1) へ戻る

以下では、同期のためのツールの設定方法と、(2) と (4) を行う方法を紹介します。

設定

Files との同期は WebDAV を使って行います。sitecopy を使うと便利です。インストールしましょう。

~/.sitecopyrc を以下のように設定します。

site iPod_touch_name
server iPod_touch_name.local
port 8080
protocol webdav
username fuser
password fpasswd
local "/Users/user/Documents/Files Documents"
remote /
url http://iPod_touch_name.local:8080/
checkmoved
exclude .DS_Store

fuserfpasswd は Files で設定したユーザ名と認証パスワードです。

その他、sitecopy の実行に必要なフォルダの作成およびパーミッションの設定を行います。

% chmod 600 ~/.sitecopyrc
% mkdir ~/.sitecopy
% chmod 700 ~/.sitecopy

原本を保存するフォルダを作ります。

% mkdir "~/Documents/Files Documents"

Files との初期同期を行います。Files のファイルが空の状態で、Files を起動してから、次のコマンドを実行します。

% sitecopy -ai ; sitecopy -au

これで準備完了です。

Mac → iPod Touch の同期

Mac 上の原本のドキュメントを、iPod Touch 上の Files へ転送します (運用の流れ (2) の操作です) 。Files を起動してから、次のコマンドを実行します。

% chmod -R a-w "/Users/user/Documents/Files Documents"
% sitecopy -au

sitecopy はファイルリストを持っていて、実際のファイルとの間の不一致が発生するとうまく動作しません。ファイルリストの不一致を防ぐため、運用の流れ (4) の操作を行うまで、原本を書き込み禁止にします。これは根本的な解決方法ではありませんが、気休めにはなるでしょう。

iPod Touch → Mac の同期

iPod Touch の Files 上で行った削除の操作を、Mac 上の原本にも反映させる操作を行います (運用の流れ (4) の操作です) 。Files を起動してから、次のコマンドを実行します。

% chmod -R a+w "/Users/user/Documents/Files Documents"
% sitecopy -af ; sitecopy -as

原本を書き込み許可にし、削除の操作を反映させます。

2009年4月19日日曜日

LAMY pico 到着

先日注文したコンパクトに収納できるボールペン LAMY pico (マットクローム) が到着しました。やや大きめの箱に入っていて、箱を開けると LAMY pico が恭しく登場する演出はさすがです。あえて詳しく書きません。買った人だけが味わえる感動があります。

第一印象は、「小さい」の一言に尽きます。ペンの先入観を打ち砕いてくれます。もちろん、当初の目標であったかばんへの収納も OK です。

ペン先を出してみると、このくらいまで伸びます。書き味も申し分ありません。

実売価格は 5,000円程度が大勢です。私は 3,190円 + 送料 650円で買いました。いい買い物でした。胸ポケットにも入る短いペン。新社会人へのプレゼントにもおすすめですよー。

2009年4月12日日曜日

コンパクトに収納できるペン LAMY pico

MacBook Air 導入をきっかけに、日々持ち歩く手荷物の最適化を進めています。最適化とは、重量・体積・機能のバランスを取ることです。必要な機能は確保しながら、なるべく軽く・小型なものを求めています。出張が多いので、カバンは移動オフィスと位置付けています。私のカバンの中は仕切り板で区切られ、ほとんどの物が定位置に収納されています。カバンを開けたら、仕事に必要なすべてのデバイスにアクセスできる、すぐに仕事ができる体制になるのが理想です。

一通りの最適化が済んできていて、現在の最適化対象は文房具です。元々、私はあまり字を書かないので、ペンにはこだわりがありません。ペンは、私のカバンで定位置を持っておらず、扱いが下です。一緒に仕事をする人たちに目を向けると、「ビジネスパーソンとしてペンにはこだわる」という意見をお持ちの方も多いようです。とはいえ、私はあまり字を書かないので、書き心地というより、サイズからアプローチしてみました。

実際、探してみると、短いペンはあまりありません。ペンはある程度の長さがないと手の中で固定できず、使いにくいからでしょう。最低でも12cm 程度は必要なようです。この問題を解決し、カバンの中で定位置を与えるためには立てて収納できるサイズ (最長11cm) であることが条件です。つまり収納時はコンパクトに、使用時は必要な大きさに伸びる、そのコンセプトを実現するペン、それが LAMY pico (ラミーピコ) です。収納時は 9cm、使用時は 12.5cm です。

少々高いですが、新社会人へのプレゼントなどにもいかがでしょうか。物がまだ届いていないので、使用感などは後日書きます。

2009年4月9日木曜日

Mac OS X 10.5 Leopard に SVN サーバを立てる

Mac OS X 10.5 Leopard に標準でインストールされている Apache 2 を SVN レポジトリとして使うための設定です。結構よく見るネタなのですが、実際やってみたら、色々ハマるところがあって苦労したのでまとめておきます。

前提

Apache 2 は標準でインストールされています。SVN が標準で入っているかどうかはわかりません。Developer Tools をインストールしとけば入るでしょう。

レポジトリの URL は http://localhost/~user/repos/ 、ファイルシステム上のレポジトリは /Users/user/Sites/svnrepos と仮定して手順を紹介します。ファイルシステムのレポジトリを URL が指す /Users/user/Sites/repos とすることはできません (← ハマる原因①) 。

1. レポジトリを作る

シェルから 次のコマンドを実行します。

% svnadmin create /Users/user/Sites/svnrepos
% sudo chown -R www /Users/user/Sites/svnrepos

SVN のレポジトリを作成し、Apache 経由のアクセスに備えて、ファイルオーナーを www にします。グループは特に関係ありません。

2. /etc/apache2/httpd.conf に以下を追加

Apache の設定を変更します。変更箇所を差分として示します。

% diff /etc/apache2/httpd.conf /etc/apache2/httpd.conf.orig
117d116
< LoadModule dav_svn_module libexec/apache2/mod_dav_svn.so
489,494d487
< <Location /~user/repos>
<  DAV svn
<  SVNPath /Users/user/Sites/svnrepos
< </Location>

※ 末尾の / あるなしは、とても重要です (←ハマる原因②) 。

3. Apache を再起動する

システム環境設定の共有 > Web 共有を使って、Apache を再起動します。

4. 新規プロジェクトを登録

試しにプロジェクトを登録してみましょう。

% mkdir project
% cd project
% mkdir trunk
% mkdir branches
% mkdir tags
% svn import -m "initialize" . "http://127.0.0.1/~user/repos/newproject"

5. 登録したプロジェクトをチェックアウト

今、登録したプロジェクトをチェックアウトし、作業を開始します。

% svn co "http://127.0.0.1/~user/repos/newproject"
% cd newproject

ここまでうまくいけば、一通り使えるようになっています。この設定では、認証などの設定が済んでいないので、引き続き設定を行ってください。

2009年4月5日日曜日

ボイスレコーダー iTalk + Mic

つづきです。

その乗り換えた先のソフトですが、GRIFFIN Technology の iTalk (無料) です。教訓を受けて、本体に転送するためのソフトウェア iTalk Sync もダウンロードして、一通り試しました。

で、その時、気付いた一番の問題点。無料のソフトウェアのため、広告が出るのですが、間違えて触ってしまうことが多いのです。触ってしまうと、録音中でも容赦なく広告主のサイトに切り替わってしまうので、とても困ります。最低限、録音を中断してよろしいですか? とか確認してほしいのです…。600円払うと、広告なしバージョンにアップグレードできます。よくできたソフトウェアなので、それくらいなら払ってもいいかな…。

次は、iTalk Sync について。iTalk Sync はとても CPU 時間を消費します。音声ファイルは、Finder にコピーはできました。iTunes に登録は、うまくいかないようです。$HOME/Music/ 以下に転送されているので、iTunes のバージョンアップに追随できていないのかもしれません。ま、AIFF が取れればいいですよ。充分充分。

今使っているマイク (XtremeMac MICROMEMO) は、iPod Touch をケースに入れたまま使えないので、やや不便を感じています。iPod Touch で使えるマイクは Apple 純正のものもいいですが、オーディオテクニカの製品がスマートでいい感じです。iPhone ならば、襟元に付けて、お気に入りのイヤホンと組み合わせたハンズフリーマイクにもできます。

その他の製品はこちらで検索

日本では未発売ですが、ThumbTacksはコンパクトでとてもいいですね。iPod Touch のイヤホン端子に差し込んでおけば、本体を片手で持って録音できるので、運用しやすそうです。

ボイスレコーダー

昨日、会議で急遽 iPod Touch をボイスレコーダーとして使うことになりました。それなりに準備していたものの、色々、反省することがありました。

準備状況ですが、マイクは iPod 5G の時から使っている XtremeMac MICROMEMO を用意していました。ソフトウェアは QuickVoice (無料) です。CD 品質で録音できる設定の存在、無料のソフトウェアをダウンロードすると、録音した音声データを Mac 本体に転送できるらしい、ということを確認しました。あとは、ちょっと試しに録音・再生したくらいで安心していました。

本番で使ってみると、録音まではスムーズに運びましたが、いざ音声データを Mac 本体に転送しようと思ったら…吸い出すためのソフトウェアが有料化されてるじゃないですか…。音声データを人質に取られてしまいました。仕方なく購入して、転送してみると…えらい遅い…だけではなく、一旦、iTunes を起動して、同期してからじゃないといけない。Mac 本体の HDD にデータは転送済みなのに、なんでこんなに遅いのよ? そして、.caf とか聞いたこともないフォーマット。すっかりやられました…。.caf は iPhone で使われている音声フォーマットで中身は .aiff のようです。

さらに調べると、完全無料で WiFi 経由で転送できて、.aiff で録音できるソフトウェアがあるじゃあないですか! .caf → .aiff → .mp3 と変換するのは面倒です。せっかく買ったソフトはもったいないですが、使いやすい方に乗り換えました。

教訓。

  • ぶっつけ本番はやめましょう。テストは本番と同じく手順をすべて確認しましょう。
  • ソフトウェアはさっさとダウンロードしておきましょう。

2009年3月26日木曜日

LaTeX2e (dvipdfmx) のフォントを小塚明朝・ゴシックに

最近、ヒラギノフォントを埋め込んだ LaTeX で書かれた論文をときどき目にするようになりました。ヒラギノフォントは確かに美しいのですが、Mac OS X バンドルの明朝 W3 と角ゴシック W6 の組み合わせは、どうもバランスが悪いように思います。

Adobe Creative Suite 4 をインストールすると、小塚明朝・ゴシックが一式入るので、こちらを使用するようにしてみましょう。太さはそれぞれ 6段階あります。

まずは、LaTeX にフォントを認識させる準備です。/Library/Fonts/ にインストールされている小塚フォントのシンボリックリンクを作ります。

sudo mkdir -p /usr/local/share/texmf-var/fonts/opentype
cd /usr/local/share/texmf-var/fonts/opentype
ls /Library/Fonts/KozMinPro-* | sudo perl -MFile::Basename -ne 'chomp; symlink($_, basename($_));'
ls /Library/Fonts/KozGoPro-* | sudo perl -MFile::Basename -ne 'chomp; symlink($_, basename($_));'

dvipdfmx で小塚明朝・小塚ゴシックを埋め込む設定にします。/usr/local/share/texmf-var/fonts/map/dvipdfm/updmap/cid-x.map を以下のように変更します。ファイルがなければ作成します。

rml H KozMinPro-Regular.otf
gbm H KozGoPro-Medium.otf
rmlv V KozMinPro-Regular.otf
gbmv V KozGoPro-Medium.otf

最後に、作成したファイルを TeX が見つけられるようにしてあげます。

sudo mktexlsr

私は、TeX が持っている Computer Modern フォントとのバランスを考えると、小塚明朝 Light と小塚ゴシック Regular の組み合わせが、ゴシックの強調文字としての視認性としては、小塚明朝 Regular と小塚ゴシック Medium の組み合わせがベストと思いますが、皆様はいかがでしょうか?

2009年3月25日水曜日

MacBook Air の USB ポートの不足を補う

サンワサプライの USB充電タップ型ACアダプタ ACA-IP14を買いました。これはとてもいいです。カラーバリエーションは、左のブラックの他に、ACA-IP14W ホワイトACA-IP14SV シルバーACA-IP14R レッド があります。

USB ポートから電源だけ頂戴するという使い方が増えてきています。この製品には電源として使える USB ポートが 2つ、テーブルタップとして AC 100V のコンセントが 2つ付いています。

利用シーンは 2つ。出張先のホテルで iPod と携帯電話を USB ポートで充電しながら、MacBook Air と デジカメはテーブルタップから充電。そして、会議室でコンセントが足りない時にも、コンセントを自分だけで占有せずに、他の方にもお分けする…そんな使い方を考えています。出張に持っていくにも、とてもコンパクト (W71.5×D68×H20.5mm, 87g) です。

MacBook Air の USB ポートは確かに足りないんですが、用途をよくよく分析してみると、充電できれば OK という使い方が多くなってきました。MacBook Air と一体化するセルフパワーの USB ハブを組み合わせれば、かなりの部分は解決するのではないでしょうか。

2009年3月14日土曜日

date オブジェクト

date オブジェクトのリファレンスがどこにもないので、判明している点についてのメモ書きです。

date オブジェクトの作成方法

make new date with properties { ... } でうまく作成できません。

次のように作成します。

set s to "2009-03-14 13:05:49"
date s -- should be date "2009年 3月 14日 土曜日 1:05:49 PM"

日付だけでも OK

set s to "2009-03-14"
date s -- should be date "2009年 3月 14日 土曜日 0:00:00 AM"

プロパティ

判明しているプロパティは以下の通り。時・分・秒は取れないとしている資料がありますが、現行バージョンでは取れます。

year of (current date) -- 年
month of (current date) -- 月
month of (current date) as integer -- 月 (数字)
day of (current date) -- 日
weekday of (current date) -- 曜日
weekday of (current date) as integer
      -- 曜日 (数字: 1. Sunday .. 7. Saturday)
hours of (current date) -- 時
minutes of (current date) -- 分
seconds of (current date) -- 秒
time of (current date) -- 0:00:00 AM からの経過秒数

month of は数字を使って書き換えても大丈夫。

set d to date "2009年 3月 1日 日曜日 0:00:00 AM"
set month of d to 4
d -- should be date "2009年 4月 1日 水曜日 0:00:00 AM"

日付に関する計算

date オブジェクトに対して、秒単位で加減算をすることで、n 秒前、n 秒後の日付を得ることができます。

set d1 to date "2008年 2月 29日 金曜日 0:00:00 AM"
set d1 to d1 + 60 * 60 * 24 * 10 -- 10日後
d1 -- should be date "2008年 3月 11日 火曜日 0:00:00 AM"

set d2 to date "2008年 2月 29日 金曜日 0:00:00 AM"
set d2 to d2 - 60 * 60 * 24 * 10 -- 10日前
d2 -- should be date "2008年 2月 19日 火曜日 0:00:00 AM"

日の加算はうまく行くようです。n日後とかを計算するのに便利です。

set d to date "2008年 2月 29日 金曜日 0:00:00 AM"
set day of d to (day of d) + 1 -- 1日後
d -- should be date "2008年 3月 1日 土曜日 0:00:00 AM"

day of に 32日 を設定しても大丈夫です。

set d to date "2008年 3月 31日 月曜日 0:00:00 AM"
set day of d to (day of d) + 1 -- 1日後
d -- should be date "2008年 4月 1日 火曜日 0:00:00 AM"

day of に 0 や マイナスの数値を設定するとエラーになります。n 日前を指定する時は、前述の秒単位の減算を使います。

set d to date "2009年 3月 1日 日曜日 0:00:00 AM"
set day of d to (day of d) - 1 -- 1日前

時間に関する計算

日付のように、各プロパティに関する設定はできないので、time of で計算します。

set d to date "2009年 3月 1日 日曜日 0:00:00 AM"
set time of d to (time of d) + 3600 -- 3600秒 (1時間後)
d -- shold be date "2009年 3月 1日 日曜日 1:00:00 AM"

オーバーフローしても大丈夫。

set d to date "2009年 3月 1日 日曜日 11:53:00 PM"
set time of d to (time of d) + 3600 -- 3600秒 (1時間後)
d -- shold be date "2009年 3月 2日 月曜日 0:53:00 AM"

time of に 0 や マイナスの数値を設定するとエラーになります。n 秒前を指定する時は、前述の秒単位の減算を使います。

set d to date "2009年 3月 1日 日曜日 0:00:00 AM"
set time of d to (time of d) - 1

日付の比較

日付はちゃんと比較できます。

set d1 to date "2009年 3月 14日 土曜日 0:00:00 AM"
set d2 to date "2008年 3月 14日 金曜日 0:00:00 AM"
d1 > d2

2009年3月8日日曜日

iPod touch 用の動画エンコード

VLC 1.0 以降に対応した版を公開しました。こちらは古い情報です。

VLC 0.8.6i をコマンドラインから動かして、iPod touch 用の動画を作成するための設定。主にテレビ番組の録画を想定していて、640x480でキャプチャしたムービーを iPod touch 用に変換します。画面の縦横比ごとに用意してあります。

4:3

#!/bin/bash
/Applications/VLC.app/Contents/MacOS/VLC $1 --sout "#transcode {vcodec=mp4v, vb=1536, canvas-aspect=1:1, width=430, height=320, acodec=mp4a, ab=128, deinterlace=enable}:standard {mux=mp4, url=$1.mp4, access=file}"

3:2

#!/bin/bash
/Applications/VLC.app/Contents/MacOS/VLC $1 --sout "#transcode {vcodec=mp4v, vb=1536, canvas-aspect=1:1, cropleft=16, cropright=16, croptop=34, cropbottom=38, width=480, height=320, acodec=mp4a, ab=128, deinterlace=enable}:standard {mux=mp4, url=$1.mp4, access=file}"

16:9

#!/bin/bash
/Applications/VLC.app/Contents/MacOS/VLC $1 --sout "#transcode {vcodec=mp4v, vb=1536, canvas-aspect=1:1, cropleft=4, cropright=8, croptop=60, cropbottom=60,  width=480, height=270, acodec=mp4a, ab=128, deinterlace=enable}:standard {mux=mp4, url=$1.mp4, access=file}"

ピクセルのアスペクト比まで厳密に合わせていないので、厳密に iPod touch でベスト、とは言い難いかもしれません…。もう少し調整が必要なように思います。

2009年3月1日日曜日

MacBook Air と一体感のある USB ハブ

Ray-out RT-MBA3H1/S 。MacBook Air と一体感のある USB ハブです。

バスパワー方式の 3ポート USB ハブです。3ポート合計で 300mA しか保証されていないので、利用可能なデバイスは限られます。それでも、この手のピンポイントな商品は、うまくニーズにハマれば便利なものになると思います。

MacBook Air 自体が、元々そういうコンセプトの商品ですから、ぴったりではないでしょうか?

ブログ開設のご挨拶

当ブログをご訪問いただきありがとうございます。

私のホームページから Mac OS X 関係の情報を独立させ、ブログ化しました。やや古くなっている情報などは、移行時に見直して、最新の事情に合うように変更してあります。JAIST を去って久しいので、ホームページを今後どうしていくかという問題は発生しているところですが、とりあえずコンテンツを減らして、問題そのものを小さくしています…。

このブログでは、Mac OS X と iPhone / iPod touch を使っていく上で発生した問題とその解決策、運用ノウハウなどを公開して行く予定です。今後ともよろしくお願いいたします。

Mac OS X のスリープモードの変更 (sudoers)

Mac OS X のスリープモードの変更には /usr/bin/pmset を使う。管理者権限が必要なので、GUI レイヤーから行おうとすると、若干の問題が生じる。そこで、スリープモードの変更に限って、管理者パスワードなしで行えるように設定する。

以下には、お使いの Macintosh を安全でない設定に変更する方法が書かれています。Mac OS X のスリープモードの違いを理解した上で、自己責任で設定を変更してください。

設定

sudo の設定ファイルである /etc/sudoers を編集する。sudoers に構文エラーがあると、sudo が実行できなくなるので、必ず以下に示すように visudo を使って編集する。visudo は編集終了後に構文検査を実行し、エラーがある場合は、更新するかどうか確認を求めてくる。

% sudo visudo

vi の操作については、ここでは解説しない。/etc/sudoers のファイルに、次の 1行を追加する。追加する場所は、サンプルの手前。

user ALL=NOPASSWD:/usr/bin/pmset -a hibernatemode ?

userには、スリープモードの変更を許可したいユーザ名を指定する。

この設定により、次のようにスリープモードの変更ができる。

% sudo pmset -a hibernatemode 0

スリープユーティリティ

スリープモードの変更が可能になったので、次のようなスクリプトがユーザモードで実行可能である。

スリープさせるスクリプト catnap は以下の通りである。

#!/bin/sh
/usr/bin/sudo /usr/bin/pmset -a hibernatemode 0
/usr/bin/pmset sleepnow

セーフスリープさせるスクリプト safesleep は以下の通りである。

#!/bin/sh
/usr/bin/sudo /usr/bin/pmset -a hibernatemode 3
/usr/bin/pmset sleepnow

ハイバネーションさせるスクリプト hibernate は以下の通りである。

#!/bin/sh
/usr/bin/sudo /usr/bin/pmset -a hibernatemode 1
/usr/bin/pmset sleepnow

後は、これらのスクリプトを GUI レイヤーから呼べるようにすればよい。その方法は様々であるが、清野はクラシカルなアップルメニューが好きなので、FruitMenu (US $12.00) を使用している。

FruitMenu の設定により、このようなアップルメニューが得られる。

2009年2月28日土曜日

Web ページ巡回スクリプト (更新チェック付き)

AppleScript で書いた Web ページ巡回スクリプトです。毎日、指定曜日、特定日に巡回する URL をスケジュールできます。簡単ですが、更新チェックの機能があります。ブラウザで一気にどばっと開きますので、たくさん URL を指定すると、大変なことになります。うまく曜日で散らしてください。

巡回 URL リストの作り方

巡回リストは、iCal の “巡回” という名前のカレンダーに保存します。まずは、iCal に “巡回” という名前のカレンダーを作ってください。

巡回したい Web ページごとに、終日イベントを作成し、URL を、イベントの URL 欄に記入します。イベントの繰り返しは、毎日、毎週 (複数の曜日を選ばないでください) を指定できます。繰り返しイベントの終了には対応していません (※) 。

※ ここら辺の iCal のサポートがとても poor なのです…。

更新チェックは、イベントごとに指定できます。チェックをしたい場合は、イベントのメモ欄に“/bin/cat”と入力してください。HTML のハッシュ値を保存し、前回の訪問時とハッシュ値が異なるときのみ、Web ブラウザで表示されます。カンのいい方はお分かりでしょうが、この箇所は、UNIX 流のフィルタになっています (※) 。ハッシュ値の計算対象を HTML 全体としたくない場合は、別のフィルタを実行させることができます。更新チェックのデータは、~/Library/Preferences/patrol script.plist に保存されます。

※ /usr/bin/curl -s URL | 指定されたフィルタ | /sbin/md5 を実行しています。

以下は、毎日巡回する Web ページを指定する例です。

以下は、毎週土曜日に巡回する Web ページを指定する例です。加えて、更新チェックを行うことが指定されています。

コード

コードの掲載をやめ、スクリプトを配布することにしました。

patrol web pages.zip (12k)

できれば、コメントなどをいただけるとうれしいです。

スクリプトは、現状のまま提供され、使用した結果の責任については、すべて使用者の責任とします。再配布はご遠慮ください。

清野の使い方

私は、毎朝一回、これを動かして、コーヒーを入れに行きます。コーヒーを入れて戻ってくると、全部のページのロードが完了している、という感じで使っています。

Safari の環境設定の「一般」の一番下に「アプリケーションでリンクを開く場合」という設定があります。これを「既存のウィンドウの新規タブに開く」にしておく方がよいと思います。タブにしておかないと、画面がウィンドウだらけになります…。

Dock の Finder アイコンを変更する

Finder のアイコンは Mac OS X のバージョンによって異なりますが、新しい Finder アイコンが気に入らない方はお試しください (Mac OS X 10.4.7 で確認) 。

以下の情報は Terminal での作業に関する知識を十分お持ちの読者を想定しています。作業の失敗によって、大切なデータを消失したり、OS を再インストールをする結果になることがあります。カスタマイズは自己責任です。

準備

材料として、次のファイルが必要です。

  • Finder のアイコン (.png 形式) 。一般にはアルファチャネルの情報が必要です。.icns 形式をプレビュー.appで変換するとよいでしょう。

手順1:

/System/Library/CoreServices/Dock.app/Contents/Resources/finder.png を所望のアイコンファイルに置き換えます (root権限が必要です) 。

手順2:

/Library/Caches/dock.iconcache.501 (※) を削除し、Dock を再起動します。

※ .501の部分はユーザIDです。dock.iconcache はログインしているユーザごとに作成されるので、すべてのユーザについて、キャッシュを削除してください。

FileVault と Web共有 (Apache) を同時に使う

FileVault をオンにすると、http://localhost/~user/ にアクセスできなく (403 Forbidden) なります。これはホームディレクトリのパーミッションが drwx------ になっているためで、drwx---x---x (711) に直せばアクセスできるようになります。

他の人と共有している Mac ではセキュリティ上の問題が発生しますので、充分注意してください。

2009年2月27日金曜日

JUDE を Mac OS X で使う

JUDE/Community は無料で使える UML モデリングツールです。Java で書かれているので、もちろん Mac OS X でも動作します。コマンドラインから起動してもいいのですが、せっかくなので、通常のアプリケーションのようにダブルクリックで起動できるようにする方法を紹介します。

(2009-08-30追記) Mac OS X 10.6 Snow leopard でも、同じ手順で作成できることを確認しました。

準備

材料と道具として、次の 2つが必要です。

  • この記事の執筆時点 (2009年 2月 27日) 時点での JUDE/Community の最新バージョンは 5.4.1 です。JUDEの公式サイトで登録後ダウンロード (無料) してください。jude_community-5_4_1.zip というファイルが落ちてくると思うので、それをダブルクリックして展開しておきます。
  • Mac OS X の Xcode が必要です。インストーラは Mac OS X のインストールディスクの中に入っています。

手順1:

Jar Bundler を起動します。/Developer/Applications/Utilities/ に入っています。

※ Jar Bundler の実体は、/usr/share/java/Tools にあります。もしかしたら、Xcode のインストールは必須ではないのかもしれません…。手元に Xcode をインストールしていない環境がないので、確認できていません…。

手順2:

Jar Bundler の Build Information タブの中の Main Class を指定します。Choose... ボタンをクリックして、jude-community.jar を選択します。すると、Jar Bundler は jude-community.jar の中から Main メソッドのあるクラスを探してくれます。

Options は、お好みで指定してください。

手順3:

Jar Bundler の Classpath and files タブを開きます。Additional Files and Resources と Additions to Classpath のリストに、jude-community.jar が見えていると思います。これに加えて、Additional Files and Resources の Add... ボタンをクリックし、jude-api.jar、Welcome.jude および Welcome_ja.jude を追加します。

上記の操作を行うと、jude-api.jar は Additions to Classpath の中にも、自動的に追加されます。

手順4:

Jar Bundler の Properties タブを開きます。VM Options に -Xms16m -Xmx512m -Xss2m を指定します。Version は JUDE のバージョンにしておきましょう。

手順5:

Create Application... ボタンをクリックし、JUDE という名前を付けて Application Bundle として保存します。うまくいくと、以下の右のようなアプリケーションが作られています。Jar Bundler の問題だと思いますが、左のような進入禁止のアイコンになることがありますが、実際には正常に作られています。一度、アイコンをクリックすると、右のアイコンになります。

作業は以上です。おつかれさまでした。

このアイコンをダブルクリックすると JUDE が起動します。作成に使用した jude_community-5_4_1.zip や jude_community フォルダは捨ててしまってかまいません。

RAM ディスクを作成する

RAM ディスク
http://homepage.mac.com/nand/macosx/ramdisk.html

Mac OS X にはディスクキャッシュ、HDD の断片化を予防するための遅延再配置機能があるので、一時ファイルを作成するために RAM ディスクを使っても、労力に見合う効果は得られないと思います。

現在のところ、RAM ディスクのうまい使い方は思いつきませんが、メモとして書いておきます。

メモリが慢性的に足りないノートブックタイプの Mac では、利用する価値はないでしょう。SSD の環境と組み合わせると、何か可能性が使い道があるかもしれません…。(2010-07-17追記)例えば、ATOK のユーザ辞書のように頻繁に読み書きするファイルを RAM ディスクに置くことで、SSD の劣化を防ぎパフォーマンスの改善ができるようです。

2009年2月26日木曜日

フォルダアクションを作るとき

フォルダアクションのスクリプトハンドラ adding folder items は、.DS_Store や Icon^M のような、Finder が自動的に作成するファイルの存在を考慮に入れて作らないといけない。

除外するファイルを考慮に入れた adding folder items ハンドラのサンプル。

-- 今日の日付のサブフォルダを作って、追加された各項目をそこに入れる

-- フォルダアクション (項目追加時) のハンドラ
on adding folder items to this_folder after receiving these_items
  -- フォルダアクションで操作対象外とするファイル
  set excludes to {".DS_Store", ".localized", "Icon" & (ASCII character of 13)}
  set results to my preparation(this_folder, these_items)
  try
    -- メインループ
    repeat with this_item in these_items
      tell application "Finder"
        -- 処理対象外のファイルは、ハンドラを invoke しない
        if name of this_item is not in excludes then
          my itemHandler(this_folder, this_item, results)
        end if
      end tell
    end repeat
  on error error_message number error_number
    display dialog error_message
  end try
end adding folder items to

-- 準備
on preparation(this_folder, these_items)
  -- ファイル移動のための準備
  set today_foldername to my getCurrentDate()
  tell application "Finder"
    -- 今日の日付のフォルダがない時は作る
    if not (exists folder today_foldername of this_folder) then
      make new folder at this_folder with properties {name:today_foldername}
    end if
    folder today_foldername of this_folder
  end tell
end preparation

-- 各項目に対する処理
on itemHandler(this_folder, this_item, target_folder)
  -- 追加された項目を今日の日付のフォルダに格納する
  tell application "Finder"
    considering application responses
      move this_item to the target_folder
    end considering
  end tell
end itemHandler

on getCurrentDate()
  -- yyyy-mm-dd のフォーマットで日付を取得する
  do shell script "date +%Y-%m-%d"
end getCurrentDate

2009年2月25日水曜日

Mac OS X のスリープ

Mac OS X のスリープモードは 3種類あります。これらの違いを以下の表に示します。

No名称スリープモードへ移行時、メモリをHDDにスリープモードから復帰時、HDDからメモリへスリープ中の電源
0スリープ待避しない読み込まない省電力モード
1ハイバネーション待避する読み込む
3セーフスリープ待避する読み込まない省電力モード

No は pmset というコマンドでスリープモードを指定する時の数値です。

  • 0 は最もオーソドックスなスリープで、スリープ状態への移行およびスリープからの復帰が高速であるが、スリープ中にバッテリがなくなる等、電源が切れた時は、システムはクラッシュする。
  • 1はメインメモリの内容をHDDに書き出してからスリープし、復帰時にはHDDからメモリへ書き戻す。スリープ中は電源を必要としないが、スリープ状態への移行および復帰は最も遅い。
  • 3は0と1の中間で、万が一の電源断に備えてメインメモリの内容をHDDに書き出すが、スリープ中もメインメモリの内容を保持し続ける。スリープ状態への移行は 1 と同じ時間を要するが、スリープからの復帰は 0 と同様に高速である。

工場出荷時では、デスクトップマシンは 0 が、ノートブックでは 3 が指定されています。

運用からスリープを考える

ノートブックタイプのマシンで、バッテリを節約しなければならない局面は多いものです。しかし、デフォルトのセーフスリープでは、こまめなスリープが却って仇になります。

セーフスリープでは、スリープの度に、メモリの内容を HDD に書き出します。このために 30秒くらいかかります。この間、HDD は回りっぱなしです。これでは、本体を動かすのも恐いですね。

また、移動や睡眠などで長時間使わないのが分かりきっている時には、ハイバネーションさせて電池の消耗を抑えたいものです。

こうした要求から、スリープモードを使い分けられると便利です。

以下には、お使いの Macintosh を安全でない設定に変更する方法が書かれています。自己責任で設定を変更してください。

切り替えるには、Terminal.app から、次のようにタイプします。

% sudo pmset -a hibernatemode 0

root 権限が必要です。0 の部分を、上記の表の数字にしてください。

つぶやき

公開していない (リンク張っていない) はずなのに、なぜか旧サイトの中でもこのページは大人気でした…。なぜ公開していないかというと、間違いが含まれていたからです。それにしても、どうやって見つけたんでしょう?

スリープさせるためのスクリプトについては、別の記事で紹介します。

iCal の終日イベント作成時のバグ

AppleScript から iCal の終日イベントを作成した時に、時間帯の扱いについてバグがある模様。iCal の環境設定の「時間帯サポートを有効にする」を変更しても、同じ結果となった。

実験環境

  • Mac OS X 10.5.6
  • iCal 3.0.6
  • スクリプトエディタ 2.2.1
  • AppleScript 2.0.1
  • 時間帯 Tokyo - Japan

テストコード

次のようなスクリプトを動かしてみると、(a) だけ昨日のイベントとなる。

tell application "iCal"
  tell calendar "テスト"
    set d to current date
    set hours of d to 8
    set minutes of d to 0
    copy d to d8  -- 今日の 08:00
    set hours of d to 9
    copy d to d9  -- 今日の 09:00
    set hours of d to 10
    copy d to d10  -- 今日の 10:00
  
    -- (a) 本日 8:00 - 9:00 の終日イベントを作る
    make new event at end with properties {summary:"テスト終日 (a)", start date:d8, end date:d9, allday event:true}
    -- (b) 本日 9:00 - 10:00 の終日イベントを作る
    make new event at end with properties {summary:"テスト終日 (b)", start date:d9, end date:d10, allday event:true}
    -- (c) 本日 8:00 - 9:00 の通常イベントを作る
    make new event at end with properties {summary:"テスト通常 (c)", start date:d8, end date:d9, allday event:false}
    -- (d) 本日 9:00 - 10:00 の通常イベントを作る
    make new event at end with properties {summary:"テスト通常 (d)", start date:d9, end date:d10, allday event:false}
  end tell
end tell

実行結果

この通り。多分、バグでしょう。

対策

今後、バグが直る可能性もあるので、対策としては、終日イベントを作るときは、開始時間を正午にしておく、ということでよさそうです…。

iCal 4.0.3 (Build 1388) では修正されていることを確認しました。(2010-09-05 追記)