区块链只是去中心化的一种方式
不知道有没有人能帮我 up 一下 https://news.ycombinator.com/item?id=23076877
雖然帶頭人很牛逼,但是這個東西要怎麼用還是很迷糊。。
發現目前有唯一一家做了 uid 的是 hubzilla,這裡有一些機制的介紹 https://github.com/pixelfed/pixelfed/issues/216 https://zotlabs.org/help/en/developer/zot_protocol#Technical_Introduction
依賴於公私鑰對鑒權,但是我感覺這個會很依賴不同節點的節操,看上去不是很靠譜。
因为目前考虑的只是要达到数据自有的目的,就是在想这个中心服务器是不是不可避免的或者有没有其他取代方式,是不是也有 namecoin 类似的区块链方案?
uid 的形式我倒是觉得没有特别有所谓,邮箱和钱包其实差的就是能不能 revoke,私钥如果丢失了或者被盗用了,就是永远丢失了,或者只能等过期,邮箱对保护用户安全更好。
确实不行,应该提示一下的,我建个 issue 先
回复晚了不好意思,添加的关联是 post has_many people,没有定义反向关联,应该是不需要你说的 post_id 的,或者可以试试升级一下 gem 的版本再试试,如果有问题可以在 github 上发个 issue 具体看看
嗯,在打理一下可以发个 feature request 看看他们喜不喜欢
是的
要说的话 ary[1..-1] 其实是个很神奇的思路,直接把 begin 和 end 拿来用了,1..-1 和 1..Infinity 看上去是完全不等价的两个东西……
非常赞,ssr 和 webpacker 结合在我看来是完美的方案,可以避开前端各种状态管理,路由的坑。之前看 webpacker 的 react ssr 好像有人在 WIP,原来 react-rails 就已经支持了。
cichol#live.cn 两个 古银 古金
这样是可解的,就是得用户打密码登录,另外苹果的 ITP 把 google sign in 都搞的不能用了。。https://github.com/google/google-api-javascript-client/issues/342
是的,用缓存的话等过期就好,读取和 preload 会更新缓存,不用手动
这些是可以的:
router = Mrouter.new
router.add_route '(/page/:page)(/per_page/:per_page)', '233'
p router.match '' # => {:tag=>"233"}
p router.match '/page' # => false
p router.match '/page/12' # => {:page=>"12", :tag=>"233"}
p router.match '/per_page/12' # => {:per_page=>"12", :tag=>"233"}
p router.match '/page/12/per_page/34' # => {:page=>"12", :per_page=>"34", :tag=>"233"}
我在遇到 (
的时候直接让 trie 分叉了,然后匹配的时候是深度优先匹的。这样做可能 trie 重复的部分多一点,不过匹配是没问题的。
是指匹配不到 /per_page/34/page/12
?
这个可能得反过来加个定义,毕竟定义本身也没表达出可以反过来,别的应该还好吧
是的,不得不用啊。。手机和 pc 一定要相同的 url,就是读 session 也得用 mruby 了。。感觉很头疼
好吧,我解决了
def process obj
case obj
when String
obj.chars.map{|x| x.ord}.join('.')
when Array
obj.map{|x| process x}
when Hash
new_hash = {}
obj.each do |k,v|
new_hash[process k] = process v
end
new_hash
else obj
end
end
def recover obj
case obj
when String
obj.split('.').map{|x| x.to_i.chr(Encoding.find('utf-8'))}.join
when Array
obj.map{|x| recover x}
when Hash
new_hash = {}
obj.each do |k,v|
new_hash[recover k] = recover v
end
new_hash
else obj
end
end
dump 之前 process load 之后 recover
本质是把字符串改成数字的字符串,虽然应该也会有隐患,但是目前看来还没有问题
这 BUG 真是太坑爹,5 个小时就这么没了
数组还真是一个方法
array = lambda{|x| x+1}
p array[0] #=> 1
以上是声明一个自然数数组
#8 楼 @coooldfarmer 推特才叫恶心。。根本没有翻页
我觉得我还是很能理解 lz 的感受的,虽然理解并没有什么用
不过拼了却没什么回报的例子是比比皆是的,一神带四腿翻不了盘就是翻不了盘,单纯是运气不好也不奇怪,毕竟人的一生是抗争的一生
因为 Ruby 没办法监听 local_variable 的赋值行为,所以原则上是无解的
但是有一些黑科技。。 打个比方你可以分析源代码里对这个函数的调用,把参数拿出来
var1 = 1
def func(params)
line_num = caller[0].match(/#{$0}:(\d+):/)[1].to_i
param_name = File.open($0).readlines[line_num-1].match(/func\((.+)\)/)[1]
end
p func(var1) # => "var1"
大概就是这样,其实取参数用这个正则肯定不行。。但是我不会写正则,就糊弄一下
还有一种方法是看参数的 object_id 或地址,因为 Ruby 传参都是传引用 比对一下 local_variables 的 object_id 就好了,但是在方法内拿外面的 binding 是很麻烦的。。而且有同值不同变量名的话也会 GG
也举一个例子
var1 = 1
$bindings = {}
set_trace_func proc{|*e| $bindings[e[2]] = e[4] if e[0] == "line"}
def func(params)
line_num = caller[0].match(/#{$0}:(\d+):/)[1].to_i
params_binding = $bindings[line_num]
param_name = params_binding.eval("local_variables").first{|x| params_binding.eval("#{x}.object_id") == params.object_id }
end
p func(var1) # => :var1
不过这种不可控的 set_trace_func 会严重拖慢程序的执行
require 'ripper'
require 'pp'
def test=(n)
2
end
code1 = "self.test=1"
code2 = "self.send(:test=, 1)"
p eval code1 # =是assign,返回值永远是用于assign的值
p eval code2 # send是方法调用,调用test=方法,返回值就是这个方法的返回值
# 两段代码解析后的语法树,详见《Ruby Under A Microscope》
pp Ripper.sexp(code1)
pp Ripper.sexp(code2)
#2 楼 @ziu =属于 assign,确实是特殊的,和普通私有方法不同
require 'ripper'
require 'pp'
def test= n
puts 1
end
def test n
puts 2
end
private :test=, :test
code =<<EOF
self.test= 12
self.test 15
EOF
pp Ripper::sexp(code)
[:program,
[[:assign,
[:field,
[:var_ref, [:@kw, "self", [1, 0]]],
:".",
[:@ident, "test", [1, 5]]],
[:@int, "12", [1, 11]]],
[:command_call,
[:var_ref, [:@kw, "self", [2, 0]]],
:".",
[:@ident, "test", [2, 5]],
[:args_add_block, [[:@int, "15", [2, 10]]], false]]]]
test= 解析出来的操作是把参数 assign 给对象的属性
私有方法为=结尾,如果不显式调用,就和局部变量赋值产生歧义,所以只有对象的属性能自定义 assign 的方法
关于 ruby 比较底层的机制,推荐书籍 Ruby Under A Microscope,很快有中文版【貌似