兄弟无间

这条线是相当重要的,几乎是大厦之地基,帝国之鼎器。

在清末的官场中立足相当困难,看过刺马案或者看过投名状的小伙伴一定有感触了。主战派,主和派,维新派,光绪派,慈禧派。

晚清四大名臣:曾国藩,左宗棠,李鸿章,张之洞。

此为说法一,说法二 曾国藩、左宗棠、胡林翼、彭玉麟。

前两个都称得上是乱世出枭雄。当然,太平盛世也轮不到他们的布衣出身。一个笨的可以,曾公七次才考上了秀才,左公三试不第,这种出身到最后也能入阁拜相,实属乱世所赐。而后两位就算得上学院派的,都喝过洋墨水,面儿上人,都是非内战出名,主打外交和建设。下一篇专门讲曾和左的佚事一二。

回头说,两位打硬仗的硬汉或说是老炮儿。他们都要依靠兄弟。当然,有血脉相通的仅有曾公。左公的兄弟,不用介绍,胡雪岩,红顶商人。经济专家。但后来如何了?胡被皇帝抄家时,左公却不知所踪。是避谦,是有意?打人先打狗。想弄左宗棠先拆了胡雪岩。对比之下,这里就不及曾国藩与曾国荃了。多少人想着离间,厚黑这两位兄弟。处处凶险。

国荃莽撞有余而智略不足,当初,要不是曾公劝他多读书,要顶住压力不要南归。曾国荃也就是湖南田间一伢儿子。

此处就显示出血脉相连,而且还亲密无间的“家族优势”,要比左公的“集团优势”更加稳固。我们慢慢道来吧!

劝诫读书

曾公在家书中最多的就是劝学。四弟,九弟要经常写文章传阅给曾国藩和其父,由他们来审读,并给予评价,家族男丁视考取功名为第一要务。

端正思想

不知道曾国荃在北京的各种不适,除身体外,是否有官场外人排挤和煽风。想必更多是一种对兄长曾国藩的一种“不服气”。可以理解为青春期的叛逆吧。

当时,湖南来的京官,都是弱势群体。人数少而且没有上应。在官阶的低层,俸禄自然不够养家,书信在道光二十年左右,老家的债务算刚结算清了。曾国荃也可能是感觉到混下去没的意义了。自己又三天两头闹头痛脑热的水士不服。这种情况下,曾国藩真是感受到了一种孤独。且看摘录如图:

好个兄弟匪他人,唯兽有狼狈。贬义?用在这里全是合理和完美。

让我这个独生子女,羡慕不已呀。

曾的九弟一直“事史随行”,戎马征战。直至剿灭了太平天国,官至总督。四弟持家有道。六弟曾国华战死,曾国葆也是一代名官。所以,又摘录了家书的与兄弟诗句。

读家书,开始信的称谓是一长串的兄弟名,从给四,五个兄弟写信,到最后只能给九弟,子植写信。你能感受到新人离世的过程。国化战死,季弟病死……长串一点点变短。

曾左不和

晚清中兴的两位重臣一定是曾国藩和左宗棠。四名臣说法虽多,但有两个名字是必须的。就是本文主要聊的曾国藩和左宗棠。但两者同朝为官却相处不甚融洽。

开始的开始,是手下幕僚间互相攻击,口诛笔伐。

因为,两位的战场定位不同,一个是攘内,一个是征外。

但最后的最后,是同心若金,攻错若石,一句晚生左宗棠,在挽联中吐真言。

曾国藩去世时,左宗棠正在新疆为国打仗,但立刻书信派自己在京考试的儿子,拿着银子和挽联去送曾公最后一程。

大臣们都是有点性格的。有刘罗锅和纪晓岚就有和珅。对立阴阳。互相谁也不服气。同室操戈,面和心不和,让后世人说甚龙争虎斗。但事实上,曾和左都是死在任上,为国居功至伟,直至忠死,曾公62,左公73。

两个的共同点还包括:

湖南老乡,且都领导过湘军,打仗勇猛,长寿(以当时人平均寿命来看),仕途都曾遇到伯乐,但读书都开窍较晚。有林则徐的新疆情报和地图,有陶铸的力挺,左才破格录用。至于曾国藩也要感谢他的伯乐胡林翼。湘军正是在两个人的合作中诞生的。

如果说他们愚钝之才也是共同点,可能大家会有意见。那看数据喽。

曾国藩考秀才7次,左考3次。曾麟书(曾的父亲)更是考了17次。

当然不同点也多:

对考取功名的态度,曾公是用力极深呀,家书中没有一篇提到过科举的不好。而左公早早看透了八股文就是在浪费生命,读书是素养,功名则可遇不可求。

在新疆问题上,曾主张和,而左主张打。民族气节方面左公略胜一筹。曾公内战内行,左公外战威武。

打仗一个擅长“结硬寨,打呆仗”的攻坚战,一个擅长野外游击,左公在新疆和西北都是战神。左公带着棺材打仗,曾公带着亲兄弟战斗。

无论是出于自上而下的平衡还是出于自下而上的表演。

敲黑板,划重点。能听懂刚才那句话的都是人精了。试想难道慈禧想看到功臣们不争风吃醋?为人臣者,位高权重者,最担心的又是什么?没有敌手或者敌人隐藏于黑暗中。所以,曾与左,实在是高明。江湖不是打打杀杀而是人情世故。

