• gems 安装或添加源时卡住 at 2020年05月09日

    如果是 IPv6 连接的话,应该会涉及到

    DNS4 DNS6
    IPv4 DNS4 + IPv4 DNS6 + IPv4
    IPv6 DNS4 + IPv6 DNS6 + IPv6

    这么一个 2x2 的问题。可以先用 https://ipv6-test.com/ 这网站确认自己 IPv6 是正常工作的。看解析出来的 2409:8c54::/32 确实是中国移动机房的地址,像是一个合理的 CDN 节点,不过我这里 IPv6 肯定是好的的情况下打过去也是 100% 丢包。

  • 可以可以,我安排一下。

  • std::bad_alloc 是 C++ 内存申请失败的异常吧。申请失败的常见原因应该是... 你机器上内存已经被吃爆掉了,分配不出可用内存了?

  • 乐理还是讲相对关系,标准音高其实是可以变的,调律方式也是可以变的。所以我只是用了其中一种比较常用的来写了,毕竟写代码最好还是确定算法确定数值比较好处理一点。

  • Sonic Pi 我也用过,算是可以很方便用 Ruby 来为合成器进行编程。特别是现在高级的合成器按钮越来越多,真的还不如直接弄个 DSL 来写比较方便。

  • 其实本来是想在线下的分会场弄一个小的 workshop 尝试的。但现在搬到线上后,互动性没有那么强了,是有点直播 coding 的味道了。

  • 差不多比起 Keynote 演讲的纯介绍性,更多地加入 Live Coding 来演示某一种技术的使用。以练习和 tutorial 为主,内容不一定需要太先进或困难。

  • Petri Net workflow for Rails at 2020年02月14日

    促进一下生态,我又花了一天写了个 PetriNet 的可视化编辑器 https://github.com/dsh0416/petri-editor

  • 花了两天时间简单写了个 DSL https://github.com/dsh0416/petri-dsl/

    用法:

    require 'petri'
    
    network = Petri::Net.new do |net|
        net.start_place :start, name: 'Start'
        net.end_place :end, name: 'End'
    
        net.transition :leader_evaluate, name: 'Leader Evaluate', consume: :start do |t|
            t.produce :leader_approved, name: 'Leader Approved', with_guard: :approved
            t.produce :rejected, name: 'Rejected', with_guard: :rejected
        end
    
        net.transition :hr_evaluate, name: 'HR Evaluate', consume: :leader_approved do |t|
            t.produce :hr_approved, name: 'HR Approved', with_guard: :approved
            t.produce :rejected, with_guard: :rejected
        end
    
        net.transition :report_back, name: 'Report Back', consume: :hr_approved, produce: :end
    
        net.transition :resend_request, name: 'Resend Request', consume: :rejected do |t|
            t.produce :start, with_guard: :resend
            t.produce :end, with_guard: :discard
        end
    end
    
    puts network.compile
    
    # {:places=>[{:label=>:start, :name=>"Start"}, {:label=>:end, :name=>"End"}, {:label=>:leader_approved, :name=>"Leader Approved"}, {:label=>:rejected, :name=>"Rejected"}, {:label=>:hr_approved, :name=>"HR Approved"}], :transitions=>[{:label=>:leader_evaluate, :name=>"Leader Evaluate", :consume=>[:start], :produce=>[{:label=>:leader_approved, :guard=>:approved}, {:label=>:rejected, :guard=>:rejected}]}, {:label=>:hr_evaluate, :name=>"HR Evaluate", :consume=>[:leader_approved], :produce=>[{:label=>:hr_approved, :guard=>:approved}, {:label=>:rejected, :guard=>:rejected}]}, {:label=>:report_back, :name=>"Report Back", :consume=>[:hr_approved], :produce=>[{:label=>:end, :guard=>nil}]}, {:label=>:resend_request, :name=>"Resend Request", :consume=>[:rejected], :produce=>[{:label=>:start, :guard=>:resend}, {:label=>:end, :guard=>:discard}]}], :start_place=>:start, :end_place=>:end}
    

    大概可以相对方便地来描述 workflow 了。

  • 我觉得维护一个 OpenCV 的 wrapper 可能先得维护一个线性代数库,返回一个 Array,甚至是 Array 的 Array 的 Array 还是有点蠢的,而且很难处理。ruby 现在有内建的 Matrix 库,不知道能不能堪此大任。