※ この記事は、Mac OS X 10.7.3/VMware Fusion 4.1.1/Windows 7 SP1について書かれています。

会社で使っている Windows Vista(32bit)がいろいろ不都合があって我慢できなくなったので、思い切ってiMacに変えた 。
AppleStoreでCPUだけ Core i7 の 2.8GHz にして、メモリは標準の4GBに、IO-DATAの4G×2を追加して12GBにした。
そして、VMware FusionとWindows7 Pro 64bitを購入して、インストールした。
既存のWindowsで使っていた仕事のファイルは、全てMac上に作った暗号化したsparse bundle image にコピーした。(sparse bundleにした方がTime Machineのバックアップの効率が良いと考えたのだけれど、VMwareのimageとかならともかく、仕事の細かいファイルの場合は意味がない、と言うかTimeMachineで特定のファイルのちょっと前のバージョンを取り出すとかができないことに今気づいた)
このmac上のvolumeをWindowsからVMware Fusionの共有機能を使ってmountした。
そして、VMware上のWindowsにOfficeとメーラを入れて、事務仕事はほとんどWindowsで、開発はVMware上のCentOSやUbuntuでできるようになった。
ここまで前置き1。

続いて前置き2。
プロジェクトの共有ファイルは、svnかdavに置くことになっていて、Windowsのdavの扱いはかなり怪しいのでCarotDAVと言うアプリケーションを利用している。
しかし、Macの場合はFinderの移動→サーバへ移動...でhttp:のURLを指定すれば直接davが開けて、そのまま読み書きができる。
そこでちょっとしたファイルのコピーはMacでやっていたのだが、私がdavに置いたファイルを、他の人が見るとファイル名が文字化けしていると言う。
どうも、濁点/半濁点を含むファイル名を、Macから置くとCarotDAVでは文字化けするらしい。CarotDAVで濁点/半濁点を含むファイルを置いた場合は、Macから正常に読み出せる。
(今にして思えば、こちらがNFC/NFDの問題だったのだが、このときはまだ知らなかった)

さて、いよいよ本題。
ある日、顧客から「サンプルデータ.zip」と言うファイルが届いた。Windows場ではlhaplusと言うアーカイバを愛用している。
いつものようにvmwareの共有フォルダに上記添付ファイルを置いて、lhaplusで展開しようとしたら、ファイルが見つからないと言われた。
Lhaplus-1.png
ここから長い調査がはじまったのだが、前置き2の先入観のせいでてっきり「サンプルデータ」に「プ」と「デ」が入っているのが悪い、と思い込んでしまったせいでなかなか正解にたどり着かなかった

まずは、「mac 濁点」等で調べてみたところ、Mac OS Xの濁点ファイルがやってきた - miauの避難所と言うページがひっかかった。
Unicodeで濁点、半濁点を表すには、「プ」と「フ」+「゜」(\u309a)の2種類があり、「プ」に揃えようとするのをNFC、「フ」+「゜」に揃えようとするのをNFDと呼ぶらしい。
そして、Macのファイルシステム(HFS+)のファイル名は、積極的にNFDで正規化を行い、WindowsやLinuxは積極的には正規化を行わないが、結果としてNFCになっていると言うことがわかった。
っつーか、同じ文字を表すならバイト数が少ないほうが良いと思うんだけど、なんでMacはNFDを採用したんだろうか。
Macのターミナル上ではzshを使っているのだが、zshはこのNFC/NFDの正規化を行わないらしく、「サンプルデータ.zip」と言うファイルがあると、以下のような挙動をする。
  • ls サンプルデータ.zip → ヒットする
  • ls サンプ<TAB> →補完されない
  • ls サンフ<TAB> →補完されるが、「サンフ<309a>ルテ<3099>ータ.zip」と表示される
同じディレクトリを、Windowsでdir /bで見てみると、上記サイトと違い、濁点/半濁点は別れずに表示された。(この段階でも気がつくべきだった)
再現テストを繰り返すうちに、以下のことがわかった。
  • サンプルデータ.zip → lhaplus で展開できない
  • プ.zip → lhaplusで展開できる
  • longlongarchive.zip → lhaplusで展開できる
  • サンフルテータ.zip → lhaplusで展開できない
どうも、今回の問題はNFC/NFDの問題ではないらしい。上記参考サイトの場合は、Macから受け取った添付ファイルに含まれていたNFDのファイル名を問題にしているのであり、今回のようにMacのVolumeをWindowsからマウントした場合の問題ではなかった。
そもそも、Windouwsにマウントした時点で、ファイル名の文字コードはUnicodeではなくMS932になっているので、その段階でNFCの正規化が行われているらしい(推測)

振り出しに戻って、じゃあ何が原因なのか考える。再現テストの結果からわかることは、ファイル名に非ASCIIが含まれている時かつ、8.3文字を超えているとき、に問題が発生すると言うこと。
そこで、8.3 filename - Wikipedia, the free encyclopediaなどを読んでいると、dirコマンドに /x とか /-n とか言うオプションがあることを知る。
早速、問題のディレクトリで実行してみると、
2012/03/25  07:46    <DIR>                       .
2012/03/25  08:25    <DIR>                       ..
2012/03/24  22:15               131 LONG~CDD.ZIP longlongarchive.zip
2012/03/24  08:18               134 サンプ~~B2E.Zサンプルデ.zip
2012/03/24  08:18               134 サンプ~~B44.Zサンプルデータ.zip
2012/03/24  08:18               134              デ.zip
のように表示された。
詳しい原因まではわからないが、lhaplusにこの辺のLFNからSFNへの変換(もしくはその逆)の問題があるのかもしれない。
とりあえず解決策を探そうと思って、VMwareの共有ではなくてMac OS X のsmb共有を使ってみた。
すると、lhaplusでも展開に成功した。
dir /x を実行してみると、
2012/03/25  07:46    <DIR>                       .
2012/03/25  08:25    <DIR>                       ..
2012/03/24  22:15               131              longlongarchive.zip
2012/03/24  08:18               134              サンプルデ.zip
2012/03/24  08:18               134              サンプルデータ.zip
2012/03/24  08:18               134              デ.zip
のようにLFNのみが表示された。
いまいち良くわからないけど、Mac OS X のsmb共有を使っておけば問題ないってこと?

カテゴリ

トラックバック(0)

このブログ記事を参照しているブログ一覧: VMware Fusionのファイル共有の罠

このブログ記事に対するトラックバックURL: https://www.wizard-limit.net/cgi-bin/mt/mt-tb.cgi/2863

コメントする

このブログ記事について

このページは、falseが2012年3月25日 07:50に書いたブログ記事です。

ひとつ前のブログ記事は「さらばBootCamp」です。

次のブログ記事は「plaggerが動かない」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

広告

Powered by Movable Type 6.1.1