阅读视图

发现新文章,点击刷新页面。

AI时代的摩尔定律与赢者通吃

技术的发展真的是让人感慨自身的局限与保守。看完今年CES Nvidia的发布会,感慨就是赢者通吃。当你有了一个基于硬件算力的软件通用平台,就像发电机接入了电网,应用层面的爆发就是只争朝夕了。

以前听闻摩尔定律,觉得指数式增长简直天方夜谭。而今看AI的发展速度,确实是指数级别的爆发。

这有多么颠覆呢?以前学经济学的时候有个概念叫做自然垄断,就是一个东西的规模成本导致这个市场只需要单一生产者(或者少数寡头)就足够了。最典型的就是基础设置比如水和电,公路网铁路网等。

AI的规模的乘数效应之强大,自然而然形成了一个新的基础设置。自然垄断最后的结果一定是政府规制,而AI还处于一个野蛮生长的阶段,赢者通吃。

作为一个宏观经济学渣,唯一记得的经济增长模型就是里面有个外生的科技进步系数,这个系数决定了经济增长的上限。没想到,在有生之年,居然能看到这个系数又一轮的变化,工业革命的井喷。

哎,虽然无法直接贡献到技术增长本身,但身在其中还是让人心潮澎湃,感慨命运的眷顾。

孔大壮与阿桂

这个按分类的话,应该算是同人小说。


站着喝酒的孔大壮

赵家庄的酒馆的格局,与别处无他。大柜台备着热水,可以随时给收工的人温酒。

我因家就住在这附近,打小就在家旁边的酒馆当伙计。

店里长衫短衣的都有,大家都坐在店里吃酒。长衫要酒要菜,短衣则要酒要肉。每当有人点肉,掌柜就调侃:「赚这么点钱,全吃肉了。」短衣帮也不客气:「吃肉才有力气!有力气才能赚钱!赚钱才能吃肉!」

孔大壮却是站着喝酒的唯一的人。他身材高大健硕,焦黄脸色,满脸皱纹,眼神却十分犀利。身穿短衫,说脏不脏说破不破,看着却又像穿了多年一般,大腿胳膊把袖腕裤腿都撑满了。对人说话也直率得很,但有时却又很高深,跟短衣帮直来直去,跟穿长衫的却不仅能之乎者也,甚至有时还会冒出几句洋文。因为他姓孔,身材粗壮,所以小名叫孔大壮,叫得太久,没人记得他原来的名字了。

听人家背地里谈论,孔大壮没读过书,年幼便四处打短工,努力营生,赶上如此乱世,愈过愈穷,弄到将要讨饭了。幸而一身好体力,地主家都喜爱他来做苦力,换一碗饭吃。又幸得一次,路遇洋人打洋人,孔大壮上去逞能,竟把打人的洋人吓跑了。被救的洋人说是教堂的主簿,说是要好生报答大壮,大壮竟才转运。


茴香豆

孔大壮喝过半碗酒,座下的人便问道,“大壮,你当真认识洋文么?”孔大壮看着问他的人,很显然知道大家又想逗笑了。他们便接着说道,“大壮去捞个秀才吧?”孔乙己立刻显出一副嫌弃模样,脸上笼上了一层灰色,嘴里说些话,听着貌似有啥深意,但完全不懂了。在这时候,众人也都哄笑起来:店内外充满了快活的空气。

在这些时候,我可以附和着笑,掌柜确是阴冷的脸。有时候还会拉住还站在柜台旁的孔大壮,表示大壮不能和他们谈天。孔大壮也自己知道不能和他们谈天,便只好向孩子说话。有一回对我说道,“你读过书么?”我略略点一点头。他说,「读过书了,有什么以前没读过书时的感想?」我想,只是一个苦力,也配考我么?便回过脸去,不再理会。孔大壮等了许久,却不见回应,只是叹了口气,显出极惋惜的样子。

有已回,邻居孩子听得笑声,也赶热闹,围住了孔大壮,大壮便专门点上一盘茴香豆。孩子吃完豆,仍然不散,眼睛都望着的碟子。大壮伸开五指将碟子罩住,弯腰下去说道,「娃娃们要不要学写字?」然后用手指站着酒在桌子上写了个回字。娃娃也照着大壮的办法写字,写出一个字,大壮就给发一个豆,豆子没有了,这一群孩子也都各回各家了,大壮一个茴香豆都没吃,却心满意足的把空盘子端了回来。


赵家丁

一日,街上大乱,掌柜的叫我去门口看是如何,我刚走下台阶,就见孔大壮正举着一个巨大的扁担砸向一个逃跑的男子。

「在让我看到一次,我就打断你的腿!」孔大壮如此大吼着。

掌柜的竟也出来看了,竟径直走向孔大壮,一把拉住,「你怎么能打赵家丁啊?他可是赵老太爷家的家丁!你怎么惹得起的啊!」说罢竟把孔大壮拉入了酒馆,赵家丁见状就此跑得不见踪影。

孔大壮竟在酒馆坐下来,巨大的身高配上巨大的扁担,坐在狭窄的板凳上,显得突兀。「我正在赵老太爷家做工,那厮竟当着众人的面调戏吴妈,我忍不得!」

掌柜竟端了碗酒过来,「消消气。」

不大一会,阿桂竟来到店里。


阿桂

没人知道阿桂是什么身份,一贫如洗,无家无业,大家只知道他住在山上的寺庙里,平日只给人家做短工,赚了钱,却只能吃饱肚子,不吃酒肉不见赌,不知道钱都花在什么地方了,就是一直很穷。

每当有人问他叫什么,什么身世,他只敷衍「先前阔」和「我的儿子会阔多啦」,可见是真话一句不讲。加以他进了几回城,该是见识高,便更该是自负,却越越卑微,实在是看不懂。

阿桂很少来酒馆,简直是稀客。「你这祸事,六尺的大个头跑得真快。赵家丁那厮竟然还能跑掉。我在后面追,实在是追不上你们。」阿桂气喘吁吁,竟端起掌柜的给大壮的那碗酒喝了起来。

喝完酒,阿桂对大壮说:「赵老太爷叫你回去。」


