カテゴリー別アーカイブ: Windows

Windows版Anacondaのsilent install

Anacondaとは

Anacondaは数値計算とかに便利なライブラリが一式つまったpythonのディストリビューションです。
Download Anaconda Python Distribution

Windows版Anacondaのsilent install

Windowsの場合exe形式のインストーラーがあります。GUIのウィザードで簡単にインストールできますが、 コマンドひとつでサイレントインストールすることもできます。

Anaconda Install — Continuum documentation

Anaconda-2.x.x-Windows-x86[_64].exe /S /D=C:\Anaconda

/Sというオプション(スイッチ)がポイントですね。 /Dには導入するフォルダを指定します。一番最後に指定しましょう。 これでインストールではできるのですが、PATHの設定や使用ユーザーを設定したいときには次のようなオプションを設定できます。

  • /InstallationType=AllUsers [default:JustMe]
  • /AddToPath=[0|1] [default:1]
  • /RegisterPython=[0|1] [default:AllUsers:1, JustMe:0]

ちなみにこれらは/?というオプションをつけて実行すると確認できます。

例えばすべてのユーザー用にインストールし、PATHやRegistryを登録するサイレントインストールの方法は以下のコマンドになります。
ただしPATHやRegistryにきちんと登録するためには、コマンドプロンプトのアイコンのコンテキストメニュー(右クリックメニュー)から「管理者として実行」(Run As Administrator)で起動してから以下のコマンドを実行してください。

Anaconda-2.x.x-Windows-x86[_64].exe /InstallationType=AllUsers /AddToPath=1 /RegisterPython=1 /S /D=C:\Anaconda

バッチファイルで実行する場合

コマンドは一瞬で終了しますが、実は裏側でインストーラーが動いています。
バッチファイルなどでインストールが完了するまで待つためにはstartコマンドの/waitオプションを使います。詳しくはstart /?を参照してください。

以下は、32bit版Anacondaの2.0.1版をすべてのユーザー用にC:\Anacondaにインストールし、PATHとレジストリの設定まで行うものです。

set FILENAME=Anaconda-2.0.1-Windows-x86.exe
set PATHTO=C:\Anaconda
start "Anaconda Install" /wait "%FILENAME%" /S /InstallationType=AllUsers /AddToPath=1 /RegisterPython=1 /D=%PATHTO%

上のようにインストール先を変数で渡す場合、/D="%PATHTO"と書くとうまく行きません。
C:\Program Files\Anacondaのようにパスに空白を含む場合でも/D=%PATHTO%と書きましょう。
変数で渡さず直接インストール先のパスを書く場合は、/D=C:\Program File\Anacondaと書いても/D="C:\Program Files\Anaconda\"と書いてもどちらでも大丈夫なようです。

参考

Windows silent installation

Microsoft Office文書をOpenXML形式に変換する

Microsoft Office文書(Word,Excel,PowerPoint)をOpenXML形式に変換したい、そんなとき。

やりたいこと

要は次のようにしたい。

.doc
Microsoft Word 97-2003 文書
.docx
Microsoft Word 文書
.xls
Microsoft Excel 97-2003 ワークシート
.xlsx
Microsoft Excel ワークシート
.ppt
Microsoft PowerPoint 97-2003 プレゼンテーション
.pptx
Microsoft PowerPoint プレゼンテーション

もちろん、それぞれのソフトウェアを起動して「名前を付けて保存」するときに形式を指定してやればよいのだけれど、
ファイルが大量にあるときにはバッチ的に処理したい。

変換ツール

そこで、
2007 Microsoft Office System Migration Guidance: Microsoft Office Migration Planning Manager
Microsoft Office Compatibility Pack for Word, Excel, and PowerPoint File Formats
以上の2つをインストールすればそれができるらしい。

上のリンク先のガイド通りにインストールすると、 C:\ompm\ 以下にいろいろ展開される。
C:\ompm\Tools\ofc.ini の fldrに変換したい文書の入ってるフォルダを指定して実行。

ところが

