• %{} 是什么意思? at 2018年03月30日

    因为 Perl 比 Ruby 早发展,198x 年的时候就已经 为人们所知所用,而且 Linux 早期团队其中就有 Larry Wall,Ruby 95 年出生 真正被人们所察觉的时候,都已经是 200x 年了。

  • %{} 是什么意思? at 2018年03月30日

    Ruby 的糖算甜度适中了,你去看看 Perl 的暴雨梨花甜,腻到吐,以至于有些语法写的人自己才知道。

  • 噢,昨晚快睡着了,困困哒不小心搞错了,是 singleton_methods,已修正

  • JIT for MRI 开始开发了 at 2018年03月29日

    嗯,这个在 HTTP 1.1+ 之后有了长连接,chucked 是可以做的,如果你不使用 Rails,垂直 Puma 直接编程应该可以

    Rails dispatch 到特定控制器、特定方法的时候,假设是在 A 线程里面的,但是你开一个线程 B 去处理数据库读出来,如果不 join,A 可能已经返回给客户端了。

    你说的 BigPipe 得改造 Rails 的响应方式。

    在博文中,已经明显这样的处理了:

    get '/chunked' do
      response['Transfer-Encoding'] = 'chunked'
      stream :keep_open do |out|
        out << erb(:bigpipe)
        sleep 2
        out << '<script>Bigpipe.puts("pagelat1","这是第一块")</script>'
        sleep 5
        out << '<script>Bigpipe.puts("pagelat2","这是第二块")</script>'
        out.close
      end
    end
    

    如果你非得讨论这个,你还可以上 HTTP/2 呢,HTTP/2 可以并行长连接,而且第一次握手之后的都是跟 WebSocket 类似的流,而且服务端和客户端还可以做互相的 RPC 反向推送,可以认为就没有谁是服务端谁是客户端的区别了。

    HTTP/2 比 你说的这 BigPipe 本质上就是 HTTP 1.1 chucked 流先进多了去了

    所以重新审题,我说的是 Rails 在 React 响应 Action 那里分配一个线程 task 处理 controller method 的业务

  • 该用 Bootstrap 4 还是 3? at 2018年03月29日

    b4 用上了 sass,b3 b2 是 less,样式定制如果你需要做前端写的话,是有差别的。

    b4 具有前端前瞻一些,看个人需求吧。

  • 吾辈认为,autoload 的废弃 实际上是 Ruby 有了成熟的包管理机制(融入了 gem)带来了模块管理就不需要了。现在的 Ruby 跟 Java 的包管理不相上下(当然还是有点差距)。

    就像 Java 有了 lib 目录,当然后来加入了 maven / ant,Java 是一开始,这方面机制就比较完备的。

    个人觉得 autoload 是解决 PHP 5 时代像:

    require '../../module_a.php'
    

    当时发明 autoload 还是以 “集中目录” autoload 一些模块:

    function __autoload($classname) {
        $filename = "../../". $classname .".php";
        include_once($filename);
    }
    
    $obj = new ModuleA();
    

    后来 autoload 已经远去,标准文档都建议改用 spl_autoload_register。

    其实 composer 解决的就是跟 gem 同样目的的产物,但是,我觉得 PHP 的包管理没什么意义,作为标准有很多争议的语言(当时 CodeIgniter 有自己的 Code style,然后 Symphony 又有另外的还有锅铲各种更不用说了),如果不是 Laravel 带了个头,相信很多人是瞎写命名空间的。

    说到这里提一点话外语,我觉得 PHP 作为 View 语言(像 Angular / React.js 的 View 部分语法作为刚出生定位)也差不多了,现在有点变态(比双性恋还扭曲的一种形态,不伦不类)了(首先不好好作为 View 展示,又去加入复杂的语法、没有一个标准的书写面孔,还有 Scalar 与 面向对象混乱的搭配,Scalar 崇尚的是内聚、无类型、效率,class 的加入就是类型独立、分裂、离散,两种简直就是混搭,如果开发者稍微不注意就会写出相爱相杀的代码)。

    因此,用【编程语言界的畸形】来描述 PHP 最不为过。 人家 Perl 发明 $ 魔符是为了 跟 @(复数)还有 %(哈希)区分开来的,PHP 好歹参考人家 $,也得按人家规则来吧,你只搞一个 $ 然后数组还是 $var[] 然后 给数组追加语法又是 $var[] =,好,这是 “[]=” 的语法。

    因此,我觉得 $ 完全在 PHP 变量名 中是负责卖萌的,不起任何作用。 要是我去重写它的 词法 phrase tokenizer,我一定会坚决删掉它。

    呀,不小心黑了一把。。。表现出文不对题的尴尬

    回头说 autoload,其实它就是脚本语言早期没有包(或命名空间)对已存在的模块的管理的一种应对措施。

    对于猴子补丁啥的,我觉得应该说说 extend (允许类能够像 JS prototype 那样在 Ruby 的另一个叫做 singleton_methods 的继承支线)吧。

    感谢 LZ 分享 Ruby 基本模块加载用法。

  • 同在武汉

  • 不错!!!

  • 它是有 Out-of-Band,有些时候我故意读一些大文件(比如大软件安装包)测试过,其实是过一段时间会 GC,回到一个稳定的位置,但是有时候感觉起来不太起作用,真正跑 site 的场景,GC 不会在测试场景那么轻松,因为请求是那么的频繁和密集还有离散的。

    所以个人观点觉得要么就分流,不同的实例跑网站不同的部分。但是网站架构就改了,最简洁的办法,还是进程突破 max 触手工强 GC 或者 kill,或者限定 max,这样来得直接。

  • 其实 我早期就发现了 Ruby 这个问题,我想要是 Ruby 跟 JVM 一样有一个 -XX:max 的最大内存设置就好了。

    不仅仅是 puma、unicorn,我自己的 amber-kit 也会这样的。。。midori 也会

    跟 Server 没关系,Ruby 的 GC 分代回收,有些常驻的对象没那么容易直接收回去滴,项目大了,controller model 各种 obj 多了,如果在一段时间这么多的东西都会需要,就不轻易回收。

    思考一下 Ruby 的内存池要是碰到缓存攻击(别人故意去搜索命中率低的东西)那样的事情。。。

    幸好 unicorn 有杀进程的机制


    补充:

    刚看到一个帖子

    https://samsaffron.com/archive/2014/04/08/ruby-2-1-garbage-collection-ready-for-production

    We can tune our settings, from “Ruby 2.1 Out-of-Band GC”:

    RUBY_GC_MALLOC_LIMIT: (default: 16MB)
    RUBY_GC_MALLOC_LIMIT_MAX: (default: 32MB)
    RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR: (default: 1.4x)
    

    and

    RUBY_GC_OLDMALLOC_LIMIT: (default: 16MB)
    RUBY_GC_OLDMALLOC_LIMIT_MAX: (default: 128MB)
    RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR: (default: 1.2x)
    

    这应该很有帮助,设置试试看