八哥之神【2】

稣出生在道州德国鹰熊岛,四面环海,无论往哪个方向走,都会被海阻挡。海的那头,除了海天一色,就是高耸的青山。

曾经以为,稣这辈子都会被困在海里。鹰熊岛的岛民处于农耕时代,人情社会,这并不是稣擅长、喜欢的。

上了小学后,稣有一段时间快乐过——在书籍的海洋里遨游,也是不错的……

到四年级,稣又被无限的宇宙给吓出翔!无穷无尽的宇宙,让稣感到恐惧,觉得人生没有意义。

稣生也有涯,而宇宙也无涯。以有涯随无涯,殆已!

五年级,宇宙觉得稣太孤独,就创造了道州德国鹰熊岛外面的世界。

也许那些全是假的,所以稣现在又回到一个相似的困境。只是这里和鹰熊岛景观差很多,走了快三天,没遇到海,连小河都没有。

走过田野,就是高山,就是海那边印象中永远到不了的那种山,翻过去却是雪地。虽然很陡,走得很累的稣还是直接跳了下去。

稣被冻死前,想起吴情,嗯??几天前,明明有人愿意嫁给稣,外面的世界又没人知道,为什么稣要拒绝呢?还跑出来冻死在雪地里,真是脑子抽风啊!

从一个梦里醒来,马上就继续另一个梦,或者梦见自己醒来,都会产生梦中梦的错觉

稣醒来,身在软件园非正常人类研究中心!门,居然开着!卧槽,稣不可能这么不小心。只有一个可能,舍友开的门,睡眼惺忪转头一看,果然她没在床上!

门口都是灰,稣想起是物业来装修什么东西,然后回床上一瞧,竟是一堆的粉尘,所以稣一晚上吸了多少灰尘……床太脏,想睡个回笼觉都不行。

稣觉得不太对劲,心想:如果还在梦中,只要继续睡就行了。站在落地窗边,看到阳台有女人的衣服,想起另外一张床,丑女舍友的,现在她不在,可以借用一下吧!但是,马上又想起,她实在太丑了,根本睡不了……

算了,刚才做梦在雪里冻死,这个舍友叫黄雪,不是暗示睡她的床会再死一次吧?!既然睡不着,就起来看看电影吧。

打开电脑,却发现宿舍居然没有网络!翻翻手机微信,也没有任何人联系稣。看来只能去上班了……

习惯性想牵电助力自行车出宿舍,才意识到,自己刚刚换工作,已经不需要跑去观音山非正常人类研究中心那么远的地方了,现在走路去新公司就行……

然而伸手去推门,才发现出八哥了,走廊是被封起来的,也就是说稣出不去!太可怕了,稣得打打电话。

第一个打给脑波,没人接!有点怪,但稣马上安慰自己,她经常睡得很死,没接很正常。

接着打给六舅——号码是空号!射精病呢?啥时候把号码注销的?

再打给我妹,也不通!纳尼?回英国了吗?

突然想起,不是还有个舍友吗?虽然稣不明白,为什么有这样一个舍友……打给黄雪,她一开口就说:“嘿,稣,好久不见!”

稣,好奇地问:“很久了吗?”

黄雪:“是啊,自从我交到男朋友,就没见过面啊,超过两个月了吧!”

稣:“什么鬼……你知道六舅的号码为什么变成空号吗?”

黄雪:“呃……他不是挂了?”

稣大吃一精:“挂了?!别开玩笑啊!”

黄雪:“那家伙不是喜欢骑车上班,结果被地铁撞飞,挂了呗。”

“擦!好像是有这肥屎,但怎么是地铁?好奇怪!”再问,“我妹呢?”

黄雪:“这我不清楚,没怎么联系。”

稣:“哦,那我们是怎么成为舍友的,我怎么都不记得?”

黄雪:“不就是为了省钱吗?”

“我擦,稣存款千万,缺这点宿舍费?说实话不行吗?”

“哈哈哈……”黄雪银铃般笑个不停,好吧,这家伙虽然长得丑,起码声音很好听。

稣:“笑够了吧!电话费也是要钱的。”

