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-09-19
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-23
■ [ruby] 歌えPC
require 'Win32API' def beep(freq, dur) Win32API.new('kernel32', 'Beep', %w(i i), "i").call(freq, dur) end FREQ_TBL = { "a" => 0, "a+" => 1, "b" => 2, "c" => 3, "c+" => 4, "d" => 5, "d+" => 6, "e" => 7, "f" => 8, "f+" => 9, "g" => 10, "g+" => 11, } def freq_oct(oct) 440 * (2**(oct-4)) end def freq_of(onp, oct) return 50 if onp == "r" oct-=1 unless %w(a a+ b- b).include? onp unit = (freq_oct(oct+1) - freq_oct(oct))/12 freq_oct(oct) * (2.0**(FREQ_TBL[onp].to_f/12)) end def say(onp, oct, len=100) p onp beep(freq_of(onp, oct), len) end if __FILE__ == $0 oct=6 "c<bagbagfgfedcdeg>1".each_byte{|c| #A>A<a>a<A>A<a>a<A>A<a>a<A>A<a>a<ArrrD case c when ?> oct+=1 when ?< oct-=1 when ?1 l = 10 (80/3).times do say("c", oct, l) say("g", oct-1, l) say("e", oct-1, l) end else if (?A..?Z).include? c say("#{c.chr.downcase}+", oct) else say(c.chr, oct) end end } end
Windowsのひとはためしてみよう!
- Q.コードがぐちゃぐちゃなんですが
- A.でもそんなの関係ねえ
- Q.合宿中じゃなかったんですか
- A.でもそんなの以下略
2007-09-27
■ [ruby][prog] プログラミング言語「ず」を公開しました
先日の言語開発合宿で製作したプログラミング言語「ず」を公開しました。
「ず」はアスキーアートで図を描くとそれがそのまま実行される、フローチャート指向言語です。
性格判断を行う程度のプログラムが書けます。
サンプルプログラム:
*-----------------------* |ask "do you like ruby?"| *--------------------------------* | +------------> ask "then, do you like python?"| *------------------+----* | | | *-----+------------------------+-* | | | | | | | *----------v----------------------* | *-----------------v-----------*|say "maybe you don't like LL..." | | |say "maybe you like Haskell."|*---------------------------------* | *-----------------------------* | *------------------------------v---* | | |say "maybe you like OCaml." | *----------------------------------*
実行結果:
yhara@meteor:~/src/zu/zu-0.1.0 % ./zu sample.zu do you like ruby? [y/n] > n then, do you like python? [y/n] > y maybe you like OCaml.
(内容に深い意味はありません。^^;)
処理系のダウンロードはこちらからどうぞ。
AAグラフのパーザ部分は、Rubyのライブラリとして独立に公開予定です。ぜひ面白い使い道を考えてみてください。
■ [ruby] TextGraph-0.1.0をリリースしました
アスキーアートで書かれた有向グラフをパースするRubyライブラリ、TextGraphをリリースしました。
フゥゥーー…… 初めて…………Rubyforgeでgemを公開しちまったァ〜〜〜〜〜♪ でも想像してたより、なんて事はないな。
とりあえず newgem 使ってフォルダ構成を自動生成しておけば rake clean → rake package でgemが出来るので、あとはアップして終了。簡単でした。 詳しい手順は以下のサイトが非常に参考になりました。ありがとうございます。
*----* *---* => #<TextGraph::Graph:0x2b4fc09a19c0 |foo +--->bar| @cells = [ *-+--* *---* #<TextGraph::Cell:0x2b4fc099c538 @y=0, @raw_content="foo ", @x=0, @h=3, @w=6>, | #<TextGraph::Cell:0x2b4fc099b8b8 @y=0, @raw_content="bar", @x=9, @h=3, @w=5>, *v---* #<TextGraph::Cell:0x2b4fc0999ab8 @y=4, @raw_content="baz ", @x=1, @h=3, @w=6> |baz | ] *----* @links = [[0, 1], [0, 2]],
アルゴリズムは特に難しいことはしてなくて、
- まず文字列を文字(アスキーコード)の配列の配列に分ける
- 全ての「*」について、そこを左上とする四角ができているかを調べる
- 全ての「+」について、そこから上下左右に矢印が伸びているかを調べる
- 全ての矢印について、始点と終点がどの四角に属しているのかを調べる
という感じです。
gem install textgraph でインストールできるので、みなさんもぜひTextGraphを使ったアプリケーションを
考えられるものなら考えてみてくださいね!
2007-09-30
■ [prog] Scala - 機能のためには文法を自重しない言語
昨日のRuby勉強会でkeisukenさんによるScalaの発表があった…んだけど僕は遅刻して見られなかったので(ごめんなさい)、 今日電車の中で配布資料を読んでたんだけど、、、こんなにカオスな言語だとは知らなかったw
とりあえず、機能追加のためには文法の拡張を厭わないということは分かった。ある意味格好いい。
以下キーワード:
- JVMや.NET上で動く
- 静的型、型推論あり
- varで変数宣言
- valで再代入できない変数宣言 (関数型言語におけるletみたいに使える)
- 無名関数は (i) => print(i + "") とか
- for(i <- 0 until 10){} とか、 (0 until 10).foreach() とか
- メソッド定義はdef
- Generics (型名がArray[String] とか)
- Structural Subtyping (継承してなくても、同じシグネチャのメソッドがあれば多態できる)
- 型名が Array[{def name: String}] とか
- 暗黙の型変換をユーザが定義可能
- XMLがリテラルとして書ける (val html = <html>(中略)</html> とか)
- パーサコンビネータが付いてくる (文法組み込みなのかな?)
- Actor (並行処理、切り替えは自分で指定、Ruby1.9のFiberに近い?)
- Lift (Railsに影響を受けたWebフレームワークらしい)
- User.find(By(User.email, "foo@bar.com"))
- Railsと行数は同じくらいだけど、型安全だからテストが少なくて済むよ!
- まだ 'early alpha' らしい
気になった方は西本さんの発表資料をどうぞ。 あとはScala@どう書く?orgとかみずしまさんの発表@LL Spiritとか。
Scalaの楽しみ方:
- 型推論ありのRuby風言語として。
- Javaや.NETの機能が使える関数型(風?)のLLとして。
- 最先端機能の実験場として。
□ trotr [こんなのありますよ>公開svnリポジトリ http://coderepos.org/share]
□ ohai [Mercurialに鞍替えするとか。CGI経由でリポジトリを公開できるよ。 gitとかも似たようなことができるかな。]
□ yhara [trotrさん: 情報ありがとうございます。 coderepos楽しそうですよねえ。登録してみようかな…。 ohai..]