EC2 のコマンドラインツールと VM Import

今更ながらアマゾンウェブサービスVM Import についてちょっと見てみた。
紹介されたのは結構前 Amazon Web Services ブログ: 【AWS発表】 VMwareイメージをAmazon EC2上へ持ち込めるVM Importの発表
その後どうなったかと思ってマネージメントコンソールを探すもそういうメニューは見当らない。紹介記事等確認すると、コマンドラインツールからの使用だとか(別途APIや、VMware vCenter 用には GUIツールもある模様) VM Import/Export

Amazon EC2 API Tools

という訳でコマンドラインツールをダウンロードする SDKs and Programming Toolkits for AWS
コマンドラインJava(5以降)前提なんだけど、手元 Windows7機には既に入ってた、いつ入れたんだっけか、わりと初めから付けてた様な覚えも。
そしてこの辺の手順に従い環境変数を set する。

但し、IAMアカウントの X.509 Certificate はマネージメントコンソールのメニューにはないので、その辺の Linux機の opensslコマンドで自分で作って登録する。CSR作るときに国とか都市とか組織とかいろいろ訊かれるけどそのへんは適当に

設定した環境変数JAVA_HOM, EC2_HOME, PATH=%PATH%;%EC2_HOME%\bin, EC2_PRIVATE_KEY, EC2_CERT このくらい。

取敢えず「ec2-describe-regions」(ec2dre)とかしてみる、無事リージョンのリストが返って来る、現在 7箇所。

ec2-import-instance (ec2iin)

そして ec2iin コマンド。取敢えず手元の VMware Player のイメージを dry-run してみると format が違うと言われる。

C:\<どこか>>ec2iin <イメージへのパス>.vmdk -f VMDK --dry-run -o <アクセスキー> -w <シークレットアクセスキー>
ERROR: This file appears to be in RAW or flat-VMDK format. Please check the form
at parameter and the User Guide for more information.

説明にもあるが、vSphere とかから特定の形式でエクスポートしてないといけない模様。
また、仮想機自体

とか条件がある。さらに、VPC使わないならインターネットに直接さらされるのでセキュリティには十分気を使えと(ちゃんとしたセキュリティグループ、強いパスワード、等々)

VMware Player の更新時に

手元 Windows機(7、64bit、Pro、SP1)で使っている VMware Player をアップデートした(info)。一度前のをアンインストールし、新しいのをインストールする(聞かれる登録情報が随分少なくなってた、名前とメールアドレスくらい)、Windowsは何度か再起動する。
前使ってたゲストOS(Debian)のイメージは新しいプレイヤーでも引き続き動くが、ネットワークの設定が一新しちゃってるのでその辺は(コンソールで)設定し直さないといけない。

gem と Rails の Gemfile でのプラットフォーム

Windows (7 64bit Pro. SP1) で Rails してみようかと思ったのだけど(by NougakuDo Manual)、ジェムの sqlite3 を入れる所で。
特に何もしないでいるとエラーになる。

Installing sqlite3 (1.3.5) with native extensions
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

sqlite3 | RubyGems.org | your community gem host を見に行くとウィンドウズ用のバイナリ版もある様なんだけど、どうやってインストールするんだっけ。「gem install --help」をみるとプラットフォームの指定が出来るのか。

  Options:
        --platform PLATFORM          Specify the platform of gem to install

ということで、「gem install sqlite3 --platform x86-mswin32-60」としてみたら何とかなった。

さて Railsの方では、「rails new depot」とかすると、ファイルやディレクトリをいろいろ作った後で最後に「bundle install」になってやっぱり上記と同じエラーになる。ファイルは全部そろっているし、アプリケーションは(能楽堂で)動く、Sqlite3へのデータストアもするんだけど、「bundle install」には失敗する、ジェムの追加が出来ないわけだ。