PowerPoint(.ppt)がうまく変換されない。64bitマシンを使っていたせいか、C:\Program Files\Microsoft Office\Office14 に
Wordconv.exeとexcelcnv.exe はあるのに、PowerPointを変換しそうなヤツが見当たらないせいでエラーになる。
C:\Program Files (x86)\Microsoft Office\Office12 にPPCNVCOM.exeがいた。ついでにここにWordconv.exeとexcelcnv.exeもいた。

というわけでofc.exeなど使わずに、この3つを直接使うことに決めた。

それでコマンドプロンプトでなんとかしようとしたら、前記事「Windowsのコマンド・プロンプトの拡張子の取り扱い」の罠にはまった。
テキトーにやるとdocとdocx,xlsとxlsx,pptとpptxが区別できなくなったりするので注意。

変換コマンドの使い方

それぞれの使い方。出力ファイル名の拡張子にはxつけてあげる。

"C:\Program Files (x86)\Microsoft Office\Office12\Wordconv.exe" -oice -nme input_file output_file
"C:\Program Files (x86)\Microsoft Office\Office12\excelcnv.exe" -nme -oice input_file output_file
"C:\Program Files (x86)\Microsoft Office\Office12\PPCNVCOM.EXE" -oice input_file output_file

それにしてもこのコマンド群の統一感の無さ。とにかく見事にバラバラである。
● 変換の略し方(conv, cnv, CNVCOM)
● 大文字小文字(Word, excel PP)
● オプション引数の順序と数
オプションの意味はよくわからんのだが、順番がわりと大事だったりする。excelcnv.exe で -oice -nme って書いても動いてくれないのだ。
PowerPointでは-nme付かないし、いったいどうしてこんなことになちゃうんだろうか。

「こいつら全く別物だぜ!」というアピールなんだろうか。ユーザーはそんなの望んでないよね。
インターフェースの悪い例の良い見本だね。勉強になるね!

ところでこのdocx,xlsx,pptxにしたらサイズが小さくなったのだけど、これって要はzipでXMLファイルが圧縮されているのだね。
docx,xlsx,pptxをそれぞれzipという拡張子に変更して展開すれば、中にXMLファイルが入っているよ。

Windowsのコマンド・プロンプトの拡張子の取り扱い

[NT] コマンド プロンプトでの拡張子の取り扱い http://support.microsoft.com/kb/164351/ja

コマンド プロンプトからワイルドカードを使ってファイル管理を行う場合、3 文字を超える長い拡張子は、3 文字に切り詰められて取り扱われます。 というわけで、上のリンクのガイドに従って、レジストリエディタで HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem Win95TruncatedExtensions : REG_DWORD を 0 へ変更(デフォルトは 1)して、再起動 ところが、もう一度試してみても、やっぱり3 文字に切り詰められて取り扱われるのか、以下のようなコマンドを実行すると、ひっかかって欲しくない拡張子4文字以上のファイルもヒットしてしまう。

> dir /B *.htm
index.htm
index.html

このレジストリ値を変える以前に作ったファイルには効かないようだ。レジストリ変更後に作った拡張子4文字以降のファイルはちゃんとその通り扱われていた。 うっかり削除なんて事故も起きかねない。コマンド・プロンプトでワイルドカードを使うときは十分注意が必要だね。

CaboChaの文字コードRecompileしてもうまくいかない、そんなとき

CaboCha 0.60pre4 Windows版で辞書の文字コードを変えようと思ったのだけどうまくいかなかったときの話 CaboChaをインストールすると、スタートメニューには

  • Recompile SHIFT-JIS Model
  • Recompile UTF-8 Dictionary というのが用意されているのだけれど、これをこのまま実行してもCaboChaがうまく動作しないことがある。

症状

たとえば、文字コードをUTF-8からSHIFT-JISに変えようと思って「Recompile SHIFT-JIS Model」を実行。特にエラーもなく終了したので、CaboChaを実行すると、

morph.cpp(108) [charset() == decode_charset(dinfo->charset)] Incompatible charse
t: MeCab charset is SHIFT-JIS, Your charset is UTF8

となり係り受け解析ができない。

原因

