笔记

文档技术方案选型:AsciiDoc vs Markdown

文档技术方案选型:AsciiDoc vs Markdown

D瓜哥在前面的文章 使用 Hugo 搭建博客 中介绍了如何用 Hugo 搭建个人博客。部门准备系统地整理一下各个小组的文档。恰好 D瓜哥 对写文档非常感兴趣,正好写个材料分享一下血泪经验。 编辑进化之路 第一代:WordPress 缺点:写作和排版割裂,排版耗时且繁琐 第二代:MarkDown 缺点:方言众多,工具链不够完整。 现在已经改观很多。 第三代:AsciiDoc 轻量级标记语言的优点 思路与格式融为一体 在整理文档时,随手加入格式管理,不需要为格式分心,也无须浪费时间调整排版。 代码高亮 AsciiDoc 与 MarkDown 都支持 /** * @author D瓜哥 · https://www.diguage.com/ */ public class Main { public static void main(String[] args) { System.out.println("Hello, D瓜哥!"); } } 文本格式 文本格式,天然跨平台,支持性好,方便编辑与管理。 结合 Git,支持版本管理。 生态完善 Markdown Hugo: The world’s fastest framework for building websites — Hugo 使用 yuin/goldmark: A markdown parser written in Go. 来做转换工作。也支持 AsciiDoc,不过需要挑选比较合适的主题: Hugo Themes。
《远见》之读书笔记

《远见》之读书笔记

D瓜哥
最近向一个朋友了解一家公司情况时,聊到职业发展的问题。就随手推荐了《远见:如何规划职业生涯3大阶段》这本书。正好利用这个机会,把以前的读书摘要发布出来。 这本书,D瓜哥在 告别 2019,迎接 2020:《远见》 中也提到过。这里把当时写的读书笔记直接拷贝过来: 本书讲人生的职业生涯分为三个阶段: 第一阶段是强势开局的时候。你在职业上的努力必须着重于为前方的漫长道路挖掘和装备自己。你的学习曲线要比职位、职称更加重要。在这一阶段,要为职业生涯打好基础并建立起良好的早期习惯。 第二阶段是聚焦长板的时候。该阶段的首要目标是寻找自己的甜蜜区,即你所擅长的、所热爱的和这个世界所需要的这三者之间的交集。这个时候你要展现自我,让自己鹤立鸡群,想方设法平稳地走在那条收获最大的职场路径上。你要专注于自己的长板,且大可忽略自己的短板。 第三阶段致力于实现持续的影响力,以及寻找一条可以稳定延续到60多岁甚至70多岁的新的可持续职业道路。你要在第三阶段完成三个关键任务:完成继任计划、保持关联性,以及为自己点燃一团新的职业之火。 用一句话来总结:第一阶段:加添燃料,强势开局; 第二阶段:聚焦长板,达到高点; 第三阶段:优化长尾,持续发挥影响力。 三大职场燃料来源:可迁移技能、有意义的经验和持久的关系。 5个数字,树立正确的职场思维 职业生涯的长度:用62减去你目前的年龄。 精通一项技能所需的时间:要花多少小时才能在某一方面达到“精通”? 40岁之后能赚到的个人财富百分比:在40岁之后,你赚到的钱会占你一生个人财富的百分之多少?大部分人的估计是60%。 社交货币:你有多少社交网络好友? 职场支持者的人数:你认为能在“职业生涯的天堂”里遇到多少人,也就是说有多少人能对你的职业生涯和人生带来真正的变化? 这本书强烈推荐给对未来职业有追求的小伙伴! 好戏开始,下面👇是读书摘要: PART 1 远见思维与工具箱 远见思维:多行动,少忧虑 职业生涯的持续时间长得惊人,包括了三个截然不同的阶段。 第一阶段是强势开局的时候。你在职业上的努力必须着重于为前方的漫长道路挖掘和装备自己。你的学习曲线要比职位、职称更加重要。 第二阶段是聚焦长板的时候。该阶段的首要目标是寻找自己的甜蜜区,即你所擅长的、所热爱的和这个世界所需要的这三者之间的交集。 第三阶段致力于实现持续的影响力,以及寻找一条可以稳定延续到 60多岁甚至 70多岁的新的可持续职业道路。 职场燃料很重要,因为职业生涯的基础决定结果。 这种燃料有三个主要来源:可迁移技能、有意义的经验和持久的关系。 职业生涯需要通过对时间的巧妙投资来构建。 职业生涯并不是以线性或者可预测的方式发展的。 职业生涯远不止于一份工作,而是生活的一大部分。 实现职业规划要做到的5件事 学习职场数学,树立正确的长期思维方式。 盘点职场清单,梳理你最有用处的技能、经验和关系。 进行“ 100小时测试”并完成一份“个人时间档案”,从而了解你目前的时间投资状况。 在尝试建立新的职场路径或者在多个选项中抉择时,运用“职场路径向导”( Career Path Navigator)。 时刻更新你的职业生涯 我如何避免被机器取代? 我能在哪里以什么方式找到工作? 未来我将如何分配时间? 我会把钱花光吗? 工作如何能让我更幸福? 三大阶段,聚焦 45 年职业生涯 第一阶段:加添燃料,强势开局; 第二阶段:聚焦长板,达到高点; 第三阶段:优化长尾,持续发挥影响力。 第一阶段:加添燃料,强势开局 职业生涯前 15年的唯一目标就是为接下来的两个阶段打好基础。 第一阶段是探索和弥补自身短板的时候。如果你是个糟糕的演讲者,那就去参加相关的培训课程。如果你对待团队成员过于强势或弱势,那就去参加领导力培训。学习要比纯粹的成功更重要。有时跌倒并不可怕,只要你能吸取教训,并将这些经验加以利用就行。 第二阶段:锚点甜蜜区,聚焦长板 第二阶段是在你的长板、你的爱好以及这个世界的需求之间寻找交集的时候。 坦率地承认自己的短板,针对它们招募盟友,你就可以把大多数时间放在核心长板上了。 第三阶段:优化长尾,持续发挥影响力 第三阶段的主要目的是确定接班人,即给继任计划画上完美的句号,从执行或领导的角色转变成顾问或辅助的角色。 保持关联性是你在第三阶段的工作之一。 储备三大职场燃料 你的领导力是由你的学习意愿助燃前行的。