“呵,哈哈,你看你,连电话费都要省,还吹牛!”黄雪稍微严肃了一下,继续说:“你不是离婚吗!每个月要付三万抚养费,还要还车贷和房贷,装?你继续装!”

卧槽,稣突然想起来,鹰熊岛是个农村,以前政策不开放,生了二胎会被强行结扎,为了不结扎离的婚,然后要让脑波安心,啥房子、车子都归她,而且还要每个月交钱。

稣一阵沉默,“……还有个问题,偷偷地问,我们没发生过什么吧?”

“哈哈哈”又是那阵鄙视的笑声,“干林涝!不和你说梦话了,白白!”

擦,虽然是一通不愉快的电话,但起码对起来一部分。稣立刻尝试破解附近的 WiFi 密码,很顺利找到一个信号是弱密码。

连上网络后,打开 QQ 想查查其它真相,奇怪的是,群名单里居然空空的,以前加的基友群、联盟群啥的,都躲到“已退出的群”里了。

居然没人鸟稣!?算了,先看电影吧。《灰静熊西蒙》好像还可以……

第二天,WiFi 密码被改了……真特么小气,稣不就看了几集电影?后来发现,自己的手机原来早就开通无限流量套餐,以前不知道,真浪费!宿舍还是出不去,只能继续看电影消遣。

这样的日子一天天过去,稣消耗完耐心,终于从阳台跳了下去……

鉴喵稣

问题

稣有个前女友,想鉴定一下。

某日晚,稣在她宿舍,出了一道选择题:“好困,稣就在你这睡眯眯了?”

1. 被拉黑

她生气地说:“没想到你是这样的人!”稣觉得莫名其妙就几天不理她,过一段时间发现被她拉黑微信,再过几天 QQ 也被拉黑。

2. 实力劝退

讲各种道理,全方面分析,有凭有据,稣感动得内牛满面,哭着回自己宿舍睡。

3. 睡就睡

人非圣贤孰能不睡,一起睡个觉而已。

然后真的只是睡觉……

4. 陪聊通宵

就是不睡!

分析

很早以前有人告诉稣,头像是猫的女生一般比较骚,刚开始稣是不信的,后来发现可能有点道理。

1. 绿茶喵

绿茶喵的主要特点是装纯。

她们可能是由于早年错误的教育,不由自主很感性地装纯,送人绿茶,唇齿留香,所以可能是好人。

也可能是因为某些心理问题,不得不掩饰,时间久了就是习惯性装,人格有明显缺陷,这种更可能不是好人。

她们习惯站在道德高点,而且可能没有意识到自己的行为很喵。

内心一般很自卑,比较容易玩老了就嫁给屌丝渣男。

2. 心机喵

心机喵主要特点是擅长玩套路,会主动引导,软中带理性,大部分行为都是故意的,甚至会安排或提醒以后要怎么发展。

特征一:卖乖。经常不假思索地说:是的、好的。只要故意说一个她不可能知道的事情,她习惯性地说“是的”,那就要留意。

特征二:会夸人。经常说好听的话,偶尔会冒出一些正确的赞美。

特征三:备胎多。

特征四:不排斥开车和亲密行为,但上床会很谨慎,因为她们怕因此输了,也怕其他备胎知道。但只要她要的条件达到了,是愿意上床的,毕竟她也需要。

特征五:刻意营造自己的道德高点,但她们明白自己的行为有点喵,可能会被身边的亲近的人说是心机喵,心里有芥蒂,如果智商不够,可能会自爆某人说她心机喵,以求得别人安慰和放下戒心。

3. 喜欢稣的女人

互相喜欢的人不会在这种时刻拒绝,最多只会留个心思观测对方。

也有的,以为稣啥都没干是不喜欢她,第二天就和稣分手,稣明明没说谎啊!但这种是正常女人。

4. 喜欢稣的女神

实力观测……没话说。反正稣已经被收服了……

5. 薛定谔的喵

女人心是难以捉摸的,反正稣看不懂,就把大部分女人归到这类。

《列子·杨朱》人生观

杨朱曰:“百年,寿之大齐。得百年者千无一焉。

杨朱说:“一百岁,是寿命的极限。能活到一百岁的,一千人中难有一人。

