• 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

  • Ruby Kaigi 2017 没人关注么... at 2017年09月21日

    还有个 Workshop 手把手教你写 PyCall,第二天的时候

  • Ruby Kaigi 2017 没人关注么... at 2017年09月19日

    我明天还要演讲,想想我又要睡不着了

  • 哇,这个图画得好高级

  • Ruby v2.4.2 Released at 2017年09月17日

    没用。。。我翻译版本发布记的时候看了下遇到的具体问题。。。 不过你这么一说我倒是可以试试这玩意,三年没维护这个 gem 了,有点虚。