分布式事务概述

D瓜哥
现在手机银行转账已经司空见惯。但是,D瓜哥一直在思考,银卡跨行转账是如何保证事务一致性的?借机就对分布式事务,做了简单地了解。 2PC 两阶段提交(2pc, two-phase commit protocol),2pc是非常经典的强一致性、中心化的原子提交协议。中心化是指协议中有两类节点:一个中心化协调者节点(coordinator)和N个参与者节点(participant、cohort)。 顾名思义,两阶段提交协议的每一次事务提交分为两个阶段: 在第一阶段,协调者询问所有的参与者是否可以提交事务(请参与者投票),所有参与者向协调者投票。 在第二阶段,协调者根据所有参与者的投票结果做出是否事务可以全局提交的决定,并通知所有的参与者执行该决定。在一个两阶段提交流程中,参与者不能改变自己的投票结果。两阶段提交协议的可以全局提交的前提是所有的参与者都同意提交事务,只要有一个参与者投票选择放弃(abort)事务,则事务必须被放弃。 两阶段提交协议也依赖与日志,只要存储介质不出问题,两阶段协议就能最终达到一致的状态(成功或者回滚) 优点 强一致性,只要节点或者网络最终恢复正常,协议就能保证顺利结束;部分关系型数据库(Oracle)、框架直接支持 缺点 网络抖动导致的数据不一致: 第二阶段中协调者向参与者发送commit命令之后,一旦此时发生网络抖动,导致一部分参与者接收到了commit请求并执行,可其他未接到commit请求的参与者无法执行事务提交。进而导致整个分布式系统出现了数据不一致。 超时导致的同步阻塞问题: 2PC中的所有的参与者节点都为事务阻塞型,当某一个参与者节点出现通信超时,其余参与者都会被动阻塞占用资源不能释放。 单点故障的风险: 由于严重的依赖协调者,一旦协调者发生故障,而此时参与者还都处于锁定资源的状态,无法完成事务commit操作。虽然协调者出现故障后,会重新选举一个协调者,可无法解决因前一个协调者宕机导致的参与者处于阻塞状态的问题。 基于两阶段提交的分布式事务在提交事务时需要在多个节点之间进行协调,最大限度地推后了提交事务的时间点,客观上延长了事务的执行时间,这会导致事务在访问共享资源时发生冲突和死锁的概率增高,随着数据库节点的增多,这种趋势会越来越严重,从而成为系统在数据库层面上水平伸缩的"枷锁", 这是很多Sharding系统不采用分布式事务的主要原因。 3PC 三阶段提交协议(3pc Three-phase_commit_protocol)主要是为了解决两阶段提交协议的阻塞问题,从原来的两个阶段扩展为三个阶段,并且增加了超时机制。 3PC 的三个阶段分别是 CanCommit、PreCommit、DoCommit CanCommit 协调者向所有参与者发送CanCommit命令,询问是否可以执行事务提交操作。如果全部响应YES则进入下一个阶段。 PreCommit 协调者向所有参与者发送PreCommit命令,询问是否可以进行事务的预提交操作,参与者接收到PreCommit请求后,如参与者成功的执行了事务操作,则返回Yes响应,进入最终commit阶段。一旦参与者中有向协调者发送了No响应,或因网络造成超时,协调者没有接到参与者的响应,协调者向所有参与者发送abort请求,参与者接受abort命令执行事务的中断。 DoCommit 在前两个阶段中所有参与者的响应反馈均是YES后,协调者向参与者发送DoCommit命令正式提交事务,如协调者没有接收到参与者发送的ACK响应,会向所有参与者发送abort请求命令,执行事务的中断。 3PC只是解决了在异常情况下2PC的阻塞问题,但导致一次提交要传递6条消息,延时很大。 TCC TCC是Try、Commit、Cancel的缩写,TCC在保证强一致性的同时,最大限度提高系统的可伸缩性与可用性。 TCC(Try-Confirm-Cancel)又被称补偿事务,TCC 与 2PC 的思想很相似,事务处理流程也很相似,但 2PC 是应用于在 DB 层面,TCC 则可以理解为在应用层面的 2PC,是需要我们编写业务逻辑来实现。 TCC 的核心思想是:"针对每个操作都要注册一个与其对应的确认(Try)和补偿(Cancel)"。 一个完整的业务包含一组子业务,Try操作完成所有的子业务检查,预留必要的业务资源,实现与其他事务的隔离;Confirm使用Try阶段预留的业务资源真正执行业务,而且Confirm操作满足幂等性,以遍支持重试;Cancel操作释放Try阶段预留的业务资源,同样也满足幂等性。“一次完整的交易由一系列微交易的Try 操作组成,如果所有的Try 操作都成功,最终由微交易框架来统一Confirm,否则统一Cancel,从而实现了类似经典两阶段提交协议(2PC)的强一致性。” 再来一个例子: 与2PC协议比较 ,TCC拥有以下特点: 位于业务服务层而非资源层 ,由业务层保证原子性 没有单独的准备(Prepare)阶段,降低了提交协议的成本 Try操作 兼备资源操作与准备能力 Try操作可以灵活选择业务资源的锁定粒度,而不是锁住整个资源,提高了并发度 缺点 应用侵入性强:TCC由于基于在业务层面,至使每个操作都需要有 try、confirm、cancel三个接口。 开发难度大:代码开发量很大,要保证数据一致性 confirm 和 cancel 接口还必须实现幂等性。 在 Seata 中,根据两阶段行为模式的不同,我们将分支事务划分为 Automatic (Branch) Transaction Mode 和 Manual (Branch) Transaction Mode.

