MacOS X Lion に vnc で接続する際にパスワード入力ができない

Lion/Mac mini で Remote Management を有効にして他のPCから vnc で接続して利用している.接続して最初に表示される Lion 側の認証画面でパスワード入力ができない事があり困っていたのだが,Mac にマウス類を繋いでおくと致命的な問題は解決できるようだ.

うちでは Mac mini 用に Bluetooth キーボードと Tracpad を使っているのだが,Mac mini をサーバ的に利用しようと考えているので普段はキーボードも Tracpad も電源をオフにしていた.(マウスもキーボードもなくても起動するように,システム環境設定の「Bluetooth」内の「詳細設定」でマウスやキーボードがなくても Bluetooth 設定アシスタントが起動しないようにしている)

しかし,VNC 的には接続成功した後に表示される Lion 側の認証画面でパスワードの入力が全く受け付けられず,先に進めなくなることがあり困っていた.どういう条件で起きるのか調べてみたところ,スリープから復帰した後にマウス類が繋がっていない状態で VNC 接続しようとすると起きるようだとわかった.(スリープ復帰後じゃなくてOSを起動した直後なら問題ないようだ)

Tracpad を繋いでおけばパスワードが全く入力できないという問題は回避できた.ただし,時々,パスワードを数文字打ったところで無反応になることはある.これは原因不明だが VNC を再接続すればたいていうまく行くのであまり困っていない.

しかし,このためだけに Tracpad の電源を入れっぱなしにしておくのもなんだか勿体ないし,いつ電池が切れて繋げなくなるか分からないので,余っているUSBマウスでも繋いでおくことにしよう.


それにしても,Mac はスリープ状態でも sshvnc で繋ごうとするだけで復帰してくれるのは便利だ.スリープ状態の消費電力がどの程度なのかは気になるところだけど.

Excelで 0/1 を×/○ に

とあるイベントの参加申込をExcelで集計している.
参加するなら1,不参加なら0,未回答なら空欄,というルールで記入しているのだが,これはプログラムを書く人には分かってもらえると思う.しかし,このExcelシートを普通の人に見せて確認してもらおうと思うと,「なんで0や1なの?意味分からない.」「0って○じゃないの?」といった話になりがち.
それで,「0/1/空欄」をうまく「×/○/空欄」に変換する方法は無いかと調べてみたら,表示形式でユーザ定義を利用すれば簡単にできることがわかった.

[=1]○;[=0]×

これだけで良かった.

最初は数式を駆使して別のセルに「×/○/空欄」が出るようにしようとしていたが,空欄が0と表示されてしまったり,それを回避するのに余計にIFを使ったりしてイマイチな感じだったけど,表示形式を使えば0/1で入力すると即座に「×/○」に変換され,空欄も維持されるし,それ以外の文字を書けばそのまま表示されて,これは便利かも.

unzip でファイル名文字化け対応

Windowsがデフォルトでzip圧縮形式に対応して以来、メールに添付されるzipファイルが急増した気がする。しかしファイル名の文字コードの関係で、unzip するとファイル名がいつも文字化けしてしまい、下記のようなコマンドで修正していた。

% convmv -f sjis -t utf-8 --notest *

しかし、unzipにはファイル名をiconvで変換するパッチがあって、FreeBSDports にもずいぶん前から取り込まれていたようだ。ただし、コンパイル時にオプションを指定する必要があった。

# cd /usr/ports/archives/unzip
# make -DWITH_ICONV
# make install

使うときは、たいていWindowsで圧縮されたファイルを解凍するので、ほぼ100%こういうコマンドになる。

% unzip -Ocp932 -l [ファイル名]
% unzip -Ocp932 [ファイル名]

でも毎回指定するの面倒なのでエイリアスで指定しておく。

alias unzip="unzip -Ocp932"

しかしこうすると zsh の補完が効かないことに気付いた。"-O" なんてオプションを知らないのでその後が正常に補完できなくなるようだ。補完のルールを変えるのが正当な方法だろうけど、この問題を回避できるオプションがちゃんとあった。

setopt complete_aliases

これで、エイリアス展開後に現れることになる"-Ocp932" は無いものと思って補完してくれるので普段どおりの補完が効く。

ZFS on Root な FreeBSD を 8.2 から 9.0 にアップグレードしたら起動しなくなった (解決)

FreeBSD-8.2 をメインマシンとして利用している.なんだか楽しそうだったので ZFS on Root の環境を構築したのだが,9.0 ヘアップグレードするときにきっとハマるだろうと思うので,別環境でアップグレード試験をしてみた.(これまで何度となくいきなり本番アップグレードをしてうまく起動できなくて焦った経験があるので)

PC-BSD 8.2 を使って FreeBSD-8.2 をインストールして,そこからアップグレードを試したのだが,案の定,zpool や zfs のアップグレードをしたあと起動できなくなってしまった.FreeBSD-9.0R の USB 起動メモリを使って試行錯誤を繰り返した.

結論としては,PC-BSD 8.2 のインストーラが確保する freebsd-boot パーティションの領域が小さ過ぎて,9.0 用の /boot/gptzfsboot が書き込めないようだ.下記のように freebsd-boot のサイズを128セクタに広げてから bootcode を書き込んでやると無事に成功.(もともとは freebsd-boot が 64セクタになっていたと思う).

# gpart resize -i 1 -s 128 ada0

$ gpart show ada0
=>       34  117210173  ada0  GPT  (55G)
         34        128     1  freebsd-boot  (64k)
        162       1854        - free -  (927k)
       2016  117198848     2  freebsd-zfs  (55G)
  117200864       9343        - free -  (4.6M)

# gpart bootcode -p /boot/gptzfsboot -i 1 ada0