QA Blog: How to configure gemfile for windows platform によると、Gemfile の中でプラットフォーム指定が出来る模様。はじめ同様に「gem 'sqlite3', '1.3.5', platform: 'x86-mswin32-6'0」としてみたが駄目だった。

The available options are: [:ruby, :ruby_18, :ruby_19, :mri, :mri_18, :mri_19, :rbx, :jruby, :mswin, :mingw, :mingw_18, :mingw_19]

「gem 'sqlite3', '1.3.5', platform: 'mswin'」としたら何とかなった。

NougakuDo 1.2.0
ruby 1.9.3p0 (2011-10-30) [x64-mswin64_100]
gem 1.8.13
Rails 3.2.0.rc1

円マークでの混乱、\、¥、¥

多分組み合わせ的にレアなケースだと思うのだけど、円マークで混乱してしまった。

環境

やりたかった事

# coding: utf-8
require 'win32ole'
wsh = WIN32OLE.new 'WScript.Shell'
wsh.Run '"C:\Program Files\<云々>\<実行ファイル名>" <オプションとか>'

そしてエラー

<Rubyスクリプト>.rb:<行>:in `method_missing': (in OLE method `Run': ) (WIN32OLERuntimeError)
    OLE error code:80070002 in <Unknown>
      <No Description>
    HRESULT error code:0x80020009
      Exception occurred.
        from <Rubyスクリプト>:<行>:in `<main>'

所要の Rubyスクリプトxyzzy で編集していた、その文字エンコーディングは「Unicode (UTF-8N)」(ツール - ローカル設定 - もろもろ)。動かしたかった実行ファイル名は Windowsエクスプローラーからドラッグ&ドロップしてきたもの。そのディレクトリ区切り文字「\(バックスラッシュ、"\\".ord # => 92)」がいつの間にか「¥(&yen;、&#165;)」にすり替わっていた(それは「¥(全角円マーク、'¥'.ord # => 65509)」でもない)。
で、.Run で実行しようとしてもそんなファイル見つからずエラーになる。
xyzzy の編集画面では、「¥(&yen;、&#165;)」も半角幅の表示で、はじめ違うとは思いもしなかった、疑ってよく見るとフォントフェイスがちょっと違うのだけど。
別にコピー&ペーストしても「\(バックスラッシュ、"\\".ord # => 92)」になるし、いろいろ動いたり動かなかったりでなんか大変混乱した。WindowsShift_JIS(Windows-31J) をコピーしてきて xyzzy で UTF-8N にコード変換するときになんかあったんだろうか。

分かってしまえばよく目を凝らせば良いことなんだけど、それまで随分時間掛かった。

Exerb と RubyGems

RubyGems を使ってる RubyスクリプトExerbWindows実行形式にしても、LoadError になって起動しない。

純化した Rubyスクリプト

require 'rubygems'
puts 'Hello!'

Rubyで実行すれば普通に動きます。
exyファイル作成後 exerbコマンドで実行形式にし実行した場合にエラー

rubygems.rb:349:in `clear_paths': no such file to load --
rubygems/specification
 (LoadError)
        from rubygems.rb:1235

実行環境

  • Windows 7 Professional SP1 (64bit)
  • ActiveScriptRuby (1.8.7.36)
  • Exerb 5.3.0
  • gem 1.8.5

恐らくは autoload の影響かと思われ、"C:\Program Files (x86)\ruby-1.8\lib\ruby\site_ruby\1.8\rubygems.rb" の 1235行目で Gem.clear_paths を実行し、その際 349行目で Gem::Specification.reset を実行、 1141行目で autoload 設定していた rubygems/specification をロードしようとしてエラーになるのでしょう。

一応先に require しておけば回避できますが、ちょっと ad hoc に過ぎる。

module Gem; VERSION = '1.8.5'; end
require 'rubygems/specification'
require 'rubygems'
puts 'Hello!'

