#20 楼 @yedingding 不会吧,碰巧我明天去上海你们就要搞,不人道啊
#13 楼 @solomon_fc #14 楼 @armpc2008 #15 楼 @zhuf 多发言多参与,也欢迎多提问(当然方式上建议参考《提问的智慧》)
ubuntu 现在缺省的是 mysql workbench,感觉还行
我很犹豫,是不是应该说“嗯嗯,楼主说的对”
网站还是没处理,是不是只有运营和市场,没有技术人员,现在开始招干活的了?建议项目外包吧
真的不容易
这个有意思,下载看看
#10 楼 @yedingding 不反对啊
一开始没听出来是江南 style
上次用 google 视频,感觉效果还行
非常棒!
#22 楼 @luikore 恩,这个不错,多一行 require,不过可以简化最长的那句
require 'scanf'
Dir['*'].each do |dir|
puts "%15s: %.4f %s" % [dir, Dir["#{dir}/*.txt"]
.map{|x| [File.read(x).scanf('max:%d min:%d/').reduce(:-), x] }
.group_by{|a| a[1][-14..-8]}
.map{|k,v| [v.map{|a| a[0]}.reduce(:+).to_f/v.size, k]}
.max].flatten
end
性能暂且不论,可读性有提高,可惜还是做不到 one-liner
非常好的文章,持续关注
#11 楼 @jimrokliu 果断歪楼,上次去北京见过 @chairy11 ,不过不知道她单身,友情提示各位单身 gg:对程序员来说,找一个理解编程的人对沟通帮助会很大的
另外,这个也会影响技术选型
#10 楼 @zzhattzzh 帖子修改过了?一开始好像说的不是这个意思?
如果真要看执行时的差异,可以这样
1.9.3p194 :038 > iseq = ISeq.compile "class MyClass2; def hello; 'hello' end; end"
=> <RubyVM::InstructionSequence:<compiled>@<compiled>>
1.9.3p194 :039 > puts iseq.disassemble
== disasm: <RubyVM::InstructionSequence:<compiled>@<compiled>>==========
0000 trace 1 ( 1)
0002 putspecialobject 3
0004 putnil
0005 defineclass :MyClass2, <class:MyClass2>, 3
0009 leave
== disasm: <RubyVM::InstructionSequence:<class:MyClass2>@<compiled>>====
0000 trace 2 ( 1)
0002 trace 1
0004 putspecialobject 1
0006 putspecialobject 2
0008 putobject :hello
0010 putiseq hello
0012 send :"core#define_method", 3, nil, 0, <ic:0>
0018 trace 4
0020 leave
== disasm: <RubyVM::InstructionSequence:hello@<compiled>>===============
0000 trace 8 ( 1)
0002 trace 1
0004 putstring "hello"
0006 trace 16
0008 leave
=> nil
1.9.3p194 :040 > iseq = ISeq.compile "MyClass2.send :define_method, 'hello' do 'hello' end"
=> <RubyVM::InstructionSequence:<compiled>@<compiled>>
1.9.3p194 :041 > puts iseq.disassemble
== disasm: <RubyVM::InstructionSequence:<compiled>@<compiled>>==========
== catch table
| catch type: break st: 0002 ed: 0019 sp: 0000 cont: 0019
|------------------------------------------------------------------------
0000 trace 1 ( 1)
0002 getinlinecache 9, <ic:0>
0005 getconstant :MyClass2
0007 setinlinecache <ic:0>
0009 putobject :define_method
0011 putstring "hello"
0013 send :send, 2, block in <compiled>, 0, <ic:1>
0019 leave
== disasm: <RubyVM::InstructionSequence:block in <compiled>@<compiled>>=
== catch table
| catch type: redo st: 0000 ed: 0004 sp: 0000 cont: 0000
| catch type: next st: 0000 ed: 0004 sp: 0000 cont: 0004
|------------------------------------------------------------------------
0000 trace 1 ( 1)
0002 putstring "hello"
0004 leave
=> nil
似乎是用 define_method 添加的方法会把 block 封装成调用对象,于是每次调用时,调用栈会多一层 之前的说法不是很准确,稍微精确的说法应该是 define_method 等价于下面的代码
class MyClass3
def hello
inner_proc
end
def inner_proc
'hello'
end
end
#19 楼 @ruohanc 那就把你的 robot 包装好接口,然后在 initializer 里面启动
其实直接使用 AR 和环境变量也不复杂
gem 'mysql2'
require 'active_record'
require 'yaml'
MYAPP_ENV=ENV['MYAPP_ENV']
ActiveRecord::Base.establish_connection YAML.load( File.read 'config/config.yml' )[MYAPP_ENV]
$: << './lib/tieba_xiaoshuo_bot/models'
require 'users'
...
至于 db migrate,我估计你也不奢望能回滚吧,那就每次升级写一个数据迁移脚本完事
顺便罗嗦一句,ruby 的很多元编程能力很多只是在 runtime 时变化了类的固有行为逻辑,但是由于逻辑本身是固化的,调用栈的深度没有增加,此时语言的动态性并不会降低性能。所以如果你不是用 method_missing 这一类技巧,那么无需担心运行效率
#6 楼 @zzhattzzh send :define_method 这个过程是在类载入的时候进行的(类载入的时候为这个类添加一个 hello 的实例方法),后续对 hello 的所有调用和直接写 def 的做法并无差别