Windows Vista以降で導入されたユーザーアカウント制御UAC(User Account Control)により、C:\Program Files\CaboCha\model\charset-file.txtの書き換えに失敗している。

C:\Program Files\CaboCha\model>echo SHIFT-JIS 1>charset-file.txt
アクセスが拒否されました。

対策

Recompileのバッチ実行後に直接C:\Program Files\CaboCha\model\charset-file.txtのファイルを書き換える。 もしくは、 C:\Program Files\CaboCha\model\mkmodel.batの1行目に以下を追加して、”管理者権限で”Recompileのバッチを実行する。

 cd /d %~dp0 

なぜだろう

UACにより書き込みが制限されるのであれば、最初からバッチコマンド自体を管理者権限で実行すればよいのでは? しかし次のようになってしまう。

C:\Windows\system32>..\bin\cabocha-model-index -f SHIFT-JIS -t SHIFT-JIS dep.ipa
.txt dep.ipa.model
指定されたパスが見つかりません。

C:\Windows\system32>..\bin\cabocha-model-index -f SHIFT-JIS -t SHIFT-JIS chunk.i
pa.txt chunk.ipa.model
指定されたパスが見つかりません。

C:\Windows\system32>..\bin\cabocha-model-index -f SHIFT-JIS -t SHIFT-JIS ne.ipa.
txt ne.ipa.model
指定されたパスが見つかりません。

C:\Windows\system32>echo SHIFT-JIS 1>charset-file.txt

実行ディレクトリが**C:\Windows\system32**になってしまうのだ。 そこで、バッチの先頭で実行ディレクトリに一旦移動する必要がある。それが上で追加したcd /d %~dp0だ。

これは他のバッチファイルでもよくハマるので、なんとなく心の片隅に入れとくとよい。

ちなみに毎回管理者として実行するには、 バッチのアイコンを右クリック→プロパティ→ショートカット→詳細設定→管理者として実行にチェック

Hudson/JenkinsでVisual Studioプロジェクトのビルドをする – MSBuild Plugin

Hudson/JenkinsでVisual Studioのプロジェクトをビルドしたい、そんなとき。
MSBuild Pluginを使うよ。

MSBuild Pluginの導入

「Hudsonの管理」→「プラグインの管理」→「利用可能」タブ→
Hudson MSBuild Plugin」にチェックを入れて「インストール」
インストールが完了したら、「ジョブが実行中でなければ再起動」ボタンを押してHudson/Jenkinsを再起動。

MSBuild Pluginの設定

導入ができたら、プラグインの設定をする。

「Hudsonの管理」→「システムの設定」

MSBuild Builderの項目が新たにできているので、nameとpathを指定する。
nameは、ジョブの設定時、MSBuildの選択肢として出てくるのでわかりやすい名前をつける。Path To msbuild.exeにはmsbuild.exeの場所を指定すればよい。
たいていの場合、C:\WINDOWS\Microsoft.NET\Framework\[version]\MSBuild.exe 
私の環境では以下のバージョンがあったよ。

  • v1.0.3705
  • v1.1.4322
  • v2.0.50727
  • v3.0
  • v3.5
  • v4.030319

設定例

とりあえず、最新のだけ使うので
name: v4.030319
path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
と入力して保存。必要に応じて他のバージョンも追加できる。

ジョブの設定

「ビルド手順の追加」で
Build a Visual Studio project or solution using MSBuild.
を追加

  • MsBuild Versionはプルダウンメニューから使用するMSBuildを選ぶ。上のシステム設定でnameに指定したものが一覧に出る
  • MsBuild Build Fileにはビルドしたいプロジェクトの.projか.slnのパスを指定
  • Command Line ArgumentsにはMSBuildのオプションを設定

設定例

MsBuild Version: v4.030319
MsBuild Build File: C:\hudson\jobs\ジョブ名\workspace\プロジェクト名\プロジェクト名.sln
Command Line Arguments: /t:Rebuild /p:Configuration=Release