秀才和假洋鬼子和洋人

赵家丁说是被赵老太爷赶出来了。

孔大壮成了赵家的长工。

赵府大公子却说要办学问,四处求人,洋人。孔大壮竟把赵大公子介绍给了洋教堂。没过几天,赵大公子竟把辫子剪了。

得了,赵秀才成了假洋鬼子了。

阿桂却还是那一副模样,只在庄上做短工,偶尔还会去城里,回来时经常带着大包大包的好货,在庄里卖上好多钱,却并不见他日子有变好。阿桂还是那一副模样,唯独来酒馆次数变多了一些。阿桂会小曲,有时边喝边唱,店里更加快活。

「君子固穷」,阿桂如此说到,「好像这词不是这么用的」。


断腿

某日,店里突然有声音说:「赵家丁的腿被人打断了!现在是个跛子」

孔大壮竟十分兴奋:「阿桂打的!」

店里突然就热闹起来了。

孔大壮竟又点了一碗酒,边说边喝。

「那厮,当时调戏吴妈不成,被我满街追着打。学尖了,竟然搞偷的,去了山上的尼姑庵,想要欺负小尼姑,却忘记阿桂家就在庙上,撞了个正着。别看阿桂那人小,打起来真不含糊,竟然把赵家丁的腿打断了!」

这次掌柜的却没去阻止大壮,却躲在柜台里偷笑。

「他姓赵?他也配姓赵?」

店内外再一次充满了快活的空气。


秋风

孔大壮是这样的使人快活,可是没有他,别人也便这么过。

大约是中秋前的两三天,邻里的小孩冒出来,问大壮是否许久没来了,掌柜的却也一愣,忽然说,「大壮长久没有来了」,随即却把茴香豆端出来给小孩子。小孩子却不肯接。掌柜竟然叫我教小孩子学写字。

一个喝酒的人说道,「他怎么会来?……他打折了腿了。」掌柜说:「啊?」

「赵老太爷家里前些日子遭了抢,赵跛子带着几个洋人冲进赵家大院,当场把大壮抓了现行。」

「后来呢?」

「赵跛子逼着大壮写服辩,大壮一不跪二不写。」

「再后来呢?」

「当场打折了腿!」

「打折了怎样呢?」

「怎样?……谁晓得?许是死了。」

掌柜也不再问。

「听说阿桂上次进城后就再也没回来。」


初冬

中秋之后,秋风是一天凉比一天,看看将近初冬;

我整天的靠着火,也须穿上棉袄了。一天的下半天,没有一个顾客,我正合了眼坐着。

忽然间听得一个声音,「温两碗酒,要一碟茴香豆」

这声音虽然极低,却很耳熟。

在我还发愣之时,掌柜的竟过到柜台:「你怎么敢的啊!」


这一回是现钱

这一男子,上身披着一件破旧的夹袄,头上带着一个破败的帽子,声音低沉。

掌柜:「所有人都在找你,你怎么敢的啊!」

男子:「下回还清罢。这一回是现钱,酒要好。」

掌柜听罢,端出两碗酒,一碟茴香豆。

男子并未付钱,却掏出一个包递给掌柜。

掌柜小心翼翼打开包,往里面看了一眼,又把包重新系上了。

掌柜的又拿出两块布,把茴香豆分成两份,一块布包一份。「你去赵老太爷家一趟,把这份茴香豆送过去。再去一趟教堂,给他们的主簿。」


人去

到赵老太爷家门前,偌大的园子,在门外却感受不到一丝生机,只是一个伙计开门,打开小包看到茴香豆后,付给我几枚铜板。

又到教堂。主簿看到茴香豆后,付给我几枚铜板,上下左右比划,嘴上念叨些什么,然后竟然开始收拾起来了。

回到酒馆,把铜板交给掌柜。

掌柜却又把铜板递交给我,然后开始在那算账。

「明天起就不用来做工了,我准备回老家了。」

忽然又说:「不要跟别人提起,今天阿桂来过。」


包好

深冬。

酒馆停业也有好一段时间了。在家百无聊赖。

忽然邻居的小孩来砸门。

「大妈!大妈!有了!有了!包好!包好!」

我去应门,小孩才发现敲错门,转头又去砸邻居大妈的门。

「大妈!大妈!包好!包好!」


酒醉不快活

我跟着人群来到了菜市场。

上面站着的竟是赵跛子。

而下面跪着的人,身高足够6尺,全身青黑,头上带着个大黑罩子,看不到脸。僵硬在那里,身上的衣服也已经烂了,一动不动。

赵跛子在上面吼着什么我听不清的话语,只听到什么「篡夺」「革命党」「不知悔改」,然后砰的一声,如似炮仗一样的巨响。人群中酒醉似的喝彩,听起来却并没有酒馆那时的快活。

或许枪毙并无杀头那般好看。


描红纸

回去的路上,邻居的小孩跟在我后面一起回来。

脑子里竟然在回想当初在酒馆做工时听过的小曲,但自己却一句也学不来。

路边有卖描红纸的。花了钱买了些,塞给邻居小孩,问他是否识得这些字?

小孩说识得:

「上大人孔乙己」

The post 孔大壮与阿桂 first appeared on 石樱灯笼博客.

制造泪点和操纵他人

婚礼上,过世的亲人变成蝴蝶出现,甚至还停在了新娘的脸颊,那是多么美妙的画面啊。据说,已故的亲人会变成蝴蝶回到自己熟悉的地方,甚至是参加他原本遗憾的仪式,往往在这个时候,婚宴现场的氛围达到另一个高潮环节——集体自我感动。

然而,如果你用“婚礼蝴蝶”作为关键词在各种视频平台搜索,都可以得到套路一模一样的桥段。如果这么多已故的亲人都变成了蝴蝶参加至亲的婚礼,那这件事早就应该成为“玄学”素材给好好研究一番。我询问了在做婚庆策划的朋友,她表示嗤之以鼻——“这个都是大型婚庆公司玩儿剩下的把戏啦。”

