byte_array.force_encoding('utf-16le').encode 'utf-8'
如果 le 不对就换成 'utf-16be'
方向错了... 不是看 rails 而是要看 rack
我没看仔细,请忽略...
我写了个 https://gist.github.com/luikore/5850721 , 就是查表的,0.1 秒不到
简单思路就是前半和后半都做个表 (其实可以用同一个表)
表的内容是 { 值 => 和为这个值的排列数 }, 然后复杂度就 √n 了
哈鸡卡西...
绝对不是 ruby python go
肩扛火箭筒,还是 lz 进入了戏服界?
#82 楼 @yedingding 这句子信息量巨大...
论如何逃脱跨国追捕...
github 为站外图片移除那个黄色 warning 是不对的... 假安全=更危险
#1 楼 @leozwa S>
和 S
可以一样也可以不一样,由于 S
用的是 native endian, 系统是 big endian 才一样。
在 VAX, x86 指令里用的 word/dword/qword 数据,处理字符串的 W 系列的 win32 API 里,用的是 little endian. 我们的台机和本基本是 x86 的,所以 native endian 往往等于 little endian. Mac OS X 的 NSString
内部也是用 little endian 的 utf-16 code unit.
但以前 sun 为了让 java 在他们的 sparc 上跑得比较快 (sparc 是 big endian 的), 字符串用了 big endian 的 utf-16 做内部表示 (文档里就笼统的说 unicode, 反正也没暴露 API).
unpack 文档如 #1 楼 链接
bit 就是位,8 bit 等于 1 字节
S
意思是 short, 在 C 语言里 short
是 16 位也就是两字节表示的整数
小写 s
是有符号 (signed, 也就是能加负号), 能表示的整数范围是 -32768 到 32767
大写 S
是无符号 (unsigned, 也就是不能加负号), 能表示的整数范围是 0 到 65535 (所以 socket 端口可以在 0..65535 取值)
关于 endian
假设有两个字节 \x01\x02
, 可以解释成 1*256 + 2, 也可以解释成 1 + 2*256, 到底怎么解释要看系统或者协议是怎么规定的。native endian 就是使用和系统一致的 endian.
网络协议中一般用 big endian (network endian 和 big endian 一个意思).
big endian 的意思就是先接收到的字节表示高位,后接收到的字节表示低位。
unpack 中用 >
表示 big endian, <
表示 little endian. 之所以用 >
这个符号是因为比较形象:左边的字节对结果影响比较大。
"\x01\x00".unpack 'S>' #=> 1 * 256 + 0 = 256
"\x00\x01".unpack 'S>' #=> 0 * 256 + 1 = 1
正则的话 /\A[\p{Han}\p{Alnum}\-_]{4,24}\z/
就行了,但是渣浪验证的长度是转码成 gb18030 后的字节数而不是字符数...
validates :weibo_nick, length: {
maximum: 24,
tokenizer: lambda{|s| s.encode('gb18030').bytes }
}
这样写就可以了:
yxfilm.us/blog/2013/06/centos6-4下安装gitlab5-2/
yxfilm.us/blog/2013/06/centos6-4下安装gitlab5-2/
标准中 url 是不带非 ascii 字符的,你在浏览器上地址栏看到的是为了好看自动把 %xx 转换了结果
#11 楼 @blacktulip 额有些写法是为了解决 IE5 不能释放循环引用而弄的吧,大部分都是没用的花拳绣腿...
我觉得理解 coffeescript 的 class / 继承 做法 和 jquery 的 extend 就够了...
这段应该是书里用来证明 for 循环里起闭包很容易出错的:
我们写代码时经常会在循环里建造一系列的闭包 function, 以为每个都对应了不同的 i
, 结果全部都是同一个 i 还是超出范围的那个...
所以 js 里其实推荐用 array.forEach 的,或者再包个 function 让 result 的每个元素都有自己的一个 i (文绉绉一点说,就是 "不用共享状态来传递消息,而用传递消息来共享状态") :
for (var i = 0; i < 10; i++) {
result[i] = (function(i) {
return (function() {
return i;
})
})(i);
} // 爆炸了没? 还是乖乖用 forEach 吧
btw.
js 的 array.forEach 不能 break
和 continue
, 大大限制了其用途,所以依然是个蛋疼的语言...
其实为了 forEach 支持 break 和 continue, 很多语言都做了超多的工作。
例如 C++ 和 java 教程里都会唱 iterator 很好使:用 iterator, 就能把抽象的元素 traverse 放到普通的 for 里面去,break 和 continue 都能自由使用了还容易做优化 -- 唯一问题是一碰到并发/并行访问一个容器,iterator 就从救世主变成了万恶之源...
而在纯函数式编程语言里,一般是只有 map/fold/filter 而没有 for 的。一般需要 break 的地方,程序员可以自行脑内转换成 find
调用,而本来要 continue 的地方,程序员都自行包个条件判断或者模式匹配... ES5 的话就是 array.every()
了 (这个函数相当于 ruby 里的 Array#all?
, 却是 js 里唯一具备按返回值中断循环之神奇功效的 functional primitive ...), 但我基本没见过有人用它来替代 break ...
#8 楼 @blacktulip 好像是不能直接学,但可以直接用... 还是先看完 js 书吧
写 js 总要想 each 的第一个参数究竟是 index 还是元素... 直接 coffee
1 是 lambda call 早了 2 是 js 里的 i 是多个 functions 之间共享的变量,而你的代码里 i 是 block local 的 3 是 for 循环最后 i 会变成 10, 而用 each i 最多变成 9
def create_functions
result = []
i = 0
while i < 10
result[i] = lambda { i }
i += 1
end
result
end
create_functions[0].call