• Crystal 1.0.0 Released! at 2021年03月26日

    用 channel 就好了

    channel = Channel(Nil).new()
    
    spawn do
        sleep 3
        puts "fiber done."
        channel.send(nil)
    end
    
    channel.receive
    
  • Buffer Queue for Ruby at 2021年03月24日

    我当时的需求是做个 server 端的 event track sdk,所以需要异步处理并且尽量不依赖第三方包。

    不过既然你用了 concurrent ruby,感觉是不是直接用 actor 代替 queue 会更直观。

    require 'concurrent'
    require 'concurrent-edge'
    
    class JobActor < Concurrent::Actor::Context
      Message = Struct.new(:action, :value)
    
      def initialize
        @jobs = []
    
        @timer = Concurrent::TimerTask.new(execution_interval: 5) do
          puts 'time to flush.'
          flush
        end.execute
      end
    
      def on_message(message)
        case message.action
        when :add then push(message.value)
        when :flush then flush
        end
      end
    
      private
    
      def push(value)
        flush if @jobs.size == 20
        @jobs << value
      end
    
      def flush
        jobs = @jobs.map(&:itself)
        @jobs = []
    
        p jobs
      end
    end
    
    
    actor = JobActor.spawn name: 'job_actor'
    
    67.times do |i|
      actor.tell(JobActor::Message.new(:add, i))
    end
    
  • Buffer Queue for Ruby at 2021年03月23日

    👏

    callback 看起来跟 push 是在同一个线程,如果 callback 是耗时较长的操作,好像 push 会卡住的

  • Buffer Queue for Ruby at 2021年03月22日

    之前写 server 端 ab testing 的时候看过,貌似没有现成的。最后自己用线程实现了

    核心代码就几行.

    thread = Thread.new { sleep(5) and mutex.synchronize { flush(jobs) } while true } # 定时 5 秒 flush
    mutex.synchronize { thread.wakeup if jobs.push(job).size > 10 } # push 时检查数组大小,超过则 flush
    at_exit { mutex.synchronize { flush(jobs) } } # 退出时 flush
    
  • 事实上写代码的思维比语言对性能的影响更大,比如这种递归写过 fp 的人会优先考虑 tco 的.

  • 如果想要像 activeadmin 那种开箱即用的可以试试 trestle,基于 bootstrap

  • 这个是真的不错

  • 11 月份刚去成都玩了几天,是个好地方

  • 谨防比特币和区块链骗局 at 2018年01月30日

    现在的虚拟货币跟黄金有点像,但是金本位早没了。同样,比特币也不可能有法币的职能。充其量就一个充满泡沫的投资商品,有闲钱可以进场,是不是韭菜就看个人造化了。

    至于区块链,据目测应用场景貌似还在探索中,暂时没看到未来。作为技术储备闲着可以看看,但跟入币圈完全是两码事,不理解为啥你要扯在一起讲。

  • 我觉得去 go 社区拼命吹 rust 有多好,go 一无是处也是被喷的下场。个别信徒一个劲地吹新语言新框架有多好顺便贬低 rails,看着都烦。要不开个贴写点干货对比对比,别留一句话然后转身就跑。

  • kemal 和 amber 比优势不大。性能上没有多大差距,而 amber 有自己的 cli,有 orm,console 和 router。虽然说是这么说,但如果现在要用的话也只能用 kemal 了。

  • amber 吧,虽然还是很起步阶段。但语法亲近,性能高,开发也活跃。配套的 micrate 解决了 migration,webpack 解决 assets pipline。就是要等到 crystal 和 amber 能在生产环境使用可能还需要挺长一段时间。

  • 字符串截取后面 at 2017年07月05日

    这个需要看 string:sub_string/3lists:reverse/1 的实现。

    首先是 string:sub_string, 这个函数通过 cons 递归截取。erlang 实现

    然后就是 lists:reverse/1,这个函数虽然也是 erlang 实现,但是主要通过 lists:reverse/2 实现 reverse,而后者是 bif,也就是性能会比使用 erlang 实现的函数高上许多。大概就是这样

  • 申请删帖 at 2017年06月04日
    1. block, lambda, first-class functionanonymous class 都在各自语言平台上大量使用,各种回调都能看到。但本质上都是一类东西。
    2. 你说的是开发者滥用 yield, &block,但这只是开发者本身素质问题,并不是语言问题。
    3. 日常开发要用到 yield 并不多,大部分是在一些封装起来的类库中使用。
    4. 如果你说 b1, b2, b3 或者 yield 意义不明,那么 js 那一段也一样不明所以,甚至连 c1, c2, c3 传进去是不是函数都不确定。这个不关 block 或者 function 的事,这类问题上类型系统。
    5. js 的确为回调做了很多工作,promise, generator, await/async。但是你有想过为啥其他语言没有那么多事情?是的,语言性质决定了,ruby 压根就不会用到那么多嵌套 block,至少,现实世界很少能看到。
    6. 最后,你口中的 Rubyist 到底是谁?
  • where 循环语句怎么写 at 2017年05月17日

    不建议这么做,这样的话后面有同样问题的同学就搜不到答案了

  • 在 Ruby 里面,local variable 和 setter method 还是挺容易区分的。前者就是一个赋值过程,左值是一个变量。而后者是一个 send message 的过程 + 包装了一层语法糖,self.color = :orange 实际上等同于 self.send('color=', :orange) ,意思是向 self 对象发送一个消息 color= 的信号,参数为 :orange

  • [上海] 2017.5.21 Elixir Meetup at 2017年05月15日

    霸爷和强哥的博客都是之前学 Erlang 常逛的地方,可惜现在都不更新了😂

  • 我还在重构,看看这两天能不能提 pr? https://github.com/IceskYsl/worklogs/compare/master...aiasfina:3.x?expand=1

  • D lang => C 已死, Scala => Java 已死, F# => C# 已死, Node => Ruby 已死, Meteor => Rails 已死......就我个人印象中就有以上那么多论调了,但实际上谁也没死。

    如果 beam/otp 真的能解决痛点,我觉得 erlang 根本就不是问题,况且个人觉得 erlang 语言本身真的没有那么不堪。。

  • 你用 webpacker 管理 js 的话,直接用 `${}` 就行了,自带 babel-loader 会转换的

  • 没有 Scala 吗(逃

  • capistrano 实测是不用的,跟以前一样跑 assets:precompile就行了。但是会有一个 yarn install deps 的过程,慢得飞起,而把 node_modules 设置为 link_dir 会出问题。😂

  • Map for hash array using &: at 2017年04月30日

    symbol to proc 没法带参数,可以用 lambda to proc a.map &->(_){_[:aa]},但还不如直接用 block

  • docker swarm 已经被 swarmkit 干掉了,新的 swarmkit 发展下去可能会对 k8s 有点影响,不过目前还不稳定,而且国内实在是冷。