只需要在彩排阶段询问饭桌安排时,稍加引导就可以套出婚礼双方的亲人生故情况,再观察当事人对该名故人的情感程度,确定要不要通知道具组准备蝴蝶。于是,这一整套流程可以在神不知鬼不觉的状况下,形成一个“你亲人回来看你啦”的完美闭环。

嚯,里面还动用了谈判学和心理学呢!


当然,有人会站出来指责“拆穿真相”的人——这就是一个寄托思念的桥段,有必要用揭露真相的方式把美好都毁于一旦吗?但是“真相”在这里,因为套路被制造感动的“事实”也在那里,怎么?这件事少一个条件情感还可以更真一点吗?

人们善于为自己的经历赋予“意义”,甚至是覆盖原本的“真相”——这就是算命得以成功最重要的底层逻辑。往往回到真相讨论的事情,比想象中的更残忍。比如“秽语症”,在医学心理学还不被重视以前,人们无法透过传统心理学解释和医治“秽语症”,所以只能通过更“玄”的方式去解释,比如被鬼缠身、被恶魔入侵。

直到医学心理学的普及,秽语症仍然被当作“邪物入侵”来看待。之后才发现不过是大脑里的基底神经出现紊乱,才导致了莫名抽搐、舞蹈、秽语等行为。不过,就算这个真相是被科学证实的,至今仍然有人觉得这是一种“外邪”。只要赋予的意义足够,天王老子来了也得是自己已故的亲爹上身要钱来了。


另一种极端,真相已经完全超越意义,但是人们仍然执着于赋予意义,就会显得滑稽且抽象。

以前从一个命理师那里听过一个故事,他们村里人均称自己可以让神明上身,所以有重大节日的时候就会变成“斗法”现场。大家的“流程”都是差不多的,干呕、翻白眼、张牙舞爪、满地打滚,肢体语言已经卷得差不多的时候,大家开始卷谁上身的神明更厉害。(需要补充说明一下,出马仙这件事确实存在,但是这个行业本身也已经到了劣币驱逐良币的状态,所以才会有了这种“斗法”的趣事)

那个人说自己是观音菩萨,这个人就敢说自己是玉皇大帝,王母娘娘治得住玉皇大帝,但是孙猴子又能大闹天宫治住天庭……这个游戏里有一个死循环,就跟棒打老虎鸡吃虫一样,总会有最小的虫可以治得住打虎的棒子。所以有人另辟蹊径,让一个说外国话的神“上身”了,这个神就是耶稣——于是这个“被上身”的人开始“How old are you”“Nice to meet you”“Sorry I don’t know”“I’m fine thank you”,他把自己这辈子仅学的英文课文都用在此刻。农村人也没见过真正的耶稣,也确实可以被这样的阵仗给唬住。

这里有一个关键:真相是一个外界存在的表象,但是只要当事人相信那这个真相也可以被“意义”覆盖。除非,当这个真相已经可以动摇“意义”本身,于是这个时候,人们就会站出来指着你的鼻子吗:“你这个人怎么这么破坏气氛,人家婚礼怎么安排管你屁事!”


只不过,这个真相动摇意义的事实也已经发生,之后有裂缝生出各种五味杂陈的就不是看到真相的人,而是那些宁愿无视真相也要把自己蒙在鼓里的人。

《加菲猫》里,加菲猫走丢后被卖进了宠物店。他的主人乔恩也在疯狂找寻加菲,直到有一天,乔恩走进一家宠物店在销售橱窗里看到了加菲,于是两个人重逢又在一起。加菲永远都不会去问乔恩“为什么那一天他走进了宠物店”。当然,最后一句是观众对《加菲猫》的“过度解读”,认为这是无言结局里谁都不要说破的真相。

意义是“重逢”,真相是乔恩走进了宠物店,但这个真相似乎在打破另一个一直以来的真相,乔恩作为饲主深爱着自己的宠物加菲,所以无论如何他都不应该表现出“我想要再买一只猫”的想法,否则这就是在破坏他和加菲之间的“意义”。所以这个意义到底是谁赋予的呢?难道是乔恩在购买加菲时,被要求签署一份类似婚姻的契约,无论生死疾病都要不离不弃——甚至是在宠物丢失或去世后,也必须要守寡尽孝,以表达自己对他的爱是忠贞不渝的——很可惜,这一点婚姻法里也他妈的没有规定啊!


一场婚礼里,司仪、策划、道具组都知道真相,甚至有观众还看到了蝴蝶从什么地方放出来,那怎么?为了保证“意义”的重要性,把这群人都在仪式结束前给杀了活埋?——当然啦,历史上也不是没有做过这种事情。

在剧本创作里,最厉害的悲剧是让人哭着笑,在悲剧的结尾里藏着一个仿佛是石缝里种子刚开始发芽的喜剧。如果,在意义里藏着一个谁都无法避开的“真相”,这是喜剧还是悲剧——这或许是最厉害的喜剧,让人笑着哭。

那结婚是悲剧吗,不能这样说嘛。那是喜剧吗(我觉得是),出现一只代表已故亲人的蝴蝶,或许是喜中悲。看到真相的人,觉得这是闹剧;制造泪点的人,极力营造悲剧的气氛,只有那些沉迷在赋予意义游戏里的人,是悲是喜,都是别人说了算。

所以反过来,只要你懂得如何安排“意义”,那这些沉迷于赋予意义的人,就可以无视真相,唯你操纵。

时间

前天晚上终于有时间看了《花月杀手》——这是一部三个多小时的电影。没什么花哨,却不枯燥,导演、演员的功力自然高超,不过剧情本身也实在引人入胜。说起来,观影前我完全没做功课,以为是什么特工动作片,结果却是一段美洲原住民的血泪史。代表着文明的白人,把一条条鲜活的生命抹杀,只因他们是不同种族,只因他们手里有钱。当然从程度上论,我们普通人或许并没有做如此残忍的事(的机会),但是本质上相同的事情,身边却每每上演。比如想象武力占领台湾的方法时说着玩弹齐发把那里炸成焦土;比如发表仇视日本的言论说真该再让他们吃两颗原子弹;比如见到意见分歧者会说他们就该被轧死……不是说一百多年前的美国人值得原谅,只是显然我更关心当下、我的同胞们,就这么无法接受别人与自己不一样吗?就这么坦然地相信不一样的人就该死吗?那么,一百多年过去了,我们能说自己生活在更文明的时代和国度吗?

