2006-06-22
特異メソッドでクロージャ(?)
バイトのO君に特異メソッドでクロージャみたいなことってどうやるんですか、つわれたので
o = Object.new
str = 'string'
def o.foo=(proc)
@__proc = proc
end
def o.foo(*args)
@__proc.call(*args)
end
o.foo = Proc.new{
puts str
}
o.foo
str = 'foo'
o.foo
みたいにすればできるんじゃない?って教えたんだけどきっと何か間違っていて、より良い解がある気がする。
vim script で HTTP クライアント
中途半端だけど作ってみたよ。vimproc 必須。
let g:HTTP = {}
function g:HTTP.new(host, ...)
let self.host = a:host
if a:0 >= 1
let self.port = a:1
else
let self.port = 80
endif
let self.headers = {'Host': self.host}
let self.query = {}
return deepcopy(self)
endfunction
function g:HTTP.get(path)
return self.access(a:path, 'GET')
endfunction
function g:HTTP.head(path)
return self.access(a:path, 'HEAD')
endfunction
function g:HTTP.access(path, method)
call g:vimproc.load()
let sock = g:vimproc.socket_open(self.host, self.port)
call sock.write(self.make_header(a:path, a:method))
let re = ""
while !sock.eof
let re .= sock.read()
endwhile
call g:vimproc.unload()
return g:HTTP.Response.new(re)
endfunction
function g:HTTP.make_header(path, method)
let hds = []
call add(hds, a:method . " " . a:path . " HTTP/1.0")
for key in keys(self.headers)
call add(hds, key . ": " . self.headers[key])
endfor
return join(hds, "\r\n") . "\r\n\r\n"
endfunction
let g:HTTP.Response = {}
function g:HTTP.Response.new(str)
call self.parse(a:str)
return deepcopy(self)
endfunction
function g:HTTP.Response.parse(str)
let lists = split(a:str, "\r\n\r\n")
let header_lists = split(lists[0], "\r\n")
let first = remove(header_lists, 0)
let self.code = matchstr(first, '[1-5]\d\d')
let self.headers = {}
for header in header_lists
let h = split(header, ': ')
let self.headers[h[0]] = join(h[1:], ': ')
endfor
let self.body = join(lists[1:], "\r\n\r\n")
endfunction
実行してみる
let h = HTTP.new('rails2u.com')
let res = h.get('/404_not_found.html')
echo res.headers
if res.code < 400
echo res.body
else
echo 'error ' . res.code
endif
結果
{'Content-Type': 'text/html', 'Date': 'Thu, 22 Jun 2006 13:24:13 GMT', 'Content-Length': '345', 'Connection': 'close', 'S
erver': 'lighttpd/1.4.9'}
error 404
最近マンガ買いすぎ
つっても週10冊ぐらいで、買いまくってる人から見たら全然たいしたこと無い量なんだけど。今までは本棚からあふれたら本を売っていたんだけど最近は床に積まれるように…。
今日も仕事してない
気がするメソッド。
vim を static compile
src/Makefile の一番上らへんに
LFLAGS += -Bstatic
追加してコンパイル。んで 8M 強の vim ができあがりで(たいがい)どのサーバでも動く!すばらしす。MonaOS の人に教えてもらった。
ActiveHeart
酒井法子じゃないほうなんすよ!!!
Rails の大きな弱点
Rails 使ったアプリケーションを作ろうとすると、横道にそれまくって普通に実装すると30分ぐらいな仕事でも数時間かかる縄。罠。
ActiveRecord::QueryCache
な、なんだってーくまー。
development:
adapter: mysql
query_cache: true
…
とかするとつかえるぽ、だけどつかえないぽ(エラーる)。test も書いてないし obsolete?
あと AR の insert/update/delete で query cache 全消去というステキ実装で、うーん。
オペレータと演算子
速度的にはほとんど変わらないのかな?
require 'benchmarker'
def equal_operator(obj)
!obj || obj.kind_of?(String) && obj == 'string'
end
def equal_if(obj)
if !obj
true
elsif obj.kind_of? String
if obj == 'string'
true
else
false
end
else
false
end
end
class OperatorBench < Benchmark::Benchmarker
def if
equal_if Object.new
equal_if Array.new
equal_if 'str'
equal_if 'string'
end
def operator
equal_operator Object.new
equal_operator Array.new
equal_operator 'str'
equal_operator 'string'
end
end
OperatorBench.bm(100000)
結果
:!ruby %
user system total real
if 0.340000 0.750000 1.090000 ( 1.086957)
operator 0.360000 0.770000 1.130000 ( 1.124448)
model に対する helper
ってあるのかな。通常の helper は基本 controller に対する helper で、でも model のとあるデータを html に整形して出力したいとき
model ExamplesHelper
def foo(model)
...
とするのは冗長だから model に実装したい、けど model には基本ビジネスロジックを記述するため html に整形するコードが入るのは綺麗じゃない。ので model に対する helper があったりすると便利だと思うんだけどどうなんでしょうか。もっと better な解決法があったりする?
期待しまくリング
><ノ。ぼくもなんか手伝えるように C がんばろう。。
Rails で DB 云々
えー趣味アプリならべつに頭空っぽで作ればいいだけなので本当に速攻終わると思うんだけど何が難しいのだろうか…。セキュリティって何?
設計じゃなくて DB 使う部分で躓くって云うのはただやったことのない事に対する恐れみたいなモンで一度定石覚えればこれほど簡単なことは無いのに。たぶんやってみれば簡単に覚えられると思うんだけど。
あとべつに AR なくても Rails べんりやん?と思った。
ベーグル
もちもちしててあまり好きくないなぁ。
scaffold
え、みんな scaffold 使ってないの?超便利なのに。Rails ちょっとだけつかって知ったかぶりする時期には scaffold つかえねー、と云う人が多い気がする。一時期の俺とか。
ブーン
chm でも bA つかえばマウスジェスチャできるしなぁ。つかわんけど。インクリメンタルな検索したいから使ってるようなもんだし、それが rails でなかったから api.rails2u.com 作ったんだし。