83's

Top > Archives > 2008 > January

January 09, 2008

to_xml 22:16

ActiveRecord#to_xmlを初めて使ったんだけど、あーこれ楽だ……。 Array#to_xmlも気が利いてるなぁ。

まあrender :xml => @records.to_xmlで済むならそれでいいんだけど、 Builderと一緒に使うにはどうしたもんかと思ったら :builderオプションで渡してやるとよいのかーというメモ。

# xxx.rxml(まだRails 1.2.6使ってます)

xml.instruct!

xml.records :foo => 'bar' do
  @records.each {|r| r.to_xml(:builder => xml, :skip_instruct => true) }
end

なるへそ。あと:skip_instruct => trueにしておかないとto_xmlのたんびにXML宣言が挿入される罠。

あ、あけおめ。今年はもうちょっとブログ更新したいですね。

Rails 1.2.6でもrake routes使えるじゃん 22:26

ルーティングの確認に使えるRails 2.0のrake routesがRails 1.2.6でもコピったら使えるっぽい。

% cp `gem env gempath`/gems/rails-2.0.2/lib/tasks/routes.rake lib/tasks

January 20, 2008

Date.parseでこけた 19:04

ruby 1.8.5

irb(main):001:0> Date.parse('18/Jan/2008')
ArgumentError: 3 elements of civil date are necessary
        from /usr/lib/ruby/1.8/date.rb:650:in `new_with_hash'
        from /usr/lib/ruby/1.8/date.rb:695:in `parse'
        from (irb):1

ruby 1.8.6

irb(main):001:0> Date.parse('18/Jan/2008')
=> Fri, 18 Jan 2008

おおう。さっさとバージョンあげろってことか……。

irb(main):001:0> Date.parse('18/Jan/2008')
ArgumentError: 3 elements of civil date are necessary
        from /usr/lib/ruby/1.8/date.rb:650:in `new_with_hash'
        from /usr/lib/ruby/1.8/date.rb:695:in `parse'
        from (irb):1
irb(main):002:0> Date.parse('18/Jan/2008'.tr('/', '-'))
=> #<Date: 4908967/2,0,2299161>

あww とりあえずこれでお茶にごしとくかw

January 27, 2008

ファイルのMD5 18:53

% md5sum ~/gauche-refj.txt.gz
31970f62bbb827c8fc14ebae6a132b25  /home/yz/gauche-refj.txt.gz

これをやりたいんだ。

Rubyだと

require 'digest/md5'
puts Digest::MD5.hexdigest(File.read("/home/yz/gauche-refj.txt.gz"))
#=> "31970f62bbb827c8fc14ebae6a132b25"を表示

で済むんだけど、Rubyでぬくぬくしてるとそろそろゆとり脳って言われそうなのでひさしぶりにGaucheで頑張る。

(use rfc.md5)
(use file.util)
(print (digest-hexify (md5-digest-string (file->string "/home/yz/gauche-refj.txt.gz"))))
;=> "6ff4b0c6979cb79d21e355d338769d5b"を表示

なんか違う。file->stringFile.readとは違うみたい。

rfc/md5.scmから適度にパクってこうなった。

(use rfc.md5)
(use gauche.uvector)

(define *buffer-len* (* 1024 10)) ; 10KB

(define (file->md5-digest path)
  (let ((buf (make-u8vector *buffer-len*))
        (md5 (make <md5>)))
    (call-with-input-file path 
                          (lambda (port)
                            (until (read-block! buf port) eof-object? => cnt
                              (digest-update! md5
                                              (u8vector->string (if (< cnt *buffer-len*)
                                                                  (uvector-alias <u8vector> buf 0 cnt)
                                                                  buf))))
                            (digest-final! md5)))))

(print (digest-hexify (file->md5-digest "/home/yz/gauche-refj.txt.gz")))
;=> "31970f62bbb827c8fc14ebae6a132b25"を表示

なげぇw けどdigest関係の必要な関数が把握できた。ウフフ

January 29, 2008

Gaucheのロードパス 03:16

環境変数GAUCHE_LOAD_PATH、goshコマンドの-Iオプション、あとは大域変数*load-path*set-car!でもしていじくる。

*load-path*いじるよりadd-load-pathを使うべきらしい。

add-load-path path &optional (afterp #f)

パスpathをライブラリロードパスのリストに加えます。 afterpに真の値が与えられていればpathは既存のリストの末尾に追加されます。そうでなければpathは既存のリストの先頭に追加されます。

ロードパスを変更したい場合、*load-path*を直接替えずにこのフォームを使って下さい。このフォームはコンパイル時に解釈されるのに対し、*load-path*を書き換えるコードは実行時に解釈されます。"use" や "require" はコンパイル時のロードパスを使うので、*load-path*への変更は反映されないかもしれません。