其实前面的内容属于跑题了,我只是想说时间来着。我受不了一部电影分多次看,现在大家都说时间碎片化,但妳瞧,即便是三个多小时,挤一挤总还是有的。这部电影给我的另一点关于时间的感触,源自本片导演马丁·斯科塞斯在专访中的话:「我希望我能休息八周,同时拍一部电影(笑)。整个世界都向我敞开了大门,但为时已晚,太迟了。我老了。我读,我看,我想讲故事,但没时间了。卢卡斯和斯皮尔伯格共同为黑泽明颁发奥斯卡奖时,黑泽明说他现在才看到电影的可能性,但为时已晚。那一年他83岁。当时我还在思考这段话是什么意思,如今我终于明白了。」

fin.

在有限的生命面前,没什么是放不下的

其实,我很怕死的。今年三十一岁了,来得很快。回想起来,距离二十岁已经过去十年了。好像二十岁时傻傻的样子还历历在目。如果你问我想回到过去吗,我回答是不太想。过去的我虽然很年轻,我也不用发愁于生老病死,但我是无知的,迷茫的,像一个无头苍蝇,只知道吃喝拉撒,只知道即时满足。

但年轻的岁月,对于人来说,是如此的珍贵。人的生命只有一次,而且也只有几十年。小时候觉得人生很长,一百年很长很长,时常会幻想自己十七岁的时候是怎么样,感觉自己的三十岁是非常的遥不可及。转眼,一年又已经过去,自己已经过了三十这一年,觉得有点恍惚,但又很真实。

我时常想,我的父亲,活了半辈子,五十多岁,其实他的时间也不多了。有一天他也会离开我,从此我再无归处。我父亲不算是优秀的人,虽然也因为当时的环境所影响,不能上学受到良好教育,家里也没钱,半辈子普普通通,为了生计四处工作。不够二十岁的时候就离开家乡去边境当兵,然后遇见了我妈。

现在想起来,我小时候受到父亲各种情绪上的攻击,精神暴力,如今我也能理解了。都是普普通通的人,努力的活着,摸着石头过河,没有谁会帮你一把,没有谁会突然站出来教你做事做人。我老爸其实也真的不容易,他当时三十岁的时候或许就像我现在这样,对生活感到无力,眼睁睁的看着时间流逝,看着许多人离开了自己。不甘,不舍,但又毫无办法。心中有压抑的情绪,又得不到倾诉,于是情绪就爆发在身边的人身上。

十年,一晃眼就过去了。我从初中的时候对父亲的抱怨,到害怕,到憎恨,再到出了社会工作之后对父亲的躲避,再到尝试和解,再到现在的理解,现在的我已经不太想再憎恨他了,只想多给到他一些关爱。终有一天,我的父亲,会带着一些遗憾离开人世。

我时常在想,再过几十年,等我死去之后,就再也不会再醒过来了,无论一万年,一亿年,无论几百千万亿光年,我也再也毫无意识,我就像从来没有来过这个世界一样。它没有解法,没有任何的办法,这种感觉非常的,非常的,非常的令人绝望。再想想我的余生,如果能活到八十岁的话,也只有五十年的余额了,然后就再无法重来了,不像明天早上我还能醒过来那样。

推特开源算法与开放革命

3 月 31 日,马斯克如约开源了一系列推特推荐算法代码

Twitter 开源推荐算法代码

这次开源代码的操作,出发点跟大多数商业公司不太一样。

我在《企业实践开源的动机》当中提到的动机,要么是扩展软件的生态,要么是拿来即用后的回馈上游,最为“无私”的动机,也是希望开源标准以保护现存业务。所有这些动机,企业开放的源代码,都不包含业务代码,而是支撑业务代码的基础软件逻辑。

这次推特开源推荐算法代码,是史无前例的。以往接近的类型,当属阿里巴巴公开 BLINK 代码,或者苹果公开 Darwin XNU 代码。不过,后两者都是基础软件,而推荐算法是业务代码。

BLINK 的一次性开源

XNU 的单向开源

这些代码公众只能阅读,而没有任何参与协同开发的途径,甚至代码应该如何跑起来,都是不知道的。

这样的开源,放在基础软件系统上,就像是一篇代码写成的论文,可以阅读和理解,但是不能共同创作,距离实际能工作的软件也还有一定距离。而放在业务软件系统上,其基础技术研究意义并不明显,因为业务系统往往跟具体场景绑定颇深,许多的代码逻辑没有对应的环境非常难以理解,更遑论复用。

业务系统开源缺乏实际环境与数据

我不是马斯克,也不知道推特做出这一决定真实的原因,但是从它当前产生的结果来看,这样的开源动作不是商业诉求推动的,除了可能满足马斯克的表现欲,这一事件将极大鼓舞推动社会开放革命和传播自由文化理念的人群。

权当这一猜测的佐证,就在几周之前,马斯克在推特上发文,称研发 ChatGPT 的组织 OpenAI 成立之初的目的是作为一个平衡谷歌影响力的开源非营利组织。

OpenAI 的初心是开源非盈利组织

开放革命的理念有两种出发点。

其一认为当前人类的创造力在信息极大丰富并自由流通的情况下已经井喷,如果仍然保留以往保护专利和商业秘密的法律体系、社会制度,将会阻碍创新与发展。持有这一观念的人通常援引人类基因组的开放协作和维基百科的成功及其经济学模式作为论据。

其二认为在线空间是人类社会的延伸,平台运行的规则和社会活动在线化的逻辑,其对应的代码如同现实世界中的规章和法律,如果不开放,是违背自由主义精神的。美国一部分州采用开源选举投票系统就是这一理念发展的成果。

这次推特开源其推荐算法代码,可以认为是第二种开放理念出发点的体现。

