2007-09-22
■ [event] 開発合宿
なんか2つ重なったのでいま合宿生活4日目です。4日間全くゲームやってないとか俺にしてはあり得ない真面目さなんだが そろそろ風邪でもひくんじゃなかろうか。
LDRとメールは見てる。nicovideoはBGMのために開いてたけど岐阜に来てから禁止されました(><)
■ [prog] 公開svnリポジトリ
がほしい。
なんでかっていうとやる気がなくてリリースしなかったプロジェクトも中途半端なのがダウンロードできるようになるじゃん?という 至極消極的な理由だったりしますが。中途半端でも公開しないより良いと思うんだよな。
■ [ruby] autotestが落ちる
/home/yhara/gems/local/lib/site_ruby/1.8/rubygems.rb:278:in `latest_partials': undefined method `[]' for nil:NilClass (NoMethodError)
from /home/yhara/gems/local/lib/site_ruby/1.8/rubygems.rb:275:in `each'
from /home/yhara/gems/local/lib/site_ruby/1.8/rubygems.rb:275:in `latest_partials'
from /home/yhara/gems/local/lib/site_ruby/1.8/rubygems.rb:245:in `latest_load_paths'
from /home/yhara/gems/local/lib/site_ruby/1.8/rubygems.rb:244:in `each'
from /home/yhara/gems/local/lib/site_ruby/1.8/rubygems.rb:244:in `latest_load_paths'
from /home/yhara/gems/repos/gems/ZenTest-3.6.1/lib/autotest.rb:109:in `autodiscover'
from /home/yhara/gems/repos/gems/ZenTest-3.6.1/bin/autotest:36
from /home/yhara/gems/repos/bin/autotest:18:in `load'
from /home/yhara/gems/repos/bin/autotest:18
というエラーが出ていたのだが、どうもgem置き場に変なフォルダがあったかららしい。
yhara@meteor:~/ % ls ~/rubygems/ -1 ParseTree-1.7.1/ (中略) uuidtools-1.0.1/ web_spec/ ←これ wirble-0.1.2/
rubygems.rbを修正することで回避。
yhara@meteor:~/rubygems/ZenTest-3.6.1/lib/autotest % diff -c ~/tmp/orig ~/gems/local/lib/site_ruby/1.8/rubygems.rb
*** /home/yhara/tmp/orig 2007-09-22 17:40:26.000000000 +0900
--- /home/yhara/gems/local/lib/site_ruby/1.8/rubygems.rb 2007-09-22 17:32:14.000000000 +0900
***************
*** 275,280 ****
--- 275,281 ----
all_partials(gemdir).each do |gp|
base = File.basename(gp)
matches = /(.*)-((\d+\.)*\d+)/.match(base)
+ next if matches.nil? #こんなんでいいのかな
name, version = [matches[1], matches[2]]
ver = Gem::Version.new(version)
if latest[name].nil? || ver > latest[name][0]
■ [ruby] RSpec + autotest
名づけてautospec。
検索してもRails環境でのやり方しか出てこないので調べてみた。
前提知識
- RSpec
- テストツール。Test::Unitを人間に読みやすくしたような感じ
- autotest
- ファイルをセーブした瞬間に自動でテストを走らせてくれるツール。ZenTestというツール群に同梱。デフォルトでは、Ruby標準添付のTest::Unitを使う
autotestを使う場合、
./bin/hoge ./lib/hoge.rb ./lib/Hoge/*.rb ./spec/*.rb
みたいな構成にしなければならない。
インストール
gem install rspec gem install ZenTest
設定
最近のRSpecにはautotest用の設定が内蔵されている…のだが、RSpecをgemで入れると specコマンドをうまく見つけられず
/home/yhara/gems/repos/gems/rspec-1.0.8/lib/autotest/rspec.rb:80:in `spec_command': No spec command could be found! (RspecCommandError)
というエラーになるというバグがある(RSpec 1.0.8現在)。
解決策
- ./bin/spec を rspec-1.0.8/bin/spec へのsymlinkにする
- rspec-1.0.8/lib/autotest/rspec.rb に一行足す
など。
def spec_commands
[
File.join('bin', 'spec'),
File.join(Config::CONFIG['bindir'], 'spec'), #←ここに「,」を足して
File.expand_path(File.join(File.dirname(__FILE__), "/../../bin/spec")), #←ここに一行足す
]
end
end
まとめ
とまあほんのちょっとだけ面倒なんですけど、入れた分のメリットは十分あると思うのでRSpec使ってる人は是非。
おまけ
./spec/spec.opts に -c って書いておくと出力に色が付くよ。 (←他の方法はないのかな…)
■ [ruby][screen] Autotest::Screenを導入してみた
autotestついでに、テスト結果がGNU Screenの右下に出る設定を導入してみた。
わるいとき
いいとき
設定は角谷さんのをほぼそのままお借りしました。ありがとうございます。
変更点:
- screenのパスを設定した
- returnをnextに変更した(ブロック内でreturnってできないですよね?)
require 'autotest/screen'
Autotest::HOOKS.delete(:interrupt) #これがないと、autotestが^Cで止まらなくなります(なりました)
Autotest::Screen.statusline = "kmc | %w | %0` %u %= %m/%d %D %c"
Autotest::Screen.screen_cmd = '/home/yhara/bin/screen/bin/screen'
class Autotest::Screen
SCREEN_COLOR[:green] = 'gw'
SCREEN_COLOR[:yellow] = 'yk'
Autotest.add_hook :run_command do |at|
message 'Running' if execute?
end
Autotest.add_hook :quit do |at|
clear if execute?
end
Autotest.add_hook :ran_command do |at|
next unless execute?
results = [at.results].flatten.join("\n")
output = results.slice(/(\d+)\sexamples?,\s*(\d+)\s.*failures?(?:,\s*(\d+)\s.*pendings?)?/)
if output
ex,fail,pend = $~.captures.map {|e| e.to_i}
if 0 < fail
message "FAIL #{ex}ex, F:#{fail} ", :red
elsif 0 < pend
message "Pend #{ex}ex, F:#{fail} P:#{pend}", :yellow
else
message "All Green #{ex}ex", :green
end
end
end
end
# vim:set ft=ruby:
■ [ruby][rspec] Specファイルの正しい書き方は?
ナマケログ - RSpecを日本語の仕様っぽくするには がすごく面白かったです。
'Teacher when introduce himself should tell his own name' ↓ 'Teacher 先生が自己紹介をするケース 自分の名前を言う' ↓ 'Teacher 先生が自己紹介をするという状況では 先生は自分の名前を言うんだ' ↓ 'Teacher が自己紹介をするとき は、自分の名前を言うこと'
こういうのを文芸的プログラミングと呼ぶのでしょうか(多分違います)
さて、僕はといえば、「メソッドごとにテストケース作るならこれでよくね?」という結論に達しました。
describe "CharMap" do
it ".new" do
...
end
it "#[]" do
...
end
it "#each_char" do
...
end
end
…RSpec作者の方に絶望されそうです。
2007-09-19
2007-09-14
■ [scheme] Schemeゴルフ
リハビリがてらにゴルフ。
共有構造 ([[#0=, #0#) を覚えた。あと文字列の補間(#`"hoge ,var moge") が便利。Gauche限定だけど。
■ [javascript][vim] OOP javascript indentation : This indentation script for OOP javascript (especially for EXTJS)
var Hoge = Class.create();
Hoge.prototype = {
initialize: function(){
},
run: function(str){
print(str);
}
}
みたいのをvimでそれっぽくインデントしてくれるやつ。もっとランクが高いのもあるんだけどなんか上手く動かんかった。
■ [javascript] SpiderMonkey
MozillaのJavaScriptインタプリタ部分を抜き出したもの(だと思う)。Cで実装されている。
Debianだとaptで入るので便利。
インタプリタだけなので、window.*とかdocument.*みたいにブラウザ関連のものは一切使えないが、 print()とreadline()があるらしいので簡単なものなら実用的なのものが作れるかも。 あとゴルフができる。
CではなくJavaで書かれたインタプリタ(rhino)も存在する模様。
■ [prog] anagol table修正
なんかうまく取得できなくなってたので直した。
http://mono.kmc.gr.jp/~yhara/files/anagol.html
っていうかcron用起動スクリプトの書き方が悪くてずっとエラーになっていたのだった。これはひどい。 Hpricot使ってるからRUBYLIBとかGEM_HOMEとかをexportしておかないといかんのだな。
2007-08-11
■ [ruby] Binding.of_callerが1.8.5から動かなくなったのは
set_trace_funcのバグが修正されたためだそうです(私信)。
つまりBinding.of_callerは存在自体がバグだったらしいw
関数を抜ける直前にフック"return"が呼ばれるべきなのに、関数を抜けた直後に呼ばれていたという。
あとCレベルで実装しようとすると(例) 必要な情報を常に持ってないといけなくなるので、of_callerのためにそこまですべきか…という話になるらしい。
もう少しマシな実装として、&blockみたいに適当な記号(ここでは^とする)を使って
def foo(a, b, ^bdg) ...
みたいに書いておくとbdgに呼び出し元のbindingが入る…みたいな案はあったそうな(実装はされず)。
■ [prog] Befungeが来てる件
http://d.hatena.ne.jp/mayah/20070810/p1
とりあえず「カレンダーが書かれた言語」がesolang多すぎというのは突っ込むべきでしょうか(笑)。
2007年は「Befungeがブレイクした年」として(俺の)記憶に残りそうだ。
Befungeユーザ会作りたい。Befunge Users' Group = BUG か(ひどい)。
2007-08-08
■ [event] 関東にいました
いました。
- 未踏の発表会でかなりエネルギーを貰ってしまった。やっぱりコード書きまくってる人はカッコいいと思うし自分もそうなりたい。
- ブログに変なことを書いたらshinhさんから飲みに誘ってもらった。何でも書いてみるもんですな。ありがとうございました。
- という効果を考えると事前に「LL魂行きます」とか書いといた方が良かったかな。考えてみればあの会場に相当数の「ブログ読んでるけど会ったことない人」が含まれてたはずだし
- と思いつつやっぱりネタを優先してしまう俺なのでした
■ [hiki] 野良プラグインの管理
hikiは(tDiaryのように)複数のプラグインディレクトリを指定できるようにはなってないのかな?
みんな野良プラグインの管理とかどうしてるんだろう…。バージョン上がるたびにいっこずつコピー?
とりあえず
- misc/plugin/ を ~/bin/hiki-plugin/ に移動
- misc/plugin/ を ~/bin/hiki-plugin/ のシンボリックリンクに (ln -s)
- 野良プラグインは ~/bin/hiki-plugin/ に突っ込む
という感じにしてみた。
■ [hiki] 同一サーバで複数のHikiを管理する方法
同一サーバで複数のHikiを管理する方法について書いてみる。
(1) 設置したいディレクトリごとに hiki-x.y.z.tar.gz を解凍してインストール
面倒なのでお薦めしません。
特にWebアプリは脆弱性が発見された場合に迅速にアップデートしなければならないので、各ディレクトリ毎に アップデート作業が発生するこの方法はあまり良いとは言えません。
(2) HikiFarmを設置する
HikiFarmを設置すると、http://wiki.fdiary.net/ のような感じで ユーザに自由にWikiを増やしてもらうことが可能になります。
が、HikiFarmだと
http://example.com/~hoge/hikifarm/hiki1/ http://example.com/~hoge/hikifarm/hiki2/
のようなURLになるので、ユーザを跨いだりトップレベルに複数設置することができません。
#こういうことがしたい http://example.com/~foo/hiki1/ http://example.com/~bar/hiki2/ http://example.com/~bar/hiki3/
このような場合は、以下の方法を使えばOKです。
(3) tDiary方式
同一サーバで複数のtDiaryを運営する方法のように、 設定ファイルとプロキシCGIだけを置いて本体を共有する方法です。
基本的に http://www.namaraii.com/diary/?date=20030408#p03 を参照すればOK。
まず ~/bin/hiki/ あたりに hiki-x.y.z.tar.gz を解凍します。*1
次に、Hikiを設置したいディレクトリ毎に以下のファイルを設置します。
- hikiconf.rb (hikiconf.sample.rbをコピーして編集)
- .htaccess (dot.htaccessをコピー)
- hiki.cgi (以下ような内容、chmod +xで実行権限を付加しておく)
#!/usr/bin/env ruby
master_path = '/home/hoge/bin/hiki/' #←Hikiを解凍したフォルダに合わせて設定
$LOAD_PATH.unshift(master_path)
load "#{master_path}/hiki.cgi"
あとはHikiを設置したURLにアクセスし、管理画面からパスワードやタイトルやテーマを設定すれば設置完了です。
*1 もしくはCVSからチェックアウトするのでもOK。その方がアップデートが楽でいいかも。
2007-08-05
■ [event] 関東にいます
サプライズwが終了したので書いてしまいますが。
- 8/4(土) LL Spirit → http://kangetsu.com/
- 8/5(日) 未踏ユース 2006年度下期成果報告会 → 先輩のうちに泊めてもらう ← いまここ
- 8/6(月) 未踏本体 2006年度下期 並木・齋藤・高田・黒川4PM合同成果報告会 → 多分カプセルホテル
- 8/7(火) 同上 → 帰宅
というスケジュールです(でした)。
今回は(ついに)名刺を作ったので、いろんな人に配りまくりですよ。残り8枚なのでほしい方はお早めに(?)。 LL Spiritでshinhさんにぜひ渡したい!と思ったんだけど人多すぎて探すどころでなかった。ウォーリーもびっくり。
xtalよりxbyakよりまず「神保町」が読めないと思うんですよ。
http://karetta.jp/article/blog/ll-spirit/110939
会場から魂もらいました。やる気でた。このやる気は大事にしないと。
2007-08-01
■ [ruby] irbを使う前にしておくべき3つ(+α)の設定
Rubyで試行錯誤しながら開発したいときにはirbを使うのが便利です。 今日はirbをさらに便利にする設定をいくつか紹介します。
ホームディレクトリ*1に .irbrc というファイルを 作り、そこに設定を書いていきます。
(1) タブ補完
# --- completion require 'irb/completion'
メソッド名をTABキーで補完できるようになります。
例:
yhara@meteor:~ % irb >> a = [] => [] >> a.ind[TAB] a.index a.indexes a.indices
(2) リファレンス検索
IRB上から「r」というメソッドでrefeを引けるようになります。
例:
>> r :partition
Enumerable#partition
--- partition {|item| ... } ruby 1.7 feature
各要素に対してブロックを評価した値が真であった要素からなる配列と
偽であった要素からなる配列からなる配列を返します。
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0].partition { |i| i % 3 == 0 }
#=> [[9, 6, 3, 0], [10, 8, 7, 5, 4, 2, 1]]
=> nil
>> r :inspect
Iconv::Failure#inspect Included#inspect Method#inspect
Object#inspect OptionParser::ParseError#inspect
Syslog#inspect TMail::Mail#inspect
=> nil
クラスを指定したいときは「r "Array#inspect"」とか、「Array.r :inspect」のようにします。
(3)結果の色付け
wirbleというgemをインストールするとirbの実行結果に色が付くようになります。
# --- wirble require 'rubygems' require 'wirble' Wirble.init Wirble.colorize
(おまけ)長すぎる出力を切り詰める
File.readなど、巨大なStringを返すメソッドを呼ぶと、IRBの出力がやたら長くなってちょっと鬱陶しいですよね。 こんな時に、出力の先頭以外を省略する設定を考えてみました。
なお実装の都合上Wirbleを先にロードしておかなければいけません。 *2
# --- truncate long output (load wirble first!)
module IRB
class Irb
CUT = 1000
def output_value
if @context.inspect?
s = @context.last_value.inspect
if s.size > CUT
s = s.slice!(0, CUT) + "...(snipped)"
end
printf @context.return_format, Wirble::Colorize.colorize(s)
else
printf @context.return_format, @context.last_value
end
end
end
end
(おまけ2) irb中でもlsを使えるようにする
手が空くとついlsを打ってしまうあなたにお薦めです(笑)。
def ls print `ls -CF` end
オプションはお好みで。
ついでにcdも実装……とかやってるとirbshになってしまいそうなので 今回はこの辺で。
Enjoy irbing!
2007-07-31
■ [prog] 50音から始まるプログラミング言語
プログラミング言語の名前を五十音順に並べてみました。びわこ開発合宿のときに作ったのを忘れてた。
聞いたことねーよ!っていうのが結構あるかと思いますが、その辺は http://99-bottles-of-beer.net/ から拝借しました。
あと「が」「ぎ」「ご」「ざ」「ず」「つ」「ぬ」「へ」「を」「ん」が埋まってないので、夏休みの自由研究で自作言語を作ろうと思ってる人はぜひ これらから始まる言語名にしてみてください。
■ [softs] Firemacs
firefoxをemacsキーバインドにする拡張。
C-aもC-eもC-pもC-bも使えるよ!すげえ!
C-space (Mark set)も普通に使える。
以下コメント欄より:
firevimとかもあるのかなぁ…
Vimperatorというのがあるようです(試してないですが)。
C-v でペースト出来ないことに違和感を感じて外してしまいました
確かに。設定でなんとかできないのかな。
Windows なら XKeymacs なんてのも
Windowsは窓使いの憂鬱を使ってます。
□ shinh [なんといらしてたんですね。それはもったいなさすぎるので今日(月曜)か明日なりの晩とかにもしお時間あったりすれば適当に..]
□ yhara [おお、ありがとうございます! 火曜は16:30までは東京駅付近にいるのですが、そこから最終の新幹線(21時台)まで..]
□ shinh [昨日は良い子ですやすやでした。18:00なり18:30くらいにアキバとかだとどうでしょう。とりあえず連絡先は 070..]