这两位能成为一代名臣,民族英雄,一定是实力大于脾气的。在官场博弈中,不会发生逞匹夫之勇,口舌之快而露出明显的破绽。而斗的凶的是手下的二级人物。李鸿章是年龄小于曾公和左公的。由于和曾公是师徒关系,所以,自然站队到曾公门下,看不上左公的诸多行为。

相同的价值观

这事实也是共同点,只是这个共同点太重要了。所以单独立出来。

左宗棠给过挽联前,在一次家宴中与曾国藩写了12个字。也是现代企业家曹德旺办公室挂了多年的座右铭。

敬胜怠,义胜欲,知其雄,守其雌。

释义大略:

做人要有敬畏之心,不能怠工,怠慢。敬胜怠者昌。义胜欲者从,用义来控制欲望,也就是反人性,有人跟随,才能领导别人。

同朝为官,两公都是实力大于脾气的。

前言中讲的,曾国藩有十二日课。第一课便是主敬。所以,两位用兵如神的人,对待做事,做人唯一个“敬”字当头。

拙诚劳谦

这四个字可以高度概括,曾国藩的崛起原因。

拙与诚

不用说他的笨,有个小故事大家听过。说有人来曾国藩家里做客,在门外等候。门里的曾国藩在背诵诗书。背诵后再会客。结果,门外的客人都背诵下来。可曾国藩还没有背成。

他的同僚们更是天天鄙视他,嘲笑他笨。打仗也慢,人家夺城,他修战壕;人家抢功,他写报告。而且报告全篇不自夸一句,全是圣上英明。但这不是诚实,是幕僚的智慧。

诚实,体现在与朋友交往。也体现在日志中记录着自己的诸多糗事。对自己的诚实,才是真正的诚。别人纳了小妾。自己馋,回头又说自己不是个人,如禽兽也。自己审视自己,内省慎独。这是圣人的修炼之路。

劳与谦

即使不自夸,但是战功赫赫也是让慈禧担忧。于是派马新贻空降湘军,结果被刺杀。无耐,慈禧又派曾国藩去查此案件。凶手倒不跑,声称与别人没关系,纯私人恩仇。

曾公深知,太平天国已没,自己又手握重兵,长江以南的大批干部又是自己的举荐和培养。实在是风头盛呀。于是,要求了裁湘军。但是一旦没有了枪杆子,不就是被人搞死的节奏嘛?

但是,自己的培养的干部,可以出师了。为首正是名门之后,李鸿章。根红苗正不说,而且,组建淮军以平新叛乱。捻军也不好打。曾国藩这时没有拥兵自重。把湘军的精锐全都给了李。为了这事,几乎和九弟闹掰了。当时,李鸿章才1500人,曾国藩的这份雪中送碳,让淮军有了政治的种子。这合理合法,而且依然控制着“国家神经”。试问大清谁敢动曾李?

谦虚的另一种体现也可以说是世故。拿下了太平天国不代表可以弹劾督军了,这一点,曾国荃就不如他哥的觉悟了。家书还是到的慢了,估计曾国荃也看了他哥的劝罢书信,但依然要逞勇上书告状,终于吐了官文腐败厚黑的这口气。官文是何许人也,是督军,是八旗子弟,是曾国蕃家书中说的“巨室”。

所以,曾国藩劝弟不要动干戈。慈禧正愁没有机会来削弱曾家的力量呢。谦虚的结果是曾国藩息事宁人没事,而国荃提的官文的十条罪状之后,政府迫于面子,让官文免官了,可几年后,官文又是当上了总督,继续管着曾国荃。人家能继续当官,而骄傲的曾国荃却终于领到了“学费”,革职回家种田了。

要不是曾国藩一直以来,以谦为上。他的九弟早就把恶念变恶果了,败了兄弟的基业。攻下了南京,曾国荃答应将士可以烧杀抢掠。抄了太平天国的家,却打算着抢占财富。为官之道这件事,真不是学来了。师傅已经领进门了,但修行还是要看个人呀。悟性才是众人的短板,牛人的强项。

前言

大家都知道中国历史千年,只出了两个半圣人。

孔子和王阳明,猜的出来。但半圣则为本文集的主角—曾国藩,谥号是曾文正公。能被称为文正的,一定是家国之楷模。他卒年62岁,当时在高位,突发脑溢血,在45分钟内就去世了。

孔子的儒学,阳明心学,都是系统的哲学。而曾公和王阳明类似也是文官操武,救国平乱。但曾又不同于前两者,有着一定的书籍传世。但这不妨碍我们通过书信,或者说家书来走近这位清末的“半圣”。

曾文正公家书,是一部由后人整理的曾国藩与家人往来的书信。本人边读边笔记,用心感受这个更接地气的哲学家。

由于,曾国藩家书的世面版本也较多。本人阅读版本,即李鸿章和李瀚章两兄弟校勘的,由线装书局出版的。边读边记录,这样把曾国藩家书的干货列出来,大家可根据结构再丰富血肉。

家谱

一般来说,私人的书信往来,一定要厘清人物关系。不然读起来生涩。但曾家的人物都可不是无名之辈。他的九弟曾国荃是绞灭太平天国的功臣。他的儿子是著名的外交家。朋友和幕僚就不必多说,虽未体现在家谱图中,但都是往来无白丁。

