#24 楼 @bhuztez 嗯我说得太粗略了。其实和 session 的实现相关,rails 里 session 默认是整个 base64 或者加密了加上签名存 cookie 里的,然后 cookie 中的这个 session 项的生命期是没设的,所以关闭浏览器就没了。session 用数据库或者内存存储的话处理会不太一样.
但是实现 remember me 的话,往往是加上一个 expire 比较长的 cookie (那么 cookie 就变成 session=...;remember_me=...;expires=...
了), 关闭浏览器也还存在,清空 session 的动作是不消除其它 cookie 的,这种情况基本没影响...
但如果像 ruby-china 这样,把 session 项也设置上生命期来记住用户登录状态,重置 session 确实什么都没了。
ruby 调用 OTS 可以啊,直接上 fiddle
就行了,估计结果差不多。
#21 楼 @ywjno 日语的分词工具最流行的是 mecab, 用二元语法 (bi-gram, 就是只记录相邻两个字之间的条件概率), CRF 模型,用 viterbi 算法搞的,中科院分词啥的感觉就是照抄了 mecab, 然后加上一些无关紧要的经验判断做调料,根本就和什么语没关系...
数学之美里面介绍的是最大熵方法,也算一种分词方式,好处是不受词典限制。
viterbi 算法是从隐马模型来的,有个做得挺精致的 ppt. HMM 的 viterbi 算法扩展一下就能搞 CRF 了。
类似的东西还有个 SGD, 研究反向传播算法的家伙特别喜欢,(例如 dejavu 格式的作者 ), 只是好像没见过用来分词...
#7 楼 @feitian124 声音的频率按 10000 Hz 算,调幅数字信号的理论最大传输速度就是 10kB/s, 但是加上校验或者用调频方式,加上波幅调整的技术精度限制,估计有 1kB/s 就不错了...
csrf 这个处理方式是凝聚了无数经验的结果...
有跨站的需要就 protect_from_forgery except: [...]
呗。或者对 API 调用整个关掉 csrf 验证。
跑题:csrf 还有各种坑在里面,例如浏览器会缓存页面,如果打开一个登录页面,关闭浏览器再打开浏览器,session 失效,session 里的 csrf token 就和页面上的不一致了,但登录是能成功的。因为 csrf 失效只是清空了 session, 然后登录的话不用验证 session 里的 user id 的,所以还能正常登录,而且这样是没有危险的...
另外如果把字节用调幅信号传送,听得见的声波的频率在 (20-16000Hz), 比微波信号 (300M-300GHz) 的频率和带宽都低很多,不管调频 (FM, 传输率和带宽相关) 还是调幅 (AM, 传输率和频率相关) 都比蓝牙慢很多的... 调相或者调相差分传输率也和频率/带宽相关。还有环境音干扰失真也很严重... 玩一下挺有意思,不实用...
只有长连接需要高并发,特别是聊天或者游戏服务器的场景,而且都有相应的解决方案... 大部分网页都是一下就搞定的并发有个鬼用...
@zhangjingqiang @bhuztez 写页面绝对是 django 比较慢,那个模板略蛋疼啊... 一个 admin 搞这么久是他们不对,都不会查一下各种 admin 的 gem...
声波的频率太低,限制了波特率,也就传歌比较效率... 可以把歌压缩成超声波传送...
可以记录 csrf 的 referrer 来提醒用户该网页有问题... airbrake 的异常统计里也能看到哪个站在使坏或者被注入了...
另外重置的是 session 不是 cookie, 如果有"记住我"的设置的话一般会写到 cookie 中而不是 session 中,所以登出的用户只包含没点选"记住我"的那些...
P.S. 现在 ruby-china 的 markdown parser 被搞得很奇怪,~~删除~~
前后不加空格的话就不能做删除线,代码中的空行也被自动消灭了 ...
可以的哦,前提是 f
是在源文件中定义的,看你的描述应该满足。
假设有方法 f
def f a=1, b=2
# ...
end
那么获取它的默认参数的值可以这么做:
require "method_source"
require "ripper"
class OptParamsBuilder < Ripper::SexpBuilder
def initialize meth
@src = meth.source
super @src
end
def on_def *xs
@method_name ||= xs[0][1]
super
end
def on_params *xs
@opt_params ||= xs[1]
super
end
def opt_params
parse
params = @opt_params.map do |(_, param), value|
param
end
first_line = @src.lines.to_a[0]
eval "#{first_line}\nreturn #{params.join ' , '}\nend"
send @method_name
end
end
p OptParamsBuilder.new(method(:f)).opt_params #=> [1, 2]
@robbin 新博客很漂亮啊
学 bilibili, 每半小时解析一次优酷视频地址
然后用 <video><source><source>...</video>
生成干净的播放器...
首先应该查找触发条件:是光?声音?静电?温度?电容变化?爱恶作剧的某同事在附近?做实验才是正确的寻找答案的方法
楼主可以尝试表演很惊讶害怕,不知所措的表情,附近有人憋笑的话就知道答案了. 如果让别人把外套放椅子上也能启动,就表明和楼主个人无关,如果不能,就很可能是楼主的电容或者气场异于常人 (学名叫电波体质). 如果用东西蒙着电脑,电脑看不见也能启动,就表明光线变化不是启动条件 (macbook 的键盘就能探知光线变化决定是否发光). ...
python 的新网站挺好看的
iciba 和常见词典经常搜不到一些生僻词或者流行语的,urbandictionary 基本可以
例如 Taylor Swifting, AMA, w/o 之类的
编译和解释的界定要看宾语...
编译 = code generation, 这个 code 可以是任何代码 (源文件,字节码,机器码,数据,文本...), 编译的结果可以存在文件里,也可以存在内存里。
ruby 可以是编译器:把源文件编译成字节码 ruby 也可以是解释器:解释执行字节码
javac 是编译器:把源文件编译成类 (字节码) java 可以是解释器:解释执行字节码 java 也可以是编译器:把热的字节码编译成机器码 (JIT), 不经过汇编
只有放在可执行内存里的机器码可以直接送给 cpu, cpu 是机器码的解释器
字节码是语言设计的比较效率的中间代码表示,生成字节码不需要申请可执行内存。
汇编是一种 语言 , 基本可以 1:1 由 assembler 翻译成机器码。gcc -S
生成的就是汇编,gcc
编译 C 语言是先编译成汇编,然后调用 gas
把汇编编译成机器码。
debug 时看到的 xor %rax, %rax
之类的就是 反编译 出来的内容 (机器码 => 汇编).
常常有人分不清 强/弱类型 和 静态/动态类型 的区别... 这和有些语言卖广告时喜欢混淆视听也有关系...
能的
export ACK_OPTIONS='--text --ignore-dir=log --smart-case'
原因很多... 例如防火墙把你的连接喀擦了,或者是你的 socket 对象 close 掉了,没代码没真相...
和企业号同型的船叫企业级
从帆船到太空船都有
用了 FreeTDS, 应该是 Unix 和 Linux 都能用的跨平台 sql server 驱动
@chenge 你不爱用 migration 可以用 datamapper 代替 activerecord, migration 和交互工具都不需要了。
只是数据库的演化往往不是简单的把 sql 放版本控制就能搞定的。等到你以后碰到实际问题,自己重造出一套 migration 工具后,就会理解为什么有 migration. 等你 migration 写多了,就会理解为什么要专门为此设计一套 dsl...
还内置 berkley db 呢... 以前还内置过 soap, 不过删掉了...