• 对,方案就是增加这些 hook。但这些 C 扩展还是要手动手动加上 hook 以支持。这几个本质是让同步等待由 Ruby 去监听 fd,等变化了再返回来调用 C。不知道第三方社区的跟进力度会如何了。

  • Linux、Ruby 不冷没天理! at 2018年02月04日

    好久没看到那么有意思的帖子了。

    “我”技术不行,我用工具干嘛得懂怎么修理工具?

    当然自己不会修,受制于人的话,那其实这几个也没啥区别。但是工具出了问题,还是要有人来修的。如果微软家的系统真的可以通过花钱解决一切问题的话,那我也愿意花钱解决,谁没事喜欢自己乱折腾呢。

    2016 年的时候我上报了一个在 Windows 更新后产生的 UAC 权限的严重 bug,提交了大半个月还没 fix。打电话给客服和我说直接重装系统吧。感觉微软家几个客服里也就只有 Azure 的客服专业点。

    后来上微博发了牢骚,又得到了微软微博客服的官方回复。

    最后只好停机 fresh reinstall。

    当然苹果也好不到哪去,有一次给 Safari 的 JavaScript 引擎 Nitro 提交了 bug report,拖了一个大版本,Safari 从 9 升到了 10 才 fix 的。

    Linux 嘛,逼急了至少还有自己修的可能嘛。

    苹果......你知道苹果系统多少? 你知道苹果的手机和笔记本为什么配置这么高?

    微软......你知道微软系统多少?你知道微软的服务器为什么配置这么高?

    完全一致!

  • 引入 ActiveRecord 其实就可以考虑不要上 Sinatra 了,ActiveRecord 还依赖 ActiveSupport,一通下来,已经半个 Rails 都导入进来了。除了写路由的方法发生了变化,总的来说没有区别。特别是加个 WebSocket 还要自己处理集群平衡。如果使用 Redis (Ohm) 做数据库,那感觉还是挺爽的,明显会变快不少。重写一个 ActiveRecord 可以考虑直接上 Sequel 吧,基本满足需求。

  • Auto Fiber 的处理方式非常暴力,Hijack 所有的 I/O 操作,然后直接去把 fd 取出来塞进去,我写的 midori 在处理 redis 连接的也参考了这一做法。Auto Fiber 目前面临最大的一个难点就是 C 语言里面的 I/O 阻塞,因为 I/O non-blocking 的问题是一处阻塞,处处阻塞。

    去年 RubyKaigi 我演讲完会后 ko1 问了我怎么看 Auto Fiber,我就讲了这个顾虑。因为 Auto Fiber 的 Hijack 还是基于 Ruby 层的 I/O,如果是 C 扩展,则并不能全自动的转换过去,相应地 C 扩展里需要正确使用 Ruby 新加入的 API,例如 rb_iom_waitfdrb_iom_waitpid 等进行处理。如果 C 程序直接使用了同步方法,或者没有正确使用异步方法,Ruby 并不会主动去调度这些东西。

    另外一个难点就是 Mutex。比如 midori 在 monkey patch Redis 驱动的时候,一上来就遇到了死锁问题,这是因为驱动本身并没有考虑到异步后的数据顺序问题。于是额外对里面的锁结构进行了改造,类似的问题在一些 DB 驱动上也是比较常见,甚至 Ruby 一些内置方法的 C 实现也受到影响。

    这事实上对于社区压力还是挺大的,现在 Ruby 还是挺想合并 Issue #13618 的,但对于生态的影响也确实有顾虑。不过感觉最倒霉的还是 socketry,iom.h 合并进来,至少把 epoll 和 kqueue 都统一实现了,再不济 nio4r 也没啥意义了。我写的 midori 也有一大半功能都没啥用了。不过长远来看,这也是终于从语言、标准库层面接入异步了,可以说非常进步了,随着 Ruby 3 现在的特性来看,Thread 里包 Guard 里包 Auto Fiber 可以说并发上会很爽。

  • MySQL 惊险恢复记 at 2018年01月05日

    4 GB 的 log,只有几百 MB 的数据库。。。

  • Ruby 2.5.0 已发布 at 2017年12月31日

    这其实是一个回归问题,报错的复现是:

    [].delete 1 { 'NG' }
    

    在 Ruby 2.3 系列以及更早的 Ruby 版本中,从 2.3.0 到 Ruby 2.3.5 中,这个语法是非法的,会报错。

    ❯ ruby --dump=parsetree -vwce "[].delete 1 { 'NG' }"
    ruby 2.3.5p376 (2017-09-14 revision 59905) [x86_64-darwin17]
    -e:1: syntax error, unexpected '{', expecting end-of-input
    [].delete 1 { 'NG' }
    

    在 Ruby 2.4.0、Ruby 2.4.1 中,会返回 NG

    parser 的结果如下:

    ❯ ruby --dump=parsetree -vwce "[].delete 1 { 'NG' }"
    ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
    Syntax OK
    ###########################################################
    ## Do NOT use this node dump for any purpose other than  ##
    ## debug and research.  Compatibility is not guaranteed. ##
    ###########################################################
    
    # @ NODE_SCOPE (line: 1)
    # +- nd_tbl: (empty)
    # +- nd_args:
    # |   (null node)
    # +- nd_body:
    #     @ NODE_PRELUDE (line: 1)
    #     +- nd_head:
    #     |   (null node)
    #     +- nd_body:
    #     |   @ NODE_ITER (line: 1)
    #     |   +- nd_iter:
    #     |   |   @ NODE_CALL (line: 1)
    #     |   |   +- nd_mid: :delete
    #     |   |   +- nd_recv:
    #     |   |   |   @ NODE_ZARRAY (line: 1)
    #     |   |   +- nd_args:
    #     |   |       @ NODE_ARRAY (line: 1)
    #     |   |       +- nd_alen: 1
    #     |   |       +- nd_head:
    #     |   |       |   @ NODE_LIT (line: 1)
    #     |   |       |   +- nd_lit: 1
    #     |   |       +- nd_next:
    #     |   |           (null node)
    #     |   +- nd_body:
    #     |       @ NODE_SCOPE (line: 1)
    #     |       +- nd_tbl: (empty)
    #     |       +- nd_args:
    #     |       |   (null node)
    #     |       +- nd_body:
    #     |           @ NODE_STR (line: 1)
    #     |           +- nd_lit: "NG"
    #     +- nd_compile_option:
    #         +- coverage_enabled: false
    

    这是一个不符合预期的 parser 行为,所以应该被移除。移除的工作发生在 Ruby 2.5.0 的开发过程中,见:Issue #13547

    因此,在 Ruby 2.5.0 中,该行为已被修复。但是需要注意的是,这不止是 Ruby 2.5 系列才这么进行了修改,Ruby 2.4.2 同样也解决了这个回归问题。

    这引发了另一个 Issue, Issue #13898,说的是 Ruby 2.4.2 作为小版本更新,是否应该保持和 2.4.0、2.4.1 的向后兼容。目前该 Issue 已被 Rejected,回归问题可能不作为向后兼容的考虑。

  • Rails 时安装 Nginx 不成功 at 2017年12月30日

    给 log 加个 code block 啊,这排版咋看。。。

    看了一下,没找到哪里报错啊?

  • 没有啦,至少人家就事论事的话,如果能最后达成共识,也是好事啊。

  • 你先等等。。。

    如果 JIT 对 Ruby 那么重要,对标 LuaJIT,Ruby 也有已经实现了 JIT 的 JRuby 和 Rubinius 啊。。。

    JRuby 倒是去年搞了个 GraalVM + TruffleRuby,真的还挺快的。但还是风声大雨点小。

    最近 Rubinius 还把 JIT 从实现中移走了🤦‍♀️

  • Ruby 的官方实现 JIT 现在还是没有的,MJIT 目前还在比较初步的开发状态。可能 2020 年前才有可能加。Python 是 1991 年发布的最早版本,Ruby 是 1995 年,Java JDK 1.0 是 1996 年。Ruby 随着 YARV 的引入,现在也可以编译到 Bytecode,也可以说是某种意义的编译语言了,但是和 Java Hotspot 区别还是比较大的。要是说像 Python,我就更想不出什么原因了。

    如果不是 VM 层面,而是语言层面,倒是讲得通一些。Ruby Python 和 Java 肯定都有不少像的地方。Ruby 不严谨地来看,特别是早年可以看成是 LISP + 面向对象 + 减少括号 + Perl 里的字符串。Java 从 LISP 和 Smalltalk 里学了很多东西,而 Python 也是一门很像 LISP 的语言。。。那么 Ruby 和他们像不如说是大家都像 Lisp 吧。

    这么一想,其实还是挺推荐 Rubyist 去接触一下 LISP,可能会对 Ruby 的一些设计理解得深刻许多。LISP 是一门 1958 年的语言,是世界历史第二悠久的高级语言,但是确实有很多很有远见的设计。

  • 为啥 Ruby VM 结合了 Java 的 Hotspot 和 Python 的 Interpreter?感觉都没啥关系啊?

  • 我前几年在 Raspberry Pi 2 上跑过一次,就是实验性地用了一下,当时发现的一个问题是 Hash object 的 performance 不是很好。用来跑 Rails 不是很确定。

  • 其实这个项目现在想想还是很有问题的。当时 xdite 在台湾的时候就已经惹出过很多事情了,哪怕是后来某个帖子说的什么「肌肉记忆」,其实这个说法 xdite 在台湾就说过很多次。

    2015 年的时候我去台北参加会议,就已经听到了还多 xdite 的负面新闻,包括其实更早,在 2014 年就搞出过「由爱生恨之诈神传」的事情。包括有一个生成 xdite 幹话语录的 Ruby gem,也是在 2014 年发起的。我当时写炮灰工程师文章前在一些大陆的 Ruby 群里也问过,发现大多数人都不知道这些事。

    我觉得这个还是解释了,xdite 和李笑来来大陆办这个培训班,社区一开始觉得是好事,有一个问题是可能也是两岸的交流不是很多,信息比较闭塞,大家当时确实对对岸已经发生过的 灾难 没有意识。更何况,培训的价格和台湾当时她开的一致,只是货币从新台币换成了人民币(这点真是厉害啊)

    至于 xdite 其人,我倒是觉得她是个利益至上、见风使舵的人。这可以解释很多问题,包括当时 xdite 也写过一些台独的文章,现在也能找到一些 Tweets 她之前说自己是绿啊什么,后来 xdite 突然开始骂柯 P 墨绿啊台独的时候,又把这些文章删掉了。大家有兴趣可以去 Web Archive 上找找 blog.xdite.net 删掉的内容。我倒不是觉得台湾人不能持有台独的观点,这是自由,但是持有这样观点的人,过了没几年突然就把中国改口叫大陆来大陆赚钱,自然是为了钱可以放下信仰的表现。

    这么看来 xdite 与李笑来的合伙是完美的,一个是见风使舵的人,一个是吹风大师。至于你问:

    这些人的良心不会痛吗?

    一个有良心的人会见风使舵和乱吹风吗?

  • Ruby 2.5.0 已发布 at 2017年12月28日

    jemalloc 这玩意好是好,就是没见过几个人用(逃

  • Ruby 2.5.0 已发布 at 2017年12月28日

    2.6 的 JIT 可能不会被编译,需要手动开启编译选项才行。。。

  • Ruby 2.5.0 已发布 at 2017年12月26日

    谢谢提醒,因为前几项和 rc1 版本一样我拿过来了🤦‍♀️

  • 我不用查维基,我也知道 ACID 指代的是哪四个单词。这不是一个要背的概念,这是任何一个深入使用数据库的人都应该掌握的知识,也是大学本科教学的内容。不知道是你的问题,不是我的问题,也不是维基百科的问题。

  • ”你个中间件做 reduce 的玩意“: 你可能不知道,阿里云Hybrid MySQL(请注意:是MySQL,不是PG,不要再搞错了),就是基于一个中间件发展起来的。

    你先来找找哪里我说 PG 了?

  • 回到23号关于形式化验证的讨论。 当时我在给另外一为客户,讲解UDDB架构的问题。旁边的你突然插问测试的问题。我当时问:是不是指SQL覆盖性测试。然后你说是,并说 TiDB 做了形式化(确切地说,你当时用的是 Formal Verification,我翻译成形式化验证是不会有错的)。 我当时表达了这不可能。 因为如果能够对SQL代码做形式化验证,那么大部分公司都应该不需要测试人员了。

    不要说你翻译的啥,我当时用的就是中文「形式化测试」。我当时问的是「你对架构怎么进行测试的?」你回答说「我们有一些测试」。这句废话回答得很好,我只好接着问,是通过了什么测试,是 MySQL 自己的测试集吗?然后你回答「对,类似的」。我立刻提出,MySQL 自己的测试集不能覆盖这种集群情况,哪怕是已经做了集群测试的 AWS 和 TiDB 也在做了形式化验证后发现了更多问题。到你这里就变成什么玩意了?

    是听力不行,理解力不行,还是故意来混淆视听?

    至于你说「因为如果能够对 SQL 代码做形式化验证,那么大部分公司都应该不需要测试人员了。 」你这对形式化验证的理解真是弱啊。你形式化验证通过,代表你形式化验证本身是正确的了吗?还来说什么「那么大部分公司都应该不需要测试人员了。 」我看你不但是完全不懂数据库,连测试都不懂吧。

  • 而分片内多副本一致性,是指在分布式系统里(出于容灾或读性能提升考虑,需要多副本),需要多副本部署。这就产生的多副本一致性的问题。

    多副本一致性的解决,一般采用 Paxos、Raft 算法,你用了吗?你不是和我说「MySQL 会自己解决的吗?」

    在我的个人经验里, 任何哪怕具有一点数据库从业经验的技术人员, 都应该是能够清晰地识别这个概念的。

    对的,所以你不能,你是想说你一点数据库从业经验也没有吗?

  • 等那么久终于等到当事人回应了,如果当事人是这么一个偷换概念的态度和理解,我想实在是非常说明问题的。

    分布式事务

    当时的情况,是我和另外一位客户(我们组总共有4位客户)在讨论UDDB如何实现分布式事务,所以我介绍了二阶段提交的做法。您在中间插问了节点间多副本一致性的问题,因为当时我们在探讨分布式事务的问题,而多副本一致性问题跟分布式事务无关(是完全独立的两个问题),所以当时我说的是:这并不是我们讨论问题(分布式事务)的范畴。

    我先来给你念念维基百科:

    为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。

    连一致性都做不到还来谈分布式事务?你是看 2PC 看傻了吧。2PC 协议是分布式事务的解决方案,用于保证属于多个数据分片上的操作的原子性。根本保证不了数据分片内的数据的一致性,完全不适用于 UDDB 的场景。保证不了这一点,也没有任何额外的解决方案,既不满足 ACID,也不满足 BASE,还来谈什么分布式事务,甚至说出事务和一致性是无关独立的问题,也是六得不行。

    形式化验证

    您提到TiDB对SQL解析代码做了形式化的验证,然后发现了几个bug,同时提到aws也有这样的方法。 我认为的是, 对SQL解析的代码做形式化验证,这是一个不可能有解的问题。UDDB只是收集了很多SQL测试用例来做测试,而TiDB这块也是这么做的。

    我和你解释了三遍这个 Formal Verification,倒最后没想到理解的还是「对SQL解析代码做了形式化的验证」。被怼了一天一夜,你不会上 Google 查一下到底是做了什么验证吗?

    http://lamport.azurewebsites.net/tla/formal-methods-amazon.pdf

    这里有一篇 AWS 自己写的 paper,自己念一下再回来说。

    OLTP

    我的理解是在讨论一个概念时,需要结合实际的应用场景才有意义。 HTAP从概念上理解,是OLTP+OLAP, 但技术需要结合具体的产品讨论才有意义。 正如我当时举得一个阿里云Hybrid MySQL的例子,阿里云Hybrid MySQL也称之为HTAP,但假如你看过阿里Hybrid MySQL的产品文档,你就会发现,他们文档里面写得很清楚,针对的场景就是物联网、大数据分析等领域,并不是涵盖OLTP+OLAP(所以我当时反问过你: 如果Hybrid MySQL能涵盖OLTP+OLAP,那就是阿里下一代产品了,又为何定位在物联网和大数据分析领域?)。 假如你对分布式数据库产品多去了解一点,这个结论是不难得出的。

    我先不说别的,阿里云的 Hybrid for HTAP 在 Sharding 上还做了分区键。要是阿里云的 Hybrid for HTAP 连 OLTP 都做不到,你个中间件做 reduce 的玩意也敢说自己能做到 OLTP?阿里云怕杀鸡用牛刀说「针对的场景就是物联网、大数据分析等领域」,到你嘴里就变成除了这个就干不了别的了,我也是佩服得不行。

    另外既然当时我举的例子既然是 TiDB,你回去打开自家 UCloud 的官方网站

    https://www.ucloud.cn/site/product/cloudtidb.html

    这里对 TiDB 怎么描述的啊?你要不要继续回去打你东家的脸才开心?

    TiDB 的设计目标是 100% 的 OLTP 场景和 80% 的 OLAP 场景。

    这就是 TiDB 对自己 HTAP 设计目标的描述。

    本来觉得这个事情造成的影响很大,特别是对 UCloud 公司的影响是超出预期的,也想避免扩大影响。没想到当事人竟来上一篇这么偷换概念的文章,看来是丝毫没有悔改之意,我必须予以驳斥了。

  • 我觉得有个问题是,Ruby 或者 Rails 一直都没有做错什么事。另一方面 Ruby 社区看事情也不是那么激进,也一直没有话题可以炒。就不像 JavaScript 社区随便出个什么新东西就能立刻把老东西的全家都批判一遍🤦‍♀️

  • 点进去数字只 -1,有个 bias 去不掉,是因为第二页、第三页的未读没有看吧。。。

  • 笑而不语 at 2017年11月09日

    Tweet from PikkamanV

  • 本质就是要把 ActiveRecord 的结果集 marshalize 一下,如果要还原出来还是 ActiveRecord 的类的话。可以把 attributes 自己提出来,塞到 ActiveRecord 里,出来的时候还原一下。理论上,也可以调标准库里那个 marshalize,这个有可能杀鸡用牛刀了,看具体需要了。

    slc 里核心需要用的就是 record_marshal 的代码,照着实现一个类似的就行。 https://github.com/hooopo/second_level_cache/blob/master/lib/second_level_cache/record_marshal.rb