作者们肯定看 gravity falls ...
iphone20 老图
合并才能快,js 再大也没图片大。合并不限于 application.js,合在 xxx.js 也可以的,用法一样。
@bhuztez 如果像你说的,SELECT *
存在两种问题的话, SELECT name
就存在六种问题:
SELECT name
没写错SELECT name
写错了SELECT name
写错了SELECT name
没写错SELECT name
写错了SELECT name
写错了写个 rake task 然后在 cap 中调这一个任务就可以了
不熟悉 api 而已,多写写查查就清楚啦
大概是这样:
<%= link_to posts_path do %>
<span>Back</span>
<% end %>
匹配汉字用 /\p{Han}+/u
就可以了
只有算法复杂度是持久靠谱的,很多优化技巧升个版本就不成立了
我也来提供一个:
([0]*64).each_slice(8).to_a
好是好,但... 只要不是 300 apm 的鼠标流,都是命令行工具操作快,图形界面还有编辑器集成的 git 插件和 github 在竞争
因为金庸想写师生恋
有机械的方式将所有递归改写成循环,不过结果是在堆上分配一个栈,一些函数式语言就是这么做的,让你放心使用递归而无需担心栈溢出的问题。 某些不需要保存中间状态的递归可以改成不带栈的循环,有专门研究这个的。
做网站遇到的问题基本都有现成套路去搞... 没必要全递归或全不递归。 就算是没有循环结构的函数式语言也有仿造 foreach 和 while 的方案,怎么好理解就怎么写。
pg = mysql + 0.3 个 mongo
MRI 没把尾调用放到指令集中而是直接替换 send
的实现,@hooopo 的例子尾调用优化其实是发生在 fib(40)
中 ...
InstructionSequence.compile_option
是全局选项,后面的所有代码不需要 InstructionSequence.new
了。
只用特定参数编译一段代码,可以用 InstructionSequence.new src, file, path, line, opts
(new 和 compile 是同一个方法)
opts = {
tailcall_optimization: false,
trace_instruction: false
}
iseq = RubyVM::InstructionSequence.compile <<-RUBY, nil, nil, nil, opts
def fib(n)
return 1 if n == 0 || n == 1
return fib(n - 1) + fib(n - 2)
end
RUBY
puts iseq.disasm
输出如下
== disasm: <RubyVM::InstructionSequence:<compiled>@<compiled>>==========
0000 putspecialobject 1
0002 putspecialobject 2
0004 putobject :fib
0006 putiseq fib
0008 send :"core#define_method", 3, nil, 0, <ic:0>
0014 leave
== disasm: <RubyVM::InstructionSequence:fib@<compiled>>=================
local table (size: 2, argc: 1 [opts: 0, rest: -1, post: 0, block: -1] s1)
[ 2] n<Arg>
0000 getlocal n ( 1)
0002 putobject 0
0004 opt_eq <ic:7>
0006 branchif 16
0008 getlocal n
0010 putobject 1
0012 opt_eq <ic:8>
0014 branchunless 21
0016 jump 18
0018 putobject 1
0020 leave
0021 putself ( 2)
0022 getlocal n
0024 putobject 1
0026 opt_minus <ic:9>
0028 send :fib, 1, nil, 8, <ic:3>
0034 putself
0035 getlocal n
0037 putobject 2
0039 opt_minus <ic:10>
0041 send :fib, 1, nil, 8, <ic:5>
0047 opt_plus <ic:11>
0049 leave
@hooopo 你那个例子速度变快的原因应该是 :trace_instruction => false
去掉了编译后的 trace
指令(默认 trace 是打开的)
这个例子不是尾递归,最后一个指令是 opt_plus
,不是递归调用 send :fib
(所有 opt_
开头的指令都是为了优化特定 code pattern 的,opt_plus
相当于 send :+
但为整数优化了)
不过尾调用优化和尾递归优化不同,尾递归优化把字节码里的某些递归变成循环,尾调用优化不改写字节码,但在运行的时候碰到 return method call 时就改写栈帧(或者说只把 send
指令改成 tail_send
指令),改写耗的时间往往比增长栈多,所以除了避免暴栈以外作用很微...
因为开了不一定会快而且某些情况下是不对的...
#96 楼 @happypeter iTerm 这么多好处都被你一个皮肤带过了... 我只知道某些命令例如 sed 的一个参数不同,GNU 工具链除了 edge GCC 不好整,在 Mac 还没碰到过不好用的...
Linux 哲学和 Unix 哲学是有微妙差别的,Mac 才是 Unix 啊喂!
简单 sinatra 小应用如果没线程安全问题的话,用多线程部署也可以
#92 楼 @happypeter 没用 iTerm ?
关于操作系统和编辑器的争论,貌似各执一词,但基本都是 "我老婆最漂亮" ...
我觉得贴士里写 Mac 没什么不妥,写 Linux 也不错,各有道理,但写 "Linux 或 Mac" 就太假了,中肯了但信息含量直线下降,不如不写 ...
函数式解决方案:(其实和 6 楼的差不多,本质上也是 Null Object)
class Maybe < Struct.new(:o)
def chain m, *xs
v = o
xs.each do |x|
return if v.nil?
v = v.send m, x
end
v
end
end
value = Maybe[data].chain :[], :row, :column, :field
没污染,不仅适用于 []
,也适用于其他方法的 nil
链,data 为 nil
时也能工作
ruby 异常都是运行时异常,通常往外传播就好了,只有 java 有这种烦人的 checked exception 机制强制捕获各种你不处理的异常,java 8 对这种状态改善了不少
rails 可以用数据库事务,没有编程性事务,mongo 没有事务,但你可以用原子操作,只要修改限于一个 document 中就能用原子操作完成。我见过用编程事务操作 mongo 数据的,还不如用 sql 数据库 ...
这个还在维护吗?