如图:

诗词

我把书信中的诗词摘录了一下,并自己来用软笔写成书法。

一为效法曾公的修身一二,自己练字;二为真正的体会和学习。

曾公练字,写文学,下的功夫是几十年如一的。有些人可能读过他的《日课十二》

他给自己列了十二条铁律和规矩。这也会在他的书信中经常体现。

本人在读书时,也做了首诗来枉评曾公。抛砖引玉。

如图二张:

日课十二

主敬

敬胜怠,义胜欲。这是左宗棠写给曾国藩的字。当然那是后来,但曾年轻时就已经有此觉悟了。

静坐

曾对浮躁的人一眼就看得出。他的识人术是千古出名的。常用办法是约一批干部见面,然后失约,隔着帘子偷偷观察他们。然后给出的结论,谁为人中龙,历史自有证明。

早起

坚持才是重点。古人言:早起三光,晚起三慌。湘军每日晨练,少一人不请假,便不开饭。李鸿章想睡个懒觉,曾国藩揩全体将官在饭堂坐等,人到方开饭。这种压力,你敢迟到吗?你敢晚起吗?

精读

曾国藩在读一本书时,不读完是绝不会再看其它书的。叮嘱其四,六,九弟的书信中更是多次强调。

读史

曾国藩让他的弟弟和自己的儿子读《论语》,读《史记》

守本

从曾国荃弹劾官文这件事上,看的最清楚。他明白自己的地位,即便是功臣。同时,与左宗棠的几次沟通也是没有官架子。还有,在家书中,曾已经是官至二品了,但依然,对老家的父母去省官厅严厉禁止。即不让家人为乡亲告状代言,也要提醒他们要避谦。

谨言

事实上,家书中曾国藩是何等的敢说话呀。兄弟任何的懈怠于功课,就直言批评。同时很多都是对周边人员的褒贬点评。但真正的与人交往过程中,却是很得分寸。考察干部时,全是在鼓励别人说话,而自己在听。

养气

一日读书十页,习字百个。不要一时之快来纵欲。交的朋友全是良师。无聊的社交早早推脱。年轻时,曾喜欢吸湖南老家产的土烟。很大的瘾。日记里提过多次,决心要戒烟。最终用了十年,才彻底的完成目标。

保身

这块在家书中体现不多,但由于曾公有藓病。平时对自己卫生很下功夫。饮食和中医都有专门负责。事实上,在打仗军营中,纳了个小妾是为照顾自己的皮肤病。可是,军中良友以为曾国藩是沉迷女色,乱军心,誓言要杀小妾而激励其上进。这又是一段佚事。

作字

临帖百家,四个兄弟,天天互相评论写字。其中九弟最好,四弟最差。雷打不动每天百字。对此,本人也开始练,效仿。采购了一些种类的笔:钢笔式毛笔,科学毛笔,秀丽笔,便携毛笔。但坚持很难。

夜闭

这个也是修正了曾自己的一些坏老毛病。以前,年轻时,喜欢到处溜达。看别人家小妾美,就去喝花酒。自己把这些风流事写到日志中,是可笑,也是对自己的真实。

区块链阅读笔记

不谈比特币,只谈区块链,要谈也就谈一点儿。

区块链—一个数据库,分布式,账本式。
如果高度概括来说,没错就是个数据库而已。但是包装上了系列的定语,形容词,让它炫丽动人。

  • 分布式,你听不懂,换成去中心化。
  • 第三方交易信任担保,你听不懂,换成去中介化。

必须清楚地看到,比特币只是区块链应用的一个成果,“比特币不等
于区块链”。区块链是多种技术的集成,比特币只是区块链多种技术整合
的一种形式,还可以有不同技术的多种组合形式。因此,区块链的发展
必须跳出“比特币区块链”的思维和定式,不必过于追求理想化,转而
脚踏实地、实事求是,注重运用相关技术解决现实世界的实际问题,并
在实践中不断改进和完善,充分发挥区块链的积极作用。

事实上,比特币是想建立一个“乌托邦”显然,,但东方智慧不会参与天下之先。但会寻找道与术的平衡。

有人说:区块链的底层是数学逻辑,中层是哲学思维,顶层是宗教信仰。
数学逻辑是指:基于成熟的后台技术基因(p2p点对点通信,非对称加密,分布式存储)。现在是3.0版本,拥有智能合约
哲学思维是指:共识方面基于拜占庭将军问题。以太坊的Gas的鼓励政策设计也体现着经济学理念。扯蛋一下,如果春秋七国有区块链,强秦绝无机会。区块链下的价值互联网,玩的全是匿名,而目前的互联网,实名制的伎俩下依然信任危机。特么有点儿“灯下黑”的感觉。
宗教信仰是指:思想正确,而且理论自洽。已经写入国家的计划。宗教字眼都有点小,而是时代所趋。

如果,在中层哲学都有了偏差时和线下交易混乱时,那么这个比特币就仅是个“网络游戏”。你玩的再好也是一个ID,你的账户装备再贵重也只是一串加密数字。

发展过程

v1.0

比特币(Bitcoin)
v2.0

以太坊(Ethereum)
v3.0

开源:
超级账本(Hyperledger fabric)
FISCO-BCOS

《中国区块链行业发展报告2018》

