• 想了一个无需默认0 Hash的一行版:

    a.inject({}){|m, (k, v)| m.merge(k => v.to_i) {|k, old, new| old + new} }
    
  • 这个弱鸡的换行问题 at 2017年12月11日
    params.values_at(:begin_integral, :end_integral, ...).all?(&:present?)
    
  • 你这个只有对单个created_at进行查询,RTree索引在这里和BTree相比没有优势

  • 对,ActiveRecord的PG支持有range这个类型,Mysql就比较落后了,得自己去实现,就是提到的扩展问题3: http://edgeguides.rubyonrails.org/active_record_postgresql.html#range-types

  • Ruby 爬虫框架 at 2017年11月07日

    现在的爬虫趋势是用headless chrome,通过 amazon lambda 运行,之前写过2个脚本,支持ajax,加上css selector/xpath,用来抓数据非常方便,大规模爬虫,代理IP,都很容易设置。

    如果做爬虫框架的话,求支持这种模式。

  • 有etag和last-modified

  • 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,保证赚回你的机器钱

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