char 类型问题可多了... 首先字符串必须内码一致并且用定长编码,如果处理是不同编码的内容,就要先统一转换成内码再处理,你是可以直接用 enumerable 方法,但是之前和之后的转换比 each_char / each_byte 要麻烦,而且用户又怎么知道迭代的是字符还是字节呢?
内码其实用 utf-32 才是正确的,但由于历史原因 (最初他们以为全宇宙字符不会超过 65535 个), 常见语言都用了 utf-16 (最初定长的时候叫 ucs-2), 例如 C++ 的 wchar_t
(wchar_t
在各平台长度不一样又是另一个坑了...), OC 的 uchar
, Java 的 char
.
但 utf-16 和 utf-32 都有 less endian 和 big endian 的不同 (例如 windows 的 "unicode" 和 java 的 "unicode" 是二进制不兼容的)...
超过 65535 的字符要两个 char 才能表示,为了解决这个问题,就衍生出各种新概念 (如 glyph) 去表达原本"字符"的意思,定长编码的预设也失效了,char 类型也不是字符的意思了,可坑爹了...
ruby 处理 utf-8 字符串:
"𝄞".size #=> 1
"𝄞".bytesize #=> 4
java 里:
String s = "𝄞";
s.length(); //=> 2 WTF?
s.codePointCount(0, s.length()); //=> 要得到正确的结果, 还要在 javac 加上 -encoding UTF-8 参数
所有基于 java 的二奶语言弄这类超出 65535 的字符都超蛋疼 (jruby 虽然结果正确,但 irb 输入都困难...) clojure 我整了个 rlwrap 可以输入了但正确结果我是弄不出来 ...
归根结底最大的祸害就是这个暧昧不清的 char
类型...
#6 楼 @windwiny 不管 p327 还是 p362, range 作为逻辑条件都是上下文相关的:
http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html
You can use a Ruby range as a boolean expression. A range such as exp1..exp2 will evaluate as false until exp1 becomes true. The range will then evaluate as true until exp2 becomes true. Once this happens, the range resets, ready to fire again
production 输出的东西都在 logs/production.log 里了
spree 栈太深 -_-
没看明白..
def a
... # 静态的逻辑
yield
... # 静态的逻辑
end
a{ 动态的逻辑 }
Date.now.to_time < Time.now
或者
Date.now < Time.now.to_datetime
:label_html => {:id => "add-label"}
:input_html => {:id => "add-input"}
:wrapper_html => {:id => "add-wrapper"}
在 test_helper 里判断一下如果是 production 直接 exit!
?
$ pry
> require 'active_support/all'
> cd String
> show-doc classify
rails 里放到 lib 目录,或者在 config/application.rb
的最后加一行 (假设是 /home/xxx/y.so)
require '/home/xxx/y.so'
或者像 #3 楼说的那样
$:.unshift "/home/xxx" # 这里最好用 unshift, 后面追加的话, 如果你的 so 和某个文件同名就载不来了
require 'y' # 这里不用加扩展名也可以哦
合并成同一个 action 加个参数判断是否是第一个页面链过来的?
代码过多加 module, 职责过多加 scope ...
700 够高了...
1 请求/秒就能撑起百万 PV/月的应用...
2.0-preview1 的 ChangeLog 里有:
sat Jan 7 22:25:50 2012 Narihiro Nakamura [email protected]
- gc.c: use Bitmap Marking algorithm to avoid copy-on-write of memory pages. See [ruby-dev:45085] [Feature #5839] [ruby-core:41916].
但 1.9.3-p327 没有
另外 1.9.3 已经是使用了 lazy-sweep 手段的增量式 gc, 不会有像 1.8 那样的卡住的情况了
再另外同样是这个作者 nari 已经做了 parallel gc 的原型,据称可以提升 40% 左右的 gc 速度
针对 css @media braile
(盲文) 和 @media speech
整?
@xds2000 C 扩展慢的问题不好解决吧?
Ruby 写 C 扩展很容易的一个原因是 Ruby 的 GC 是保守式 GC, 保守式 GC 可以通过扫描栈获得变量存活信息而不用在 C 代码中手动释放对象.
而 JNI 完全就不是这么回事,你要各种手动 JNIEnv->releaseXXX
, 而且对象进入到 C 实现的代码中前,指针会在内存中 pin 住,直接脱离 GC 的 compact 阶段...
这种异构导致要么得用 Java 重写相应的 C 扩展,要么得在调用前走好厚的 FFI 包装,本来能变快的东西却变慢了...
web 服务器没有办法获取代理后面的 ip 吧?
可以弄贝叶斯方法筛选广告贴之类的...
用 xml 解决一个问题,你就有了两个问题,然后再用 xslt, 你就有了ℵ2
个问题
XSLT 就是 xml 版的 lisp, 最早我就在暴雪官网看到过用... 后来换掉不用了,太蛋疼了...
?
sed -i .bak 's/ftp.ruby-lang.org\/pub\/ruby/ruby.taobao.org\/mirrors\/ruby/g' ~/.rvm/config/db
wiki 里不是有个 -e
参数么你怎么没加..
可能你没有 C 有关基础,Ruby(MRI) 是用 C 实现的,能用的编译器如我上面说的有 gcc 和 clang, 而 llvm-gcc 不行.
编译第一步是 ./configure
, 检测环境并产生 makefile, 这时就决定好了用哪个编译器,如果你一开始编译出错了,然后换了编译器,应该把源代码目录删掉再继续。
选择 GCC 最简单的方式就是 configure 之前
export CC=`your path to gcc`
替换源直接打开文件编辑 ~/.rvm/config/db
替换 ftp.ruby-lang.org/pub/
成 ruby.taobao.org/mirrors/
就好了嘛...
最大的障碍是 Mac 更新很快很频繁,ruby 相关的开发也很活跃,所以大部分教程都会很快过时, 然后无头苍蝇般每个都弄一遍结果就是像你这样产生奇怪的问题,按照 rvm requirements
去做是不会出问题的...