• 浅谈 Markdown 编译器 at 2018年11月19日

    楼主的 13 + x * 2 前后两个例子的语法树的图弄反了吗?我怎么感觉对不上。。。

  • 其实 macOS 新版本升级后出问题最多还是那个 oh-my-zsh 吧?所以它这个命名似乎也说明了一切(oh!my zsh)。所以这个东西虽然有很多亮点,我还是不装的。

    一直感觉 rvm 还好,不能因噎废食啊。 看重 rvm 的优点就是能帮你把系统缺少的库自动装上,管理 Ruby 多版本的同时,也能管理多个 gem set。不能说扔就扔。

    rbenv 尝试过几次,感觉不若 rvm,弃之久矣。至于 Docker 得看入坑深浅了。

  • 任何语言都可以用来写命令行工具;Ruby 当然也可以;编译型语言的命令行一般是可执行的二进制文件;Shell、Perl、Python、Ruby 等语言基本就是可执行的脚本文件了。

    Rails 的命令多是使用 Thor 这个 gem 实现的:https://github.com/erikhuda/thor。具体可以看它的 wiki。

    至于手动写一个带有可执行命令的 gem,可以见 https://guides.rubygems.org/make-your-own-gem/#adding-an-executable。 可以参考的例子非常多,比如这个:https://github.com/beijingrb/mdopen

    如果只是运行一个脚本,不管什么系统,关键是把脚本路径加到 PATH 环境里。对于 Windows 应该要让执行程序和脚本扩展名做好关联,否则就得用 ruby + 脚本名称 的方式来运行。

  • 试过几次这个 Ubuntu 的系统,在上面启动 rails 应该也比较慢。之前看网上说应该是涉及 IO 操作的时候会慢。

  • 即使 release 了二进制版本,你也需要手动下载放到可执行路径里,每次更新都要重复一遍。

    如果使用 go get -u 或者 gem install 安装以及更新就是一条命令的事儿。

  • 为啥说 Ruby 写会麻烦呢?觉得和 Go 的复杂程度差不多的啊。

    但是对于有 Ruby 环境的人安装和使用起来就方便多了。

  • Ruby 不要每日,能 weekly 就好啊~

  • Ruby 里为什么要有 unless? at 2018年03月27日

    Ruby 为啥要有 unless 呢?其实同样可以严肃的问为啥英语里有 unless 呢?

    但是关于如何使用 unless 是个很好的话题,这里有讨论: https://github.com/bbatsov/ruby-style-guide/issues/329。 该讨论同时延伸了 not!,以及 &&/||and/or 等的用法区别。

    比较认同这个说法

    if unless looks weird, try to use a simple if
    don't mix and/not/or with &&/!/||
    only use and/not/or for logical comparisons
    

    这里用了个 weird, 所以除了团队有代码风格约束外,更多的和你的舒适感有关。更具体的示例可以看这里

    另外,个人认为在不给具体代码示例的时候如下的说法可能对新人会产生误解的,因为不写成 modifier 的形式不一定就不好,有时恰恰相反:

    # bad
    if some_condition
      do_something
    end
    
    # good
    do_something if some_condition
    

    最后,Perl 和 Ruby 里都还有个 until 的关键词,楼主可以继续开一下脑洞 : )

  • 听了一节 Laravel 的入门课,课程做的很赞。网站的细节也做的很好。

  • 多谢指出。我原本就是想写 lookahead,不是 lookbehind。但测试发现其实写在匹配前面的 lookahead 并未生效,已更新。

  • 要在你项目的 Dockerfile 里安装 node 环境。而不是在 docker-compose 里定义来启动一个 node 环境的 container。

  • 严格说处理 HTML 文档还是像 Rei 说的解析后处理比较好,但如果要求不高的话使用正则表达式会比较快的解决问题。比如你能确定要替换的词不包含在一些标签的属性之类的地方,否则干扰因素太多就不如其它方法干净利落了。

    下面是使用正则替换 <a> 标签之外的所有文本中的 ruby 一词的示例:

    $ irb
    irb(main):001:0> str = "关于ruby方面的问题,可以到<a href='https://ruby-china.org'>ruby-china</a>上搜索ruby相关资料"
    => "关于ruby方面的问题,可以到<a href='https://ruby-china.org'>ruby-china</a>上搜索ruby相关资料"
    irb(main):002:0> str.gsub(/ruby(?!(.(?!<a))*?<\/a>)/, "<a href='https://ruby-lang.org'>ruby</a>")
    => "关于<a href='https://ruby-lang.org'>ruby</a>方面的问题,可以到<a href='https://ruby-china.org'>ruby-china</a>上搜索<a href='https://ruby-lang.org'>ruby</a>相关资料"
    irb(main):003:0>
    

    updated。

  • 使用 rvm 安装 ruby 失败 at 2018年03月19日

    看来应该是权限问题,加上 sudo 试试?

    sudo rvm install 2.2.5 
    
  • 如何在 Rails 全局启用该功能的帖子。试了一下,不要说第三方 gem,首先 action_view 就报错了(Ruby: 2.3.4,Rails:5.1.5)。当然这只是想在 Rails 中全局使用的情况。

  • 其实没有问题吧,至少 25 倍可以快 40 多倍 并不矛盾。

  • 通过 SQLite 的驱动根据上传后的文件地址直接读取就可以了吧?

  • 建议回复和讨论问题的话尽量负责一些,把具体的代码和说明贴上。言之无物的回复还不如多看看之前别人的回复比较好。谢谢。

  • 这样的话是说的通的。所以我在 #4 给你的数据不够公平和精确。

  • @luikore 我觉得这正是两种语言的差别所在,因为 Ruby 作为解释型语言就是这样运行的啊。感觉这个就是见仁见智了。

    @jakit @nouse 大家倒是可以继续讨论。

  • 问题在于, Ruby 本身就是脚本语言,Go 是编译型的语言。大家都知道这一点,所以这样比较本身是没有问题的。更有意义的数据当然是比较 Ruby 原生和使用了 Go 共享库的性能。

    至于哪一种算法算 fib 更快,则是另外一个问题了。

  • 我电脑上 ./fib 1.8M, fib.dylib 817K。

  • Ruby 代码不变:

    # big_fib.rb
    a, b = 0, 1
    100000.times { a, b = b, a+b }
    #puts b
    

    Go 和你一样使用大数的包:

    // big_fib.go
    package main
    
    import (
        "math/big"
    )
    
    func main() {
        a := big.NewInt(0)
        b := big.NewInt(1)
    
        for i := 0; i < 100000; i++ {
            a.Add(a, b)
            a, b = b, a
        }
    }
    

    Ruby 的结果:

    time ruby big_fib.rb
    
    real    0m0.409s
    user    0m0.279s
    sys 0m0.120s
    

    Go 的结果:

    time ./big_fib
    
    real    0m0.046s
    user    0m0.038s
    sys 0m0.005s
    
    1. 这是一篇译文,通过 fib 介绍一下基础概念和用法。
    2. 抛砖引玉,大家可以深入挖掘,讨论一些真实场景。
  • 这里原文有句话大致是说:“为了简化比较的考虑,采用同样的算法”,略过漏译了,已补上。

    所以也可以用 Go 写您同样的算法来比较:

    # tail_fib.rb
    a, b = 0, 1
    40.times { a, b = b, a+b }
    puts b
    
    // tail_fib.go
    package main
    
    import "fmt"
    
    func main() {
        a, b := 0, 1
        for i := 0; i < 40; i++ {
            a, b = b, a+b
        }
        fmt.Println(b)
    }
    

    Ruby 的用时:

    $ time ruby tail_fib.rb
    165580141
    
    real    0m0.095s
    user    0m0.067s
    sys 0m0.021s
    

    Go 版本二进制的用时:

    $ time ./tail_fib
    165580141
    
    real    0m0.005s
    user    0m0.001s
    sys 0m0.004s