Google 三驾马车:MapReduce、GFS、Bigtable

D瓜哥
MapReduce MapReduce编程模型来自函数式编程,包含两个最基本的算子:map,reduce 将一个运算任务分解成大量独立正交的子任务,每个子任务通过map算子计算,得到中间结果,然后用reduce算子进行聚合,得到最终结果。 这两个算子有一个很重要的特征:确定性的纯过程调用(pure function),函数既不会修改输入,也不存在中间状态,也没有共享的内存。因此,输入一致的情况下,输出也是一致的,这大大方便了容错性设计。 系统中有两类主要的进程节点:master(单点),worker(多个)。其中,worker根据不同的计算任务,又分为map worker(对应上图中的Map phase)、reduce worker(对应上图中的Reduce phase)。 master是系统的中心节点,负责计算任务到worker节点的分配,同时监控worker节点的状态。如果某个worker计算太慢,或者宕机,master会将该worker进程负责的计算任务转移到其他进程。 map worker从GFS(google file system)中读取输入数据,然后将中间结果写到本地文件;reduce worker从master处得知中间结果的问题,通过rpc读取中间文件,计算之后将最终结果写入到可靠存储GFS。生产环境中,一个MapReduce过程的输出通常是另一个MapReduce计算的输入,类似Unix 的 pipeline,只不过unix pipeline通过stdin、stdout连接两个程序,而MapReduce使用GFS连接两个计算过程。 Scalability 由于计算任务的正交性,很容易通过增加map worker、reduce worker来处理计算任务的增长。Input file 到 Map phase这个阶段,使用了基于范围(range based)的分片方法,master作为元数据服务器会记录split到worker的映射关系。 Availability 系统对worker的容错性较好,但对master的容错性较差。 对于map worker,计算结果是写到本地文件,本地文件的位置需要通知到master,即使同一个task被多个map worker执行,单点的master只会采纳一份中间结果。而且上面提到了map function是pure function,所以计算结果也是一样的。 对于reduce worker,reduce task的计算结果会先写到临时文件(temporary file),task完成之后再重命名写入gfs,那么如果一个reduce task再多个reduce worker上计算,那么会不会有问题呢,答案是不会的 Performance data locality — 将任务调度到数据所在的节点进行计算,减少网络传输; backup task — master在发现某个worker上的task进展异常缓慢的时候,会将这个task调度到其他worker,以缩短这个任务(Job)的完成时间。 GFS GFS(Google File System)是Google研发的可伸缩、高可用、高可靠的分布式文件系统,提供了类似POSIX的API,按层级目录来组织文件。 GFS master、GFS Client、GFS chunkserver。其中,GFS master任意时刻只有一个,而chunkserver和gfs client可能有多个。 一份文件被分为多个固定大小的chunk(默认64M),每个chunk有全局唯一的文件句柄 -- 一个64位的chunk ID,每一份chunk会被复制到多个chunkserver(默认值是3),以此保证可用性与可靠性。chunkserver将chunk当做普通的Linux文件存储在本地磁盘上。 GFS master是系统的元数据服务器,维护的元数据包括:命令空间(GFS按层级目录管理文件)、文件到chunk的映射,chunk的位置。其中,前两者是会持久化的,而chunk的位置信息来自于Chunkserver的汇报。 GFS master还负责分布式系统的集中调度:chunk lease管理,垃圾回收,chunk迁移等重要的系统控制。master与chunkserver保持常规的心跳,以确定chunkserver的状态。
《解读基金》之读书笔记