摘录:风投钟情的区块链 8 个领域:
挖矿、钱包、虚拟货币、基础设施、底层技术、交易所、相关服务和区块链应用
中国区块链产业链可谓基本成型。

中央网信办第三批区块链信息服务名称及备案号

区块链的优势

重新定义未来商业生态

如果共识是机器处理二进制一定比人类专业,那就相信机器,使用机器。
就像用筷子,球拍,水壶,电灯泡……
但不同的是这个工具是账本,记录一下与你交易的或者与你有关的别人的交易的哪些事儿。后台的保证是一系列的事务,加密和传输等,这也是区块链最大的贡献。
区块链并不是一个新技术也不是一个独立技术,尤其是在当下,结合相关的链条来看:

AI,云计算——-生产力
区块链——生产关系
机器(安全科技),IOT—-生产工具

有人提出BASIC的技术战略:五个首字母分别是区块链、人工智能、安全科技、物联网(IoT)、云计算
事实上在上面的“生产三者”中都体现了,而且,任何两个新技术的组合和碰撞出的火花都是一个新的细分的领域。

你不知道的区块链

  • 可以没有币
  • 可以自己发币
  • 可以私用,场景有联盟链,公用链系统有比特币和以太坊
  • 代码开源,智能合约是一段流程化的动态合同

防黑客的话,使用联盟链或私有链,同时,一笔生意有时效性,那么让链也有保质期监控,变成离线存储。
对于效率性能问题,那么联盟节点的数量设置限制。交易的数量级下降,效率就一定提升。
技术是有边界的,也没有绝对安全的算法。关键看如何使用,最大限度的规避风险。

应用场景

商业新势力

  • 公益监管,阿里第一个上线的项目
  • 精准扶贫,农业溯源
  • 货品,食品,药品溯源,京东也在搞事情
  • 宠物品种或基因溯源
  • 私人资产管理,艺术品买卖,教育治理
  • 垃圾溯源,实名领取免费发放的垃圾袋(具有唯一性码的环保材料)
  • 去除房屋中介的DAPP
  • 协同办工,共写一本书,一个项目等
  • 物流追踪
  • 清分结算
  • 全国性的或者说多区域,流动席位类票务解决方案(铁路席位管理改造)

蚂蚁链的数字物流解决方案

区块链资源整理

解读以太坊黄皮书系列

一共有七章,目前只找到了六章翻译好的。

第一,二,三章

第四章

第五章

第六章

核心交易流程

  1. 一切源于用户A在DAPP工具上生成一个随机数,反正,我们称它为私钥k。通过把它输入ECDSA运算,得出公钥的全文,一般会比私钥长。再通过hash算法(SHA-3)来得出公钥hash,它的后20位则是用户A的账户地址。
  2. 用户A要交易给用户B一个ETH时,填充一个交易结构体tx.目前还是在用户A的DAPP工具中,对tx进行RIP编码,再hash算法(SHA-3)生成摘要,最后签名,签名结果是65位字节长的值(r,s,v)前两者32字节长。签名实质上是使用私钥k对交易摘要进行加密的过程。
  3. 验证节点出场即机器。它拿到原始交易tx和签名结果。
    1. 首先恢复出用户A的公钥q(是通过交易hash和签名计算出来的)
    2. 签名验证即是用公钥q来解密交易,得出账户名(用户A)
    3. 得出的,计算的,或者说恢复的公钥得出的这个账户名,要和原始交易中from的值做为对比。一致说明内容未被篡改。
  4. 交易一旦合法,就要被矿工进行流水线加工,进入区块。这里是有区别对待的,交易中流通的价值高,蕴的鼓励值越高,矿工也不是傻子,所以,高额交易会更快进入到区块。
  5. 当一个区块生成,即要更新世界观。树就是以太坊这个状态机的后台世界了:默克尔树(一个全局的静态树,叶子节点是指向具体数据区块),MPT状态树,其中M是指默克尔树,显示它是个进化的树结构。

给开发者的启示

方兴未艾的市场

回头看马云建立的支付宝,竟然是最没有互联网精神的阶段性物件。但是它引导和启发了市场。
所谓,分久必合,合久必分。去中心化的结果,会再次制造出中心化。
没有一个互联网公司想放弃区块链这个阵地,所以,纷纷出台自己的方案,但纵观各方案,平心而论,现在蚂蚁链,更能吸引到区块链+的客户。原因很多,它更产品化或者说产品线设计合理,概念更明晰,客户引导方面做的更好。相比其它大厂,还属于在炫技和宣传的层面。本来要去中心化,可是对大部分客户都想“开箱即用”的需求下,那么只能依赖基础设施,而蚂蚁链又准备引导市场了,虽是大鳄,但创业公司并非没有机会。因为,技术的透明的,实践是自己的,激励机制是共同的。
即使中心化再次来袭,我们也可以理性分析,首先,市场变化了,中心化的气焰一定是被打压的,暴利的中心不会存在了,其次,区块链的进化,更多出现的是基础设施的中心化,而不再是交易业务中耦合的中心角色。同时,随着业务扩展和交易数量上升时,边界成本不再线性同比上升。

个人感想