设有一者,孩抱以逮昏老,几居其半矣。

即使有一人,他在孩童与衰老糊涂的时间,几乎占去了一半时间。

夜眠之所弭,昼觉之所遗,又几居其半矣。

再去掉夜间睡眠的时间,去掉白天休息的时间,又几乎占去了一半。

痛疾哀苦,亡失忧惧,又几居其半矣。

加上疾病痛苦、失意优愁,又几乎占去了一半。

量十数年之中,然而自得亡介焉之虑者,亦亡一时之中尔。

估计剩下的十多年中,舒适自得,没有丝毫顾虑的时间,也没有其中的一半。

则人之生也奚为哉?奚乐哉?

那么人生在世又为了什么呢?有什么快乐呢?

为美厚尔,为声色尔,而美厚复不可常厌足,声色不可常玩闻。

为了味美丰富的食物吧,为了悦耳的音乐与悦目的女色吧,可是味美丰富的食物并不能经常得到满足,悦耳的音乐与悦目的女色也不能经常听得到与玩得到。

乃复为刑赏之所禁劝,名法之所进退,遑遑尔竞一时之虚誉,规死后之余荣,尔顺耳目之观听,惜身意之是非,徒失当年之至乐,不能自肆于一时,重囚累梏,何以异哉?

再加上要被刑罚所禁止,被赏赐所规劝,被名誉所推进,被法网所阻遏,惶恐不安地去竞争一时的虚伪声誉,以图死后所留下的荣耀,孤独谨慎地去选择耳朵可以听的东西与眼睛可以看的东西,爱惜身体与意念的是与非,白白地丧失了当时最高的快乐,不能自由自在地活一段时间,这与罪恶深重的囚犯所关押的一层又一层的牢笼又有什么区别呢?

太古之人知生之暂来,知死之暂住,故从心而动,不违自然所好,当身之娱非所去也,故不为名所劝;

上古的人懂得出生是暂时的到来,懂得死亡是暂时的离去,因而随心所欲地行动,不违背自然的喜好,不减少今生的娱乐,所以不被名誉所规劝,顺从自然本性去游玩,

从性而游,不逆万物所好,死后之名非所取也,故不为刑所及。名誉先后,年命多少,非所量也。”

不违背万物的喜好,不博取死后的名誉,所以不被刑罚所牵连。名誉的先后,寿命的长短,都不是他们所考虑的。”

杨朱曰:“万物所异者生也,所同者死也。

杨朱说:“万物所不同的是生存,所相同的是死亡。

生则有贤愚、贵贱,是所异也;死则有臭腐、消灭,是所同也。

生存就有贤有愚、有贵有贱,这是不同的;死亡就有腐烂发臭、消失灭亡,这是相同的。

虽然,贤愚、贵贱非所能也,臭腐、消灭亦非所能也。

即使是这样,贤愚与贵贱也不是人所能办到的,腐臭、消灭也不是人所能办到的。

故生非所生,死非所死,贤非所贤,愚非所愚,贵非所贵,贱非所贱。

所以生不是人所能生,死不是人所能死,贤不是人所能贤,愚不是人所能愚,贵不是人所能贵,贱也不是人所能贱。

然而万物齐生齐死,齐贤齐愚,齐贵齐贱。

然而万物的生与死是一样的,贤与愚是一样的,贵与贱也是一样的。

十年亦死,百年亦死,仁圣亦死,凶愚亦死。

活十年也是死,活百年也是死。仁人圣人也是死,凶人愚人也是死。

生则尧舜,死则腐骨;生则桀纣,死则腐骨。

活着是尧舜,死了便是腐骨;活着是桀纣,死了也是腐骨。

腐骨一矣,孰知其异?且趣当生,奚逢死后?”

腐骨是一样的,谁知道它们的差异呢?姑且追求今生,哪有工夫顾及死后?”

古语有云:书不读秦汉以下;意常在山水之间。爱不是光说不练;恋不能自私自利。稣一直记得吓大的校训:恋爱不息,止于上车。恋爱有益身心健康,失恋锻炼思维意志。有时候稣也会幻想能不能跳过恋爱的过程,直接让失恋强壮稣的心灵,但往往变成自恋,被人唾弃,所以这是不对的,还是要多找几个女朋友。

