迷路作ってみた

アルゴリズム自動生成迷路にのってる棒倒し法。
ソースはあんまりキレイじゃないかも。。
ネストが多いと見づらいね( ´・ω・`) リファクタすべき?
明日ちょっとやってみようかな。
CGIバージョンはここ

#!/usr/local/bin/ruby
#print "Content-Type: text/html\n\n"

# 棒倒し法によって迷路を作成する
# 迷路は英語で Maze
class Maze
  def initialize(height = 21, width = 21)
    @height = height
    @width = width
    @wall = ''
    @enp  = ''
    # 0..n  は n を含む
    # 0...n は n を含まない
    @map = (0...@height).map{ Array.new(@width, @enp) }
    @direction = %w(up down right left)
    make_outside
    make_inside
    make_rand
  end

  def make_outside
    @height.times do |h|
      @width.times do |w|
        if h == 0 or h == @height-1 or w == 0 or w == @width-1
          @map[h][w] = @wall
        end
      end
    end
  end

  def make_inside
    @height.times do |h|
      next if h % 2 == 1 or h == 0 or h == @height -1
      @width.times do |w|
        next if w == 0 or w == @width - 1
        @map[h][w] = @wall if w % 2 == 0
      end
    end
  end

  def make_rand
    @height.times do |h|
      next if h % 2 == 1 or h == 0 or h == @height -1
      @width.times do |w|
        next if w == 0 or w == @width - 1
        # 1行目かどうかの判定
        if w % 2 == 0
          d = @direction[rand(4)]
          case d
          when 'up'
            # 上方向へ棒をつくれるのは1行目のときだけ
            if @map[h-1][w] == @enp and h == 2
              @map[h-1][w] = @wall
            else
              redo
            end
          when 'down'
            if @map[h+1][w] == @enp
              @map[h+1][w] = @wall
            else
              redo
            end
          when 'right'
            if  @map[h][w-1] == @enp
              @map[h][w-1] = @wall
            else
              redo
            end
          when 'left'
            if @map[h][w+1] == @enp
              @map[h][w+1] = @wall
            else
              redo
            end
          end
        end
      end
    end
  end

  def disp
    @map.each do |m|
      m.each do |n|
        print n
      end
      puts
    end
  end
end

height = ARGV[0] || 21 # ARGV[0].to_i だとダメ
width  = ARGV[1] || 21
height = heigth.to_i
width  = width.to_i
maze = Maze.new(height, width)
maze.disp

□(しかく)と口(くち)だと、くちの方が大きい?

Firemacs を改造したい

firemacsを自分用に改造してみた - とりあえず暇だったし何となくはじめたブログを見て、僕もFiremacsを改造したくなったんだけど、
chrome/content/firemacs.js ってどこ?
Program Files/Mozilla Firefox の中を見てみたけど、
それらしいファイルが全然見つからない・゚・(つД`)・゚・
C-/ でアンドゥとか、C-k で改行ごと消すとか、
ぜひできるようにしたい!

追記

Redirectに置かれている非公式のバージョン2.1をインストールしたら、
アドオンの設定からバインドの設定が簡単に行えた。
JavaScriptをいじらなくてもよかったので、これは嬉しい!
とりあえず、1.0ではできなかった C-d が使えることを確認し、
C-/ でアンドゥできるように設定する。
C-k で改行ごと消すのは、この設定画面からでは無理みたい。


ただし、バージョン2.1のxpiは、
マウスでクリックするだけではなぜか自動インストールが始まらない。
解決策は、一旦デスクトップなどに保存してから、
ドラッグ&ドロップでFirefoxの窓に投げ込むこと。
これでインストールが始まる。


インストールの仕方が分からなかったので、
xpiについて調べていたら、xpiがただのzipなんだということが分かった。
拡張子をzipに変更すれば解凍ソフトで解凍できちゃうんだね。

追記2

Firefoxのアドオンがどこに保存されているか分かった。
「C:\Documents and Settings\gan2\Application Data\Mozilla\Firefox」(gan2はユーザ名)にあったよ。
僕はMDIEというタブ型ファイラーを使っているんだけど、
それを使っていると Application Data ってフォルダが表示されないみたい。
でもパスを直接打ち込むか、標準のエクスプローラを使えばアクセスできる。


このパス以下を辿っていった「extensions\{e98b7313-167d-48c6-89be-bc514d6de8d9}」
がFiremacsがインストールされているフォルダみたい。
ここのchromeにあるfiremacs.jarを解凍したら、その中にfiremacs.jsがあった。
でもfiremacsを自分用に改造してみた - とりあえず暇だったし何となくはじめたブログが書かれた時と、大分中身が変わっているみたい。
ざっと見た感じだと、keybinding2.jsをいじればよさそう?
改造後は、firemacsフォルダをまとめてjarに圧縮すればいいんだろうね。

アクセス解析ツールの設置

はてなダイアリーへのアクセス解析ツールの組み込み方について具… - 人力検索はてなを参考に、
忍者Toolsアクセス解析ツールを設置した。
サイドバーの右上の方にちょこんとある黒いのがそう。
ほんとは白いのにしたくて、そう設定したつもりなんだけど、
なぜか黒い方が出る。まあいっか。

Meadow から Ruby のデバッガを起動する

rubydb3x.elをsite-lisp以下に置き、.emacsに以下を追加する。
rubydb3x.elはRubyアーカイブの中にあるmisc以下から入手できる。

;;; Ruby のデバッガを Emacs から使うための設定
;; M-x rubydb
(autoload 'rubydb "rubydb3x"
  "run rubydb on program file in buffer *gud-file*.
the directory containing file becomes the initial working directory
and source-file directory for your debugger." t)

起動方法は、M-x rubydb RET した後に、
デバッガを走らせたいRubyスクリプトを指定すればOK。
ただし、Rubyスクリプトの名前の保管はやってくれないので、
そこがちょっと使いづらいかなと思う。
ディレクトリの指定もしなきゃいけないのでけっこうめんどい('A`)
ソースを一緒に表示してくれるのはすごいありがたいんだけどねー。


結局は、eshell を立ち上げて ruby -rdebug test.rb するのと、
どっちがいいかって話になっちゃう。
ファイル名の補完ができるなら、迷うことなく rubydb なのにっ。

インスタンス変数を外部から参照できない

なんでこれでnilが出力されるのー?
なんで'A'が出力されないんだうわー。

class A
  attr_reader :var
  @var = "A"
end

a = A.new
puts a.var #=> nil

ほんとに分からない。何で??


ちなみに、これだと意図した通りに'A'と表示される。

class A
  attr_reader :var
  def initialize
    @var = "A"
  end
end

a = A.new
puts a.var #=> A

Ruby のデバッガの使い方まとめ

以下の3つが参考になる。
いやなブログさんのがコンパクトにまとまっていて分かりやすかった。