Vue 值得注意的小知识点
this.$el.querySelector(‘#map’) 只能查找第一个 dom 以内的 dom 节点,不包括当前的 dom。 在 webpack:// 这个域下可以看到可调式的 vue 文件。
Spark Standalone 模式启动的全过程
把这个事情做成一个小 routine,免得以后每次都要看英文文档来搭 dev 环境 准备工作下载安装包,解压并进入根目录。 ./sbin/start-master.sh。看 jps 果然已经有了一个 Master 进,文档里面说会打印出 spark 的 master url,但没打印出来。就去默认的http://localhost:8080上看即可: 12URL: spark://magicliang:7077REST URL: spark://magicliang:6066 (cluster mode) 这个6066在本地 telnet 不通,也是很神奇。 把这个 URL 拼接成 worker 的启动命令./start-slave.sh spark://magicliang:7077,然后可以看到以下这张图: 文档里的给出的定义 worker 节点的方法:在 Spark 根目录下定义一个 conf/slaves 的文件,每一行写一个主机名。如果这个文件不存在(就是我们现在这个状况),则 worker 就会全部启动在 localhost 上。而 master 是通过 ssh...
DAG 执行框架优于 MapReduce 的地方在哪里?
有个同学问我什么是 DAG 框架。我感觉隐隐约约听过,但又讲不清楚它的概念。 上网搜了一下,我们常见的新大数据执行框架如 Spark、Storm,还有一个我没听过的 Tez,都算 DAG 任务执行框架。他们的主要优点是,可以用 DAG 事先通晓整个任务的全部步骤,然后进行转换优化。如 Tez 就可以把多个任务转换为一个大任务,而 Spark 则可以把相关联的 Map 直接串联起来, 免得多次写回 hdfs(看来 hdfs 也很慢)。传统的 MapReduce 框架为什么不能理解这种优化空间的存在,在任务运行的时候好像一个盲人一样,是个很有意思的话题。 Quora 上的一个相关的问答。
风险问题
风险可能有收入也可能有损失。风控先是管理,然后是控制。 精细化管理,平衡点。 信用风险(Credit Risk)欺诈风险(Fraud Risk)操作风险(Operationl Risk)伦敦乌龙指?现金流风险(Liquidity Risk)市场风险(Market Risk)监管风险(Regulator Risk)声望风险(Reputational Risk) Exposion 担保套利 美国三大征信局 Experian、TransUnion、Equifax。美国百分之八十五的人的信息在民间征信局。 美国的征信分数 FICO 由五个部分组成。 中国人会抹掉五年期的征信历史。 Payday Loan 是没有年化上限的。
比特币小细节
收款地址是公钥的hash。 区块结构: 数据项 描述 长度 Magic No 魔数 总是 0xD9B4BEF9 4 字节(定长) BlockSize 区块大小 到区块结束的字节长度 4字节(定长) BlockHeader 区块头 包含六个数据项 80字节(定长) Transaction Counter 交易计数器 正整数 VI=VarInt 1-9字节(变长) BlockHeader 区块头 包含六个数据项 80字节(定长) Transactions 交易 交易列表(非空) 由Transaction Counter 描述的长度(变长) 由此表可见,只有交易计数器和交易明细列表是变长的。 比特币使用 SHA256 算法,它的结果哈希值大小为 256 位。也就是说,只要输入超过2的256次方个数,就一定会发生碰撞,即使只有2的255次方个数,也有百分之九十九的几率发生碰撞(为什么?)。 当前(这一百年内),每个区块都至少包含一个...
什么情况下 Scala 应该省略 Return 关键字
一个很有意思的回答。 总体而言,如果我们能够分得清什么 last expression,我们就能推导出和编译器一样的返回类型结果。否则,我们应该显式地加上 return,这样既指定了实际返回类型,也指定了控制流上的返回点。
以太坊的硬分叉
有四次计划内的软件升级,每次都是硬分叉:Frontier,Homestead,Metropolis,Serenity。 有一次意料之外的分叉(DAO 事件),制造出 ETH 和以太经典两种货币。 每次分叉都会造成矿工的迁移。旧链会因为流失算力而丧失安全性。 大都会分叉本来打算引爆难度炸弹,迫使矿工们从 PoW 共识算法移动到 PoA 共识算法,让以太坊进入冰河时代。但这个难度炸弹的引爆被延后了。 大都会同样引入了一个 PoS 的早期实施,Casper共存 算法允许每一百个区块里会有一个 PoS 区块。关于 PoS 算法,Vitalik 的解释是: 想象现在有 100 个人围着圆桌,其中有一个人拿着很多张纸,每张纸记录着很多笔历史交易信息。第一个人拿起笔签完后递给第二个人,第二个人也做出了相同的选择,如果大多数人做出了相同的选择,即都签署了同一张纸那么每一个参与者会获得1美元,当你做出和绝大多数人不同的选择时,那么你的房子就会着火!...
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...
Merkle Tree
本文还是对《区块链:原理、设计与应用》的一个基础技术的总结和摘录。 默克尔树的特点 默克尔树是多层散列表(Hash List),目的是做多层摘要,把对多个 item 的校验,转化为对一个 item 的校验。 默克尔树可以是二叉树,也可以是多叉树。 叶子节点是 item 的 value 和 value 的散列值。中间每一层的值,都是它们子女散列值的和的散列值-多叉树的结果就是多个散列值加法的结果的再散列,孤儿的计算结果就是在孤儿散列值上进行再散列。 默克尔树的用途快速比较大量数据 两组数据的排序后构建默克尔树,只要比较两个树的root 就可以确定两组数据是否一样。 快速 diff 如果默克尔树是二叉树,则只要从 root 开始做二分的 diff,就能快速定位到不一致的叶子节点。这在 p2p 传输文件数据的场景里非常有用。实际上 rsync 的 diff 算法就是一个一层的 Hash List...