毫无疑问,推特是一个垄断型的在线社交平台。它首创的时间线事件流信息推送机制,极大的改变了在线用户的阅读习惯。这一机制实际上导致平台尤其是其推荐算法逻辑决定了用户将会在时间线上看到什么内容。如果这些算法逻辑是不透明的,那么用户毫无疑问是被剥夺了获取信息的自由,成为被投喂的对象。另一方面,平台垄断将导致广告主和内容创作者处于极度不利的地位,为了提升自己的曝光量,很多时候只能任凭平台予取予求。国内的抖音平台就学习了这一机制,可以类比抖音的用户、广告主和内容创作者的日常来理解这种情况。

只有开放垄断平台运行规则的代码,如今生活与在线空间密不可分的大众才有可能监督自己贡献注意力、创作内容的平台到底有没有公平的对待它的每一个用户。马斯克也是推特的用户之一,这次代码开源就发现了推荐算法中判断推文作者是否是马斯克做特殊处理的逻辑。

算法中特判老板的逻辑

应当说,开放革命和自由文化的理念离我们所生活的社会还很远,推特这次开源推荐算法代码的动作会不会引起一连串的连锁反应,尚且是未知数。除了凑个热闹和分析开源出来的代码以外,大家不妨也读一读相关的书籍文章,了解一下这些理念的背景和发展,为可能到来的变革做好准备。

JavaScript 总结、比较 V2

Promise 与 RxJS Observables 的区别

Promise

  • Promise 是 JavaScript 中内置的,不需要任何额外的库。
  • Promise 表示可能现在或将来可用的单个值。
  • Promise 是急切的,也就是说一旦 Promise 被解析,.then()回调会立即执行。
  • Promise 只能发出单个值。
  • Promise 非常适合处理产生单个结果的简单异步操作。

RxJS Observables

  • Observables 是 RxJS 库的一部分,需要额外安装依赖。
  • Observable 表示可以随时间发出的值流。
  • Observable 是惰性的,也就是说在订阅之前不会执行任何操作。
  • Observable 可以发出多个值,包括零个或多个值。
  • 可以使用各种 RxJS 操作符对 Observable 进行转换和组合,以创建新的定制流。
  • Observable 非常适合处理复杂的异步操作,例如实时数据流或事件驱动编程。

参考

  1. JavaScript Theory: Promise vs Observable - Medium
  2. angular - What is the difference between Promises and Observables? - Stack Overflow
  3. JavaScript Promises vs. RxJS Observables

