Hatena::Groupsubtech

#生存戦略 、それは

-> 06 { 06 / 22 }

特異メソッドでクロージャ(?)

23:01 | はてなブックマーク - 特異メソッドでクロージャ(?) - #生存戦略 、それは

バイトの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 クライアント

22:24 | はてなブックマーク - 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

最近マンガ買いすぎ

21:37 | はてなブックマーク - 最近マンガ買いすぎ - #生存戦略 、それは

つっても週10冊ぐらいで、買いまくってる人から見たら全然たいしたこと無い量なんだけど。今までは本棚からあふれたら本を売っていたんだけど最近は床に積まれるように…。

今日も仕事してない

21:35 | はてなブックマーク - 今日も仕事してない - #生存戦略 、それは

気がするメソッド。

vim を static compile

19:38 | はてなブックマーク -  vim を static compile - #生存戦略 、それは

src/Makefile の一番上らへんに

LFLAGS    += -Bstatic

追加してコンパイル。んで 8M 強の vim ができあがりで(たいがい)どのサーバでも動く!すばらしす。MonaOS の人に教えてもらった。

ActiveHeart

17:51 | はてなブックマーク - ActiveHeart - #生存戦略 、それは

酒井法子じゃないほうなんすよ!!!

Rails の大きな弱点

17:44 | はてなブックマーク -  Rails の大きな弱点 - #生存戦略 、それは

Rails 使ったアプリケーションを作ろうとすると、横道にそれまくって普通に実装すると30分ぐらいな仕事でも数時間かかる縄。罠。

ActiveRecord::QueryCache

17:40 | はてなブックマーク - ActiveRecord::QueryCache - #生存戦略 、それは

な、なんだってーくまー。

development:
  adapter: mysql
  query_cache: true

とかするとつかえるぽ、だけどつかえないぽ(エラーる)。test も書いてないし obsolete?

あと AR の insert/update/delete で query cache 全消去というステキ実装で、うーん。

オペレータと演算子

16:58 | はてなブックマーク - オペレータと演算子 - #生存戦略 、それは

速度的にはほとんど変わらないのかな?

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

16:27 | はてなブックマーク -  model に対する helper - #生存戦略 、それは

ってあるのかな。通常の helper は基本 controller に対する helper で、でも model のとあるデータhtml に整形して出力したいとき

model ExamplesHelper
  def foo(model)
    ...

とするのは冗長だから model に実装したい、けど model には基本ビジネスロジック記述するため html に整形するコードが入るのは綺麗じゃない。ので model に対する helper があったりすると便利だと思うんだけどどうなんでしょうか。もっと better な解決法があったりする?

期待しまくリング

14:56 | はてなブックマーク - 期待しまくリング - #生存戦略 、それは

g:rubyist:id:nazoking

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

Rails で DB 云々

14:54 | はてなブックマーク - Rails で DB 云々 - #生存戦略 、それは

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

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

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

ベーグル

11:37 | はてなブックマーク - ベーグル - #生存戦略 、それは

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

scaffold

11:26 | はてなブックマーク - scaffold - #生存戦略 、それは

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

ブーン

10:52 | はてなブックマーク - ブーン - #生存戦略 、それは

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

babiebabie2006/06/22 11:09なる。>インクリメンタル検索 
って、ちょ、そのエントリタイトルやめてwwww

secondlifesecondlife2006/06/22 11:27ブーンww^^

kdmsnrkdmsnr2006/06/22 14:42つかうつかう>scaffold

secondlifesecondlife2006/06/22 14:47つかうよね(!-!)ノ

moromoro2006/06/22 18:39ノシ scaffold反対派
いや、モデルとコントローラは使うんですけど、
スペジェネもよく使ってますけど。でも、やっぱり。うーん。
で、ActiveRecordHelperとかを見る限り、やっぱり普通のHelperとして実装させたがってるに一票 >モデルの出力
それでもめんどくさいときはモジュール作ってmix-inしてるけど、さらにそれすらメンドいときはどうすんでしょうね。。

secondlifesecondlife2006/06/22 18:45えー。はてスクも scaffold ですよもちろん!
view はかなり書き換えますけど list 出力とかほとんど実装弄らなくてすむし。
> やっぱり普通のHelperとして実装させたがってるに一票
うーん、やはりそうなんですかね。model オブジェクトを view で extend すればすむ!とか思ったけどアレゲ

moromoro2006/06/22 21:31「はてスク」ってなんか響きがステキですごくいいです。
scaffoldはイキオイdisり過ぎたのでもうちょっと見直してみます。
コントローラなんかは確かにだいぶゴージャスになってるしなぁ。
> model オブジェクトを view で extend すればすむ!
これ何気によさそう。RubyならView周りの実装を分離するのも簡単にできるし、app/models/*.rbのなかに出力用コードがあるのはあれだけど、app/views/model_helper/*.rbとかにモジュールを入れて実行時にextendならそれでよくね?と目鱗。
つ「+1 興味深い」

トラックバック - http://subtech.g.hatena.ne.jp/secondlife/20060622