作为一个程序员,以前感觉写业务代码的人是低级的,今天做这个,明天写那个,行业积累看似很有价值,一旦换行就隔了山。直到,区块链的出现,让我眼前一亮,事实上,商业的生产关系是海量的需求,让写业务代码的人至少变成一个可以拿链走南闯北的人,努力创作不再是给别人做嫁衣,甚至是参加到价值互联网的基建圈,写入历史。
开发者就是数字世界的建筑师,全栈工程师越来越受重视,拥有更多的话语权。从对生产工具的精通转型到生产关系的设计和营造,这本身就是一种生产力。三个生产概念互相配合,界线划分得当,找准平衡点就会游刃有余。再扯远一点儿,创业公司的目标应该放在器上而不是方案上,因为要知道,整合资源绝对是自己的弱项。

读一本安全的书—-《清单革命-持续,正确,安全地把事情做好》读书笔记

本书的作者是阿图·葛文德,他是2010年《时代周刊》“全球100位最具影响力人物”榜单中的唯一一位医生。他是位外科医生,能握手术刀,妙手著文章。他通过大量的医学案例与研究发现,尽管医学科技愈发昌明高超,医生技能水平日趋完备,却仍不能避免各类医疗差错、误诊误治的发生。例如,有近30%的中风病人、45%的哮喘病人和60%的肺炎病人,未能得到妥善治疗。所以,他发起一项影响深远的行动—即清单革命。

为什么需要清单革命

这虽然是一个医学人士写的著作,文章里面充斥了一些医院救治生命的场景。但是当我读到作者对错误的深刻剖析时,就已经抛弃了试读了几页的心态,而对其奉若至宝,对作者的观点也是深以为是。
首先,错误是分为:无知之错和无能之错的。

人们犯下无知之错是一个人在未正确掌握知识的条件下所发生的错误,而无能之错是尽管掌握了正确的知识,却因未能正确使用而出错。很显然,前者可以被原谅,后者却无法被谅解。
人们犯无能之错的原因有两个:
第一:人并不能把所有的事情都记住。人往往在高压的情况下很容易忘掉一些事情。
第二:记忆和经验会让人麻痹大意。我们凭借自以为熟练的经验和记忆,麻痹大意地跳过了一些基础但重要的步骤。而清单可以帮助我们去避免犯无能之错。
了解到犯错可能是“人之常情”之后,再次“升维”深入论述一下,犯错中的两种情况:事情的复杂性与做事没有责任心。当今社会在技术力量复杂的专业领域里,“复杂性”这一点导致的失败,远比没有责任心所致失败要多得多。当工作的复杂性远超出个人正确并稳定发挥个人技能的范围时,即便最能干的超级专家都无法避免错误的发生。

我们的目标却是持续,正确,安全地把事情做好。
那么就是要进化,既然学会使用和制造工具是人类进化的标志,那么这个工具,是什么呢?系统吗?软件吗?可大可小,为了不限制想象力,我们抽象的称它为“清单”。
同时,管理的入口是基于“不相信”或者说“承认”。承认任何人或者团体做事情不是万能的,不出错的。也不相信每个人都是有责任心的。于是能让人们“于无声之处听惊雷”的反应机制的设计也是“清单”。

进阶到“清单”的应用层

为了清单真正发挥作用,作者总结了几个原则,分别是:
第一,设计要简单高效可测。
第二,执行上要有明确的检查节点。
第三,编制者要在操作-确认和边读边做这两种清单类型中做一个适合具体情况的选择。
第四,清单不能太长。
第五,要不断更新。
事实上,让领域内的资深人员编制是前提,因为,这样会保证专业的术语应用,同时,在实践中接受检验。
执行上上要有明确的检查点是说在执行清单的时候,提前安排某个节点或者某个情况下要使用指定的清单。比方说,你开车的时候,突然仪表盘上的电瓶灯亮了,这个时候你可能要停车,拿汽车手册翻到电瓶仪表灯亮的那章看看接下来该怎么样去处理。仪表灯亮就意味着是一个检查点。要让清单用起来,就要设置这样的检查点,告诉我们什么时候使用这个清单。另外清单要及时更新,清单要使用,必须要不断地进化来符合实际情况。

书中的例子:在医疗界,阿图医生所推行的手术安全核查清单,已演化为一场全球性行动,因为他真的使患者手术医学专用期的病死率由原来的1.5%降低为0.08%,下降了一倍!与之相关的并发症发生率,也降低了四个百分点。每天早晨,当笔者在手术室开始工作时,核查核对已成为一项制度,必须执行。
自己做为一个软件工程师,从软件工程的层面去解析,做的一个个系统,里面有一个个模块,模块中一个个todo list……最后才是一行行代码。开发经验越丰富的人,代码会更健壮,出bug的机率越少。所以,国内大的互联网公司,一线开发人员上岗前一定会学习“老鸟儿们”(经验丰富的人员相对于菜鸟而言的)写的编程规范,同时在coding过程中做到一行代码,十行注释要求,还有的公司在实行结伴编程。颇像汽车拉力比赛中导航员和车手的关系。一个手持清单,一人执行操作。

清单背后的意义