模版语法的简单实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const name = 'Nexmoe';const message = 'My name is {{name}} and I\'m {{getAge(20)}} years old.';function getAge(age) {  return age;}const replacedMessage = message.replace(/\{\{(.*?)\}\}/g, (match, variableOrFunction) => {  const trimmedValue = variableOrFunction.trim();  if (trimmedValue.includes('(')) {  // 如果占位符包含括号,则表示为带参数的函数替换    const [functionName, ...args] = trimmedValue.split(/\(|\)/).filter(Boolean);    const func = eval(functionName);    return func(...args);  } else {  // 否则为变量替换    return eval(trimmedValue);  }});onsole.log(replacedMessage);

先检查占位符中是否包含括号,如果包含括号,则表示是一个带参数的函数调用。使用split方法和正则表达式来解析函数名和参数,并将其存储在functionNameargs变量中。然后,使用eval函数将函数名转换为实际的函数对象,并使用扩展运算符 (...) 将参数作为参数列表传递给函数。函数执行后,将返回值作为替换后的字符串返回。

如果占位符不包含括号,则表示是一个变量。直接使用eval函数将变量名转换为实际的变量值,并返回其值作为替换后的字符串。

⚠️ 注意:使用eval函数执行代码具有一定的安全风险,因为它可以执行任意的 JavaScript 代码。有相当多的建议建议不使用eval。准备过段时间研究研究不用eval的方法。

MVVM 是什么

MVVM 代表 Model-View-ViewModel,在 MVVM 中,Model 表示应用程序的数据和业务逻辑,View 表示用户界面,ViewModel 充当 Model 和 View 之间的中介。

模型(Model)

  • 模型代表应用程序中的数据和业务逻辑。
  • 它可以是从服务器获取的数据、本地存储的数据或通过其他方式获取的数据。
  • 模型通常实现了一些方法来操作、存储和管理数据。
  • 对应的是组件中的 data、props 属性。

视图(View)

  • 视图是用户界面的可见部分。
  • 它负责展示数据给用户,并接收用户的交互操作。
  • 在 Vue.js 中,视图通常由 Vue 组件表示,可以包含 HTML 模板和样式。

视图模型(ViewModel)

  • 视图模型是连接模型和视图的中间层。
  • 视图模型通常包含了与视图相关的数据、计算属性和方法,以及与模型交互的逻辑。
  • 通过双向绑定(data-binding)将视图和模型连接起来。当模型中的数据发生变化时,视图会自动更新。通过 DOM 事件监听,当用户在视图中输入数据或进行其他交互操作时,视图模型会自动更新模型中的数据。

优势

  • 分离关注点:将数据逻辑与视图逻辑分离,使代码更易于维护和测试。
  • 提高开发效率:通过双向数据绑定和声明式编程风格,减少了手动操作 DOM 的代码量。
  • 可重用性:通过组件化的方式,视图和视图模型可以在不同的应用程序中进行复用。
  • 响应式更新:当模型中的数据发生变化时,视图自动更新,提供了更好的用户体验。

参考

  1. 为什么尤雨溪尤大说 VUE 没有完全遵循 MVVM? - 知乎
  2. Vue 的 MVVM 思想(包含三个常见面试题) - 掘金
  3. MVC,MVP 和 MVVM 的图示 - 阮一峰的网络日志
  4. Getting Started - vue.js
  5. Comparing Vue.js to new JavaScript frameworks - LogRocket Blog

MVC 是什么

MVC 这个概念已经存在很久了,用了这么多年,今天了解一下概念做个总结。

MVC(Model-View-Controller)设计模式将应用程序中的对象分为三个角色:模型(Model)、视图(View)和控制器(Controller)。该模式不仅定义了对象在应用程序中的角色,还定义了对象之间的通信方式。每种类型的对象都通过抽象边界与其他类型的对象分离,并在这些边界上与其他类型的对象进行通信。应用程序中某种 MVC 类型的对象的集合有时被称为层,例如模型层。

848723f97c7a1b862e10abe0445da348.png

模型(Model)

  • 封装应用程序特定的数据,并定义操作和处理数据的逻辑。
  • 可以表示应用程序中的实体,如游戏中的角色或地址簿中的联系人。
  • 可以与其他模型对象建立关联,形成对象图。
  • 应该存储应用程序的持久状态数据。
  • 不应与呈现数据和用户界面相关的视图对象直接连接。

视图(View)

  • 用户可见的对象,负责显示数据和响应用户操作。
  • 知道如何绘制自身,并可以与用户进行交互。
  • 通常通过控制器对象从模型对象中获取数据进行展示和编辑。
  • 在 MVC 应用程序中与模型对象解耦,提供一致性和重用性。

控制器(Controller)

  • 充当视图对象和模型对象之间的中介。
  • 负责处理用户操作,并将其传递给模型层进行数据处理和更新。
  • 可以执行应用程序的设置和协调任务,管理其他对象的生命周期。
  • 在模型对象发生变化时,将新的模型数据传递给视图对象进行显示。

优势

  • 提供良好的应用程序设计,使对象更具可重用性和接口定义明确性。
  • 支持应用程序的可扩展性,易于添加新功能和模块。
  • 分离关注点,使代码更易于维护和测试。
  • 应用程序的模型层、视图层和控制层之间保持了清晰的分离,实现了代码的结构化和职责的明确划分,从而提高了应用程序的可维护性和可扩展性。

参考

  1. https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html

为什么 Bun 这么快

JavaScriptCore 引擎

Bun 使用 JavaScriptCore 引擎,这是 Safari 浏览器使用的引擎,而不是基于 Chromium 的浏览器和 Node.js 使用的 V8 引擎。JavaScriptCore 引擎经过了针对更快启动时间的优化,这有助于 Bun 的速度。

性能分析和优化

大量的性能优化。Bun 的初衷就是要快。[2]

Zig 语言

Bun 利用 Zig 语言进行低级内存控制和消除隐藏控制流。Zig 的设计原则注重性能,通过利用 Zig,Bun 可以实现更好的内存管理和控制,从而提高速度 [2]

参考

  1. Bun 1.0 | Bun Blog
  2. A first look at Bun: is it really 3x faster than Node.js and Deno? - DEV Community

累积布局偏移优化 CLS 完全指南

什么是布局偏移

一个十几秒的短视频解释清楚。

更详细的解释是:布局偏移指的是在网页上发生突然变化时,页面中的内容位置发生意外移动的现象。这种情况常常让人感到困扰,因为它会导致阅读中断或误操作。布局偏移通常是由于资源异步加载或动态添加到页面上的 DOM 元素导致的。可能的原因包括具有未知尺寸的图像或视频、字体与其备用字体渲染大小不同,或者第三方广告或小部件动态调整大小。

难受的是,网站在开发过程中的功能通常与用户体验有很大不同。个性化或第三方内容在开发中的行为通常与生产环境中不同,测试图像通常已经存在于开发者的浏览器缓存中,本地运行的 API 调用通常非常快,延迟几乎不可察觉。

什么是 CLS

累积布局偏移 CLS(Cumulative Layout Shift)是一个指标。

是对页面整个生命周期中发生的每个意外布局变化的最大布局变化分数的度量。

CLS 通过测量实际用户遇到布局偏移的频率来帮助解决布局偏移问题。它可以帮助开发者了解布局偏移在真实用户中发生的情况,从而采取相应的措施进行修复。

为什么要优化 CLS

布局偏移是一个非常影响用户体验的问题,通过上面那一个简短的视频也能理解。

布局偏移通常会导致意外点击、页面方向的迷失,最终导致用户受挫。用户往往不会逗留太久。有时也会使用户不按照预计的产品流程走。

通常优化好布局偏移能够很好的提高用户粘性、用户停留时间等指标。

Yahoo! JAPAN News 通过降低 CLS 0.2 分,得到如下成果。

如何降低 CLS

图片等媒体元素占位

在图像、视频等媒体资源元素中始终包含宽度和高度大小属性。或用 CSS 中的 min-heightaspect-ratio 或类似的方式保留所需的空间。

aspect-ratio

可以用来直接指定当前元素的比例。

https://developer.mozilla.org/zh-CN/docs/Web/CSS/aspect-ratio

对浏览器的支持:

padding-bottom

如果考虑浏览器支持问题仍然可以考虑使用目前一个被广泛接受的基解决方案 “Padding-Top Hack”。这个解决方案需要一个父元素和一个绝对型的子元素。然后计算出长宽比的百分比来设置为 padding-top。例如:

1
2
3
<div class="container">  <img class="media" src="..." alt="..."></div>
1
2
3
4
5
6
7
8
9
10
.container {  position: relative;  width: 100%;  padding-top: 56.25%; /* 16:9 Aspect Ratio */}.media {  position: absolute;  top: 0;}

使用不易产生偏移的 CSS

其中 transfrom 表现很好,以下举几个例子。
用例可以在这里找到:https://play.tailwindcss.com/26PxFA6UVI

zoom VS transform: scale

zoom 会撑大页面并向右偏移时,transform: scale 只是在原地放大。

margin VS transform: translate

margin 造成父元素变大,transform: translate 只是让当前元素移动。

border VS box-shadow

border 会撑起父元素,而 box-shadow 并不会。

小心你的懒加载

懒加载会引起布局的偏移,如果你在有懒加载长列表的里进行跳转,请小心!
无动画进行跳转,能够一定程度上避免该问题。

小心使用 transition: all

在页面首次加载或者跳转页面时,transition: all 可能会导致元素的 padding 等从参数为 0 开始渲染,照成页面的抖动。

这都是痛:
Commit:表格以及友情链接图标抖动
Commit:修复导航栏抖动问题

标签顺序导致的偏移问题

由于在移动端上优先展示主要内容,因此侧边栏的 markup 位于主要内容的后面;而在更大的屏幕上,则通过设置 CSS order 的方式进行排序,将主要内容移到中间(即第二列),伪代码如下:

1
2
3
4
5
6
7
8
9
export default function MainLayout(props) {  return (    <Container>      <Main className={css`@media screen and (min-width: breakpoint) { order: 0 }`} />      <Left className={css`@media screen and (min-width: breakpoint) { order: -1 }`} />      <Right className={css`@media screen and (min-width: breakpoint) { order: 1 }`} />    </Container>  )}

浏览器在首次绘制时并没有完整解析 DOM、只知道 <Main /> 的存在、但不知道 <Left /> 或者 <Right /> 的存在,才因此将 <Main /> 渲染进第一列而不是第二列;直到第二次绘制时,浏览器才将 <Main /> 渲染进第二列、将 <Left /> 渲染进第一列。

Chrome 并不是一次完整解析 HTML 的,在以下两种情况下,Chrome 会暂停解析、开始渲染和绘制:

  1. Chrome 解析器在读取了 65535 字节的 HTML 后暂停
  2. Chrome 在遇到 <script> 标签后,会继续读取约 50 个「Token」之后暂停

详细了解请看:优化博客的累计布局偏移(CLS)问题

网页跳转与前进后退缓存

默认情况下,所有浏览器都使用 bfcache,但由于各种原因,有些站点不适合使用 bfcache。有关如何测试和识别阻止 bfcache 使用的任何问题的更多详细信息,请阅读 bfcache 文章

在你离开后,bfcache 将页面保存在浏览器内存中很短的一段时间,所以如果你返回它们,那么它们将完全恢复为你离开时的样子。这意味着完全加载的页面立即可用,而不会出现任何变化。

现在的 SPA 应用也能很轻易的保证路由跳转页面布局的一致性。记住始终保持你的目录和导航栏在页面的固定位置。

字体

在下载和渲染网络字体之前,通常有两种处理方式:

  1. 使用网络字体替代备用字体(FOUT——未样式化文本的闪烁)。
  2. 使用备用字体显示“不可见”文本,直到网络字体可用并且文本可见(FOIT——不可见文本的闪烁)。

着两种方式都可能导致布局变化。即使文本是不可见的,它仍然使用备用字体进行布局。这意味着使用该字体的文本块以及周围的内容在网络字体加载时会发生布局变化,与 FOUT 的可见字体完全相同。

以下方法可以帮助你最小化这种问题:

  1. 使用 font-display: optional 可以避免重新布局,因为只有在初始布局时网络字体可用时才会使用它。
  2. 使用匹配度高的备用字体。例如,使用 font-family: "Google Sans", sans-serif; 将确保在加载"Google Sans"字体时使用浏览器的无衬线备用字体。如果只使用 font-family: "Google Sans" 而不指定备用字体,将使用默认字体,而在 Chrome 上默认字体是"Times",它是比默认无衬线字体的匹配度更差。
  3. 使用新的 size-adjustascent-overridedescent-overrideline-gap-override API 来尽量减小备用字体和网络字体之间的大小差异,详细信息请参阅“Improved font fallbacks”文章。
  4. 使用 Font Loading API 可以减少获取所需字体的时间。
  5. 使用 <link rel=preload> 尽早加载关键的网络字体。预加载的字体有更高的机会达到首次绘制,这样就不会发生布局变化。
  6. 阅读有关字体最佳实践的“Best practices for fonts”文章。

使用真正的骨架屏

骨架屏好坏示例

测量 CLS 分数

生产阶段

实验阶段

Lighthouse in DevTools

能够针对移动设备和桌面设备生成网页的实际性能报告,并能够提供关于如何改进相应网页的建议。

在本地开发期间从 DevTools 运行 Lighthouse 非常方便。

PageSpeed Insights

应该就是在线版的 Lighthouse。

Performance in DevTools

性能选项卡在 Chrome 的 DevTools 配置文件的所有页面行为在一段时间内记录。时间轴上会出现一个标记为“Experience”的图层,突出显示布局的变化和发生变化的元素。

Web Vitals extension

最好将 Web vital 扩展视为查找性能问题的抽查工具,而不是全面的调试工具——这是 Chrome 的 DevTools 中的性能选项卡的工作。

结语

作为一个对自己项目有较高要求的人,平常几乎都会接触到布局偏移优化或者 Lighthouse,只不过之前自己瞎折腾的时候还没有 CLS 这个概念,现在算是对 CLS 有了较为清晰的概念了。
CLS 作为一个非常基础的优化指标,在用户体验上非常重要,任何项目都应该针对 CLS 做优化。

如有勘误,请及时指出,感谢!

参考

  1. https://web.dev/cls/
  2. https://web.dev/optimize-cls
  3. https://developers.google.com/publisher-tag/guides/minimize-layout-shift
  4. https://web.dev/yahoo-japan-news/
  5. https://addyosmani.com/blog/infinite-scroll-without-layout-shifts/
  6. https://blog.skk.moe/post/fix-blog-cls/
  7. https://developer.mozilla.org/en-US/docs/Web/CSS/aspect-ratio

(2021年终)19岁,找回迷失的自己:热爱、勇敢以及感恩

愿你生命中有足够的云翳来造就一片美丽的黄昏。

https://music.163.com/#/song?id=32069952

👆 年轻时最喜欢的音乐 Entorevolution,好久没听了,最近又听了起来。

云翳

2017年那会,15岁,我以这句话作为了我网易云音乐的签名。至今仍然它保留在我的网易云音乐签名中。

image-20211226122242084

我的人生也如同这句话写的一样。在这之后,我生命中充满了云翳,差点,这些云翳就压垮了我。

image-20211226122339633

17年,刚上高一,我决定要成为一个能散发阳光,如同太阳一般热烈,充满激情的人,并真正的朝着这个目标行进了。但我没料想到后面的生活中,一些黑暗的手将我一次又一次地抓住,让我走向完全相反的方向。那个时候我也只是个视野狭窄的普通高中生,理所应当地认为学校里的一切就是人生的一切。来自生活的压力,来自不可抗拒之力的打压让我彻底消沉了。我觉得,我玩完了

2018年也还是走到了头

朋友说:“感觉你最近状态很不好啊,去医院看看吧。”

我越来越冷漠、越来越刻薄了。那时的我认为,只有以一种应激的状态面对生活,才是现实。

此后,便是我人生中空白的几年。这段时间,我停止了进步、放弃了思考。

光,照了进来

即使是牢笼,外面的天空依旧蔚蓝

👆 我透过教室的窗拍摄的蓝天白云,这个视角好似我们于牢笼之中,但我们却能清楚的看到一片美丽的天空。

丧失了所有对生活的乐趣,我接触起了文学。诗中 “天生我材必有用,千金散尽还复来。” 便是我的最大慰藉。书确实犹药也,虽然没医我的愚,但他们救了我。

此后我还接触了科普书,他们让我学到了很多。

文学让我变得越来越勇敢。

当然还有亲人、朋友的陪伴,带着我沉重的身心一步步的前进。

当所有人都向往着太阳。但你此时却只是一个黑洞要吞噬一切,而总有一些人毫不畏惧敢于靠近你,向你分享他的光,这些人不就是真正的朋友吗?空白的那几年交到了不少人生中最好的朋友。也让我明白了亲情的重要。

度过人生中空白的几年,来到了今年。

反思

沉思

👆 大一刚来学校,宿舍晚上窗外的景象。正暗示了在人生中沉思踌躇的我。

我想变成什么样的人?

乐观:天生我材必有用,千金散尽还复来。

热爱一切:爱一个人,也爱她的缺点。爱一份事业,也爱它带来的困难。焦虑,生活是否真的如他们所说 - 陆本为 (nexmoe.com)

坚定:橡皮擦 - 陆本为 (nexmoe.com)

你的时间是有限的,所以不要浪费它为别人而活。 不要陷入教条 — 活在其他人的思想成果之中。 不要让他人意见产生的噪音淹没你自己的心声。 最重要的是,要拥有追随你的内心和直觉的勇气。 他们已经知道你真正想成为什么。 其他所有都是次要的。—— STEVE JOBS

勇敢:谁怕?一蓑烟雨任平生。对不起,我自暴自弃了 - 陆本为 (nexmoe.com)

image-20211226122946237

👆 博客 陆本为 的副标题

浪漫:世界不会满足人,人决心以自己的行动来改变世界。——列宁

无论什么样的灾难降临,只要生命还在,生活始终要继续。——美丽人生

img

👆 美丽人生男主的最后一幕

寻找

不断的反思,让我清楚的知道自己背离初心太远了,离我当初的追求越来越远了。

我决定找回迷失的自己。在今年2月15日,我决定开始我的新征程。

image-20211226115107795

找回迷失的自己

先回复上面:我快要成功了!这一年随着我定下目标并朝着目标一步步的努力。我得到了进化,或是说压抑的本性得到了释放。我就快要成功了!

我终于找回了迷失的自己。我开始重新热爱一切。

我的朋友说:

“你的眼里又焕发出光芒了。”

“真为你开心!”

“哈哈你得到认可我也跟着好开心”

“好!”

“真好哇”

感谢

世间所有的相遇,都是久别重逢。/ 一切都是最好的安排。

感谢家长、朋友的支持和陪伴,我的家长给予了我非常多的信任,让我有了一份敢于探险的勇气。不像其他家庭那种封建大家长式家庭那样过于束缚我。在生命中的黑暗时刻,是父母给予了我最大的支持,让我有了希望和决心去突破这一切。感谢朋友的陪伴,他们分享给我的光明,让我不完全被云翳遮盖了前进的路途。让我不至于对一切绝望。

感谢当初没放弃的自己,当初仿佛在地狱走过一趟的自己感觉现在已经没有什么能打败自己了。感谢当年的我最后终于鼓起了勇气,才得以如此快的恢复。感谢自己永远向往着光明。感谢自己一直坚持自我。

感谢高中的黑暗打压,那段黑暗让我现在不再害怕很多事情。这段黑暗让我清楚认识到以前的我实在是太胆小了,害怕一切,害怕失去,害怕失败,害怕结果的到来。正是这段黑暗让我有了破釜沉舟的勇气。

感谢当初转专业计算机拒绝了我,让还在不停犹豫的我鼓起勇气,下定了决心。踏上了更为艰巨的旅途。

去他妈的瞻前顾后,其他的路我都不想了,我只走这一条了,即使最后粉身碎骨我也要走下去。以前老是想着这找退路,那找退路,总觉得失败了还有办法,只要活着就还有希望。但是这些退路明明就不是我最想走的那条路。

我不要再继续自暴自弃下去了。我只管走自己的路罢,其他的事又与我何干。这么多年,我一直都在周围人的不理解中走来了。多这几年又何妨,我相信,我一定会等到柳暗花明的那一天。——对不起,我自暴自弃了 - 陆本为 (nexmoe.com)

正因为有这些值得感谢的一切,才造就了如今的我。

1黄鹤楼

👆 东湖和黄鹤楼

希望

希望新的一年我还能够追上你的脚步,来年的这个时候你还愿意看我的年终。也希望明年也和今年一样,满怀期望。

image-20211226124821260

朋友们的年终

2021年终总结 - 断舍离与原则 (notion.site)

[新坑]通用人工智能

为了写下这个标题,我打字都要抖一抖。Artificial General Intelligence 这一年被炒的太火热了,我好像一个迟到的来蹭流量的似的。硅谷每几年都会有新的一波热点,追热点死得很惨的人一片片,我还是多少费了一番功夫,才觉得这不是又一个转瞬即逝的热点,而是一波新的技术革命的开端。

最近种种原因吧,花了不少时间精力来了解和思考这个领域,理论、技术和商业应用层面都有(我怎么这么牛,打脸冷静一下)。虽然前面法语的坑还没填上,但我还是想先挖个坑,要不要开个频道专门聊一下AGI和其他这一波AI技术的革新呢……哎,再挖个坑,这次可以用英文法语中文三种语言讲这个话题哎,想到这里觉得自己好厉害的样子(再打脸清醒一下)。

让我这个周末冷静冷静,再来看自己是不是又一时冲动了哈哈。

❌