私の場合gitプラグインでプロジェクトをHudson/Jenkinsワークスペース以下にcloneして来てるので、cloneしてきたソリューションファイルの場所を指定しているよ。
Command Line Argumentsでリリース版のみをリビルドするよう設定。/t:は/target:、/p:は/property:の省略値。/t:cleanとかを組み合わせればクリーンビルドとかもできるね。
これでVC++のプロジェクトがビルドできたよ。

MSBuildの詳しい使い方

コマンドラインでUTF-8テキストのBOMを追加したり削除したりする

BOM(バイト順マーク)を削除することはよくあるんだけど、つけたことってあまりなかった。
エディタの機能を使えばできるものもあるけど、大量なファイルをいちいちエディタで開いて処理するわけにもいかないので、コマンドでまとめて処理したい、そんなとき。
結論としては、uconvを使えば割と手軽にBOMを付けたり消したりできる。
「BOMのマークの文字なんだったっけ?」とか考えなくてもよい方法

BOMの確認

fileコマンドを使う。

$ file *.cpp
foo.cpp:   UTF-8 Unicode text
bar.cpp:   UTF-8 Unicode (with BOM) text

BOMが付いてるテキストは「(with BOM)」となるので、エディタなどで開かずにBOMが付いてるかどうかを確認できる。

現在のディレクトリ以下にあるC++のソースファイル(c,h,cpp,hpp)でBOMが付いてないファイルのファイル名を取り出すには

find . -type f \( -name '*.[ch]' -o -name '*.cpp' -o -name '*.hpp' \) -exec file {} + | grep -v "(with BOM)" | cut -d: -f1

BOMが付いてるファイル名を取り出すにはgrepの-vを取って、

find . -type f \( -name '*.[ch]' -o -name '*.cpp' -o -name '*.hpp' \) -exec file {} + | grep "(with BOM)" | cut -d: -f1


BOMの追加と削除

uconvを使う。
詳しくは、International Components for Unicode http://site.icu-project.org/
debianの場合最初から使えたけど、ない人はaptitudeでlibicu-dev辺りを入れればいいんだと思う。Windowsのバイナリもある。

BOMを追加する

uconv -f utf-8 -t utf-8 --add-signature foo.cpp > foo_bom.cpp

BOMを削除する

uconv -f utf-8 -t utf-8 --remove-signature bar.cpp > bar_nobom.cpp

出力ファイルに入力ファイルと同じ名前を指定して消してしまわないように注意。
-fと-tはプラットホームのエンコーディングがutf-8以外の場合は省略するとうまくいかないことがあるので明示してる。
localeコマンドを実行してLANG=ja_JP.utf8とかだったら-f,-tオプションは省略できるよ。

上のBOMの確認の例と組み合わせれば、お手軽にまとめて変換できるね。

なんでBOMつけようとか思ったの

Windowsにつけろって言われたから。

VC++はBOM付きUTF-8

UTF-8はバイト順に依らないので、本当はBOMは要らないのだけどWindowsのVisual Studio C++では、BOM付きじゃないとUTF-8で書かれてるかどうか判断できないらしい。
ソースにマルチバイト文字を含んでる場合にはコンパイル時にC4819という警告が出て、正しく動作しないことがある。

ソースコードにUTF-8を使う場合はBOMつきのみサポート。

gccはどっちでもよい

でもgccはBOMどうなの?と思ったらBOM付きで問題なくコンパイルできる。この辺で直ったようだ
BOM付けてはいけないみたいな文書を見かけるが、イマドキは意外と付いててもなんとかなる。

Visual Studio C++でCppUnitをビルドできない、そんなとき

CppUnitをWindowsでも使うことになってビルドを試みたのだけれど、結構ハマったので、ビルド方法をメモっておくよ。

WindowsでCppUnit使いたいのだけれど…

C++アプリケーションの効率的なテスト手法(CppUnit編) - @IT
ここを参考にMicrosoft Visual Studio VC++でビルドをしてみた。

  • VC++ 2010 Express プロジェクトファイル(.dsw)変換に失敗
  • VC++ 2008 Express リンクエラーでビルド失敗

となって、うまくいかない・・・
試行錯誤の結果、うまくビルドできたので以下手順を説明するよ。

準備

以下のものを用意する

