A Day in the Life

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 な解決法があったりする?

期待しまくリング

g:rubyist:id:nazoking

><ノ。ぼくもなんか手伝えるように C がんばろう。。

Rails で DB 云々

えー趣味アプリならべつに頭空っぽで作ればいいだけなので本当に速攻終わると思うんだけど何が難しいのだろうか…。セキュリティって何?

設計じゃなくて DB 使う部分で躓くって云うのはただやったことのない事に対する恐れみたいなモンで一度定石覚えればこれほど簡単なことは無いのに。たぶんやってみれば簡単に覚えられると思うんだけど。

あとべつに AR なくても Rails べんりやん?と思った。

ベーグル

もちもちしててあまり好きくないなぁ。

scaffold

え、みんな scaffold 使ってないの?超便利なのに。Rails ちょっとだけつかって知ったかぶりする時期には scaffold つかえねー、と云う人が多い気がする。一時期の俺とか。

ブーン

chm でも bA つかえばマウスジェスチャできるしなぁ。つかわんけど。インクリメンタルな検索したいから使ってるようなもんだし、それが rails でなかったから api.rails2u.com 作ったんだし。

記事の一覧 >