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」これを「%」の前に入れる。

コマンドライン出力のハンドリング

ふと標準エラー出力の表示を抑制したくなった (Windows7)

 c:\><コマンド類> 2> NUL

「2>」が標準エラー出力「1>」なら標準出力のリダイレクト、「NUL」は NULデバイスで入出力の抑制になる。また、「2>&1」とすれば標準エラー出力を標準出力にリダイレクトする。

Windosで、CD(DVD)トレイを開閉する

結構悩んでしまった、
CD/DVDトレイ開閉スクリプト - IT生活向上ブログ

wmp = WIN32OLE.new 'WMPlayer.OCX'
f = wmp.cdromcollection.getByDriveSpecifier('F:')
f.eject
f.eject

「F:」は光学ドライブのドライブレター、手元ではそうでした。
同じドライブオブジェクトに対し ejectメソッドを繰り返すとトレイが閉じます、オブジェクトを作り直してしまうと閉じなくなるの注意。そのときは二度 eject呼ぶと閉じます。

一行スクリプトで閉じるならこんな感じか

WIN32OLE.new('WMPlayer.OCX').cdromCollection.item(0).tap{|f|f.eject}.eject

そして WIN32OLE.new('WMPlayer.OCX')オブジェクトや、WIN32OLE.new('WMPlayer.OCX').cdromCollectionオブジェクトが捕まえてる間はドライブの電源を切れなかったり。

http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/apr06/hey0417.mspx

そしてトレイを開いたり閉じたりする(一行)スクリプト、もうドライブ指定しなくていいじゃん、それっぽいの最初で。

光学ドライブトレイを開く

eject.rb

require 'win32ole'
WIN32OLE.new('WMPlayer.OCX').cdromCollection.item(0).eject

光学ドライブトレイを閉じる

tceje.rb

require 'win32ole'
WIN32OLE.new('WMPlayer.OCX').cdromCollection.item(0).tap{|cd| cd.eject}.eject

PuTTYで生成した公開鍵を使う

どこで見たんだっけな、PuTTYgen で生成したキーペアについて。公開鍵を Linux機に仕込む。

ssh-keygen -i -f id_rsa.pub >> authorized_keys

ちなみに -iオプションは

     -i      This option will read an unencrypted private (or public) key file
             in SSH2-compatible format and print an OpenSSH compatible private
             (or public) key to stdout.  ssh-keygen also reads the RFC 4716
             SSH Public Key File Format.  This option allows importing keys
             from several commercial SSH implementations.