Scala 泛型中的协变(covariant)与逆变(contravariant)符号
看到这个问题《± Signs in Generic Declaration in Scala》下面有一个很有意思的答案: “+” and “-” mean covariant and contravariant types respectively. In short, it means that: PartialFunction[-A1, +B1] <: PartialFunction[-A2, +B2] only if A1 :> A2 and B1 <: B2, where <: is subtyping relationship. 简而言之,-意味着逆变成立,+意味着协变成立。
布隆(Bloom)过滤器
本文还是对《区块链:原理、设计与应用》的一个基础技术的总结和摘录。 散列的本质,是把任意内容,映射成固定长度的内容域里的某一个内容。 布隆过滤器的本质,是在常数时间内回答,“一个元素是否在一个集合内”的问题。 直观的方法及其缺陷 假设我们总可以把任意内容映射到某一个数组的 item 上,那么只要看看那个数组的 item 是否为空,就可以确认某一个内容是否存在。然而现实之中,一个数组总是会产生冲突,操作性能会因为局部冲突而产生退化。 多重散列的布隆过滤器 布隆过滤器的原理很简单,就是插入元素时,在一个容量为 m 的bit数组上, 用 k 个散列函数对一个输入标记 k 个 bit,而查找元素时,再用 k 个散列函数来寻找 k 个 bit,若这 k 个 bit 都被标记过了,则这个内容存在。 普通的布隆过滤器是不应该支持删除的,因为删除一个 bit 可能顺便删除掉其他内容的 bit。但如果把 bit 换成一个计数器,那么就可以考虑删除了。这也就会产生 counter bloom filter。 当hash函数个数k=(ln2)*(m/n)时错误率最小。 实际上,不管是散列算法,还是布隆...
Merkle Tree
本文还是对《区块链:原理、设计与应用》的一个基础技术的总结和摘录。 默克尔树的特点 默克尔树是多层散列表(Hash List),目的是做多层摘要,把对多个 item 的校验,转化为对一个 item 的校验。 默克尔树可以是二叉树,也可以是多叉树。 叶子节点是 item 的 value 和 value 的散列值。中间每一层的值,都是它们子女散列值的和的散列值-多叉树的结果就是多个散列值加法的结果的再散列,孤儿的计算结果就是在孤儿散列值上进行再散列。 默克尔树的用途 快速比较大量数据 两组数据的排序后构建默克尔树,只要比较两个树的root 就可以确定两组数据是否一样。 快速 diff 如果默克尔树是二叉树,则只要从 root 开始做二分的 diff,就能快速定位到不一致的叶子节点。这在 p2p 传输文件数据的场景里非常有用。实际上 rsync 的 diff 算法就是一个一层的 Hash List , 零(部分知识)知识证明 所谓的零知识证明,就是不告诉 verifier 验证一个论断真伪的全部信息。只提供部分信息,就可以让 verifier 相信某个事情是真...
不常见的 Java 集合类的用法
Sorted 集合## Sorted集合 Navigable 集合 Navigable Priority集合 Priority Identity 集合## Identity SkipList 集合 跳表系列。 DelayQueue 延迟队列
CoffeeScript2 简明教程
写在前面的话 之前在工作群里看到一个排行榜: 在羡慕美国同行的薪水超高的同时,也奇怪为何 CoffeeScript 的生命力超过了自己之前的想象。 JavaScript 本是 Brendan Eich 在10天内做完的急就章之作,在设计之初,即带有大量的大意设计和缺陷。可以说,即使到了 1.5 时代,JavaScript 作为一门现代语言,依然要提防 Douglas Crockford 在《JavaScript:The Good Parts》中提出的种种陷阱。历年来,各路框架作者和超集语言作者,都不断在 JavaScript 上做出各种各样炫目的模式用法和衍生方言,足见其可提高空间之大。包括 CoffeeScript/TypeScript/Dart/Elm 等解决方案的出现,其实就是在倡导使用 Pre-JavaScript 的语言编写抽象逻辑,然后编译成原生 JavaScript 运行。 CoffeeScript 即是 JavaScript 1.5 时代的 Pre-JavaScript 语言中的佼佼者。其设计的语法和句法利用了 Ruby 和 Python 的优点...
client 与 server
client 模式 默认的jit编译器,c1。 默认的gc:serial-serial old。 需要更短的启动时间和初始堆大小,能做更保守的优化。 默认-Xms是1M,-Xmx是64M。 适合 GUI 程序。 server 模式 默认的jit编译器,c2。 默认的gc:ps-serial old即 PS MarkSweep(可以启用parallel old)。 需要更长的启动时间和更大的堆大小,能够做更有深度的优化。 默认-Xms是128M,-Xmx是1024M。 适合长时间运转的程序。 64 位JVM# 在64位 JVM 上有个 -d64 的模式,实际上就是禁止client模式单独启动,只允许server模式或者混合编译模式启动的模式。
分布式事务
问题定义 对经典的电商场景而言:下单是个插入操作,扣减金额和库存是个更新操作,操作的模型不同,如果进行分布式的服务拆分,则可能无法在一个本地事务里操作几个模型,涉及跨库事务。 CAP 定义 根据 Eric Brewer 提出的 CAP 理论: Consistency:All Nodes see the same data at the same time。所有节点看到同一份最新数据(线性一致性)。 Availability:Reads and writes always succeed。非故障节点必须在合理时间内响应。 Partition tolerance:System continues to operate despite arbitrary message loss or failure of part of the system。网络分区时系统继续运行。 由此诞生三种设计约束和取舍方向: CA:放弃P,仅适用于单点系统,非分布式,如 MySQL主从同步。 AP:放弃强一致性,保证高可用。Cassandra,DynamoDB。Gossip协议可实现最终一致性。 CP...
函数缓存 memoize
12345678const memoize = pureFunc => { const cache = {}; return function() { const argStr = JSON.stringify(arguments); cache[argStr] = cache[argStr] || pureFunc.apply(pureFunc, arguments); return cache[argStr]; };};
读书--拓展你的认知边界
新的书在不断打破认知边界,以前都是机械的方法论世界观的书,现在出了打通一切关于进化的书。 如何读书?# 《如何阅读一本书》,《快速阅读》。 如何选书? 跟主题,跟作者,跟大牛。不要看编著的书。 李善友的书单。 怎么有时间去看书? 亚马逊的推荐比京东准。 找固定板的时间看书。 Kindle 电子书和纸板书怎么选? 精华书都买 实在没时间,怎么办?# 樊登读书会 得到 听书 从哪里开始 从扉页来判断,从序言来判断一下。 读书最好抛弃论据和论证,而要寻找宏旨。 听书完,还是要自己看。
JSX
简介 JSX 是点缀着 XML 元素的 JavaScript。它是由 React 这个库最初构思出来的,但又不是专门为了某个库或者框架设计的。它是一种 DSL。 JSX 是 html in JavaScript 的一种很好体现。这里的 XML,实际上还是 html 元素。粗略看下来,和当初 backbone 写 rendertemplate 的函数差不多。要引入 JSX 的语法,在很多场景下都要引入 Babel 这个 transpiler,也就是要搞到工具链满天飞。照抄官网的例子的话,可以看到: 12345678910111213141516171819<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Hello React!</title> <script src="vendor-js/react.js"></script> <s...