トップ 最新 追記

Route 477



2007-09-14

[misc] そういえば最近ブログ書いてないけど

無事帰宅しましたですよ。

とりあえずの小ラーメンを完食できる程度には健康になった。

[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

[scheme] func, proc, pred, thunk

    表記 引数       返り値

手続き PROC 1 個以上     なんでも

述語  PRED 1 個以上が多い? 真偽値

サンク THUNK 0 個       なんでも

[http://practical-scheme.net/wiliki/wiliki2.cgi?Scheme%3a%e5%88%9d%e5%bf%83%e8%80%85%e3%81%ae%e8%b3%aa%e5%95%8f%e7%ae%b1%3alog00#H-1a5fnraより引用]

funcは"関数"だから戻り値に意味があるもの、procは"手続き"だから戻り値に意味がないもの、と思い込んでたんだが、 そうでもないのね。


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作者の方に絶望されそうです。

本日のツッコミ(全3件) [ツッコミを入れる]

trotr [こんなのありますよ>公開svnリポジトリ http://coderepos.org/share]

ohai [Mercurialに鞍替えするとか。CGI経由でリポジトリを公開できるよ。 gitとかも似たようなことができるかな。]

yhara [trotrさん: 情報ありがとうございます。 coderepos楽しそうですよねえ。登録してみようかな…。 ohai..]


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]],

アルゴリズムは特に難しいことはしてなくて、

  1. まず文字列を文字(アスキーコード)の配列の配列に分ける
  2. 全ての「*」について、そこを左上とする四角ができているかを調べる
  3. 全ての「+」について、そこから上下左右に矢印が伸びているかを調べる
  4. 全ての矢印について、始点と終点がどの四角に属しているのかを調べる

という感じです。

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として。
  • 最先端機能の実験場として。