Hatena::ブログ(Diary)

(有)掛軸裏スキマ産業 RSSフィード

2010-06-05

Rubyのサーバスクリプト実行時にコンソール表示色とタイトルを変更するようにした、が…

どーもこんちわ。

http://www.ruby-lang.org/images/logo.gifカラフルねんど 8色 No.738

エントリ名のとおりコンソール*1表示色とタイトルを変更したい。

ちなみにWindows環境でActiveScriptRubyの使用を前提。

挫折のエントリがっかり力 (アフタヌーン新書 001)

では、Ruby自体での変更は出来ないと判断した。

そこで
  1. batファイルでタイトルと色変更
  2. ruby部分をbatに取り込む
  3. 同時実行できる

という方法を試したが、Rubyのブロックコメントは「行頭から始まること」という前提があって断念。

結局
  1. batでタイトルと色をあらかじめ変更
  2. batから*.rbを呼び出す

という方法をとった。

Rubyで外部コマンドが実行できればいいのでは?ポテチの手ナノ ピンクカラー ナノ

Ruby自体の機能でコンソール色やフォントの変更をすることばっかり考えていた。

Rubyから外部コマンドが呼べれば問題ないじゃないか。

うーん、気づかなかった。

早速改良せがれいじり

Bashと同じで``でくくればいいのでは、と思った。

バッククォートを使う

#!/usr/bin/ruby
result = `ls -lh`

単純な実行ならコレ。

no title

うん、やっぱそうみたいだ。

CTEServer.rbに外部コマンド足したVer

元のスクリプトはこちらでmonoさんが作られたもの。

#!/usr/bin/ruby
# @detail Edit Textarea with Editor for Chrome.
# @author mono
# @author noromanba
# @ref http://blog.monoweb.info/archives/384
# @ver 2010/06/02

require 'webrick'
require 'tempfile'

# add@noromanba
`title CTEServer is Running...`
`color 0c`

# mod@noromanba
#$EDITOR = 'C:\vim\gvim.exe'
$EDITOR = 'C:\Program Files\EmEditor\EmEditor.exe'
$PORT = 9292

server = WEBrick::HTTPServer.new(:Port => $PORT)

trap('INT') { server.shutdown }

server.mount_proc('/status') do |req, res|
res.status = 200
end

server.mount_proc('/edit') do |req, res|
temp = Tempfile.new('editwith_')
temp << req.body
temp.close false
system $EDITOR, temp.path
temp.open
res.body = temp.read
temp.close
res.status = 200
res['Content-Type'] = 'text/plain'
res['Content-Length'] = res.body.size
end

server.start

追加はここだけ

`title CTEServer is Running...`
`color 0c`

黒バックの赤字になるはず。

普通に色変更した場合虹 (Nature Mind Book)

デフォルト

f:id:noromanba:20100606055649p:image

色変更
color 0c

f:id:noromanba:20100606055648p:image

戻す
color

f:id:noromanba:20100606055647p:image

画面の色設定

f:id:noromanba:20100606061901p:image

こうやってあらかじめ緑に変えておいた。「このウインドウを起動したショートカットを変更する」を選んだ。

プロパティ

"C:\bin\ruby\\bin\Ruby.Exe"のプロパティ

だから、そもそもこの色設定はruby.exeで実行されるやつ全てに効いて来る。

実行してみた音入り自爆ボタンDX・USB2.0ハブ

タイトル変更成功!

あれ、色が変わらない

f:id:noromanba:20100606061902p:image

…なして?

せっかくだからExerbを使ったらどうなるか試してみたとにかくやってみよう──不安や迷いが自信と行動に変わる思考法

一回もマトモに使ったことがないのが不安だ。

ExerbRubyをexe化

えーと、exerbオプションはいいや。

C:\Program Files\UserScripts>exerb CTEServer.rb

C:\Program Files\UserScripts>

おお、CTEServer.exeができたぜ。

