HTML
你为了解决一个不存在的问题引入了 5 个新问题,就是这样……
#1 楼 @quakewang 是的。
但有几个问题,Rails3 之后 AR 对象内部其实非常复杂了,除了最核心的 attributes 属性之外,还有一些内部状态,比如关联缓存也被储存到了实例里,导致直接塞进去之后再读回来 AR 对象不是fresh
的(Rails3 时是这样,不知道 Rails4 是否有改动)。如果是片段缓存这种只读场景无所谓,如果可以对从缓存读出的对象再修改,就会带来同步问题。我觉得这也是 initialize_dup 和 encode_with 接口存在的意义。保证 dump 出来的对象是fresh
的。
我觉得 Rails 推荐的用法是 用 encode_with dump 出 attributes,用 allocate + init_with 初始化对象,序列化只需要存储的是 attributes,这样对象体积也减少了很多。
# AR内部状态
https://github.com/rails/rails/blob/f916aa247bddba0c58c50822886bc29e8556df76/activerecord/lib/active_record/core.rb#L550-L562
def init_internals
@aggregation_cache = {}
@association_cache = {}
@readonly = false
@destroyed = false
@marked_for_destruction = false
@destroyed_by_association = nil
@new_record = true
@txn = nil
@_start_transaction_state = {}
@transaction_state = nil
@reflects_state = [false]
end
然后 encode_with 这个接口对于 serialize attributes 居然是不 work 的 ... 本质是 attributes_before_type_cast 这个方法返回值不固定: https://github.com/rails/rails/issues/18210
# encode_with imp
def encode_with(coder)
# FIXME: Remove this when we better serialize attributes
coder['raw_attributes'] = attributes_before_type_cast
coder['attributes'] = @attributes
coder['new_record'] = new_record?
end
架构师^_^
#11 楼 @cliviazhou 大几?
#5 楼 @jasl http://blog.rubybestpractices.com/posts/ewong/013-IO-dup-and-dup-system-call.html
文件只有一个,但文件描述符和 Ruby IO 对象有多个,他这个就是没写进去..
设置 async = false 呢,没测
都合适
楼主就这样把 rubychina 玩成 stackoverflow
把 NewRelic 的 APM client 后端改成 InfluxDB 就强大了..
pry pry
没意义,人活着不是也没意义么,整天做的就是 killing time 啊!
fourty-four 和 fourtyfour 等价应该算是一个 WordDelimiter 相关的话题,solr 的文档描述的更全一些: http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.WordDelimiterFilterFactory
可能还需要根据驼峰或数字与字母间隔去拆:fourtyFour -> fourty four, windows2000 -> windows 2000
之前没有了解过 JWT,回去看了一下,感觉和 Rails 自带的cookie 签名机制没啥区别。更想听的是“Why jwt better”,和其他类似方案的对比,比如直接用 Rails 的 MessageVerifier 或 AES 加密 甚至直接在 account 上面加一个 api token 之类做法有什么优缺点之类的话题。还有,JWT 作为标准有什么约束力,如果标准没有人遵守其实也是一种束缚,大家各自使用自己的实现会更自由一些。
大家可以就这个帖子再讨论一下...
HR 好机智 居然会用+
过滤邮件
delete
不用那么麻烦。
# cat o.rb
$stdout.sync = true
(1..10).each do |i|
$stdout.puts i
sleep 1
end
# cat i.rb
while line = $stdin.gets
puts line
end
$ ruby o.rb | ruby i.rb
也可以用一个 Ruby 进程里,自己开两个管道,一个读一个写,推荐 Eric Wong 的这篇文章: http://blog.rubybestpractices.com/posts/ewong/010-An-introduction-to-the-Unix-pipe.html http://blog.rubybestpractices.com/