2009年1月11日日曜日

irbカスタマイズ

Ruby 技術者認定試験を取得するべく日々Rubyを勉強しています。
そんなとき、やっぱり役にたつのがirb。
手早くロジックが組めて、簡単な動作確認がささっとできる。
そんなirbを使いやすくカスタマイズする方法と
私の環境の公開です。(たいしたことはしてないですが)

irbはHOMEディレクトリ直下に.irbrcファイルを準備
してやることで、irbにmethodが追加できます。
んで、私が追加したのは

@default_file = "~/.edit.rb"

def new (file = @default_file)
system "rm #{file}"
system "vi #{file}"
end

def edit(file = @default_file)
system "vi #{file}"
end

def emacs(file = @default_file)
system "emacs #{file}"
end

def run(file = @default_file)
system "ruby #{file}"
end

def clear
system "clear"
end

です。
irbで作業する際の一番の致命的な箇所は
編集できない点です。
そのため、ファイルに編集するmethodを追加し
ファイルを実行するmethodを追加しています。
デフォルトはHOMEディレクトリに.edit.rbという
ファイルを作成します。引数でファイル名を渡して
やることも可能です。

あとは refe が使えれば完璧なんですがね。

Ruby 1.9.1rc1

去年までは一日1書き込みと決めていたが
時間的余裕があまりとれないため、書き込みができる
&ネタがあればガシガシ書きこむことにした。

私は根っからの Windows ユーザー。
そのため Ruby 1.9.1 rc1 が公開された際
コンパイルできるか不安だった。
その不安は的中した。VC2005 でコンパイルして
みたが意味不明なエラー。ネットで調べても
原因不明。
そのため、ちょっと距離を置いていたところ、
artonさんのMswin32インストール
パッケージのアナウンスを目にした。
やったーと思い、早速インストールしてみたが
irb, gem が動かない!?!?!
またまた挫折した。

そして最終的にとった方法。
VMware 上の Fedora 8 上でコンパイルして
利用しています。
Linux だと一発だった。Windows やめようかな。。。(会社的に無理だけど)

んで、動作確認。シャドーウィングを実験してみることに。

#!/usr/bin/ruby -Ku
# -*- coding: utf-8 -*-
["foo"].each do |s|
["bar"].each do |s|
puts s
end
puts s
end

$ ruby .edit.rb
bar
foo

完璧。

あけましておめでとうございます

正月は7日までか11日までかとサザエさんでやっていた。
個人的には7日のような気はするが、11日説が浮上したのでとりえあず新年の挨拶を。
今年の目標は

  • テクニカルエンジニアデータベース試験に合格

  • テクニカルエンジニアネットワーク試験に合格

  • Ruby技術者認定試験の取得

  • MacBook Proを購入

  • VAIO type Pを購入


をとりあえずの目標にしてがんばる。

がんばるぞーーー!!!!!

2008年12月17日水曜日

RSpec+autotest+Snarl その2

せっかく作った環境を壊してしまった。(ボーっとして全削除した^^;)
よって再度作り直したところ、autotestが反応しなくなった。
んで、調査した結果、
どうも最新のrspec-railsではTest::UnitとRSpecのautotestを
任意に使い分けができる模様。

Test::Unit

普通に autotest で実行

RSpec

script/autospec で実行


これがわからなかった。
autotestで動かしてたから、いくらspecテスト書いても動かないわけだ。

2008年12月16日火曜日

ソフトウェア開発技術者試験

最後のソフトウェア開発技術者試験。(来年から制度が変わるため)
無事、合格できた。
午前、午後Ⅰが不安だったけど、

  • 午前:685

  • 午後Ⅰ:635

  • 午後Ⅱ:700


と、結構安全圏だった。
やっと高度情報処理受けれる。

RSpec+autotest+Snarl その1

今話題の rails テスト環境。
Growl for Windows で本当はやりたかったけど、WebKit 系ポップアップが正しく表示されない(エラーが出る)ので、snarl に変更した際の備忘録。
参考) gan2 の Ruby 勉強日記

  • snarl

  • rspec

  • rspec-rails

  • autotest

  • win32console

  • ZenTest

  • diff-lcs

  • ruby-snarl

  • redgreen


は事前にインストールしておくこと。snarl以外はすべて gems でインストール可能。
.autotestのコードを以下のように。※ ファイルの作成方法は参考サイトを見てね。

# ruby -w
require 'rubygems'
require 'autotest/redgreen'
require 'autotest/snarl'
require 'win32/console/ansi'

Autotest::HOOKS.delete(:interrupt)
module Autotest::Snarl
def self.icon
{
:green => 'rails_ok.png',
:red => 'rails_fail.png',
:pending => 'rails_pending.png'
}
end

def self.snarl title, msg, img=nil
Snarl.show_message(title, msg, icon[img])
end

Autotest.add_hook :ran_command do |at|
results = [at.results].flatten.join("\n")
output = results.slice(/(\d+)\s+examples?,\s*(\d+)\s+failures?(,\s*(\d+)\s+pending)?/)
if output =~ /[1-9]\sfailures?/
snarl "FAIL:", "#{output}", :red
elsif output =~ /[1-9]\spending?/
snarl "PENDING:", "#{output}", :pending
else
snarl "PASS:", "#{output}", :green
end
end
end

class Autotest
def self.clear_hook
HOOKS[:red].clear
HOOKS[:green].clear
HOOKS[:pending].clear
HOOKS[:all_good].clear
end
end
#Autotest.clear_hook

参考サイトと違う点(と、いうか色んなサイトを合わせた)を列挙すると、

require 'rubygems'
require 'win32/console/ansi'
Autotest::HOOKS.delete(:interrupt)
snarl "PENDING:", "#{output}", :pending
#Autotest.clear_hook

1.rubygemsでインストールしたので、gems宣言を追加。
2.win32consoleを追加しないと、Snarlに通知されなかった。
3.autotestがCTRL+C*2で停止しないため追加
4.pendingも表示(まだ試してないけど。。。)したかったので追加
5.CTRL+C*2で停止しないためコメント化

で、コマンドプロンプトで autotest を実行すれば
Snarl に通知が無事いきました。

後は、

  • rspec-rails と rspec プラグインの違い

  • ZenTest の設定


が分かり次第、エントリ登録しようと思う。

2008年12月9日火曜日

Ruby でハマッタこと

プライベートでイロイロあって投稿がご無沙汰してきた。
今日、Rubyやっててハマッタことを記録。

irb -Ks にて、

a=%w(1 2 3 4 5)
a.sort {|a, b| b<=>a }
puts a

実行すると、なんと
=>[5, 4, 3, 2, 1]
a=>1

a=1?
配列なのに、なぜ?
a.classするとFixnumになってるし。。。

答えは単純。
配列名とブロック引数名が重複しているためでした。
変数名を変えてやれば正しく動きました。
マイッタ。