あとは rubygems.rb の autoload 設定を require に書き換えるとかかな。ちなみに VERSION の値には使ってる gem のバージョンを書くべきでしょう、今、gem のバージョンと ruby のバージョンがちょうど似かよってるところで混乱しないよう注意。

参考、ML exerb-developer 保存書庫より

Windows で RSpec の色

Windows(7 Professional SP1 64bit)を使っている、そのまま rspec -c でスペック出力を色付けしようとしても、次のような感じ

You must use ANSICON 1.31 or later (http://adoxa.110mb.com/ansicon/) to use colo
ur on Windows

警告は出るがエラーにはならず、スペック出力は(コンソール配色を特にいじっていないので)黒地白文字で出てくる。

ANSICON

ANSICON ってなんだろうと言うことで、http://adoxa.110mb.com/ansicon/ を見に行く、Winndowsのコンソール用の ANSIエスケープ定義のようだ、ダウンロードして見る。
はじめどうやって動かすのか、インストールするのか混乱した。特にインストールとかいうことなく、単にコンソールで所要の ansicon.exe を実行すればいい模様。そうするとまたコンソールエコーが返ってくるので、そこで rspec -c とか rake spec とかすると色付きの出力になる。
とは言え、毎回フルパスで指定するのも大変だし、今回は 64bit環境なので \x64 方面のものを使ったが、\x86 方面と間違えないようにしないといけない(いやまあ動くみたいだけど)。

readme.txt や ansicon /? を見ると、パスを通すか或いは /iオプション(/I)でインストールとある。どちらもちょっと大仕掛けな感じで気が引ける、大体 Windows7 で AutoRun ってありなのか。
今のところ RSpec での使用しか考えていないので、Ruby環境で使えれば良い。ので Ruby のところにバッチファイルを置くことにする。C:\Program Files (x86)\ruby-1.8\bin に ansicon.bat 。今この手の場所では直接ファイルを新規作成出来ないの注意、別の場所で作っておいて持ってくる。バッチファイルの内容は一行だけ。

C:\<展開した場所>\ansi140\x64\ansicon.exe %1 %2 %3 %4 %5 %6 %7 %8 %9

%変数注意、それこそ /? とかのオプションを捕るように。
これで、ruby console 開いたら RSpec 実行前に一度 ansicon 実行すれば以後スペック出力に色が付くように。

RSpec::Core::Formatters::BaseTextFormatter

さて色が付くようになると、前にも書いたRSpec on Rails の色 - Rubyとか Illustratorとか SFとか折紙とか ように、Windowsのコンソールでの黒地に赤文字はちょっと見難い、反転とか強調とか考えよう。具体的にどうするかは前に書いたときとは考え方が変わっている。spec_helper.rb にて BaseTextFormatter の配色を直接変更する。

class RSpec::Core::Formatters::BaseTextFormatter
  def red(text); color(text, "\e[1;41m") end # "\e[1;31m" "\e[41m" "\e[1;41m"
  #def green(text); color(text, "\e[1;42m") end # "\e[1;32m" "\e[42m" "\e[1;42m"
end # class RSpec::Core::Formatters::BaseTextFormatter

コメントにしてるエスケープシークエンスは夫々の色で反転とか強調色なんで適宜。greeen は green だしまあコメントアウト。yellow はどうしようかな、まだ近くにペンディング無いのでちゃんと考えてない。
前に書いたときとは colorメソッドの綴りが違っていてちょっと躓いた(前は colour だった模様)。

環境変数の部分文字列

"C:\Program Files (x86)\PuTTY\plink.exe" root@192.168.<云々> "date %date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%"

Windowsから、その時計で近在のホストの時間をあわせようとしてみた。コマンドの実行には PuTTY付属の plink を使う。それで root で入れるホストなのは問題だが、今は見逃す。
そして、Windows環境変数 %date%, %time% には現在日時が入ってて、適宜「/」とか「:」で区切られてるのでフォーマットを変えないといけない。部分文字列を取ってくる記法が「:~m,n」これを「%」の前に入れる。