清单本质上体现了外包和可靠,梳理和概括。外包就是指我们把大脑需要记忆的工作,外包给清单。清单的精髓不是罗列注意事项然后去打钩,而是改变你的价值观,任何时刻都要清醒的认识到主角仍是人。事实上它还有多方面的价值,清单在指导人们学习方向也更有帮助,擅长做清单的人,学习中做笔记也一定是高手。很多人不喜欢用清单的执行标准程序,觉得丧失了灵活性,会变得死板,但是恰恰相反,使用精心设计的清单不会让你变得死板,他们会帮助你节约有限的脑力,不让你的大脑被繁杂的检查项目所占据,而是释放出来处理更加困难的问题。这里错用一句老子的“绝学无忧”,可能表达的更好。清单不是一种僵化的教条,而是一个实用的支持体系,使用清单反而会带来最大的灵活性。
本人也推荐一款软件,来实操清单,就是印象笔记。你可以用传统方式使用它,也可以结合日历来做计划安排,分享给团队等等。

“上士闻道,勤而行之”相信那些高效能的人士或行业已经觉醒,从上层到基层都开展了相关的活动。作者的调研来看,美国的航空和建筑业是最为受益于清单的。而医疗行业也正在变革。
当行业践行它时,一定会保障到行业的持续安全生产。
当清单出现在更多人的观念中时,它足够让一个国家有更好的未来。让我们开始清单吧。

windows核心编程(第5版)读书笔记一

第一章节 错误处理
几乎所有的windows API返回值都是下列之一:
VOID——不会失败,失败了骚扰bill gates去,
BOOL——不用说了吧,
HANDLE—失败则是NULL,当然有时是-1,
PVOID—–失败是NULL,成功就是指针喽,
LONG/DWORD—-要看具体的上下文环境了。
当调用失败,返回值会先指出已经发生错误。所以要先判断返回值。然后,使用GetLastError()来得到详细的错误提示。返回值是dword类型的,要得到描述,加入WinError.h.
技巧一:在监视中,$err,hr,就会看到调用的API错误的内容。
技巧二:使用VS的IDE小工具,error lookup
只你自己开发的模块想返回不一样的error时,可以使用SetLastError(DWORD)来写入,当然,错误代码要像点样,即32位中的29位要必须为1.而0是给系统用的。
第二章节 字符和字符串的处理
VC6——ANSI,DBCS——-/Zc:wchar_t(这个选项就会有定义wchar_t这个数据类型)
VS201X———–ANSI,UNICODE(指的是UTF-16)
事实上,typedef unsigned short wchar_t;
WinNT.h中统一了类型的名称。
TEXT(param)在unicode宏定义下,在param前加了L前缀。
所以,TCHAR也是个宏,可以配合TEXT(),_T() 来一起变脸。
unicode阵营的后缀或关键字母:
w—wide
L—-
ansi阵营的后缀或关键字母:
a—ansi
中性函数:或会变脸的,应用在两种编码下都可以编译场景,加入TChar.h配合String.h
_tcslen()会变脸成wcslen或strlen
C库的新版本的安全系列函数
1)字符串函数:加入StrSafe.h
_tcs拼加后面的选项即可cpy/cat/再拼接_s后才是安全字符串函数。第二参数为要处理的字符长度,用_countof宏(stdlib.h) 来得出字符数最好,注意不是字节数哟.
StringCch为前缀的也是安全函数。
注意:
使用微软包装的安全函数代替C库函数,好处是即时发现内存操作的异常,但有时也可能会出现“Debug Assertion Failed”对话框。当然要是debug模式下,当然也有办法屏了它,用release或定义InvailidParameterHandler函数,然后注册它,再程序运行开头加入个宏:_CrtSetReportMode(_CRT_ASSERT,0);
判断返回值必须等于宏S_OK,当不是这个值时必须要检查字符串的操作。
2)安全缓冲区函数:加入CrtDefs.h
memcpy_s——–wmemcpy_s
memmove_s——-wmemmove_s
第三章节 内核对象
有SECURITY_ATTRIBUTES结构为参数的生成才是内核对象,区别于GDI和其它的对象。
所以这也揭露了内核对象的本质是—-结构。而句柄则是—–由系统管理着的内存地址
CloseHandle()函数详析:
工作步骤:
1,验证自己主调进程中的句柄表,是否有权访问此句柄。如果有效,则获得内核对象的数据结构地址。
2,把内核对象结构使用计数减1,如果是0了,则销毁。
注意:
如果参数是无效的句柄,CloseHandle返回false,GetLastError返回ERROR_INVALD_HANDLE。如果在调试,则出现0xC0000008的异常抛出。
当函数返回前,清除当前进程的句柄表,所以以后代码不能再使用此句柄了。
当用变量保存过句柄的话,应该设置为NULL。
任务管理器是可以查看程序中的进程句柄表。
跨进程边界共享内核对象—略

windows核心编程(第5版)读书笔记二