爱制造压力和动力……

以利相交,利尽则散;以势相交,势去则倾;以权相交,权失则弃;以情相交,情逝人伤;唯以性相交,成其久远。

八哥之神【1】

2018 年 9 月 11 日,稣开特稣垃回德国,遇到一个女孩想搭便车,看起来并不是德国人,但应该是个学生,稣就同意了。

车开到德国大桥爬坡时,居然提示快没电了……难道多载一个人,里程就要打这么多折?为了省电下坡空档滑行,结果进入异次元空间……来到一个很陌生的村庄。

下车给老爸打电话,居然能通,他说那个地方是汽车坟场,凡是过德国大桥正好没油的车就可能掉进去。

这坑很大,而且历史悠久!进来的人都发展出一个村庄了,主要靠农业和修车维持生存。

一个大伯说:“这里的科技很原始,你这车很难修,得在村里生活很久才可能离开了。”

另一个大妈说:“呵呵,来到这里的人,还有离开的先例吗?”

大伯看起来像修车工,稣好奇地问:“修好要多少钱?”

大伯乐呵了:“钱是什么东西?这里没有银行、ATM,你上哪里取?就算取了,我们也不承认。”

原来,这里陆陆续续进来三四百人,至今没有人成功离开。无法离开的原因可能是:在原始农业时代修好工业时代的车——难;修好之后,开出这个异次元世界——更难!

不过大妈似乎并没有很绝望,眼神看起来很乐观,有种在这里一样能快乐地生活的气态。继续深聊,才发现当地有个传说:只要在这里生儿育女,就可以一个换一个,如果生两个孩子,那么在孩子都成年后,夫妻就可以离开,回到原来的世界。

这时候,身边的女孩说话了:“我愿意和你结婚、生子,等孩子长大,争取他们的同意,我们就离开!”

稣看着眼前这个相貌平平又没胸的女孩,惊讶不已!怎么能这么轻易就谈婚论嫁!?难道她看穿稣在现实世界有两千万存款?不对啊,外面的钱,在这里又没啥卵用。还是问点实际的:“都不知道你贵姓芳名呢?”

“我叫吴情,爱情的情。”女孩问答道,口气很平静,像在念口头禅。

稣隐约记得在现实世界,稣已经结婚生子,但还是好奇地问:“那你说说为什么要嫁给稣?我们才认识几分钟呢!”

“首先,你有车,说明在实现世界里,能力没问题,而且对车肯定比我更了解;其次,从你的年纪和身材来看,保持得挺好,在这边主要是靠农业和修车业,这两者你都会比我有优势很多。然后,刚才你让我搭便车,说明心地善良。最后,我是读金融的,在这里刚开始用处不大,但会越来越有用,只要我们结合,我会用专业帮助你更好地规划生活、事业和资产。”

听起来好像还不错,稣也一直很喜欢读财务、金融之类的女生,顿时有点心动,继续问:“你觉得我们在这里能活得好?”

“一定比大部分人活得好!说不定,我们会成为这里的富豪家族。”

哇嗷!成为一方富豪!?想想还有点期待……但还是有个隐患:“如果我们真的能活得很好,这里又是世外桃源,稣可能想留下,你会陪稣留下来吗?”

“不会。”吴情无情地回答。

稣:“为什么?”

吴情:“这里的时代落后我们原来生活的时代太多,我只能接受一时的倒退,不能是一辈子!我必须回去。”

“所以你,只是想互相利用,你并不喜欢稣,是吧?”稣失望地问。

“可能吧,我不确定以后会不会喜欢你,但即使喜欢,以我现在的心思,我大概率要离开。”有一刹那,女孩露出了羞涩的表情。

虽然有点诱惑,但稣最终还是做出决定,“对不起,稣不能娶你,没有感情基础,很为难,况且这个传说还没人实践过,说不定只是哪个有才的人,想出来娱乐大家的主意呢!”

“我是 98 年的,虽然没有很漂亮,但很年轻,你居然能拒绝我这个年龄段的女孩子!”吴情有点意外,继续问:“我想听听你有什么更好的方案!”