VC++は別々のディレクトリにインストールされるので共存できるよ。

ビルド手順

cppunit-1.12.1.tar.gzはあらかじめ解凍ソフトなどで解凍しておく。

VC++ 2008でCppUnitTestMainプロジェクトを開く

VC++2008を起動
●「ファイル」→「開く」→「プロジェクト/ソリューション」
cppunit-1.12.1\examples\cppunittest\CppUnitTestMain.dswを選択
(cppunit-1.12.1\examples\cppunittest\CppUnitTestMain.dspでもよい)

プロジェクトの変換

●「変換してこのプロジェクトを開きますか?」と聞かれるので「すべてはい」

VC++2010じゃなくてVC++2008で使いたい人は→後述へ飛ぶ

プロジェクトの依存関係を外す

●「プロジェクト」→「プロジェクトの依存関係」
プロジェクト「CppUnitTestMain」を選択し、依存先のcppunit、cppunit_dllに入ってるチェックを外して「OK」

ソリューションファイルの保存

●ソリューションエクスプローラで
「ソリューション ‘CppUnitTestMain’ (3プロジェクト)」と書いてあるところを選択して、「ファイル」→「CppUnitTestMain.slnを保存」
ソリューションエクスプローラが見つからないときは「表示」→「ソリューションエクスプローラ」
●「ファイル」→「終了」でVC++2008の役目はこれでおしまい。

VC++ 2010でCppUnitTestMainプロジェクトを開く

VC++ 2010を起動
●「ファイル」→「開く」→「プロジェクト/ソリューション」
cppunit-1.12.1\examples\cppunittest\CppUnitTestMain.slnを選択

VisualStudio変換ウィザード

自動的にウィザードが起動する。基本的に全部そのまま「次へ」でOK

●バックアップ作成の選択「変換前にバックアップを作成する」を選択すると.oldをつけたバックアップが作成される。
再びVC++2008で開きたいときなどに必要になるよ。

●「変換の完了」が出たら「閉じる」。「ウィザードが閉じたとき変換ログを表示する」にチェックが入ってると変換レポートが表示される。

プロジェクトのプロパティ設定

cppunit,cppunit_dllプロジェクトについて確認すべき点は2点。

  • 「構成プロパティ」→「全般」→「ターゲット名
  • 「C/C++」→「コード生成」→「ランタイムライブラリ

これらに気をつけて各プロジェクトのプロパティを以下の表のように設定する。

プロジェクト 構成 ターゲット名 ランタイムライブラリ
cppunit Debug $(ProjectName)d マルチスレッドデバッグ(/MTd)
Release $(ProjectName) マルチスレッド(/MT)
cppunit_dll Debug cppunitd_dll マルチスレッドデバッグDLL(/MDd)
Release $(ProjectName) マルチスレッドDLL(/MD)
CppUnitTestMain Debug $(ProjectName) マルチスレッドデバッグ(/MTd)
Release マルチスレッド(/MT)
DebugDLL マルチスレッドデバッグDLL(/MDd)
ReleaseDLL マルチスレッドDLL(/MD)

プロジェクト依存関係の設定

「プロジェクト」→「プロジェクトの依存関係」でCppUnitTestMainプロジェクトを選択、
 依存先

  • cppunit
  • cppunit_dll

にチェックを入れてOK。

バッチビルドの実行

●「ツール」→「設定」→「上級者用の設定」を選択
メニューバーに「ビルド」項目が現れる
●「ビルド」→「バッチビルド」→「すべて選択」→「ビルド」
一度「クリーン」してから「ビルド」すると安心かもね。

DLL版はコンパイル中にC4251のwarningが結構出るけど特に問題ないと思う。
CppUnitTestMainがビルドできると、自動でテストの実行も行ってるよ。

●8つの全部が正常終了すればOK。

CppUnitを使ったプロジェクトを作るときにはCppUnitTestMainのプロパティを参考に設定するといいよ。

うまくいかない?