《解读基金》之读书笔记

D瓜哥
这个月断断续续把季凯帆的 《解读基金——我的投资观与实践(修订版)》读完了,秉持读完一本,消化一本的读书理念,做一下读书笔记,整理消化一下书中的内容。 目前房地产不景气,银行利息跑不赢 CPI 的情况下,证券市场是不错的可选性。首先,有政府在背后支撑、监督,不会像 P2P 那样随时暴雷跑路;其次,多方资料显示,长期来看,美国指数基金的收益率在 10% 左右,妥妥跑赢 CPI。第三,流动性好,随手都可以出手(当然有可能会亏损),最长一周时间就可以到账。(节假日除外)第四,起始资金低,几乎没有限制(支付宝买基金十元起步),相比买房动辄几十万,这几乎可以认为没有门槛。实际上,关键的问题是如何投资证券市场。 学习借鉴别人的成功经验是迅速提高自己能力的最佳办法之一。阅读这本书,也是学习别人的成功经验,提高自己的投资能力。 D瓜哥在 “《如何阅读一本书?》之读书笔记” 中介绍了一种读书方法,这次也按照这个读书方法把书的内容梳理一遍。 四个基本问题 一个阅读者要提出的四个基本问题: 整体来说,这本书到底在谈些什么?你一定要想办法找出这本书的主题,作者如何依次发展这个主题,如何逐步从核心主题分解出从属的关键议题来。 作者细部说了什么,怎么说的?你一定要想办法找出主要的想法、声明与论点。这些组合成作者想要传达的特殊讯息。 这本书说得有道理吗?是全部有道理,还是部分有道理? 这本书跟你有什么关系? 问题 针对这本书,D瓜哥有如下一下问题: 股市都有哪些风险? 常说的系统性风险都具体指哪些? 配置什么样的投资产品?什么比例比较合适? 基金是怎么运作的?怎么收费的? 如何选择基金?需要关注哪些方面? 何时卖出基金? 场内 ETF 指数基金和场外 ETF 增强基金有啥区别? 我的操作中,有什么不合理的地方? 投资准备 总结 投资,说穿了就是让钱生钱。让钱生钱,这其实是所有富人的生财之道。-- D瓜哥觉得把“富人”换成“投资人”更合适。 “富爸爸”和“穷爸爸”最核心的区别是理念,“富爸爸”在投资,让钱生钱;而“穷爸爸”就盯着那点工资,他一生的追求就是寻找一个好的工作,得到一份好的薪水。 投机是瞄准一个“机会”,希望大赚一笔,一劳永逸,而投资是要你扎扎实实、一点一滴地走向你的最终梦想。 基金就是把大家的钱收集到一起,由专门的人(基金经理)帮我们去投资证券市场。他提取他的佣金,我们拿我们的收益,他们帮我们理财投资。 开放式基金,一般分为股票基金、债券基金、货币基金,以及介于股票和债券基金中间的配置型基金。 Charmin综合征 投资不是比智商,而是比谁更理性,而理性的前提就是理解,要理解就得花点时间吧。 摘要 学习借鉴别人的成功经验是迅速提高自己能力的最佳办法之一。 梳理正确的投资观念 投资,说穿了就是让钱生钱。让钱生钱,这其实是所有富人的生财之道。 “富爸爸”和“穷爸爸”最核心的区别是理念,“富爸爸”在投资,让钱生钱;而“穷爸爸”就盯着那点工资,他一生的追求就是寻找一个好的工作,得到一份好的薪水。 《富爸爸穷爸爸》 是一本很赞的书,推荐对投资理财感兴趣的童鞋去看一看。 投机是瞄准一个“机会”,希望大赚一笔,一劳永逸,而投资是要你扎扎实实、一点一滴地走向你的最终梦想。投机实际上更多的是收获风险和灾难,而投资则是一种理性的产物。 基金简介 简单地说,基金就是把大家的钱收集到一起,由专门的人(基金经理)帮我们去投资证券市场。他提取他的佣金,我们拿我们的收益,他们帮我们理财投资。 基金资产的管理与保管是分开的,基金公司管理我们的钱的投资运作,而钱一般是托管在银行的。 一种是在你购买基金的时候缴纳,叫前端收费;也可以选择在卖(赎回)基金的时候缴纳,叫后端收费。 每种基金的净值都是在当天股票交易市场收盘以后再根据其所持有的证券的市值来计算的,一天就一个值,这个值在北京时间下午 3点以后才知道。 在看一个基金的净值时会有两个,一个叫“净值”,一个叫“累计净值”。“累计净值”不考虑分红给基金净值带来的降低因素,反映了基金成立以来总体的发展情况,而“净值”则是你交易时候的真正价格。 目前国家对个人的基金收益是不收税的。 开放式基金,一般分为股票基金、债券基金、货币基金,以及介于股票和债券基金中间的配置型基金。 有 80% 的基友在决定拿出十万八万元购买基金之前考虑的时间不到半个小时,比买件衣服的时间都少。 美国非常著名的一个基金经理林奇把这种现象称为“Charmin综合征”。Charmin 是美国宝洁公司出的一种卫生纸,几乎在美国任何一个超市里面都可以看见。林奇说:“很多人在买宝洁公司股票前花的时间还不如花在挑 Charmin 卫生纸上的时间多。”这就是“Charmin综合征”。 稀里糊涂、懵懵懂懂地就把大把的钞票投入到一个未知的领域,而且还不想花点时间去研究一下。