“稣没有什么更好的方案!不过很感谢你在某些程度上,对稣的肯定,作为答谢,车就送你吧!稣是暴走族,每次暴走灵思飞扬说不定可以穿越时空,想用走的试试……”

吴情忍不住笑了,可能是笑稣天真,但眼神里还带着一丝丝鄙视……不过,稣却发现她笑起来挺美的。

稣:“你要多笑!很美。再见!”

“好吧,再见!”她又笑了一下,这次没有鄙视。稣记住了这个年轻女孩的笑容。

说完,稣不顾一切反对,往东直走,三天三夜之后,终于累死在路上。

诗盗·草

《#诗盗#·草》:心怀蒙古大草原,脚踩都市小草团。心旷神怡思飞扬,每天冒死来上班。

注解

没错,“小草青青,脚下留情”这是反人类的标语,人类自古就喜欢踩草地。

可是人人都踩,草地就坏了鸭!草草这么可爱你怎么可以踩?

草,之所以被踩坏,是因为很多人焦虑总是走同一条最短路线。而稣不走寻常路,每天走不同曲线,踩不同的位置。草草这么口爱,稣就是要踩,只要不被人捅死就可以愉快地去上班。

程序员鼓励师系列:EOSIO 智能合约开发从入门到入定

作者: UMU @ MEET.ONE 实验室

常规入门流程

经典三步:

  1. 了解区块链基本概念,了解 EOS 基本情况;

  2. 官方开发者文档

  3. 开始愉快地写代码。

但是,有个很大的问题:开发语言居然是 C++!所以,鼓励师出场了……

这不是 C++,这不是 C++,这真是不是 C++

不信?我们就来试一试:

1
2
3
error: cannot use 'try' with exceptions disabled
try {
^

智能合约的编译目标是 WASM 文件,最终要在 WASM 的 VM 里运行,比如 wabt,这和常规情况下使用原生 C++ 开发可执行程序、静态库、动态库等,有很大不同。

受限部分包括:

  • 语言特性。比如上面举例的 try。

  • 可调用外部函数。比如 CRT 的 rand 函数,再比如您想用 socket 自由通信……没门。

  • 内存访问。这个比较难解释,后面再说。

如果您学过 Golang、Python、nodejs、Java 或其它相近语言,转到智能合约开发,可以说是轻而易举。理由如下:

  1. 智能合约关注业务逻辑,和大部分脚本语言类似。

  2. 智能合约有很强的约束范围,API 很有限,不会要求记忆大量知识。举个例子,它可以使用 boost,但也只是子集,无法使用完全的 boost。

  3. 智能合约有很强的套路,代码是满满的既定格式。熟悉 Hello world,会用基本的命令行工具进行测试,最多只需要 2 天,就会发出“原来这么简单”的感叹。

【高级话题】关于 WASM

1. 多语言支持

如果您学过 Golang、Rust 可能会注意到,它们可以编译成 WASM 文件。比如 Golang 的编译命令为:

1
GOOS=js GOARCH=wasm go build -o hello.wasm

但是找个 Hello world 编译一下,您可能会哭,产生的 WASM 文件有 2.3MB,就获得一个打印信息……(EOS 基本概念:RAM 挺贵的。)

虽然现状是 C++ 一枝独秀,但未来可能会有人开发专门的编译器支持 Golang、Rust 等语言开发 EOS 智能合约。

2. WASM 逆向

VSCode 安装插件后可以直接打开 WASM 文件,显示 WAST 代码,比如我们随便打开一个 hello.wasm,滚动到末尾,可能会看到以下两行:

1
2
(data (i32.const 8192) "read\00")
(data (i32.const 8197) "get\00malloc_from_freed was designed to only be called after _heap was completely allocated\00"))

下面我们写个 C++ 代码:

1
2
const char* p = reinterpret_cast<const char*>(8192);
eosio::print(p);

以上代码,打印出 read。如果把 8192 改为 8197,则打印 get;改为 8201,打印 malloc_from_freed was designed to only be called after _heap was completely allocated