早速実行
C:\Program Files\UserScripts>CTEServer.exe
CTEServer.rb:8:in `require': No such file to load -- webrick (LoadError)
        from CTEServer.rb:8

C:\Program Files\UserScripts>

ううう、うーん。

requireでwebrickがないってか。なるほどこいつは予想外。

依存ライブラリをスタティックリンクしなきゃいかんのかな、もしかして。そんな気がする。

とりあえず生成したexeファイルは消した。

mkexyってのを使うみたいだクッキングママ4

Rubyスクリプトを実行して、レシピファイルを自動的に生成します。 下記のいずれかの方法で起動してください。

Exerb - コマンドリファレンス

makefileみたいなもんか。なるほど。

mkexy実行

ぽちっとな

C:\Program Files\UserScripts>mkexy CTEServer.rb
[2010-06-06 05:23:50] INFO  WEBrick 1.3.1
[2010-06-06 05:23:50] INFO  ruby 1.8.7 (2010-01-10) [i386-mswin32]
[2010-06-06 05:23:50] INFO  WEBrick::HTTPServer#start: pid=5204 port=9292

ここで止まってしまった。

多分スクリプトを動かして、実際にロードされてるライブラリでも調べてるんだろうなぁ。

強制終了じゃぁ

Ctrl+Cを押してみた。

C:\Program Files\UserScripts>mkexy CTEServer.rb
[2010-06-06 05:23:50] INFO  WEBrick 1.3.1
[2010-06-06 05:23:50] INFO  ruby 1.8.7 (2010-01-10) [i386-mswin32]
[2010-06-06 05:23:50] INFO  WEBrick::HTTPServer#start: pid=5204 port=9292
[2010-06-06 05:25:34] INFO  going to shutdown ...
[2010-06-06 05:25:34] INFO  WEBrick::HTTPServer#start done.
バッチ ジョブを終了しますか (Y/N)?

おお。サーバは普通に落ちたな。「バッチ ジョブ」ってのは多分mkexyのことだろう。

バッチも止めてみた
C:\Program Files\UserScripts>mkexy CTEServer.rb
[2010-06-06 05:23:50] INFO  WEBrick 1.3.1
[2010-06-06 05:23:50] INFO  ruby 1.8.7 (2010-01-10) [i386-mswin32]
[2010-06-06 05:23:50] INFO  WEBrick::HTTPServer#start: pid=5204 port=9292
[2010-06-06 05:25:34] INFO  going to shutdown ...
[2010-06-06 05:25:34] INFO  WEBrick::HTTPServer#start done.
バッチ ジョブを終了しますか (Y/N)? y

C:\Program Files\UserScripts>

帰ってきた。ほっ。

同時に CTEServer.exy なるものが生成された。

生成されたレシピファイル
# Recipe of Chorme textarea editor for Edit with Emacs
# Generated by mkexy
# on 2010-06-06 05:25
# @see http://d.hatena.ne.jp/noromanba/20100605/1275774459
# @see http://exerb.sourceforge.jp/man/doc/recipe.ja.html

general:
  startup: CTEServer.rb
  core: cui
  kcode: none

file:
  CTEServer.rb:
  webrick/compat.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/compat.rb
  webrick/version.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/version.rb
  webrick/httpversion.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpversion.rb
  socket.so:
    file: C:/bin/ruby/lib/ruby/1.8/i386-mswin32/socket.so
    type: extension-library
  delegate.rb:
    file: C:/bin/ruby/lib/ruby/1.8/delegate.rb
  etc.so:
    file: C:/bin/ruby/lib/ruby/1.8/i386-mswin32/etc.so
    type: extension-library
  fileutils.rb:
    file: C:/bin/ruby/lib/ruby/1.8/fileutils.rb
  Win32API.so:
    file: C:/bin/ruby/lib/ruby/1.8/i386-mswin32/Win32API.so
    type: extension-library
  tmpdir.rb:
    file: C:/bin/ruby/lib/ruby/1.8/tmpdir.rb
  tempfile.rb:
    file: C:/bin/ruby/lib/ruby/1.8/tempfile.rb
  webrick/httputils.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httputils.rb
  fcntl.so:
    file: C:/bin/ruby/lib/ruby/1.8/i386-mswin32/fcntl.so
    type: extension-library
  webrick/utils.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/utils.rb
  webrick/log.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/log.rb
  webrick/config.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/config.rb
  thread.so:
    file: C:/bin/ruby/lib/ruby/1.8/i386-mswin32/thread.so
    type: extension-library
  thread.rb:
    file: C:/bin/ruby/lib/ruby/1.8/thread.rb
  timeout.rb:
    file: C:/bin/ruby/lib/ruby/1.8/timeout.rb
  webrick/server.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/server.rb
  webrick/accesslog.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/accesslog.rb
  webrick/htmlutils.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/htmlutils.rb
  rational.rb:
    file: C:/bin/ruby/lib/ruby/1.8/rational.rb
  date/format.rb:
    file: C:/bin/ruby/lib/ruby/1.8/date/format.rb
  parsedate.rb:
    file: C:/bin/ruby/lib/ruby/1.8/parsedate.rb
  time.rb:
    file: C:/bin/ruby/lib/ruby/1.8/time.rb
  webrick/cookie.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/cookie.rb
  webrick/httpstatus.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpstatus.rb
  uri/common.rb:
    file: C:/bin/ruby/lib/ruby/1.8/uri/common.rb
  uri/generic.rb:
    file: C:/bin/ruby/lib/ruby/1.8/uri/generic.rb
  uri/ftp.rb:
    file: C:/bin/ruby/lib/ruby/1.8/uri/ftp.rb
  uri/http.rb:
    file: C:/bin/ruby/lib/ruby/1.8/uri/http.rb
  uri/https.rb:
    file: C:/bin/ruby/lib/ruby/1.8/uri/https.rb
  uri/ldap.rb:
    file: C:/bin/ruby/lib/ruby/1.8/uri/ldap.rb
  uri/ldaps.rb:
    file: C:/bin/ruby/lib/ruby/1.8/uri/ldaps.rb
  uri/mailto.rb:
    file: C:/bin/ruby/lib/ruby/1.8/uri/mailto.rb
  uri.rb:
    file: C:/bin/ruby/lib/ruby/1.8/uri.rb
  webrick/httprequest.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httprequest.rb
  webrick/httpresponse.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpresponse.rb
  webrick/httpservlet/abstract.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpservlet/abstract.rb
  webrick/httpservlet/filehandler.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpservlet/filehandler.rb
  rbconfig.rb:
    file: C:/bin/ruby/lib/ruby/1.8/i386-mswin32/rbconfig.rb
  webrick/httpservlet/cgihandler.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpservlet/cgihandler.rb
  strscan.so:
    file: C:/bin/ruby/lib/ruby/1.8/i386-mswin32/strscan.so
    type: extension-library
  erb.rb:
    file: C:/bin/ruby/lib/ruby/1.8/erb.rb
  webrick/httpservlet/erbhandler.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpservlet/erbhandler.rb
  webrick/httpservlet/prochandler.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpservlet/prochandler.rb
  webrick/httpservlet.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpservlet.rb
  webrick/httpserver.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpserver.rb
  webrick/httpauth/authenticator.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpauth/authenticator.rb
  webrick/httpauth/basicauth.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpauth/basicauth.rb
  digest.so:
    file: C:/bin/ruby/lib/ruby/1.8/i386-mswin32/digest.so
    type: extension-library
  digest.rb:
    file: C:/bin/ruby/lib/ruby/1.8/digest.rb
  digest/md5.so:
    file: C:/bin/ruby/lib/ruby/1.8/i386-mswin32/digest/md5.so
    type: extension-library
  digest/sha1.so:
    file: C:/bin/ruby/lib/ruby/1.8/i386-mswin32/digest/sha1.so
    type: extension-library
  webrick/httpauth/digestauth.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpauth/digestauth.rb
  webrick/httpauth/userdb.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpauth/userdb.rb
  webrick/httpauth/htpasswd.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpauth/htpasswd.rb
  webrick/httpauth/htdigest.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpauth/htdigest.rb
  webrick/httpauth/htgroup.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpauth/htgroup.rb
  webrick/httpauth.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick/httpauth.rb
  webrick.rb:
    file: C:/bin/ruby/lib/ruby/1.8/webrick.rb

結構すごい量だなぁ。exeがでかくなりそう。

exyをexerbに喰わせるたべる

C:\Program Files\UserScripts>exerb --verbose CTEServer.exy
Recipe File  : CTEServer.exy
Core File    : C:/bin/ruby/share/exerb/ruby187c.exc
Output File  : C:/Program Files/UserScripts/CTEServer.exe

C:\Program Files\UserScripts>

おぉ、CTEServer.exe ができたぞ。しかしでかいな。

1.08 MB (1,138,688 バイト)

うほっ。まぁFWも喰ってるからしょうがないか。

CTEServer.exeを起動してみるK&G パワースリマー2000

f:id:noromanba:20100606061858p:image

やっぱりタイトルしか変わらないのね。。はーん。

いいところきみのいいところ

色変更がアプリごとに設定できる

CTEServer.exeは独立したコンソールアプリケーションに変身した。だから今までと同じように色変更すれば、このアプリだけに色設定が効く。

これでruby.exeに対して共通的な色変更が適応されちゃう問題は回避できる。

微妙にうれしい。

単独アプリ化で配布が楽

一般向け配布する時には便利だね。Ruby環境無い人の方がほとんどだろうから。

やっぱり疑問

しかしなんでRuby内からcolorはいじれないんだろうか。

不思議だ。

動作確認ユニット 路面貼用ステッカー 指差呼称 240×300mm アルミステッカー 81917

このエントリは CTEServer.exe 使ってPOST。

ちゃんと動くね。

かいてるところ

f:id:noromanba:20100606061855p:image

反映

f:id:noromanba:20100606061852p:image

更新履歴呉竹 筆ペン 万年筆 万年毛筆 本毛 べっこう調 紅 DW140-50

  • 初版
    • アップ
  • 第2版
    • 更新履歴の追加
    • 見出しレベルを上げた
    • レイアウト大幅修正・画像追加

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証


Connection: close