• 我改了一个文件, reload 它需要的时间是毫秒级的, 重启容器就太麻烦了...

  • 另外一个办法(其实更简单点...)是按背包问题的方法做...

  • 这是个最优化问题, 可以用 MILP 解决

    设 Talk input i 的事件段是从 b_i 开始, 时长为 L_i

    Lunch 是个特殊事件, 可以设 b_0 = 12:00, L_0 = 60min

    对于 Networking event, 可以设 4:00 <= b_n <= 5:00

    我们还可以引入一系列变量 x_ij, 如果 i 事件后如果紧接是 j 事件, 那么 x_ij = 1, 否则 x_ij = 0

    那么我们有:

    \sigma_{i}{x_ij} = 1
    \sigma_{j}{x_ij} = 1
    x_ij (b_j - b_i - L_i) >= 0                 (*)
    b_i >= 9:00
    b_i + L_i <= b_n       (都在 networking event 前面)
    binary x_ij
    

    对于式子 (*), 它是非线性的, 怎么办呢?

    https://download.aimms.com/aimms/download/manuals/AIMMS3OM_IntegerProgrammingTricks.pdf 里有介绍怎么把它写成线性的

    然后把这些约束都放到 solver 求解, 如果出现 subtour (事件排成一个圈), 动态添加一个约束, 直到最后得出一个解.

    上面解决了一天内排日程的问题, 如果要排很多天怎么办? 可以把第二天的 Lunch 和 Networking 都 +24:00, 然后在两天之间塞进一个 Rest 事件解决.

  • Open addressing 可以减少 hash 碰撞情况下的内存占用 (不需要海量内存来存指针啦), 少了指针跳转减少 CPU cache miss

    Open addressing 探测下一个可用 slot 的方式叫 probing.

    Pseudo random probing 相比最简单的 linear probing, 可以减少 worst case probing 的遍历 (这种情况叫 primary clustering), 但是也有可能会增加一丢丢 cache miss ...

    对 Ruby 里大量出现的小哈希表来说, 基本没影响

    风险是... 不知道会不会带来新的 hashDos...

  • 你目的是尽量减少各环境的差别, 但是它们还是有区别的

    开发环境的基本需求就是改一点就马上能看到一点效果. 对于 Rails 来说, 可以 eager load 然后通过监听文件系统事件来重载对应文件 (就和 webpack 一样), 这样开发环境和生产环境就都能统一到 eager load 了.

    Docker 这一套在 Linux 上开发是最流畅的. 但你如果换别的操作系统, 在容器里文件系统事件往往比原生事件慢几百倍, 甚至还不一定有文件系统事件 ... 在容器开发只能回到 lazy load... 这时不在容器开发反而可以更容易一致...

    我觉得容器更适合做编译型语言的开发, 尤其是做不了热重载的语言. 而虚拟机语言其实和容器是有不少功能重复的地方的

  • SVG 與 Canvas:如何選擇? at 2017年2月27日

    Canvas 好, 写 shader 才能流畅

  • 其实用 pg 的 LISTEN / UNLISTEN / NOTIFY 语句做订阅说不定更高效

  • midori 百日记 at 2017年1月17日

    其实现在纯线程可以解决 c10k 了, 不过每个线程栈非常小 -- 其实就和 Fiber 相差不多. 我觉得线程是比较容易做对出东西的, 但是 Ruby 的线程栈不好做小... 所以在做个能把栈弄小的语言...

  • 这是个在 Mac 上用 Docker 的方案

    台式机或者虚拟机 linux, 在 Mac 上通过 Veertu 远程执行各种 docker 命令, 然后目录通过 sshfs/osxfuse 挂载到 Mac 上

    看起来有点复杂, 但其实比官方的 Docker for Mac 坑少...

  • #20楼 @huacnlee 缓存 cache(...) { ... } 就好了, 也不关模板的事