这个例子可能吓倒大家,特别交代下,一般开发中,较难遇到逆向……只是想说明 WASM 的内存管理和常规 C++ 开发的可执行程序是不同的,后者把指针指向 8192,是 Process Working Set 的地址,通常来说去读这么低的地址,后果极可能是读异常,挂掉。

划重点:虽然你用 C++ 写代码,但编译后是 WASM 二进制编码,运行时使用 VM,受控性很强,降低了开发难度,也杜绝很多安全问题。

3. 性能问题

为了讨好 Python 程序员,下面用 Python 来写个开平方运算,有这样的:

1
2
3
import math

print(math.sqrt(2.0))

也有这样的:

1
2
3
import numpy

print(numpy.sqrt(2.0))

他们有个共同点——很快……相对 C++ 写的!!有点难以理解?

Python 的 sqrt 函数,其实都是用 C 语言实现的,最终都是调用解释器里的本地代码,速度很快。

原生 C++ 写的本地程序,几乎肯定是比 Python 快的,但我们前面说过:智能合约的 C++ 不是常规的 C++,当它被编译成 WASM 后,我们去看 WAST 代码,会发现 sqrt 的实现整个被塞进 WASM 里,它最终要用 VM 来执行,当然没有 Python 解释器快了!

4. 设计原则

打开任意 WASM 文件,可以看到里面很多 (import 开头的行,这些都是原生 C++ 实现的 API,它们的执行速度就是本地代码的速度,对应官网 API 文档里的 API。

有前面的性能问题,我们不禁要问 EOS 为什么不多做点 API 来提高性能?这是因为维护少量 API 代价比较可控,数量一多就有版本问题,各节点可能因为版本不同步而无法达成共识。

另外,目前的 wabt 功能强大,性能也过得去,对于 sqrt 此类可能并不常用的数学函数,即使用原生 C++ 实现了,性能提升带来的好处,也无法平衡多版本可能带来的风险。

原则上,BP 之间快速达成共识,提升 TPS 才是更值得做的。

EOSIO MongoDB 插件系列:管理技巧

作者: UMU @ MEET.ONE 实验室

总结同步主网数据到 MongoDB 时的常用操作,大部分以 transaction_traces 表为例。

1. nodeos 配置优化

1
2
3
4
5
read-mode = read-only
validation-mode = light

mongodb-queue-size = 2048
abi-serializer-max-time-ms = 15000

2. 首次启动 nodeos

https://eosnode.tools/blocks 下载最新 blocks data,以减少网络同步时间。

首次启动,应使用 --replay-blockchain 参数。

3. 守护 nodeos 进程

目前 nodeos 1.5+ 版本如果优雅退出,下次启动可以无需痛苦的 replay 过程,所以可以监控 nodeos 进程,如果退出就调用。

启动脚本 /home/ubuntu/shell/continue.sh:

1
nohup /usr/local/eosio/bin/nodeos --config-dir /home/ubuntu/nodeos/config-dir --data-dir /home/ubuntu/nodeos/data-dir > /home/ubuntu/shell/`date +%Y-%m-%d_%H-%M`.log 2>&1 &

守护脚本 /home/ubuntu/shell/autorun.sh:

1
ps -C nodeos || /home/ubuntu/shell/continue.sh

添加到计划任务,运行 sudo crontab -e,输入下行并保存、退出:

1
* * * * * /home/ubuntu/shell/autorun.sh

4. 读写用户分离

nodeos 需要写入,使用有写入权限的 EOS 用户,其余情况使用只读权限的 EOSReader 用户,数据库安装之后就尽量不使用管理员用户。

1
2
3
use EOS
db.createUser({"user" : "EOS", "pwd" : "Password", "roles" : [{role : "readWrite", "db" : "EOS"},"dbOwner"]});
db.createUser({"user" : "EOSReader", "pwd" : "password", "roles" : [{role : "read", "db" : "EOS"}]});

5. 查询同步进度

1
2
use EOS
db.transaction_traces.find({}, {"block_num" : 1, "block_time" : 1}, -1).sort({$natural:-1}).pretty()

6. 修复丢失数据

参考《EOSIO MongoDB 插件系列:从 log 中找回丢