設定をもう一度見直してみよう。とくにランタイムライブラリの設定だね。
VC++2008でプロジェクトの依存関係を外さずにCppUnitTestMain.slnを保存してしまった場合は、
VC++2010でこれを開くと「プロジェクト」→「プロジェクトの依存関係」から編集ができなくなるよ。
CppUnitTestMainの「共通プロパティ」→「Frameworkと参照」ですべての「参照を削除」すれば編集できるようになるよ。

VC++ 2008でビルドしたいんだよ

って言う人は、上記手順のCppUnitTestMain.dswを開いた後、「プロジェクトの依存関係」は外さずに、
CppUnitTestMainのプロパティで
「リンカー」→「全般」→「リンクライブラリの依存関係」をすべての構成(Debug,Release,DebugDLL,ReleaseDLL)で「いいえ」に設定。
これをいいえにしないと、プロジェクト依存関係にあるcppunit,cppunit_dllのどちらもリンクしようとして競合して失敗する。

リンクライブラリの依存関係を「はい」のまま、プロジェクトの依存関係を外して、先にcppunitとcppunit_dllをビルドしておいて、CppUnitTestMainを単体でビルドするとうまくリンクできるはずだ。
あとは上のVC++ 2010のプロパティ設定の表のようにランタイムライブラリを適切に設定する。ターゲット名は修正しなくてよい。

(以下追記 2011/04/16)

ていうか、プロジェクトファイルくれよ

というリクエストがありました。ですよね。欲しいですよね。

cppunit-1.12.1 の Microsoft Visual Studio C++ 2010 Express用プロジェクトファイル

cppunittest-1.12.1-vcxproj.zip
↑このzipを展開すると、以下の7つのファイルが入ってるよ。

    examples\cppunittest
  • CppUnitTestMain.sln
  • CppUnitTestMain.vcxproj
  • CppUnitTestMain.vcxproj.filters
  • src\cppunit
  • cppunit.vcxproj
  • cppunit.vcxproj.filters
  • cppunit_dll.vcxproj
  • cppunit_dll.vcxproj.filters

この4つをcppunit-1.12.1以下の対応するディレクトリに置いてCppUnitTestMain.slnをダブルクリックで起動すればそのまま使えるはず。

ちなみにVisual Studio C++のProfessional版なら、上の手順みたく頑張らなくてもプロジェクトファイル変換できたよ…

WindowsからVNCでMacの画面を操作する

WindowsからVNCでMacのデスクトップ画面を操作するよ。

Mac OSX側

  1. システム環境設定を開く
  2. インターネットワイヤレス「共有」
  3. 「画面共有」にチェック
  4. パネル上部「コンピュータ名:」の下の「ローカルネットワーク上のコンピュータから、次のアドレスでこのコンピュータにアクセスできます: hostname」のhostnameを確認しておく。必要に応じて「編集…」を押して名前を設定する。
  5. 「コンピュータ設定…」を押して必要に応じて以下設定
    • 「VNC使用者が画面を操作することを許可」にチェック
    • パスワードを入力
    • アクセスを許可:「次のユーザーのみ:」を選択 +を押して自分を追加


Windows側

VNCのインストール

  1. RealVNCのTOPにある「VNC Downloads」をクリック
  2. Free Editionの「Download & Use」をクリック
  3. Please enter your detailsを必要に応じて入力(しなくてもよい)し、「Proceed to download」を押す
  4. VNC Free Edition for WindowsかVNC Free Edition Viewer for Windowsをダウンロード
    前者はVNCサーバー+クライアント。後者はクライアントのみ。
  5. インストールはほとんど「Next」を押してれば完了する


WindowsからMacへ接続

  1. VNC Viewerを起動する
  2. Options…を押す。
  3. 「Colour & Encoding」タブでColour levelをFullにする
  4. 「Load / Save」タブでこの設定を保存するため「Save」を押して「OK」
  5. ServerにMac側で最初に確認したhostname(あるいはIPアドレス)を入力
  6. パスワードはMac側の「コンピュータの設定…」で設定したパスワードを入力して「OK」

うっかり間違えてWindowsリモートデスクトップでアクセスしてみたら、
Mac上でVboxHeadlessで起動していたVirtualBoxのVMにつながってビビッたよ。