• 发现个好玩的东东 at 2012年09月25日

    作者们肯定看 gravity falls ...

  • iPhone4s VS iPhone5 at 2012年09月25日

    iphone20 老图

  • 合并才能快,js 再大也没图片大。合并不限于 application.js,合在 xxx.js 也可以的,用法一样。

  • #2 楼 @zealinux 可以,或者写在 lib/tasks/xxxx.rake 里

  • SQL 通配符真的很糟糕么 at 2012年09月24日

    #23 楼 @bhuztez 但 6 种不同的问题抛 3 种错呢...

  • SQL 通配符真的很糟糕么 at 2012年09月24日

    @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 %>
    
  • 匹配中文的正则表达片段 at 2012年09月23日

    #6 楼 @ruohanc PHP, .NET, Ruby 都能在正则用 Unicode 字符组,命令行输入 ri Regexp 在 Character Properties 段就能看到,如果没看到可以先 rvm docs generate 生成一下 Ruby 文档

    还有常用的:

    • /\p{Word}+/u 不限于 a-z0-9 的成词字符 (就是非标点制表符空格等杂类的字符)
    • /\p{Hiragana,Katakana}+/u 匹配平假名+片假名
  • 匹配中文的正则表达片段 at 2012年09月23日

    匹配汉字用 /\p{Han}+/u 就可以了

  • SQL 通配符真的很糟糕么 at 2012年09月23日

    只有算法复杂度是持久靠谱的,很多优化技巧升个版本就不成立了

  • 我也来提供一个:

    ([0]*64).each_slice(8).to_a
    
  • 小白专用: sourcetree at 2012年09月19日

    好是好,但... 只要不是 300 apm 的鼠标流,都是命令行工具操作快,图形界面还有编辑器集成的 git 插件和 github 在竞争

  • 因为金庸想写师生恋

  • 有机械的方式将所有递归改写成循环,不过结果是在堆上分配一个栈,一些函数式语言就是这么做的,让你放心使用递归而无需担心栈溢出的问题。 某些不需要保存中间状态的递归可以改成不带栈的循环,有专门研究这个的。

    做网站遇到的问题基本都有现成套路去搞... 没必要全递归或全不递归。 就算是没有循环结构的函数式语言也有仿造 foreach 和 while 的方案,怎么好理解就怎么写。

  • pg = mysql + 0.3 个 mongo

  • Tail call optimization In Ruby1.9 at 2012年09月04日

    MRI 没把尾调用放到指令集中而是直接替换 send 的实现,@hooopo 的例子尾调用优化其实是发生在 fib(40) 中 ...

  • Tail call optimization In Ruby1.9 at 2012年09月04日

    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 指令),改写耗的时间往往比增长栈多,所以除了避免暴栈以外作用很微...

  • Tail call optimization In Ruby1.9 at 2012年09月04日

    因为开了不一定会快而且某些情况下是不对的...

  • #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 时也能工作

  • #14 楼 @hooopo 类似这样的,但实际上还要加锁和保证程序可以结束 (回滚的代码出异常了怎么办?),实现要更麻烦些

    1. ruby 异常都是运行时异常,通常往外传播就好了,只有 java 有这种烦人的 checked exception 机制强制捕获各种你不处理的异常,java 8 对这种状态改善了不少

    2. rails 可以用数据库事务,没有编程性事务,mongo 没有事务,但你可以用原子操作,只要修改限于一个 document 中就能用原子操作完成。我见过用编程事务操作 mongo 数据的,还不如用 sql 数据库 ...

  • Ruby 版 Ack at 2012年08月30日

    这个还在维护吗?

  • #5 楼 @fsword 加内存是最简单的... 写应用的基本不用知道 memory map,字面看起来就不如 File.readlines 直观,而且参数很多,不熟悉的写错参数反而会慢...

  • #3 楼 @yzhrain lz 想要的应该是把文件映射到虚拟内存的功能:既可以像操作内存一样处理文件内容,又不需要把整个文件读进内存。很多操作系统都提供了这样的函数,缺的是一个 ruby 的绑定。