ひがきの日記

2016-06-04

「ねこふん」が終わったら「にゃらまち」

ねこふん

猫ふんじゃったギャラリーたち」と題して、主に大阪ギャラリーカフェ、雑貨店が猫にまつわる企画を毎年 5月に開催している。通称「ねこふん」

2016年は 25の企画が行われた。 *1

私も 21の企画に足を運んだ。 *2


にゃらまち

「にゃらまち猫祭り」と題して、主にならまちの (ry

毎年 6月に開催している。

どうやって巡るか計画を立てるべく web サイトを見てみたが、ねこふん ほど情報が見やすくない。

営業時間と定休日が一覧で見たい。

とりあえずスクレイピングしてみたが……

require 'open-uri'
require 'nokogiri'

def detail xml
  h1 = xml.xpath('//h1').first
  return if h1.nil?

  eenc = Encoding::default_external
  opts = {replace: ''}

  shop = h1.text.encode(eenc, opts)

  keywd = '営業時間'
  srv = xml.xpath(%|//p[contains(text(), "#{keywd.encode('UTF-8', opts)}")]|)
  srv = srv.nil? ? '' : "%s:%s -- %s:%s" % (srv.text.scan(/\d+/) + %w[00 00 00 00]) # !> too many arguments for format string

  keywd = '定休日'
  hol = xml.xpath(%|//p[contains(text(), "#{keywd.encode('UTF-8', opts)}")]|)
  hol = hol.nil? ? '' : hol.text.encode(eenc, opts).strip.sub(/#{keywd}[ ::]*/, '')

  [shop, srv, hol]
end

def more(uri)
  opts = {invalid: :replace, undef: :replace, replace: ''}
  puts uri.encode(Encoding::default_external, opts)

  fn = uri.split(/\//).last + ".html"
  fn.encode!(Encoding::default_external, opts)
  open(fn, 'w'){|f| f.write(open(URI.encode(uri), &:read))} unless File.exist? fn
  xml = Nokogiri::XML(open(fn))

  lm = xml.xpath('//a[contains(text(), "more")]') || []
  lM = xml.xpath('//a[contains(text(), "More")]') || []
  links = lm + lM
  links.map{|link| more(link.attributes['href'].value)} << detail(xml)
end

require 'pp'
pp more("http://www.nyaramachi.com/shop-list/")
# >> http://www.nyaramachi.com/shop-list/
# >> http://www.nyaramachi.com/shop-list/雑貨-ファッション/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/acartlifestyle/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/花羅古ろん/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/みに工房キャンバス/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/cloverand喫茶通圓/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/啓林堂書店奈良店/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/ことあかり洋品店/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/がまくち雑貨工房janji/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/doco-ao/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/ならまちわおん/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/necoco/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/猫雑貨ベゼル/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/marypoppinspochotte/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/器と郷土玩具瑜伽/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/アート-クラフトショップロビン/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/ab-cats/
# >> http://www.nyaramachi.com/
# >> http://www.nyaramachi.com/
# >> http://www.nyaramachi.com/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/猫雑貨とハンドメイドの店-cat-time/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/太古堂-ギャラリー-ショップ/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/アジアン雑貨-パーンファン/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/奈良のすごいタオル屋さん-ときどき猫/
# >> http://www.nyaramachi.com/shop-list/体験-1/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/着物あそびにっこり/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/美容室照美/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/遊悠工房zooandかぎひろ/
# >> http://www.nyaramachi.com/shop-list/カフェ-グルメ-1/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/うとうと/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/curryandcafe香炉里/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/四季折々の和菓子とらや/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/猫カフェ寧估庵/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/プティマルシェandぷちまるカフェ/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/franzkafkaフランツカフカ/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/喫茶工房まほろば/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/素人珈琲と雑貨よつばカフェ/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/若草カレー本舗/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/和彩rest紅絲/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/サブロク珈琲/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/甘いもん処-咲良/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/中華粥-穀雨/
# >> http://www.nyaramachi.com/shop-list/ギャラリー-1/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/ギャラリー一風/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/ギャルリサンク/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/スペース-プラス&#178;/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/
# >> http://www.nyaramachi.com/shop-list/カフェ-ギャラリー-1/galleryandcafeならまち村/
# >> [[[["ACART LIFESTYLE", "11:00 -- 19:00", "月曜(祝日の場合は翌火曜)"]],
# >>   [nil],
# >>   [["ミニ工房きゃんばす", "10:30 -- 19:00", "火曜"]],
# >>   [["CLOVER&珈琲館通圓", "14:00 -- 23:00", "不定休"]],
# >>   [["啓林堂書店奈良店", "9:00 -- 21:00", "1月1日、2日"]],
# >>   [["ことあかり洋品店", "11:00 -- 17:00", "月曜、火曜"]],
# >>   [["がまくち雑貨工房janji", "11:17 -- 00:00", " 不定休"]],
# >>   [["doco*ao", "13:00 -- 18:00", "月曜、火曜"]],
# >>   [["ならまちわおん", "10:00 -- 18:00", "木曜"]],
# >>   [["necoco", "11:00 -- 18:00", "月曜、木曜&#160;"]],
# >>   [["猫雑貨べセル", "10:00 -- 19:00", "月曜"]],
# >>   [["MaryPoppinsPochette", "10:30 -- 18:30", "木曜"]],
# >>   [["器と郷土玩具 瑜伽", "12:00 -- 18:00", "月曜"]],
# >>   [["アート&クラフトショップ ロビン", "11:00 -- 19:00", "木曜"]],
# >>   [["AB-CATS", "11:00 -- 18:00", "月&火曜"]],
# >>   [["にゃらまち猫祭り2016", "00:00 -- 00:00", ""]],
# >>   [["にゃらまち猫祭り2016", "00:00 -- 00:00", ""]],
# >>   [["にゃらまち猫祭り2016", "00:00 -- 00:00", ""]],
# >>   [nil],
# >>   [["太古堂", "13:00 -- 18:00", "月〜木曜 "]],
# >>   [["アジアン雑貨 パーンファン", "10:00 -- 19:00", " 木曜"]],
# >>   [["奈良のすごいタオル屋さんときどき猫", "11:00 -- 19:00", "不定休"]],
# >>   nil],
# >>  [[["着物あそび にっこり", "10:00 -- 00:00", "水曜&#160;"]],
# >>   [["美容室照実", "9:00 -- 18:00", "火曜、第3水曜日"]],
# >>   [["遊悠工房 ZOO&かぎろひ", "11:00 -- 17:00", "火曜、水曜"]],
# >>   nil],
# >>  [[["うと○うと(にゃらまち美術館)", "11:00 -- 17:00", "不定休"]],
# >>   [["Curry&Cafe 香炉里", "11:00 -- 20:00", "火曜"]],
# >>   [["四季折々の和菓子 とらや", "9:00 -- 20:30", "火曜"]],
# >>   [["猫カフェ寧估庵", "00:00 -- 00:00", ""]],
# >>   [["プティ・マルシェ&ぷちまるカフェ〜", "00:00 -- 00:00", "月曜、火曜"]],
# >>   [["Franz KAFKA フランツ・カフカ", "11:00 -- 21:00", "水曜"]],
# >>   [["喫茶工房まほろば", "11:00 -- 17:00", "木曜"]],
# >>   [["素人珈琲と雑貨 よつばカフェ", "11:00 -- 19:00", "水曜日 営業時間:11:00~19:00"]],
# >>   [["若草カレー本舗", "11:30 -- 15:00", "水曜日夜"]],
# >>   [["和彩Rest紅絲", "11:00 -- 22:30", "火曜"]],
# >>   [["サブロク珈琲", "00:00 -- 00:00", ""]],
# >>   [["甘いもん処 咲良", "10:00 -- 18:00", "不定休"]],
# >>   [["中華粥 穀雨", "00:00 -- 00:00", ""]],
# >>   nil],
# >>  [[["ギャラリー一風", "00:00 -- 00:00", "水曜"]],
# >>   [["ギャルリ・サンク", "12:00 -- 19:00", "不定休(期間中)"]],
# >>   [["スペースプラス&#178;", "00:00 -- 00:00", ""]],
# >>   nil],
# >>  [[["Gallery&Cafeならまち村", "11:00 -- 19:00", "火曜、水曜"]], nil],
# >>  ["Shop List", "00:00 -- 00:00", ""]]

力尽きた。

ページごとに構造がバラバラで Nokogiri 使うより、正規表現でゴリゴリやった方がよさそう。

*1阪神百貨店梅田本店を含む

*2:散財した

2010-12-04

第47回 Ruby/Rails勉強会@関西に行ってきた

第47回 Ruby/Rails勉強会@関西でいつものように京都女子大学へ。

おけいはんで七条駅に着くと、いつもと違って女子大生がいない。*1
女子大生いないよー」と tweet しかけて止めた。*2

Rubyist のための HTML5 入門 - Content models - by Sixeight さん

HTML5 ややこしい。
こんなにややこしいなら XHTML でも良かったんじゃ?

あと、HTML を手書きする人が減ってる現状を考えれば、ブラウザがもっと strict になってもいいと思うよ。

redminegit建築プロジェクトに使ってみた by waku さん

これは非常に興味深い事例紹介。

  • バックアップになる
  • 公開鍵でアクセス制御
  • コマンドを 5つに絞る

↑だけで git できるのうらやましい。

RailsDevCon2010の報告 by アジャイルかわばた さん

cucumber の話が面白かった。

シナリオがちゃんと動かなくても気にしないとか。
単に仕様書かいたと思えば動かなくてもなんてことないなww

フリートークセッション by むりょうい さん

もうちょっと活発に議論っぽくなれば、もっとよかった。

何回かやれば、みんな慣れてくる?

Ruby初級者向けレッスン by こなみ先生

アシスタントの女子大生ドタキャン (>_<)

練習問題の詳細は配布資料を参照。

メソッドに可変長引数を渡したりする話
  • 練習1-1

こんな感じ?

def sum_all(*ary)ary.inject(&:+)end

sum_all 1, 2, 3, 4, 5   # => 15
  • 練習2-2

計算結果を型変換するのか、型変換した値で計算するのかが不明。

とりあえず後者でいく。

Ruby1.9 なら簡単

def sum_all(type = :float, ary)
  ary.map{|i|__send__(type == :int ? :Integer : :Float, i)}.inject(&:+)
end

sum_all [1, 2.5, 3, 4.5, 5]           # => 16.0
sum_all :int, [1, 2.5, 3, 4.5, 5]     # => 15

Ruby1.8 だと、どうすれば?

def sum_all(*ary)
  type = ary.first == :int ? :Integer : :Float
  ary.last.map{|i|__send__(type, i)}.inject(&:+)
end

sum_all [1, 2.5, 3, 4.5, 5]           # => 16.0
sum_all :int, [1, 2.5, 3, 4.5, 5]     # => 15

正規表現の話
  • 練習2-1

属性って ' で囲んでも良いんだっけ?

%r|<a\s.*?href=(["'])(.*?)\1.*?>(.*?)</a>|m

$2 が URL で、$3 が名前になる。

    • \s が改行にもマッチして便利*3
    • href 以外の属性は無視
    • "url" または 'url' (開始、終了のクオートが一致していること)
    • .*? は本当に便利
  • 練習2-2

前回も同じような練習問題あったなw

require 'open-uri'

def anchors(url, encode = Encoding::UTF_8)
  open(url, &:read).
    scan(%r|<a\s.*?href="(.*?)".*?>(.*?)</a>|m).
    map{|url,title|[url, title.encode(encode)]}
end

url = 'http://www.google.com'
open('google.utf8',  'wb'){|f|f.puts anchors(url)}
open('google.eucjp', 'wb'){|f|f.puts anchors(url, Encoding::EUC_JP)}
open('google.cp932', 'wb'){|f|f.puts anchors(url, Encoding::CP932)}

*1:休講だったらしい。

*2ドタキャンが増えると困るから。

*3:あれ? バックスラッシュが入力できない。

2009-06-15

オブジェクトの等値性

ややこしいのでメモ。

equal? ふたつの式が指すオブジェクトが同一か?
== ふたつのオブジェクトの値が等しいか?
eql? ハッシュキーが等しいかどうかチェックするために Hash クラスが使う。
=== case 文の when で使われる。
=~ 正規表現のマッチ。

equal?

a = "Ruby"          # => "Ruby"
b = "Ruby"          # => "Ruby"
c = b               # => "Ruby"

a.object_id         # => 134586220
b.object_id         # => 134585530
c.object_id         # => 134585530

a.equal? b          # => false
b.equal? c          # => true

==

a = "Ruby"          # => "Ruby"
b = "Ruby"          # => "Ruby"

a.object_id         # => 134586100
b.object_id         # => 134585530

a.equal? b          # => false
a == b              # => true

1 == 1.0            # => true
1 == "1"            # => false  # 無茶しすぎ

eql?

1 == 1.0            # => true
1.eql? 1.0          # => false

Hash ってキーとなるオブジェクトの hash を取って Fixnum として比較してるんじゃないの?

class OreOre
  def initialize(id) @id = id end
  def ==(o) @id == o.id end
  def eql?(o) self == o end
  attr_reader :id
end

o = OreOre.new(1)
p = OreOre.new(2)
q = OreOre.new(1)

o == p              # => false
o == q              # => true

o.hash              # => 134668880
p.hash              # => 134668870
q.hash              # => 134668860

o.eql? p            # => false
o.eql? q            # => true

h = {}
h[o] = "o"
h[p] = "p"
h[q] = "q"
h.size              # => 3
h                   # => {#<OreOre:0x100dc4a0 @id=1>=>"o", #<OreOre:0x100dc48c @id=2>=>"p", #<OreOre:0x100dc478 @id=1>=>"q"}

やっぱり o.hash がキーになってるっぽい。

オレオレクラスを作ったときの ==, hash, eql? の関係は?
eql? を == 相等にしたら、hash はどうやって作ればいいのだろうか?

===

when でウマくマッチするようにする。

def foo(x)
  case x
  when (0..9)
    "0..9"
  when /\d{2}/
    "/\d{2}/"
  when Fixnum
    "Fixnum"
  end
end

foo 5               # => "0..9"
foo 99              # => "Fixnum"
foo "99"            # => "/d{2}/"
foo :foo            # => nil

=~

s = "Ruby"
/r/i =~ s           # => 0
/u/i =~ s           # => 1
/b/i =~ s           # => 2
/y/i =~ s           # => 3
/\d/ =~ s           # => nil

2009-04-22

refe.el を使う。

refe.el とは Emacs から ReFe を使うためのインターフェイス。

最新版は …… たぶん公式に配布してるとこはない。*1

手元にあった最新版と思しき refe.el を動かしてみると、候補の補完ができない。

本来なら複数のクラスに存在するメソッドを引くと、クラスの候補が出てきて補完できるようになるはず。

blade から refe.el 関連のメールを漁る。

手元にあったのとは、ちょっと違う refe.el を手に入れたが、やっぱり補完はできない。

looking-at の正規表現をいぢって、なんとか動くようになった。

(defvar refe-program-name
  (if (featurep 'meadow)
      "ruby"
    "refe"))
(defvar refe-program-args
  (if (featurep 'meadow)
      '("-S" "refe")
    nil))
(defvar refe-buffer-name "*Refe*")
(defvar refe-completion-table nil)

(defun refe-call-process (buf &rest args)
  (let ((coding-system-for-read 'euc-japan))
    (apply 'call-process refe-program-name nil buf nil
           (append refe-program-args args))))

(defun refe-make-completion-table ()
  (setq refe-completion-table (make-vector 547 0))
  (with-temp-buffer
    (refe-call-process t)
    (goto-char (point-min))
    (while (looking-at "[A-Z][A-Za-z_0-9:]*")
      (intern (match-string 0) refe-completion-table)
      (skip-chars-forward "^ \n")
      (skip-chars-forward " \n")))

  (with-temp-buffer
    (refe-call-process t "")
    (goto-char (point-min))
    (while (looking-at "\\(\\$[^ \n]*\\|[A-Z][A-Za-z_0-9:]*[#.][^ \n]*\\)")
      (intern (match-string 0) refe-completion-table)
      (skip-chars-forward "^ \n")
      (skip-chars-forward " \n")))
  nil)

(refe-make-completion-table)

(defun refe-get-word-at-point ()
  (save-excursion
    (while (looking-at "\\sw\\|\\s_")
      (forward-char 1))
    (if (or (re-search-backward "\\sw\\|\\s_"
				(save-excursion (beginning-of-line) (point))
				t)
	    (re-search-forward "\\(\\sw\\|\\s_\\)+"
			       (save-excursion (end-of-line) (point))
			       t))
	(progn (goto-char (match-end 0))
	       (buffer-substring (point)
				 (progn (forward-sexp -1)
					(while (looking-at "\\s'")
					  (forward-char 1))
					(point))))
      nil)))

(defun refe ()
  (interactive)
  (if (null refe-completion-table)
      (refe-make-completion-table))
  (let* ((default (refe-get-word-at-point))
	 (completion-ignore-case t)
	 (word (completing-read (if default
				    (format "Class or Method (default %s): " default)
				  "Class or Method: ")
				refe-completion-table nil nil nil nil default))
	 (buf (or (get-buffer refe-buffer-name)
		  (generate-new-buffer refe-buffer-name)))
	 (pop-up-windows t)
	 (pop-up-frames nil))

    (set-buffer buf)
    (setq buffer-read-only nil)
    (erase-buffer)

    (refe-call-process buf word)

    (goto-char (point-min))
    (if (re-search-forward "^---" nil t)
	nil
      (let ((klass-table (make-vector 17 0))
	    (completion-ignore-case t)
	    klass)
	(goto-char (point-min))
	(while (looking-at "\\([A-Z][A-Za-z_0-9:]*\\)[#.][^ \n]*")
	  (intern (match-string 1) klass-table)
	  (skip-chars-forward "^ \n")
	  (skip-chars-forward " \n"))
	(if (= (point) (point-min))
	    nil ; (message "no such class or method: %s" word)
	  (setq klass (completing-read "Class: "
				       klass-table nil nil nil nil nil))
	  (erase-buffer)
	  (refe-call-process buf "--all" klass word))))

    (set-buffer-modified-p nil)
    (setq buffer-read-only t)
    (goto-char (point-min))
    (display-buffer buf)))

(provide 'refe)

元のファイルがあやふやなので、パッチじゃなくて全部を貼ってみた。

個人的には refe-make-completion-table はいらないなぁ。遅いし。

Re: refe.el によると、

説明なしのライセンスなしで、本気でメンテしたい方にお譲りします。

らしいけど ……

*1:今は anything を使うのが主流なの?

2008-07-30

第 28 回 Ruby/Rails 勉強会@関西に関するブログ

現在 Ruby 関西の勉強会 Wiki はトラックバックできないようになっている。
spam 対策らしい。spammer 憎い。

第 28 回勉強会のページにトラックバックが全然来ないと思ったらそゆことか。

悲しいので検索して集めてみました。

主に演習問題で気になったところ、今後盗みたいところなど。

第28回 Ruby/Rails勉強会@関西 参加してきました - rubyneko

演習問題の大変適当な解答など

大変適当などと言いながら、大変読みやすいコード。

  • Range が (1..100) なのがいい。
  • 隙あらば inject 派。
  • Array#choice と Numeric#divmod をパクらせてもらいました。
    • 私はいつも Array#[Kernel#rand(Array#size)] してしまう。

第28回 Ruby勉強会@関西に参加してきました。 - らいとなひび

勉強会の二次会にて、

「rubyneko の答え見たら、やる気なくなった。」
raito3
「自分の答えが出来る前に他人の答え見ちゃダメ!」

と怒られた。

なので、id:raito3 さんの解答は後で見ましたよ。

# NetBeans では、UTF-8の使用を強制されるため、
# puts, print メソッドを書き換えるモジュールを用意しました。

端末の文字コードを utf8 にするんじゃダメですか。そうですか。


第28回 Ruby/Rails勉強会@関西 に行ってきたよ - はこべにっき#

素数判定が正規表現だけでできるのですよ.Rubyだとirbで
'X' * n !~ /\A(XX+)\1+\z/
とやると,nが素数かどうかが判定できます.

これはすごい。

演習問題

def difficult_easy_problem
end

create_difficult_problem じゃなくて?


Ruby/Rails勉強会@関西 #28 - チナミニ

irb全然関係無くなってしまったのはご愛嬌。

私も勘違いしてたんですが、「irb で動作確認しながら作ってみましょう」なので、普段通りコード書けばよかったようです。

unless b == 0 || a < b || a % b != 0
  @ans = a.send(op, b)
else
  retry
end
  • 気に入らない問題は retry で作り直し。
  • unless ... が大変混乱します。

第28回 Ruby/Rails勉強会@関西に参加 - ekurodaの日記

いつも Bianchi に乗って来る人かな?

コード長いけど、表示とロジックは分離してないと気持ち悪くて仕方ないので、個人的にはこれで良し。include Observableするだけで一発でObserverが書けるrubyは最高。

デザインパターンが得意な人なんですね。

Ruby で学ぶデザインパターン」みたいな発表して欲しい。

  • 割り算がこっている。
  • Observer パターンが難しい (>_<)

第28回 Ruby/Rails勉強会@関西 行けなかった - morphine diary

夏風邪ひいてしまっていけませんでした。

勉強会に来てなくても宿題はやる偉い人。

question = rand(calc_max).to_s
          + operator(opr_kinds) + rand(calc_max).to_s
print question + ' = '
if eval(question).to_s == gets.chomp!
  • 問題を文字列で作って、Kernel#eval で答えを出す。

第28回 Ruby勉強会@関西に行ってきたよ! - ブログなんだよもん

課題そっちのけでひたすらirbrcをいじっていたのは内緒(ぉ

  • いきなり require 'rubygems' には驚いた。ふつう?
  • def ls path = "" の方がよくない?

第 28 回 Ruby/Rails 勉強会 - okkez weblog

とりあえず、うちの ~/.irbrc です。refe2 のところはあまりうまく動かない。まともに実装しようとすると bitclust を require してごにょごにょする必要があったりなかったりする。

  • method を to_s する。なるほど。
  • どんどん親へ向って捜す。すごい。
  • Kernel と Module の関係がややこしい。

演習問題 (模範解答)

  • readline ライブラリを使用して、打ち間違えたときも修正出来るようにしています。
  • 「むずかしい」の場合で最大40000(= 100 * 100 * 4) 通りしか問題は出題されないのであらかじめ計算してみました。

  • stdin って enter するまでは修正できなかったっけ。
  • あらかじめ全パターンを列挙。その手があったか。