第四章节 进程
进程内核对象在创建的时候总会处于未激发,无信号状态,但当进程终止时,系统自动会让进程对象变成激发状态,并且会永远保持这种状态。即回不到未激发状态。
C库会根据三个维度选择入口点函数:
编码,运行模式,运行环境
_tWinMain(WinMain)
wmainCRTStartup
_tmain(wMain)
_tmain(Main)
mainCRTStartup
wWinMainCRTStartup
WinMainCRTStartup
_tWinMain(wWinMain)
编码
ANSI
UNICODE
UNICODE
ANSI
ANSI
UNICODE
ANSI
UNICODE
运行模式
GUI
CUI
CUI
CUI
CUI
GUI
GUI
GUI
运行环境
WIN16
WIN32
WIN16
WIN16
WIN32
WIN32
WIN32
WIN16
在VC自有的C运行库的源代码中,crtexe.c中可以找到以上win16四个函数的源代码。
这些启动函数或者说入口函数的作用是:
1)获取指向新进程的完整命令行的一个指针
2)获取指向新进程的环境变量的一个指针
3)初始化C运行库的全局变量。如果包括了StdLib.h,就可以访问这些全局变量了。
4)初始化内存分配和IO底层
5)调用所有全局和静态C++类对象的构造函数。
系统接管,加载exe,dll到进程的一个地址空间(与链接器有关了),把这个地址返回给第一个入口函数的参数,即实例句柄。
下面可以玩这个句柄了,GetModuleFileName().
如果,你忘记实例句柄了,或没没放到全局里,不过没关系,可以用GetModuleHandle(param).参数可以是一个路径,最好是程序里用到的某个dll,要么,param就是NULL,这样就会得到运行着的当前进程的实例句柄。
命令行和环境变量,最好不要用C运行库初始化后的内容,万一时机没对,还没初始化你就读了,会出问题,所以window有厚道的API。GetCommandLine(),C运行库都在用,你凭啥找事儿,对吧。
技巧一:配合CommandLineToArgvW(GetCommandLine(),&nNum),可以得到友好的命令行参数。
这个配置和系统—》高级系统设置—》系统变量的内容是一致的。
入口点函数完后,就是进程的后事了,包括:
1)C运行库接管,调用自己的exit
2)调用_onexit()此前注册的任何一函数,假如你注册了的话。
3)调用所有全局和静态C++类对象的析构函数
4)如果有DEBUG则可以生成内存泄漏报告,可以深入去研究下。
5)C运行库来调用操作系统的ExitProcess函数,把入口点返回值以参数传入,即退出代码。这样系统就会杀死进程了,此函数返回值是void,它通知OS了,就应该无声息的over了。
注意,有时入口点返回,而有时线程可以调用ExitProcess和TerminalPorcess。
入口函数中显示使用ExitThread的函数,会让主线程退出,但如果其它线程还在工作呢?进程就不会退出,造成僵尸进程的凶手。
入口函数中显示使用ExitProcess的函数,会让C运行库函数没有执行清理资源的机会。
所以,最保险就是永远不显示的调用ExitX之类的函数。
更NB和危险的函数还有,那就是TerminalProcess,它厉害在它可以在某线程里被用,去干掉自己和别人的进程。

进程当前目录
这里要注意,因为,进程下的线程是有能力改写进程的当前目录,这也包括子进程。所以,要注意。
线程会通过GetCurrentDirectory()和SetCurrentDirectory()来存取路径。
做为进程,可以使用GetFullPathName()来看看现在的路径或者根据驱动器去环境变量里找到某路径。

windows核心编程(第5版)读书笔记三

