Windows上でperlを使って日本語ファイル名を操作する(メモ

slashdot.jpの「Perlはゾンビだ」に、日本語Windows環境において、perlを使って日本語ファイル名を操作する時の注意点がまとめられていたので、引用&備忘録化。

過去にperlスクリプトを作る際、ファイル内に書かれた日本語の操作に関することはWindows/Linuxで動作が共通化できたものの、「日本語ファイル名の取り扱い」について、Windows上での動作がいまいち分からず、面倒になり、NASに該当ファイル群を置き、Linuxで処理する、ということをしたことがある。

その時に受けた感じからすると、以下の解説は非常に納得がいくモノだった。

Anonymous Coward の書き込み (#2628619) 」より

コマンドラインからの引数取得とかファイル操作とかのたびに
@ARGV = map { decode(‘cp932’, $_) } @ARGV; とか
open my $fh, ”, encode(‘cp932’, $filename) or die $!; とか
@files = map { decode(‘cp932’, $_) } readdir($d); とか
if (-f encode(‘cp932’, $filename)) とか
mkdir encode(‘cp932’, $filename); とかソース全体にわたって書かなければならないこと。

これが面倒だと思わない奴はWindows上でPerlを本気で使ったことがないとしか思えない。少なくとも小飼弾はMac使っているようだし。つーか面倒だと思わないならそもそもどうして開祖が「怠惰はプログラマの美徳」とか言ってる言語なんか使ってるの?

56億7千万歩ほど譲ってこれは面倒ではないということにしても、Windows以外の環境への移植性がまったくない。Windows上でシステムロケールを変えただけで動作がおかしくなる。当然どんな環境で動くかわからないモジュール内では使えない。
まあいちおうこれには対処の方法があって、
use Encode::Locale;
@ARGV = map { decode(locale, $_) } @ARGV; とか
open my $fh, ”, encode(locale_fs, $filename) or die $!; とか
@files = map { decode(locale_fs, $_) } readdir($d); とか
if (-f encode(locale_fs, $filename)) とか
mkdir encode(locale_fs, $filename); とかさらに呪文を積み増しすればいいらしい。
MacやLinuxでこんなことわざわざしてる奴いないと思うけど。つーか忘れてもたいてい問題なく動くからWindows以外の環境で正しく書くのが超困難。だから結局Windowsに移植する奴が貧乏クジを引かされる。Windows上ですら、localeとlocal_fsが違う環境があるというバグを知らずに踏んでも気づかない。

しかし実はEncode::Locale;使ってもまだ不十分で、システムロケール(日本語版ならシフトJIS)で表せない文字を含んだファイル名が扱えない。いちおうWin32::Unicode::Fileというモジュールがあるようだが、ファイル読み書きをモジュール内で独自に行なっているので信じられないほど遅くて捨てた。Win32::Longnameというモジュールがちょっとはマシなようだが、どちらにしてもまたも移植性がなくなる。

自分で書くコードは上記の面倒じゃないことにした書き換えを「するだけで」済むとしても、File::compareのような超基本的モジュールすらいまだに非対応。

Perlでこのへんが改善される見込みはまったくなさそうなので、自分はPythonの勉強を始めた。

そして、(#2630401) より

> ・PerlをUTF-8ベース(CP65001)でPerlを動かす
> ことだと思います。

Console CPはファイル名で使われるコードページにはまったく影響を与えない。Encode::Localeでもlocale_fsとconsole_inとconsole_outが別々に定義されている(そう、APIレベルではコンソール入力と出力さえ異なる可能性がある)。Perlの仕様をまともにするためにあなたのような知ったかぶりバカをマサカリで殴って回るよりコストがかからないに違いないからPythonの勉強を始めたの。

> 普通のコマンドプロンプト(SJIS)ベースでは不可能。

Windowsにはコンソール入出力にもワイド文字APIがあり、それを使えば可能(リダイレクトやパイプが絡むとこっちの都合だけでエンコーディングを決められないけどそれはCygwinでも同じだし)。もちろん今あるPerlでは不可能だがそれは実装の手抜きにすぎない。そもそもCygwinはどうやってUTF-8文字を受け付けるコンソールを実現してると思ってるの?

> ・UTF-8 な cygwin の環境を構築し、その上で Perl を使う

Cygwinはパスの扱いが特殊すぎて、結局普通のアプリとパス名をやりとりする際にパスの変換/逆変換が必要なので、面倒だとか移植性ゼロだとかいう問題は何も解決しない。Perlがmsvcrt使うのやめて、UTF-8←→UTF-16LE変換を行ってワイド文字API呼び出して、Encode::LocaleはあたかもロケールがUTF-8であるかのようにふるまってくれるのが一番いいのだが、それを実現するために投入するコストを考えるとすでにまともな処理している言語の乗り換えにコストを振り向けたほうがどう考えても省エネ。

> ・@ARGVやファイル名を、スクリプト本体内のデータ処理と混ぜない

それを面倒と思わないなら以下略

LTOテープをファイルシステムとして使うLTFSについて 2014/06/09版

LTOテープをファイルシステムとして使うLTFSについて 2020/05/11版」にて内容を更新しました。


2015/11/18の情報を元に、新記事「LTOテープをファイルシステムとして使うLTFSについて 2015/11/18版」を公開しています。


LTOテープ1本を持ち運びができるファイルシステムメディアとして使用できるようにするLTFSについて、最近の状況を調べ直した。
(過去の関連記事:「LTOテープをファイルシステムとして使うLTFS(2012/11/28)」「テープ装置メーカ純正のLTFS一覧(2013/12/20更新)」「IBM版LTFSをRHEL5で使ってみた(2013/05/20)

LTO-5/LTO-6からは、メディアを2つの領域に分割して利用することが可能になった。
その機能を活かし、1本のテープメディアの中に、メディア内データの管理情報と、実データを分割して保存することを可能とした。
これにより、これまで実現出来なかった、1本のテープメディアだけで可搬性のあるファイルシステム構築、というものが可能となり、その実装として、LTFS(Linear Tape File System)というのがある。

使用用途としては、バックアップ用ではなく、長期保存のためのアーカイブ用や、大容量データの持ち運び用として使用されている。

LTFSを実現するためのソフトウェアについては、基本的には、IBMが大本のベースを作り、それを各LTOドライブメーカが、自社ドライブ向けにカスタマイズして提供しているような形となっている。

LTFSには、バージョンがいくつかあり、現状気にしなければならないのは、以下の4つ
・LTFS 1.0
・LTFS 2.0 : ファイルインデックス関連で機能をいろいろ追加
・LTFS 2.1 : 2012/05/18リリース。LTFS2.0+シンボリックリンク(現在draft版)
・LTFS 2.2 : 2013/12/21リリース。管理情報の改良

ファイルインデックスは、XMLで書かれているので、LTOテープからデータを直接読み込んで、自前でデコードしてみる、ということも可能ではある。

LTFS2.2の規格書はSNIAの「Linear Tape File System (LTFS)」にある。
その他、いろんな情報は、LTOの規格団体の「LTFS Overview」にある。

LTFSの公式認証を取得しているLTFSソフトウェアについては、「LTFS Compliance Verification」にて紹介されている。

2014/06/06時点では以下の6個が登録されている。

 Company

 Product

 Version

 LTFS Version*

 LTO Generation

 Date tested

 Quantum

 Quantum Scalar LTFS Appliance

 2.0.2

 2.0.1

 LTO5 & 6

 9/11/13

 HP

 HP StoreOpen Standalone

 2.1.0

 2.1.0

 LTO5 & 6

 9/11/13

 IBM

 IBM Single Drive Version

 1.3.0

 2.1.0

 LTO5 & 6

 9/11/13

 IBM

 IBM LTFS Library Edition

 V1R3

 2.1.0

 LTO5 & 6

 10/2/13

 Quantum

 Quantum LTFS

 2.1.0

 2.1.0

 LTO5 & 6

 11/29/13

 HP

 HP StoreOpen Automation

 1.2.0

 2.0.1

 LTO5 & 6

 11/29/13

ソフトウェアのバージョンと、対応しているLTFSフォーマットのバージョンに関連性は無いので注意が必要。

各ドライブメーカが出しているLTFSソフトウェアの情報について

まずは、上記のリストに載っているメーカのものから。

・IBM
公式: IBM Linear Tape File System

ソフトウェアの入手は、「Fix Central」にて「製品グループ:System Storage」-「Tape Systems」-「Tape drives and software」の下にある「LTFS Single Drive Edition (SDE)」や「LTFS Library Edition (LE)」を選択して行う。
なお、LEの方はアップデータのみの配布で、元になるソフトウェアについては、IBMから別途入手する必要がある。
基本的には、LTFS Single Drive Edition(SDE)が、他の全てのLTFSソフトウェアの原型になっているもの・・・という感じである。

2014/06/09時点での最新は、
LTFS Library Edition : ver2.1.2.2-4103(2013/12/06)
LTFS Single Drive Edition: ver2.2.0.0-4301(2014/05/09)

SDEの方はLTFS2.2をサポート。
LEの方はサポートしているのかどうかはっきりしなかった。

・HP
公式: HP StoreOpen
日本語情報: HP LTFS (Linear Tape File System)

ソフトウェアの入手は、単体ドライブ向けの「HP StoreOpen Standalone」も、チェンジャー向け「HP StoreOpen Automation」も、なぜか「HP StoreOpen Standaloneダウンロードページ」のリンクから可能。

2014/06/09時点での最新は、
HP StoreOpen Standalone : ver2.2.0(2014/04/29)
HP StoreOpen Automation : ver1.3.0(2014/02/03)

どちらのバージョンもLTFS 2.2.0をサポートするためにバージョンアップしている。

・Quantum
公式: Linear Tape File System

ソフトウェア入手は上記の公式ページの「Software」タブから行う。
ソースコードについては、LTFS Open Source Filesから。

2014/06/09時点での最新は、
qtmltfs : ver2.1.1(2014/02/25)

日付的にLTFS2.2もサポートなのかな?と思いきや、README内の変更履歴を見る限りでは、LTFS2.1までのサポート。

・Quantum Scalar LTFS Appliance
公式:Scalar LTFSアプライアンス

こいつだけ、他のとは違って、ハードウェアがセットになったアプライアンス。
これの下にFC経由などでテープチェンジャーを繋いで使うもの。

リストに載っていない、LTFS

・TANDBERG DATA
公式: LTFS for Big Data Storage

ソフトウェアの入手は「LTFS Documents and Downloadsから行う。

2014/06/09時点での最新は
バイナリ: ver2.1.0
ソースコード: ver1.2.0
ではあるものの、HP StoreOpen Standaloneそのままである模様。

・Oracle
公式: Oracle’s StorageTek Linear Tape File System, Open Edition

ソフトウェアの入手は「https://oss.oracle.com/projects/ltfs/files/」から行う。

2014/06/09時点での最新は
ltfs-1.2.6-20130711(2013/08/15)

IBM LTFS 1.2.5とHP LTFS 2.0.0を組み合わせ、Oracle/StorageTek用の設定を入れたもの。
LTFS2.0.0までのサポート

samba 4.xで作ったActive Directory環境でWindowsServer2012フェールオーバークラスターは動作しない

2018/02/28追記
samba 4.7.4で作成したフォレストレベルがWindows Server 2008R2のActive Directory環境を使って、Windows Server 2016のフェールオーバークラスターを動作させることができました。
→「samba 4.7.4で作ったActive Directory環境でWindowsServer2016フェールオーバークラスターを動作させた


samba 4.1.7で作成したActive Directory環境を使って、Windows Server 2012のフェールオーバークラスターが作成できるかをチャレンジしてみた。

ドメイン/フォレストの機能レベル:Windows Server 2003
 → 失敗

ドメイン/フォレストの機能レベル:Windows Server 2008R2
 → 失敗

注: samba 4.1.7では、Windows Server 2012および2012R2というレベルはサポートされていない。

というわけで、実験の結果、Windows Server 2012 R2のフェールオーバークラスターを作ることはできませんでした。
なお、この実験完了後、同じ構成でWindows Server 2012によるActive Directory環境にてフェールオーバークラスターが構築できることを確認しています。

googlevideo.comの運用が始まったせいでyoutubeの動画が再生できない

Windows8.1のファミリーセーフティー機能を使って、子供用アカウントのコンテンツアクセス制限をかけている。

ファミリーセーフティー側はyoutube.comを許可し、コンテンツの内容についてはyoutube設定の方で制御していた。

2月末ぐらいからYoutubeの動画が再生できない、とクレームが・・・
原因がわからずGoogle Chromeを使って再生させる、という運用回避策を実施。

で・・・、昨日、OSの再インストールを実施。
その直後から現象は発生。

さすがにおかしいと思い詳細を調査。

その結果、Youtubeの動画部分のURLが「googlevideo.com」に切り替わっていることが判明。
googlevideo.comを許可リストに追加することで動画再生ができるようになりました。

・・・Youtubeの動画が再生できない、というFAQの中に「googlevideo.com」なんてドメイン出てこないんですけど!!!!

パソコンのファイアウォールが原因で YouTube 動画がブロックされて再生できない場合があります。ファイアウォールの設定で、www.youtube.com を信頼済みサイトとして設定し、他のアプリケーション(QuickTime、RealPlayer、Windows Media Player など)をデフォルトのストリーミング アプリケーションに設定しないように調整します。ファイアウォール設定の確認方法は次のとおりです。

vCenter Server 5.5のOS対応リストが見つけられない

vCenter Server 5.5は、Windows Server 2012 R2で動くのか?
というのを調べようとしたら、非常に難航したのでメモ書き。

ESXi および vCenter Server 5.5 のドキュメント → vSphere のアップグレード → システム要件 → vCenter Server のソフトウェア要件」には以下の記述が・・・

サポートされているオペレーティング システムについては、http://www.vmware.com/resources/compatibility の 『VMware 互換性ガイド』 を参照してください。

で、リンク先を見ても、うまく発見できないわけです。

どこにあったかといいますと
compati

上記の赤枠部分をクリックすると、ずらずら~っと、メニューがでてきます。
compati2

そのなかから「Host OS Compatibility Guide」の「Download Full Host OS Guide」を開きます。
具体的には、「コレ」です。

ぱっと開いた感じだと、全然関係ないように見えますが、半分ぐらいのところからWindows OS上で動作するVMwareプロダクトについての記載があります。

Windows Server 2012/2012R2に関する記述は以下の通り。

・Windows Server 2012
Workstation9.0, 10.0
vCenter Server5.5, 5.1 U2, 5.1 U1, 5.0 U3, 5.0 U2
vSphere Client (Windows)5.5, 5.1 update2, 5.1 Update1, 5.0 Update 3, 5.0 Update 2
vCenter Orchestrator5.5, 5.1 Update2, 5.1 Update1, 4.1 Update 2
vCenter Update Manager5.5, 5.1 Update2, 5.1 Update1, 5.0 Update 3, 5.0 Update 2

・Windows Server 2012 R2
Workstation10.0
vCenter Server5.1 U2
vSphere Client (Windows)5.1 update2
vCenter Orchestrator5.1 Update2
vCenter Update Manager5.1 Update2

・・・Windows Server 2012 R2の対応について、若干悩むようなところです。
なぜ古いバージョンのみ対応なのだ・・・