要弄清楚局部变量的作用域啊,而且 self.next 那里无限循环了
def topics
1.upto 100000 do |page|
url = "http://bbs.gfan.com/forum-274-#{page}.html"
@agent.get url do |page|
page.search('tbody[id^=normalthread] a.xst').each do |a|
yield a
end
end
end
end
o.topics{|a| ... }
小明缺乏的是力量和荣耀,只有比邻居更野蛮才能对付野蛮的邻居,明天锻炼身体去 lok'tar oga !
编程就是将自然语言需求写成形式语言的过程... 程序员之所以存在的一个理由就是客户说不清楚...
楼主用肯定断言表达 "不能全是数字" 是经过了一次逻辑运算的结果: ¬(∀c, c 是数字) => ∃c, ¬(c 是数字)
按照要求直接用否定断言 (?!)
也可以:
/\A
(?! \d+\z)
(?! [_-])
[[:alnum:]_-]{3,15}
\z/x
用 seed 或者 fixture 放手动档数据
或者你已经有一个内容丰富,舍不得搞掉的测试数据库了,可以在测试环境下跑 migration 更新表结构再跑测试
RAILS_ENV=test rake db:migrate
rake test
另外... 没几种写法还能称作回字吗?
/\A
(?= .*\D)
(?! [_-])
[[:alnum:]_-]{3,15} # alnum = alpha + number
\z/x
正则里的断言就和 prolog 的 rule 差不多啦 各种预定义好的 unicode character class 就和 prolog 里的类型差不多?
#4 楼 @zhangyuan request.headers['X-Real-IP'] || request.remote_ip
?
为啥不直接用 request.headers['X-Real-IP']
呢?
我嵌的 rvm 安装的 ruby, dylib 位置全部用 install_name_tool 改一遍就好了
#6 楼 @dreamskyvt 知道为什么 windows 叫 windows 么?就是因为程序都必须有一个窗口... 所谓后台程序只是把窗口隐藏了而已... 你可以用 win32api GetConsoleWindow()
获得控制台窗口句柄,然后用 ShowWindow(hwnd, SW_HIDE)
把它隐藏了...
用户懒得装 gem 有各种绕过去的办法,例如你可以在脚本里
begin
require '...'
rescue LoadError
system "gem install ..."
end
或者用 OCRA 把 ruby 和 gem 和脚本打包成一个可执行文件 (以前室友给游戏汉化组做的打包工具就是这么干的...), 或者你可以写一个 msi installer 在里面拷文件,各种奇技淫巧都有...
#19 楼 @jimrokliu 用 BCD 存还是字符串存看数据库的实现吧,如果是 mongo 或者 sqlite 肯定是字符串
@lgn21st 应该说只有 windows 的子进程不受父进程影响...
但是 system, exec 都是等待子进程完成才结束的
创建独立进程可以用 win32-process http://rubydoc.info/gems/win32-process/0.7.1/frames
1.9 用 Process.spawn http://rubydoc.info/stdlib/core/Process.spawn
貌似有 3 方面的问题:
stock_fitting.amount 赋了 -1 应该是 update_attributes!
在更新数据库之前做的,因为 update_attribute 要调用 model 的 validation, 而 validation 需要新的值哦.
事务出错应该回滚,但是内存中模型属性人家不负责给你回滚的...
stock_fitting.reload
"#{stock_fitting_amount},#{stock_fitting.amount}, #{pro_out_stock.amount}"
# 是 -1, 0, 1 应该就对了
至于算出 -1 的原因,可能是 transaction 开始后,又卖出了一件?或者是 pro_out_stocks 里面对应两个相同的 fitting_id ? 出错然后回滚是正确的处理,但如果想少出错,可以优化一下 transaction, 或者加入一次重试
最后一个问题好像挺严重:你在 transaction 里面把异常吞了,事务回滚不了吧?rescue 最好在 transaction 外面做
.amount
有调用 sql? 请求内缓存不?是不是脏数据?
所有的性能优化都是有代价 (空间/时间,编译时/运行时,复杂实现/简单实现...) 的,人们都倾向于说 benchmark 如何快,但却没告诉你代价是什么。
例如一般都说 java gc 性能很好,但是 semi-space 分代 GC 的代价就是 native 调用很难写,和 native 代码交互的 object 要手动 pin 住,无法在堆中移动,使得 JNI 效率大打折扣,不能用就重造轮子,最终全部在 c/c++ 里已经有的东西都要用 java 重造一遍... 这也造成了 "java 库很丰富" 的假象... 用 java 会有一些让人 "wtf" 的地方,例如 "你可以建议 gc 收集但不能确实让它开始收集", 这个就是多线程 gc 的代价之一...
ruby 虚拟机性能已经很好了,系统调用效率比 java 高 (写个 echo server hello world 测测就知道了), 模板引擎渲染速度比 go 快...
1.4+1.7
=> 3.0999999999999996
如果是工程计算,这个结果精度是非常高的,但如果是算钱,这个结果是 3.1 才对:
require 'bigdecimal'
(BigDecimal('1.4') + BigDecimal('1.7')).to_s 'F'
=> "3.1"
decimal 是用字符串存的,或者说是 10 进制,占用空间大,运算速度慢,精度可定制 float 是按照 ieee 标准存的,或者说是 2 进制,占用空间小,运算速度快,精度固定
只是 10 进制有限小数在 2 进制里可能是无限循环小数,存储空间的长度是固定的肯定要截断
做 rails 基本是两三下就把业务搞定了,然后大量的精力在调整 UI 上...
就等评测 leap motion 了
-I
参数的重要性... 假设目录结构是这样
A/
lib/
test/
a_test.rb
B/
lib/
test/
b_test.rb
cd A/test
ruby -I../../B/lib -I../lib a_tests.rb
cd B/test
ruby -I../../A/lib -I../lib b_tests.rb
或者写个 rake 任务一次过搞定
Ruby 2.0 的话可以用奇技淫巧...
(concurrent? ? db_specs : db_specs.lazy).map do |label, options|
Thread.new do
build_db label, options
end
end.each(&:join)
问题肯定在 a["credentials"] 赋值时给了一个字符串 (用了to_json
吧?) 而不是 hash, 所以你取值时还得 parse 成 hash:
JSON.parse(a["credentials"])["node_id"]
json 标准里没有 symbol 类型,所以转成 json 时 key 就变成 string 了