第六章节 线程基础
创建线程,要使用_beginthreadex来代替WAPI提供的CreateThread。因为,要从编译器角度来创建。从用户角度至少看起来没有依赖OS。但事实上,里面还是用了CreateThread.
同样,杀线程,使用_endthreadex.
注:用以上两个库函数的原因是,因为,如果你用了signal函数,那么就要用_end函数来清理资源,可是那样,你就画不圆上下文了。同时使用时要注意有EX来标识的,因为存在着旧的弃用的函数。
CloseHandle是可以传已经被清理的或伪句柄的,只是它会返回false,并且对error置成ERROR_INVALID_HANDLE。
TerminalThread是异步的,只是发信号。要确定被杀的线程死了,要用WaitForSingleObject,向其传递线程句柄来守候。原理就是,线程的内核对象,当引用计数减为0时,会变成激发状态,有信号状态。
GetExitCodeThread是检查线程退出代码的。如果线程还没有退出,返回是STILL_ACTIVE宏的值。如果已经退出,返回true,并有相应值。
微软提供的C/C++库用于本机的开发。
libCMt.lib
库的静态链接发行版本
libCMtD.lib
库的静态链接调试版本
MSVCRt.lib
导入库,用于动态链接MSVCR80.dll(默认库)
MSVCRtD.lib
导入库,用于动态链接MSVCR80D.dll
MSVCMRt.lib
导入库,.net的托管/本机代码混合
MSVCURt.lib
导入库,.net的MSIL代码
线程句柄自获函数:
几乎所有的WAPI函数都要在第一参数传句柄的,所以,当你突然眼前一亮,想用WAPI了,这第一个参数必须难不住你呀。
HANDLE GetCurrentProcess();
HANDLE GetCurrentThread();
注意:以上两函数返回的是“伪句柄”
原因:
1)它们不会在进程句柄表中新建句柄,当然也不会影响引用计数。当然,CloseHandle()多释放一次,程序不死,只是它返回false。
2)它们返回的句柄要根据运行所在的进程和线程来关联。比如,在父线程中调用了,返回的句柄即使以参数传给子进程,则其指向仍然是子线程的。所以这一点有些像虚函数中的虚指针,只能意会不能言传了。
当然,有时用线程ID做些逻辑时,可以使用:
DWORD GetCurrentProcessId();
DWORD GetCurrentThreadId();
当然,如果你有了ID,你还可以换成句柄。
OpenThread(),下面示例一下转换办法并且,给出一个对进程优先级操作的技巧。
VOID SuspendProcess(DWORD dwProcessID, BOOL fSuspend)
{
     HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,dwProcessID);
     if(hSnapshot != INVALID_HANDLE_VALUE)
     {
          //walk the list of threads
          THREADENTRY32 te =  {sizeof(te)};
          BOOL fOK = Thread32First(hSnapshot, &te);
          for(; fOK; fOK = Thread32Next(hSnapshot, &te))
          {
              if(te.th32OwnerProcessID == dwProcessID)
               {
                    //主角登场
                    HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te.th32ThreadID);
                    //略过对hThread的判断
                    if(fSuspend)
                         SuspendThread(hThread);
                    else
                         ResumeThread(hThread);
                    CloseHandle(hThread);
               }
          }//endfor
          CloseHandle(hSnapshot);
     }
}
最后,再赠送两个函数用于获取进程,线程运行的时间。
GetProcessTimes(),GetThreadTimes()
第七章节 线程调度,优先级和关联性
线程可以自己挂起,但不能自己恢复,并且,挂几次要应该恢复几次(ResumeThread)。挂起可以在线程生成时以参数传入,也可以用SuspendThread来人工自由操作。
第八章节 用户模式下的线程同步
技巧:
原子操作的系列WAPI函数:InterLocked*
+ExchangeAdd
+Increment
+ExchangePointer
volatile关键字,用来声明,后面的变量不能被优化,要去不断从内存来读取。
进阶一段:CRITICAL_SECTION结构和EnterCriticalSection和LeaveCriticalSection
要声明个全局的CS变量,然后用前初始,用后删除。
TryEnterCriticalSection比较灵活,做人当如此,能锁定就锁定段,没有段可用时,就立刻通知调用者。
同时,也不要把初始化关键段看低,因为,能避免交给内核态就晚点交,不然,上下文切换的步骤很耗时,耗资源的。所以,给初始化传值或用Set来设置抢段的重试时间,InitializeCriticalSectionAndSpinCount(p1,p2),p1是句柄了,p2大约4000。
注意:
线程抢锁的顺序要一致,否则死锁,即在锁包锁的情况下。
关键段的使用只能在一个进程内来控制其中众线程的同步,并且不能根据时间来等待。
进阶二段:条件变量
线程想把锁释放并把自己阻塞,就使用条件变量。
注意,这时,你得玩两个内核对象才行,即条件变量,必须配合锁。
首先看看这个阻塞函数,我特喜欢微软用sleep来前缀,因为,可读性很高。体现了两层意思:1,这是阻塞的,2,这是有时间参数的,时间到了没拿到条件变量就是false.
SleepConditionVariableSRW或SleepConditionVariableCS看吧,后缀又说明了要配合的锁。够意思。
我不够意思了,不列参数,自己去查手册喽。
有了Sleep就得有Wake吧。它会使等待同一个条件变量被触发的线程得到锁并返回。然后就干活呗,但得到锁了就得释放它。但它不会同时唤醒其它正在等待同一个条件变量的线程。
要看自己的实际需要。反正也是有WakeAll*和共享锁和独占锁来设计。
第九章节 内核态用内核对象进行线程同步
进程和线程内核对象在操作系统的处理上一样设计的。见笔记二的进程描述。
本章节介绍了另外的内核对象来帮助我们玩转线程同步。
1,事件
2,可等待的计时器
3,信号量
4,互斥量
头大吧,不过,我们要想掌握它,必须用不同的维度和结构去3D它。
首先,了解基础,或者说这个是第一个维度。
前进了解了进程和线程,有信号和无信号的规则,那么,这四个对象呢,look
事件:
引用计数器
自动重置/手动重置———–初始参数方式,CreateEvent
是否被触发——————-函数控制,SetEvent,ResetEvent
手动重置事件:
被触发时:等待此事件的所有线程都是会变成可调度状态。
自动重置事件:
被触发时:等待此事件的一个线程,只有一个线程会变成可调度状态。
因为自动重置会在一个线程得到事件对象后,自动把自己变成未触发状态。系统代劳的。
可等待的计时器:
指定时间或每隔一定时间触发
引用计数器
自动重置/手工重置——-初始化方式,CreateWaitableTimer,和事件一样没有其它的设置方式
SetWaitTimer是生成了内核对象后,需要进一步应用时的必经之路。因为,创建后,计时器都是属于未触发状态。
信号量:
引用计数器
最大资源量————-池里的资源总数
当前资源数————-目前应用了资源的数量,用RealseSemaphore来递增
互斥量:
引用计数器
线程ID———–内部自己管理,当计数为1时,则用调用的当前线程ID来填充。
递归计数———是否要触发

windows核心编程(第5版)读书笔记四

第19–20章节 dll的基础和高级技术
入口点函数:DllMain()
一般用来执行一些进程,线程有关的初始化和清理工作。要么不实现它,要么实现正常,返回true,否则,dll可能就不能被使用。
注意:
区分大小写的,否则就是无用的。
隐式调用dll时,系统启动时就会用到DllMain(),而显式调用时,在LoadLibraryex中来调用。并且,切入点是DLL_PROCESS_ATTACH
当引用了dll的exe要建立个新线程时,会检查所以已经被调入进程空间的dll的DllMain。并传入DLL_THREAD_ATTACH。有一个例外就是主线程切入仍以process来通知dll.