• curry和数学中定义各种符号一样,主要是用来抽取公用部分,简化代码。

    比如高中数学中的累加符号Σ

    对应到Ruby代码,我们可以定义一个sigma lambda

    sigma = -> (f, a, b) { a.upto(b).map{|n| f.(n)}.inject(:+)}
    

    然后用curry定义数字累加操作和平方累加操作:

    sum_of_number = sigma.curry.(-> (n) {n})
    sum_of_square = sigma.curry.(-> (n) {n * n})
    
    sum_of_number.(1,10)
    sum_of_square.(1,10)
    

    可以用相同的代码来定义累乘符号∏

    pi = -> (f, a, b) { a.upto(b).map{|n| f.(n)}.inject(:*)}
    

    更进一步,Σ和∏都是范围操作,我们可以用curry抽取出来:

    range = -> (x, f, a, b) { x.(a.upto(b).map{|n| f.(n)})}
    sigma = range.curry.(-> (r) {r.inject(:+)})
    pi = range.curry.(-> (r) {r.inject(:*)})
    
    products_of_number = pi.curry.(-> (n) {n})
    
    products_of_number.(1,10)
    
  • 贴一下我之前给一个类似项目做的性能优化, 单机目标500RPS 跑wrk本机测试,单机结果1105RPS, 这是在一台每月200元的2核4GB最低配云主机跑的结果:

      10 threads and 100 connections
      Thread Stats   Avg      Stdev     Max   +/- Stdev
        Latency     8.95ms    1.59ms  54.36ms   82.69%
        Req/Sec   224.23    142.93   484.00     79.00%
      11171 requests in 10.10s, 3.05MB read
    Requests/sec:   1105.64
    Transfer/sec:    309.35KB
    

    你要问什么架构?基于rails-api,redis存储,都是大路货,没什么高端科技 150台机器...只能说楼主有钱,请我!每小时仅收费$300,保证赚回你的机器钱

  • 上传大文件和下载一样,可以让nginx来负责接收上传的文件,然后rack通过header从文件系统读取上传完毕的文件:

    https://stackoverflow.com/questions/44371643/nginx-php-failing-with-large-file-uploads-over-6-gb

  • 我现在用的Intel NUC

  • Ubuntu 17.04 物理机 希望有个命令行就好了

  • 看了一下README,counter_culture 是通过把更新计数器移到after_commit解决的,也算一种绕过去的方法吧

  • 申请删帖 at 2017年06月04日

    他们不但没有做类型检查,反倒是去改变语法

    Javascript是因为语言本身设计缺陷,所以才需要检查传入的是否是function,Ruby已经声明这是一个blcok,你不可能给这个方法传入第二个参数,完全没必要进行参数类型检查,常见的只是用block_gvien?检查一下是否有block:

    class Foo
      def bar(name, &block)
        str = "Hello #{name}"
        yield str if block_given?
      end
    end
    
    foo = Foo.new
    
    # block是可选的:
    foo.bar('world') do |str|
      puts str
    end
    
    foo.bar('ruby')
    

    如果你没有认真学过 Ruby 这门语言,或者只是扫一眼浏览式学习,你根本不知道 yield 做了什么。

    对于没有认真学习又blahblah的人,最好的回复是:RTFM

    我去掉了 &b1, &b2, &b3,看看可读性如何,在你看 obj.m1 的时候,你知道 yield 传入了什么吗?看 obj.m2 的时候,或者本来就是从 obj.m2 看起,这时候你肯定会不知道 yield 传入了什么,总的来说:

    yield本质就是占个位,写yield目的就是为了无需知道传入的block是做什么,如果要理解m2的yield传入什么才能读懂整个代码,那说明这里不应该用block/yield去实现这种需求,写成这样是你的代码设计有问题。

    但是,ES6 新增了 Promise 和 Generator 已经解决了这些问题,把所有的异步都给我串起来!!!让你们看看什么才叫真正的优雅:

    如果你认真学习过Ruby,用block做callback使用也可以写出很优雅的代码,否则就算用promise或者coroutine也能写出不容易理解的代码,而且你举的代码例子无论从命名和实际用途都不清,如何评价是否优雅?show me the REAL code

    (最后,个人认为coroutine最优雅)

  • 量产型炮灰工程师 at 2017年05月22日

    http://threeifbywhiskey.github.io/2014/03/05/non-alphanumeric-ruby-for-fun-and-not-much-else/

    _=$$/$$;__=_-_;@_=_+_;$_=@_+_;$__=@_+$_;$-_=$__*$_;@__=''<<$-_*($__+$_)+@_;$___=''<<$-_*$__-$__<<$-_*($__+@_)<<@__<<@__;@___=''<<$-_*$__-$_*$_<<$-_*($__+$_)-$_<<@__<<@__;(___=->{$.+=_;$><<($.%$-_==__ ?$___+@___:$.%$_==__ ?$___:$.%$__==__ ?@___:$.)<<(''<<$__*@_);$.<($__*@_)**@_?___[]:_})[]
    
  • mysql index自动选择的问题,常见的坑,可以在查询里面加FORCE INDEX来解决

  • 对于这种需求,我推荐Decorator模式,有现成的gem draper可以用

    https://github.com/drapergem/draper

Ruby程序猿,写OC的果黑程序猿,蝉游记2号保管猿