ただ,これは自分の本番環境とは違う構成になってしまっているので,まだ本番環境でアップグレードをして大丈夫という自信がない.本番環境は ZFS on Root なのに何故か下記のような表示になる・・・(謎)

% gpart show

=>       63  500118129  ad0  MBR  (238G)
         63       1985       - free -  (993K)
       2048   24576000    1  !45  (12G)
   24578048     614400    2  !45  (300M)
   25192448  104856688    3  !45  (50G)
  130049136  370069056    4  freebsd  [active]  (176G)

=>        0  370069056  ad0s4  BSD  (176G)
          0  370057216      1  freebsd-ufs  (176G)
  370057216      11840         - free -  (5.8M)

PDFファイルのアイコンにサムネイルを表示 (解決)

職場ではここしばらく Windows7 64bit版を使っているのだが,PDFのアイコンにサムネイル画像が表示されずにアドビのマークになっているので,サムネイル画像にする方法を調べてみた.すると,本来はサムネイル画像になるはずなのに,64bit版のバグのため表示されていないらしいことが分かった.
64bitアプリであるエクスプローラではサムネイル画像を作成できないが,32bitアプリでサムネイル画像を生成してキャッシュファイルに乗せてやれば,その後も表示されるらしい.
というわけで,32bitアプリ(例えば Media Player) で「ファイルを開く」などして「開く」ウィンドウを出し,そこでPDFの並んだフォルダで「特大アイコン」を選択すると,期待通りサムネイル画像が生成された.

実は,ScanSnapを使っていて ScanSnap Organizer が起動するたびにPDFのサムネイル画像を生成し直しているようで,動作が遅くて気になっていたのだが,どうもWindows側のバグが原因だったようだ.おかげで動作が快適になった.

zsh で入力できない日本語文字があった (解決)

rxvt-unicode + screen + zsh というターミナル環境に,scim-skkibus-skk で日本語入力をしていた.
ターミナルで日本語の文章を入力することは無いけれど,ファイル名が日本語になっているファイルを受け取ったりしたときにちょっと日本語を入力するために.

しかし,特定の文字を入力しようとすると消えてしまうという問題がずっと起きていた.例えば「教育」と入力しているのに,「教」が消えてしまい「育」だけが表示されるなど.「教育〜」で始まるファイル名を指定しようとしているのに,それができなかったりする.最初の1文字が入力できないとTAB補完も有効に使えず,なかなかまどろっこしい操作をしていた.

何かのバグだろうと思って放置していたが,何も設定していないzsh環境では問題が起きないことに気付いて,自分の設定を一つづず確認したところ,問題の設定を見付けることができた.その設定はこれ.

bindkey '\M-f' forward-word

emacs 風に M-f で一単語戻る,というつもりで書いていた設定なのだが,UTF-8 の何かのコードと被るのかな.
しかも,この設定を消してもちゃんと M-f で単語単位で移動できていた.元々入っている下記の設定で良かったということのようで,どうして自分で "\M-f" なんて設定を入れたのか不明・・・.

% bindkey -M emacs | grep forward-word
"^[F" forward-word
"^[f" forward-word

PHP はいろいろ難しい

わけあって,以前 php4 で自分で作った Web サイトを改造することに.php正規表現がよく分からなかったり,大きな数の計算とかできなくて,困ったのでメモ.

複数行にわたる文字列から,正規表現にマッチする部分を抜き出したい.具体的にやりたいのは,PKI証明書の CSR を openssl コマンドを使って人が読める形式で表示した内容の中から,特定の文字列が含まれているかどうかの判定.

% openssl req -noout -text -nameopt esc_ctrl,esc_msb,sep_multiline,space_eq,align,sname -in HOGEHOGE.CSR

Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject:
            C          = JP
            L          = ********
            O          = ********
            OU         = ********
            CN         = www.****.****.**.**
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:b1:03:ca:5d:e9:4f:54:ad:3e:e3:de:d9:b8:c4:
                    :
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha1WithRSAEncryption
        13:24:94:40:98:ac:df:d5:25:52:91:07:5a:73:e2:9c:9b:64:
        :

のように表示された内容から,L や O や OU の ***** の部分が適切に登録されているかチェックしたい.複数行の文字列から正規表現で特定の部分を抜き出すには preg_match_all という関数を使えば良いようだが,この関数では行頭や行末を表わす ^ や $ が使えないようだ.つまり,下記の例で,前者は機能するが後者は機能しない.全ての行を一つに繋いでしまって処理しているのだろうか!?

preg_match_all('/\s*L\s*=\s*(.+)/', $csrinfo, $match);
preg_match_all('/^\s*L\s*=\s*(.+)$/', $csrinfo, $match);

mb_ereg を使えば問題ないんだろうか.PHPは何かしようとする度に,各関数で何ができて何ができないかがはっきり分からなくて,いつも試行錯誤を繰り返すことになってしまう.調べ方がよくないだけなんだろうか….

もう一つの大きな数の計算は,同じく PKI 証明書がらみで,シリアル番号の扱い.
扱かっているPKI証明書に,16進数で書くと20〜30桁くらいのシリアル番号が付くのだが,これを10進数に直したい.openssl で普通に表示すると16進数で表示してしまう.
PHPはデフォルトでは CPU の扱える整数の範囲くらいしかサポートしていない模様.
PHPGNU MP library PHP: gmp_init - Manual を使うと解決できるようだが,これ,PHPコンパイル時に enable にしてコンパイルしていないと使えない.私が使おうとした環境では使えなかった.
GMP だけ追加できれば嬉しいのだが,PHPコンパイルやり直しになると,古いシステムを壊さずに移行できるか自信が無いので別の方法を探してみよう…