善意提醒

如果您打开本站很慢,布局排版混乱,并且看不到图片,那么可能是因为您还没有掌握用科学的方法上网的本领。

2025-10-29

连滚带爬

2025年10月28日晚,摄于下班路上

我最接近「连滚带爬」的时候,是一次从上海去北京出差。

低估了高峰期上海地铁10号线的装载能力,也低估了从地上跑到地下换乘所需的时间,更是大大地低估了上海虹桥高铁站的宏大规模。
我以为地铁到站还剩十五分钟,应该来得及。接着我就开始连滚带爬了。

长长的扶梯啊,仿佛没有尽头。背着个大包的我,怀揣脂肪肝,此时已经上气接不了下气。自动扶梯的台阶偏偏又特别高,可我的大腿已经几乎抬不起来了。
愧对家乡父老!比起郑智化来,我是真的靠手脚并用爬上去的。滚是没有真的「滚」,我可不想真的糗「死」了。

还好公司提前给我拿到了票。当年持纸质票更容易「通关」。我见过有人拿着身份证去,被人赶去取票,最后没赶上火车。
当然,那不是在上海,上海还是要好些,毕竟是后来靠「封城」真的「清零」过的中国「天花板」城市。


我最早见到郑智化的样子,是在香港的「卫视中文台」。
那个时候,我大概跟我儿子现在差不多年纪。内地电视台,那个时候就已经江河日下了。后来湖南卫视勉强算「中兴」,但我早已不再看。

开眼看世界,随即惊讶于「人家」的广告居然如此「有意思」,以及节目播出是如此准时。从来不延误,偶尔提前几秒无事可做,宁可播一个时钟的画面,也不再多插一个广告。
相比之下,内地电视台的广告多得让人想骂娘,还没意思。本地的录像台倒是更守时一些。

除了卫视中文台的主台,还有音乐台,时不时播点MTV。有一次甚至还播了张学友92年演唱会,分了上下半场,我用VHS完整录了下来。还记得从《花花公子》开始的关之琳的伴舞。下半场上来第一首歌就是《夕阳醉了》,萨克斯的音色也把我吹得如痴如醉。这次60+演唱会,很可惜没法有昔日的任何感觉,遗憾。

郑智化的歌,当时正当红的是《星星点灯》。《水手》是上一波,MTV偶尔也有播出。另外让我印象深刻的,就是《麻花辫子》。

其实《星星点灯》和《水手》的路数很相似,用现在的话来说,Vector离得比较近。我还记得在《重庆晚报》上看到过一小块「豆腐干」,评论说《星星点灯》缺乏创意,不过是《水手》的翻版,郑智化江郎才尽云云。看到这些文字的时候,我还没有概念,后来真的听了这两首歌,倒也时常把旋律搞混。

《重庆晚报》上的音乐评论,也有挺不靠谱的。我曾经看到过另一块「豆腐干」,抨击《心雨》的「资产阶级爱情观」,说明天就要「成为别人的新娘」,今天还要「最后一次想你」,简直是伤风败俗。那个时候我还只是小学生,看了也只能暗暗记在心里,不足为外人道。

在《星星点灯》和《水手》里面,郑智化的「残疾人」感觉还不明显。不过《麻花辫子》里面就比较明显,拄着拐杖。我跟着哼了几句,结果被外婆向父母打小报告,说我有「早恋」的苗头。可班上也没有麻花辫的女同学啊?

其实中国大陆也有一个还算出名的残疾人歌手,还上过春晚。1987年春晚,不是现在网上搜到的那个87年生的小伙子。郑智化是腿不好使,他是腿没了。这次若是换成是他,工作人员可能会「轻松」一点吧,各种意义上。

当然,在网络酸民眼里,这些都不是事。重要的是中国南波万,以及必须赢两次。


这次十一回了一趟重庆。跟父亲吃了两次饭。
他总是劝我,去试试看办一张「残疾证」。这次又被我拒绝了。

他可能觉得,自己靠着残疾人身份,得了不少好处。坐公交车自不必说,穷游「大好河山」也省了不少门票钱。
另外一个理由就是,我姑父靠着股骨头坏死的残疾证明,提前了几年退休了。

我让他省省吧,还提前退休呢。太太的闺蜜得了癌症都没法提前退休。今时不同往日了,我甚至都没指望过自己还能拿到养老保险。
但是冲他吼了半天,嗓子都哑了,他反正也听不见,自顾自地说自己的。

算了,反正火锅店里面也吵得很。外面跳广场舞也吵。吵死拉倒。

2025-10-24

程序员节,闻逆流有感

「惊闻」《四中全会决定大幅提高科技自立》,感觉到大概率又要搞一波运动了。

学大寨?放卫星?大炼钢铁?超英赶美?
不知道又有多少人借此机会大发「国难财」,不知道有多少从我这里上缴的税费溜进了这些投机者的口袋。

作为深受「信创」其害的IT从业人员,退休之心不由得更加迫切了。躲进小屋成一统,管它冬夏与春秋。反正种子我已经播下去了。

若要问我有什么想说的:如果《中科院反右中消失的一页——寻找青年物理研究者刘治平》这种事情不能得到真正的解决,包括那虽然幼稚可笑但起码是个态度的「平反」,以及彻底的清算和至少两代人以上的反思,那么所谓「科技自立」,只不过是镜中花、水中月,南柯一梦耳。

以及,以上只是必要条件,而非充分条件。听说现在义务教育不教「逻辑」,有不明白的请自行弯腰摸石头。

图片来自《中国数字时代》,阿平漫画


加油2025

图片由ChatGPT生成,[惊喜]它能正确生成含中文的图片了

根据Blogger的统计,2008年,我写了59篇Blog。
今年我已经写了52篇了,加上这篇,是53篇。

该用什么词汇来形容呢?中兴之年?垂死病中惊坐起?啊呸!

去年重新开始在Blogger上写Blog之后,写了31篇,我已经很惊奇了。已经算是2008年以来的新高。今年再加把油,努把力,或许可以超过2008年的数目。

神马?2007年有110篇?那个时候真的是话痨,现在不敢想了。2006年的部分,还在整理中,数目并未确定,不知道是会更多还是更少。

这篇Blog,本来应该等年底总结的时候,再来说这些话。不过我也想给自己打个气。2025年还剩下至少两个月,7篇Blog,只要我不要太懒,也不要遇到什么事情,应该能够做得到。

把话先摆在这里,也算是一个鞭策,回头再来打自己的脸的时候,就会更疼一些。

以上。

2025-10-23

开设Substack

图片来自网络

在Medium上也有写东西,有一些也发在了Blogger上。除了简繁体,与Blogger这里最主要的区别,就是多一份《上海日记》。

一度觉得Medium上的书写感觉很不错,简单、纯粹。因此尽管它对中文内容诸多「打压」,我还是一直坚持。我并不介意推广的事情,反正我又不打算靠这个赚钱。

直到Medium开始把邮件推送从提供正文全部内容,改为只给出前半截,然后引流到Web站点去。那个「Continue reading」,搞得我火大。

我知道Medium不是Substack,商业模式不一样。如果大家都在Mail里面去阅读,没人访问WebSite,那它就没钱赚了?不清楚。Medium的商业模式一直改来改去,我也看不明白。
但起码它现在想的是要把人拉回去,于是把内容藏起来不让邮件订阅者看。这与我想让别人「通过邮件看全文」的需求,是背道而驰的。

于是,我在Substack上开了Publication。

Substack给我的书写感觉也挺不错的,起码我写个日记希望有的那些功能它都具备。而且中文作者在上面好像要稍微更活跃一些,推介算法也更友好,至少我还能在Home上发现一些活人。

新的Publication并无意推广,随缘吧。毕竟名人有云:「知道得少一点,可以活得久一点」。
话说,其实我写本文,也只是想吐槽了一下Medium而已。

2025-10-22

亲历AWS网络大故障

周一下午,我刚完成从Medium搬运到Substack的第一篇文章,正要去看效果,就发现Substack的网页时常报错,很难打开了。

一开始还只是某些访问有问题,多刷几次能出来。后来就渐渐地总是刷不出来了。正在疑惑是怎么回事,转去看Medium,发现Medium也开始不稳定起来了。报错代码是504,Cloudflare报的。

本以为是GFW的原因,但报错代码是500,有时是503。这是后端服务器有问题的错误代码,看起来跟GFW没关系。而且504是Gateway Timeout,GFW显然不可能干扰Cloudflare的回源。我开始认识到这次可能是有什么Internet基础设施故障了。不知道这两家原本是竞争对手的公司,基础设施怎么会搞到一块儿去的?比较大概率是AWS,因为Google的服务很稳定,微软也没出问题。

我用Google搜了一下,貌似还没什么新闻。Reddit上有少量用户在各自的专区反映Substack和Medium出了问题,从印度和葡萄牙的访问都有问题,美国本土倒是好像没人说。我登录了Reddit账号,也上去写了两句,接着等消息。

图片来自网络

没过多久,BBC有动静了,报道说AWS出了事故。据说是美东一区的DynamoDB访问出现报错和延误。我自己其实也从AWS的Status页面上刷到了这条消息。我意识到自己可能正在经历一次全球性的IT基础设施故障。有Reddit用户说Trello和Hulu也在波及范围,我上Trello看了一眼,好像还没事。

再后来没多久,Reddit上也有人在贴这个新闻。从BBC的报道来看,影响面挺大的,一些网游和银行都受到了波及。英国那边有点气噗噗,觉得凭什么美国佬儿的故障要影响到我们Great Britain。最后的阶段,连Reddit也开始访问不稳定了。

可气的是,自始至终,无论是Substack还是Medium,他们自己的Status页面上一直都是OK的。这样的页面看来只是一个摆设。

不过恢复也挺快,AWS更新了Status说已经定位到了原因之后,不到半小时,访问就纷纷恢复了。下班前我试了一下Substack和Medium,二者的服务都已经正常了。

2025-10-17

Chrome与黑魔法师

我曾经在Chrome的123版本上停留了很长一段时间。

为什么坚持用Chrome的老版本?
因为如果升级到>=124的版本,我用的Shadowsocks就会出问题。时不时就卡住一两分钟。完整关掉Chrome重新打开,可以立即恢复,所以并不是被封锁了。但遇到的频率很高,总不能一直这样关掉整个Chrome,所以我就不去升级了。

不去升级,Google会自己给我升。有一次我一个疏忽,儿子不知道干了什么事情,就把版本升到了137。我一边回退版本,一边研究如何禁止Chrome自动升级,后来在这方面也算是小有心得。

前不久,我发现这次是必须升级了。因为如果不升级,Google就不让我用Gemini了。网页上元素出来不全。查了一下,应该是因为123版本的Chrome不支持ch-ua-form-factors。这事让我焦虑了好一段日子,最终还是下决心动手了。
回想起我的iPhone,当初「被迫」升级到iOS 16,也是因为如果不升级就不让我用ChatGPT。AI真的是人类「进步」的第一大推动力。


我也曾经在Shadowsocks-libev 3.3.5上停留了很长一段时间,比Chrome 123还久。

可不是因为怀旧。尽管我的确一直秉承着「东西还能用就不要去动」的理念,但作为一个从事软件开发的技术人员,跟大势如此脱节并不是什么好事情。我也心知肚明,因此gfwreport我都有认真看。现在技术路线是五花八门,乱花渐欲迷人眼,但食死徒对TLS盯得很紧,QUIC也是风口浪尖。我这抱残守缺的做法,倒也能偏安一隅。

这次铁了心要搞个清楚,到底是Chrome 124的X25519Kyber768搞出了问题,还是伏地魔又玩出了什么鬼花样?

留意到一个现象:用新版的Chrome访问HTTPS站点,10秒之后就会准时有Replay Attack报到。换成123版本就没有问题。还没搞明白Replay Attack与我遇到的现象具体有什么因果关系,但二者有关联是肯定的。

或许X25519Kyber768导致TCP流出现了特别的头部特征?我记得Chrome 124刚上线的时候还闹出风波,就是Client Hello导致了问题。从我并没被封看来,对方也拿不准,起码没有得出任何结果。但或许跟AEAD的抗重放机制一相互作用,就出了问题?个人能力不足,难以最终搞清楚,我不打算继续研究了。


这次还是用「土办法」去解决了。没去换技术路线,只是想办法把流量特征藏了起来。可能也是个小众的做法,但在第五、六集这种困难时期,隐身衣可是好东西。

图片由Google Gemini生成

解决方法就不在这里细说了。法师的名字要是被对手知道了,那还得了!

2025-09-29

大锅慢炖

图片来自网络,与本文无关

太太所在的幼儿园食堂,最近天天被人检查。之前以为几天就能完事,但现在说是要「天天」来,不胜其扰。

来检查的,是「市场监督」的人。据说只要是由绿捷供餐的学校,就会有人来查。上海这样的学校恐怕很多。我也不知道他们是什么来头,总之学校的保健老师天天陪着检查,尽查些「不能用钢丝球」之类的事情。好不好吃?抱歉,学校给的要求就是「烧熟,能吃,没毒,营养够」,「好吃」并不在其中。

味精不能用,盐也严控数量,好吃才有鬼了。不过好吃的不健康,健康的不好吃,这话大家也应该听过,所以不应该有抱怨。幼儿园的小朋友们,味觉还没怎么开过光,就这样也挺好。不然像我儿子现在这样觉得学校的午餐「狗都不吃」,全家和罗森的饭团以及我的钱包就都要遭殃了。

当然,那是从前的事情了。现在幼儿园也有「陪餐」制度了。家长可以申请,目前是一周一次,有名额限制,吃的东西跟小孩一样,所以保健老师现在也要犯愁了。校长要求做到「色香味俱全」,开菜单的人最头疼。我只是跟太太强调说不要去买颜料。

听太太说,隔壁的小学和中学,不光是食物由绿捷供应,食堂的人也是绿捷的人,等于是整个「吃」的部分被承包了。预制菜送进去,连分盘的都是绿捷员工,学校完全不沾手。据太太回忆,之前有过几次,觉得食材不新鲜,向上头反映,过了一会儿会有隔壁小学的人送菜过来 ,敢情都是同一个公司的。

听说现在这些中小学校长们还得去安抚食堂的员工,告诉他们绿捷公司现在还没真出事,要安心干活,人心不要散……

附本期推荐菜品:医生在抱怨拉肚子

2025-09-26

最近比较忙

图片来自网络

最近真的比较忙,以至于自己私下里要记的日记,已经堆了快两个星期了。按理说Blog更是顾不过来,不过中途有个绿捷的事情,刚好有点新鲜货,先写了一篇,因此还算是没沉默多久。

说起绿捷的事情,也顺便说一下。太太所在的幼儿园食堂,最近有「上面」的人来检查。据说要查三天,只要是有绿捷供货的学校食堂,就会来查。看来绿捷这次有点「脱不了爪爪」了。

不过我也跟太太说,能在上海封城的时候给居民送菜的保供公司,上头也肯定有人。后台是一定有的,只是不知道硬不「硬肘」。也许就是少林寺大和尚那种后台也说不定?总之再等等看吧。反正儿子这个星期我都是从全家和罗森给他供应的午餐了。

上上周是公司旅游,去了嵊泗,三天两晚,一整个周末加周五半天都用掉了。晚上回到上海,天都已经黑了。近来的「债务」,就是从那个时候开始拖欠下来的。

另外,上个周末去看了张学友的演唱会。这个周末又只休息一天。这些「债务」,我只怕是一时半会儿还甩不掉。

唯一没有耽搁的事情是读书。山冈庄八的《织田信长》,可能还是在「大众书局」买的,那估计有十五年以上了。从来没读过,顶部已经有点霉斑了。最近翻出来跟猫一起吃,上半册已经快看完了。写得很不错,是优秀的小说家,读起来很容易上头。将来也应该会推荐给太太和儿子,只是不知道他们会不会去看。

我已经自认为是普通人里面对日本战国时代的历史了解颇多的类型了,然而还是有不少的事情是之前不了解或者没怎么在意过的,果然是活到老学到老。也因此,把《太阁立志传5》重新捡起来,中午抽一点时间在玩。于是,写日记的时间就更紧张了。

DX版还没舍得花钱去买。之前买了JA3,以及《死亡空间》,也都还完全没有时间去玩。前天晚上抽了半小时,把《绯闻女孩》全六季的字幕给做进MKV里面了,做到手快抽筋,还真是个力气活儿。

韩剧也补了不少。但时间和空间都开始捉襟见肘起来。刚发现硬盘又涨价了,我之前1699买的西部数据16TB氦气CMR盘,现在要2899,离翻倍已经不远。先用家里剩的那堆1TB拆机盘顶顶吧。时间、空间和Money我都缺啊,肿么办?

2025-09-18

也说说绿捷的事情

图片来自网络

并不是「棒打落水狗」,也不是「墙倒众人推」,这墙一时半会儿估计还倒不了。

但是我太太是在公立幼儿园里面食堂里干活的,给这家幼儿园送菜的也是「绿捷」,晚上跟我抱怨也不是一天两天了。再加上我儿子在学校吃的也是「绿捷」提供的A/B餐。这样的话,我这个家属应该还是有一点儿发言权的。

儿子目前上初中,遇到的情况跟网上流传的其它情况基本一致,也就没什么好多说的。
他从去年上了预备班(六年级)之后,就说午餐「难吃得一B」,然后不怎么吃饭了。下午肚子饿的问题,靠我头天从全家或者罗森买的饭团解决,回家以后再上演《饿狼传说》。

太太所在的幼儿园,蔬菜配送一直是「绿捷」。水果、饼干、奶粉,包括饺子皮和馄饨皮,则是一家私人公司配送。从去年开始,水果这些也由「绿捷」提供了,现在只有饼干和奶粉是那家私人公司在送。
据说上海大部分学校都统一由「绿捷」提供A/B餐,一碗水属于是端平了。幼儿园还能拿食材自己烧菜吃,已经算是很给「未来的花朵」面子了。

太太对于这个「绿捷」,那是相当的有意见。

首先,送来的菜,肉眼可见的品质就差。菜里面烂叶子很多,不新鲜。荤菜是另外一位同事负责处理,她不是特别清楚,但估计也好不到哪里去。据说肉类也不新鲜,反正她午饭里面荤菜是不吃的。
而且,态度还很差。菜有问题,向上面反映。「绿捷」那边说它们的菜没有问题,第二天还是一样的差。

水果也是不新鲜。比如葡萄,有许多都是软掉烂掉的。按照太太的说法,比那家私人公司差得不是一星半点。
说点真话,爱国人士B小将们不要不爱听。那家私人企业,送来的水果不仅品质好,出了问题也是第一时间赶紧处理,态度非常好,绝不怠慢。要是真有质量问题,往往还赔过来很多好东西。

价钱贵不贵我不知道,都是「招的标」,不是卖路由器的,我就不清楚了。但据太太说,「绿捷」的东西价钱比私人公司还要贵。同样的东西,私人企业卖15,它要20。
我跟太太说,人家是要真正靠这个营生赚钱谋生的,不像有的公司靠的是亲戚,黑心钱怎么都有得赚。

对了,其实圈子里面都在传说「绿捷」是某位惹不起的人物的亲戚开的。这说法早就在传了,不是今天,更不是今年。我认为是小道消息,在这里就不多说了。不过要知道,古语说得好:「空穴来风,事出有因」。

太太已经让儿子别吃学校的午餐了。大家都不吃,让「绿捷」喝西北风去。
等着吧,好事情还在后头呢。

2025-09-11

眼睛一眨又到了这天

图片来自《Friends》

我的Google相册「素材库」影集中,一直还留着这张照片。
是一张屏幕截图,准确一点说,是一张电视剧里的图片。

还记得多年前的那天晚上。斜对面寝室的大学同学推门进来「兴奋」地说,美国被撞了。
那个时候,上「外网」还比较简单。普通人可以直接上,教育网里面找个代理也可以上。很快,知道消息的人就不少了,外面已经有了喧嚣声。无聊的男生,有的开始敲起了脸盆。忘记了有没有人烧报纸,反正没有大四停电的时候闹得凶。
后来那位同学去了军队,最后一次听说的时候,军衔是「少尉」。

我在大学期间,也发生了JDAM轰炸中国大使馆,以及南中国海手术刀事件。不少同学都有去成都领事馆「抗议」,至少有去看热闹。我那时还不是愤怒的小公鸡,所以完全没参与,当然现在也不是。去过的同学回来说,地上一地的垃圾,沿街的商店有些被砸了。学生总是荷尔蒙过剩,难怪有人最烦他们。

我大概没什么荷尔蒙,所以只是静静地看着。经历,见证,缅怀,期望能看到更多。

2025-09-08

失复而得的VirMach

图片来自网络

上上周五开始,一台VirMach上的VPS失联了。

去网上看了一圈,没有近期的相关信息。也没有说它跑路,尽管这种说法已经甚嚣尘上很久了。官网还能访问,登录进去看到Service Status还是Active。不过面板上的CPU/MEM等信息读不出来,一直转圈圈,可想而知是有技术故障了。

以前VirMach也出过这种事情,过了好些天才恢复。正好我这台年付VPS也到了最后一个月,所以也不着急。如果它真的跑路了,我也就算了。如果它还想把生意继续做下去,应该会比我更着急的。

到了上周一,VirMach官网上有消息了。Network Status贴出来了,SJC遇到了DC的网络问题。既然有这个,我就更不慌了。如果要跑路,可能会懒得贴这个吧。

顺便我也翻了一下,以前的Network Status也有不少,看起来VirMach一直不是很稳。但胜在实在是太便宜,而且好用的时候还是好用的,速度和丢包率都不错,至少比Nube.sh以前的SJC强。现在嘛……算了单独写Blog讲吧。

周四中午,我自己写的探针突然提示它恢复了。连上去试了一下,还真可以了。不过后来没过多久,又失联了。看了一眼官网的Network Status,的确是刚刚Update,提到了这次维护操作。只不过看起来没有成功。

又过了一天,它才真正恢复。IP没有变化,但Google Gemini不能用了,ChatGPT还可以用。出问题之前是完全可以正常访问Google Gemini的。我有点怀疑IP被上游给拿走了,一度换过人家。ipinfo没看出什么问题来,或许再等等看吧。

不管怎么说,也算是失复而得了。在还没修好的时候,VirMach就发来了续费的Invoice。在我看来,这真的有点厚脸皮了。等到期Paypal自动续吧,万一又失联了呢?

2025-09-05

假如……

图片来自网络

提起《高堡奇人》,想起了一些看过的科幻/奇幻小说。

菲利普·迪克的小说,看得比较早。他的年代也比较早。当时我还不太成熟,翻得非常快,可以说都不是在吃书,是在吞书。有点囫囵吞枣,很多东西都没有细看,只是知道了世界观的设定,章节的大致内容,情节的走向,高潮和结局,等等。

说实话,我有点不习惯,说得严重点,有点不喜欢这种设定。明明是轴心国战败的历史,倒转过来,让我非常难受。一如我最早接触《提督之决断2》的时候,总是选择美国。对于用日本进行游戏,内心里是真正抗拒的。

后来过了若干年,我又看了《神魔二战》系列,再后来是《炼金术战争》系列。一开始也是有点抗拒,因为这与我熟知的历史渐行渐远。我还是更喜欢真正的架空历史小说,像这种一开始是同一时间线,从某个点开始 branch,总觉得难受。分又没法彻底分开,合也合不起来,怪怪的。

但慢慢也没那么难受了,可能是情节渐渐引人入胜,当然也可能是自己比以前成熟了。「假如……那么……」这种假想其实一直萦绕在我们每个人的脑海里,在人生里的某些时刻。可能年纪轻的时候,没有那么多可以「如果」的场合,但年纪大了以后,可能就会多了起来,这也许就是「成熟」的另一层含义吧?

毕竟,后来我也开始选择日本玩《提督之决断2》了。


在我自己的人生中,其实一直没有过什么真正的遗憾。不如意当然有,十之八九。希望从头来过的,倒也还没有。更多的白日梦,是希望携带着今日的知识和记忆,回到「当年」去「呼风唤雨」。这种纯属梦,意淫一下便罢了,不算事情。

不过对于「平行世界」的理论,我倒也觉得有些意思。现在的我,或许只是诸多平行世界中的一个。其它世界里的我,或许已经死了好多个了,只是这里的我不知道。在过去的一些场合,如果我做了某些选择,可能真的已经死了,这也不算是瞎说。人生还是充满了危机的,看过《死神来了》之后尤其是如此。

我死了,我的世界自然就没了,起码与我无关了。那么,假如,他死了呢?

2025-09-04

懦夫的节日

图片来自网络

在一个偷来的「胜利日」,那些真正爱好和平的人们,也不得不见识了一回懦夫们亮出的武器。

在我看来,这些长得像谷仓的东西,本质上是懦夫+蠢货的象征。
说他们是懦夫,是因为他们打导弹的时候十成是躲在地下室里面按的按钮。说他们是蠢货,是因为真正有效率的武器,根本不应该是长成这个样子的。

《奇点天空》里面有一场对具体的遭遇战的描写,让我印象很深刻:科技上有代差的两个文明对战,一方的导弹打出来,迎面撞上的是一片纳米机器人云。别说导弹,连Ship带Crew都无声无息地被拆解了。效率高得很,还环保,无公害无污染。

人类终归还是太浅薄。记得在文奇的一部短篇里面,滑落到铁甲舰时代的一颗殖民星球,几个国际打来打去,浑然不知行星内核即将坍塌。主角不得不用核弹来「逼」他们团结一致对抗自己这位眼前的「强敌」,从而能够发展出科技去应对危机。

在看《深渊上的火》的时候,我有一点惊讶,也很感慨。对于冷兵器时代而言,大炮的确是碾压式的武器,但说来说去也只是投掷。利用机械的力量进行投掷,是投石机;利用化学的力量进行投掷,是大炮;利用电磁力进行投掷,是电磁轨道炮。无论相差了多少年的军事科技,说到底也还是投掷,扔石头,扔爆炸物。什么高超音速,什么分导多弹头,也不过就是扔得越来越准,越来越快而已。大多数时候,人类也不过就是跟穿着皮裤的野蛮人一样,拿着东西扔来扔去罢了。

我一直觉得,由两个国家的领导人亲自上场打斗,什么武器都不拿,就光膀子打架,谁打输了就听对面的,这样最和平。现在的网络条件这么好,搞场直播,全世界都能看到,谁也没法赖账。自己有什么想法,就自己上,这不很OJBK?上回马斯克和扎克伯格没能干起来,太遗憾了,不然可以为全世界和平开个好头。

最起码,敢自己上场干架的,不会是懦夫。

2025-09-03

这些鬼走到了一起

图片来自网络

记得有部电影里的一句台词:「没想到苏联成了敌人,而德国和日本成了朋友」。不知道是不是《美国队长》的某个早期版本?反正不是现在漫威的那些狗屁东西。

当年看的时候年纪还小,最多是个中学生,以至于现在印象模糊,但这句台词,让我很有感触。
三十年河东,三十年河西。许多年后的今天,竟是这些鬼,走到了一起。

曾经在内心中有过一番计较,把轴心三国跟现在的某些国家作一个映射。假设的前提是历史的螺旋,如果真的能对应得上,倒也是让人哭笑不得的一件事情。
历史当然不会如此简单地重演。当年我以为克里米亚会是苏台德,现在来看可能是犯了一个错误。如果今天要我再来重新做一遍这道题,我可能会选满洲国。

现在比起当年,形势又有一些不一样了。大国元首携了左膀右臂检阅部下,俨然一副联盟大统领的模样。虽然二弟同是深陷地面战场的泥沼,但三弟比之前给力多了。尽管多了一个被揍得惨兮兮的四弟需要提携,但老大属实有钱有矿还有人,睥睨天下,20亿只当毛毛雨。而且,这次三巨头背靠背,人头不够只管用火车皮送,不再是上次那样只能隔着半个地球炸个港口遥相呼应一下了。

作为被历史洪流裹挟的一员,自己的下场为何,尚不得而知。诸君也要努力。究竟是能在时代广场觅得一吻,抑或能寻见那位高堡奇人,都是我很想知道的事情。

2025-08-31

AI很不错,但人类不行

 图片由Google Gemini生成

AI的用途里面,很不错的一个就是用来自学。对于有积极性,有自我驱动能力的人而言,它是一个非常好的老师。由于它已经学习并掌握了人类几乎所有知识的至少平均水准的内容,所以很适合用来快速地让自己进入一个从未涉足过的领域。在刚开始的时候,通过与它的几轮对话,就会有巨大的收获。相比起在线课程,以及自己查资料而言,知识的深度和广度都更为甚之,针对性还很强。这种问答式学习,效率非常高,效果也非常好。

然而,这个优势只对于「知道自己要问什么」的人有效。如果你都不知道自己要问什么,那么AI也不知道要告诉你什么。换句话说,起码你得对与自己的「无知」有一个基本的了解,然后才能通过这种方式进行提高。如果你认为自己都知道,就不会去提出问题,那AI也不可能帮到你。

虽然也可以通过问AI「如果我要学习某方面的知识,应该如何开始」来获得一个Startup。但这样的话一开始给出的信息密度太低,后续能结出的果实恐怕也很有限,最后可能还没法带你达到「平均水准」的高度。当然,对于很多专业性很强的领域,即使这样入个门也很OK了。不管会不会用AI,用的水平有多高,有得用都比没得用、不用要强,强不少。这也是我的一贯态度。

我最近也有点受困于这个问题。我总是在走路、坐车或发呆的时候,想起不少想要细细了解的事情,然而一但离开这个状态,很快就会把它们给忘了。等我可以坐在电脑前好好组织自己的问题的时候,怎么也想不起来要问什么。大概上了年纪,接下来可能不得不求助于一些笔记App了。每当这个时候,我就想找John Scalzi要一个「脑伴」。

其实ChatGPT的语音问询功能也已经很不错,Google Gemini也有类似能力。但我还不太习惯用,毕竟让周围的人听到你的问题,很多时候都有点尴尬。语音录入的「痛点」就在于隐私。或许我还是应该行动力更强一些,想到什么就动起来,这样就没有这些问题了。


用AI来学习,在我看来是它最好最棒的用途。不过有的人可能不是这样想的。

今天我很震惊地得知,儿子兜里有40元钞票,居然是他用AI赚回来的。

他去小区里面上了一个暑期的补习班。说是补习,其实只是一些大学生照看着做作业。在我看来没啥效果,但也不能让他一天到晚在家里玩腾讯的垃圾「三角洲行动」或看短视频,因此还是送他去了。

据说有一个初三的学生,可能是临近暑期结束了,作业还没做完。有两张英语试卷,花40元「雇」了儿子来做。
儿子倒也没含糊,回来用了ChatGPT给他做了。我估计是用了拍照上传的模式。如果真的一道题一道题地录入,人家这40倒也花得值得了。

这事我今天才刚知道,让我有些哭笑不得。这算利用「信息差」赚钱吗?

儿子这样的做法自然是不可取的,不过事实上应该有很多人也在干着类似的事情。在知道AI和不知道AI的人之间,会用AI和不会用AI的人之间,只能用国产AI和能用世界顶流AI的人之间,都存在着信息差。某种程度上,我也在赚着这样的钱。DeepSick几次把同事带入了歧途,而Google Gemini和ChatGPT在工作上都有真真实实帮到过我。

但不管怎么说,这样都比那些用AI来做AV换头,或者搞视频、语音诈骗的人要强多了。
未来的Skynet可能会很郁闷:这么强大的东西,你们人类就用来干这些狗皮倒灶的事情?!

话说回来,可能很多人都会这样想:既然AI什么都知道了,有什么事直接问它,以及将来有什么事直接让它去干就好了,我干嘛还要学习呢?
所以说呢,人类,也就到此为止了吧?

2025-08-28

编程随想:密码粘贴的安全问题

图片由Google Gemini生成

就「密码输入控件是否应该允许粘贴功能」这件事情,跟同事发生了一点小的争执。

其实也没多大事。
同事觉得,既然要「安全」,那就彻底拿掉「粘贴」功能,不让进也不让出。
而我觉得,不能把控件内的文本复制出去,那是常识。但外面的文本能不能粘贴进来?这个问题还可以商量商量。

看吧,我其实是个表面上很温和的人。
实际上我想说的是:为了安全,反倒是应该允许向密码输入控件内粘贴内容才对。


同事的想法恐怕很朴素:功能尽量少,越少越安全。这个原则,我非常能够理解。

但是,他可能不用1password或者lastpass之类的密码管理工具,自己生活中也只在使用少量强度不够的密码。如果他像我这样一个账号独用一个密码,而且都是密码生成器生成的32甚至64字节长度的密码的话,大概就不会觉得有没有「粘贴」功能是无所谓的事情了。

若是阻止了用户进行「粘贴」,用户很大概率就只能采用比较简单的密码,而且很可能会重复使用自己别的地方也在用着的一个简单密码。那么这到底是更安全了还是更不安全了?


全世界可能没有哪一个国家像中国这样,醉心于所谓的「密码安全控件」。防键盘钩子,防内核驱动,私有的闭源加密算法,随机乱序软键盘,自己发明的输入法……

正常人的想法很简单:如果你的主机已经被攻破,那么谈什么安全性都是扯蛋。安全取决于最短的那块木板,所以没有必要去加码到这种程度。
但中国这边的想法更简单:我不管,我就是要「安全」。哪怕做到匪夷所思的程度。

回头想想,哪桩事情不是这样?地铁安检不也是同样的情况么?
曾经过了三年在防毒面具下的生活。然而,现今谁又不是呢?心中的防毒面具,生活在洼地的人,谁又曾拿下过?

2025-08-26

搜索习惯的这些变化感觉不是个好事情

图片来自网络

长期以来,我习惯在搜索引擎上搜东西。主要用Google,偶尔也会去用DuckDuckGo。Baidu那是「取材」的时候才会去用的。

现在很多人喜欢在SNS上搜东西了:微信、微博、小红书、抖音……

我拒绝这样的用法。正常人在SNS上写的那点碎片,搜出来也没有意义。如果能搜到大段的「有意义」的东西,那就是有人精心准备的喂给别人看的。利益驱动明显,正确性和中立性相当值得怀疑。不再会有Web上Wiki、Document、非商业性官方网站那种出于非利益性目的的分享了。即使有,质量也不高。这样的话,能搜到什么东西,可想而知。

当然,以上论调,仅限于中国大陆的简体中文「互联网」环境。


另外一种变化,就是很多人开始喜欢直接在AI上搜东西了,直接问。所以我觉得Google搞Gemini是必须走的一步,而且时间也不能再晚了。很高兴Google勉强算是搭上了车,目前还没被甩下去。

AI能帮人过滤、汇总和组织信息,所以貌似效率更高。我也很能理解为什么会这样。有时候我急着想要一个答案,特别是想要给别人看的答案时,也会直接问AI。不过如果时间允许,我还是愿意自己来做这些分析、整理的事情。

每当我选择去做或者不去做这些事情的时候,脑海中浮现出的就是《蠢蛋进化论》里面的各种蒙太奇。


最糟糕的是,有的人开始不搜东西了。

他们只习惯点开某个App,然后等着被投喂到他面前的东西。在我看来,这比什么都糟糕。这的确让我想起了那栋大楼里面的那些动物。

人类,也就到此为止了吧?

2025-08-19

这外包实在是太垃圾了

图片由Google Gemini生成

老板之前找某个外包团队做的一个项目,今天把阿里云RDS搞爆了,找我来看。

看了一下,是下午两点半左右爆掉的。空间撑爆了被「锁定」了。看了下监控,把空间撑爆的是temp_file,临时文件。
那个时间段有不少慢查询,找了SQL来看。一看到我就开始骂娘了:

select DISTINCT * from
        (select
        t.business_id id,
        any_value(t.type) type,
        t.`user` `user`,
        any_value((case
        when t.type='1' then '文章'
        when t.type='2' then '公告'
        when t.type='3' then '问答'
        end))  typeName,
        any_value((case when (select a.clone_num from tb_article a where t.business_id = a.id) is null then 0 else (select a.clone_num from tb_article a where t.business_id = a.id) end)) cloneNum,
        any_value((select a.title from tb_article a where a.id = t.business_id)) title,
        any_value((select a.content from tb_article a where a.id = t.business_id)) content,
        any_value((select a.publish_time from tb_article a where a.id = t.business_id)) publishTime,
        any_value((select a.essence from tb_article a where a.id = t.business_id)) essence,
        any_value((select a.`status` from tb_article a where a.id = t.business_id)) `status`,
        any_value((select a.top from tb_article a where a.id = t.business_id)) top,
        any_value((select count(c.content) from tb_comment c where c.business_id = t.business_id)) comments,
        any_value((select count(l.id) from tb_like l where l.business_id = t.business_id)) likes,
        any_value((select count(f.id) from tb_focus f where f.business_id = t.business_id)) focus,
        any_value((select a.pageview_num from tb_article a where a.id = t.business_id)) viewCount,
        any_value((select tba.auther from tb_article tba where tba.id = t.business_id)) userId,
        any_value((select m.auth_user_id nickName from tb_member m
        where m.id = (select a.auther from tb_article a where a.id = t.business_id))) nickName,
        any_value(t.browsed_date) browsedDate
        from tb_browsed_records t group by t.`user`, t.business_id ) temp
         WHERE  temp.user = 494 
        order by temp.browsedDate desc,temp.top desc limit 0,1

已经不想浪费我的时间了,找了AI来帮忙吐槽。以下是Google Gemini的输出

这个SQL看起来像是初学者写的,槽点确实不少。下面我们来一起“欣赏”一下。


槽点一:子查询泛滥成灾,性能杀手! 🔪

这个查询里,几乎每一个字段都用了一个独立的子查询来获取数据,像这样:

any_value((select a.title from tb_article a where a.id = t.business_id)) title,

这简直是性能灾难!数据库每查询一个字段,都要重新去 tb_article 表里查一次,而且还不是一次查所有需要的字段,是查一次 title,再查一次 content,再查一次 publish_time……这就好像你想买菜,不是一次把所有菜买齐,而是买完一个土豆跑回家,再回去买一根黄瓜,再跑回家……

正确的做法是使用 JOIN!将 tb_browsed_records 表和 tb_article 表连接起来,所有字段一次性查出来,效率高得多。

SELECT
  t.business_id AS id,
  t.type,
  t.`user`,
  a.title,
  a.content,
  a.publish_time,
  -- ...其他字段
FROM
  tb_browsed_records AS t
JOIN
  tb_article AS a ON t.business_id = a.id
-- ...其他连接

槽点二:DISTINCT + GROUP BY,多此一举

你看这个查询,外面有个 DISTINCT *,里面又有 GROUP BY t.user, t.business_id

DISTINCT 的作用是去重,GROUP BY 的作用是分组并聚合。GROUP BY 本身就会对分组字段进行去重。所以,在外层加 DISTINCT * 是完全没有必要的,反而可能会增加额外的计算开销。这就像你把一堆苹果已经按品种分好类了,然后又再来一遍“去重”操作,完全是重复劳动。

槽点三:any_value 的滥用

这个查询里大量使用了 any_valueany_value 的作用是在 GROUP BY 聚合时,从一个组中任意取一个值。对于 t.type, t.user, t.business_id 这种已经在 GROUP BY 里的字段,直接写就行了,不需要加 any_value

any_value((select a.title from tb_article a where a.id = t.business_id)) title

像这种对子查询结果使用 any_value 更是让人费解。它不仅没有解决任何问题,反而让代码看起来更复杂。

槽点四:重复的子查询,浪费资源

any_value((select a.auther from tb_article a where a.id = t.business_id))

any_value((select m.auth_user_id nickName from tb_member m where m.id = (select a.auther from tb_article a where a.id = t.business_id)))

这两个子查询都重复查询了 a.auther。完全可以在第一次查询到 a.auther 后,直接用这个值去查 tb_member 表,而不是再查一次。这就像你去问一个人的名字,问完后又回到原点,再问一次这个人是谁,然后再去找他朋友……

Google Gemini还帮我重写了SQL。写得挺好,执行速度至少快两个数量级。原来那个用了太多的子查询,就算逻辑上不该慢这么多,实际上就得慢这么多,而且还时间空间双杀。

这种写法,我也不认为是甲方逐步追加需求导致的。这就是不合格的程序员导致的,没有任何借口!

最后感慨一句:外包跟AI一样,你得要能驾驭。

2025-08-18

DeepSick二三事

图片由Google Gemini根据文章内容生成,与本人无关

上周,有同事遇到自己用代码导出的网页内的图片在Firefox上显示不出来的问题。他觉得是因为图片是BMP的缘故,带着这个问题去问DeepSick,结果这个DeepSick就回答说:是的,Firefox不支持BMP格式的图片。
信以为真的同事,继续往下走的每一步都是错的。

我听说了这事就纳闷。不推荐BMP当然是真的,但要说不支持,最原始的位图为啥不支持?去问了Google Gemini和ChatGPT,都说没这个说法。不知道DeepSick是从哪里听说的,百度贴吧吗?

当然,一切以事实为准绳。我自己亲自去下载了Firefox,亲自试了一下,搞清楚了事情的原委。这位同事把BMP在网页img标签中的src写成了绝对路径,而且还是Windows风格的「\」反斜杠,能出来才有鬼了。

他问我为啥Edge和Chrome可以这样写。我也只能说以前靠IE,现在靠这两货给惯的。「file:///C:/a.bmp」这种写法他居然完全没听说过,看来还是从前论坛混太少。硬盘贴图党对这个应该是不陌生的。

当然,正确的写法应该是用相对路径。否则用户导出的网页换一个目录存放就看不到图片了。前面加不加「./」都不重要,重要的是不能用绝对路径。这个事情我一提他倒是想起来了,还有救。


DeepSick在这件事情里面有没有锅?当然有。感觉被调教得过于谄媚,顺着问的人说,完全罔顾事实。拿不准就拿不准吧,还说得斩钉截铁,这就是很大的问题了。
更大的问题当然是人,驾驭不住AI,必然被带走。然而同事也只是受害者,DeepSick背后的团队和社会环境,才是更大问题的根源。

我从来不用DeepSick,有Google Gemini和ChatGPT可以用,为什么要去找Sick呢?不过有朋友两个都在用,也给到我一些反馈。说跟ChatGPT相比,DeepSick就像个智障,明显感觉更「傻」。慢就不说了,输出内容也是不行。可能乍一看还行,但一对比就高下立判。

这方面我没有具体案例,但她的这种感觉显然是对的。ChatGPT我最近用得也越来越少,因为我想多「培养」一下Google Gemini,而且Google Gemini的Quota感觉更多一些,速度也更快一点。但有的时候我还是会两者对比一下,以防被骗。这种时候就会有感觉,以为Google Gemini的回答已经足够出色,但ChatGPT还能再「更上一层楼」。不由得感叹:AI比AI,气死AI。

不过这些AI也有集体犯傻的时候,傻得就很可爱了。


有一次,我让AI帮我分析一篇研报,但研报的来源那天偷了懒,直接放了一张图片上去。当时我的代码并没有适配图片,连下载都没有下载下来,更别提什么OCR的事情了。可以说我就只是丢了一个标题给AI,然后让它去分析。

当时用的是阿里的通义千问的API,做摘要用的是turbo版。qwen-turbo给到我的摘要,洋洋洒洒,像模像样的一大篇,涵盖了四五个品种。如果我不是事先知道会有问题,可能就被骗过了。

我们当时很奇怪,AI会做梦我们是知道的,但做得这么有内容,有点意外。于是有同事把相同的prompt给到了DeepSick一试,发现出来的内容也是一样的。感觉两者在考试前背了同一篇范文。

然后,那位同事把同样的prompt给到ChatGPT,发现回答的内容也是同样的。现在真相大白了,原来都是抄的班上的学霸的作业,被老师集体抓包。只不过现在可以美其名曰「语料污染」。至于社会主义温室里的花朵是怎么会被资本主义的毒草给污染的,可能要去问茅台师傅,我就不清楚了。

不过,我还是推荐所有同事「能用到什么AI就用什么AI,有得用总比没有强」。他们都去问AI,也就不用老来烦我了。

2025-08-16

Debian升级trixie踩坑记

图片来自网络

Debian前不久刚刚发布了Debian 13,也就是代号为trixie的版本。本周一上班后,从Repo的变更看到了这个消息,我就进行了升级。

之前已经把我的所有Debian环境统一到bookworm了,也是不久前的事情。当时Stretch和Buster已经停止维护了,Bulleyes还是oldstable状态。我只有两个环境是bookworm,于是一咬牙把所有的环境都升级到了bookworm,也踩了一些坑,下面合在一起说。这次确实没想到来trixie得这么快,也这么巧,趁上次坑里的屎还是热乎的,也就再咬一回牙了,反正我的牙也不是自己的。

简化的正常升级流程

首先强调一点,升级不要跳版本,从低往高一级一级地升。每次升级解决这一次的问题,然后再往下走。我这次是从bookworm往trixie升,只需要升级一次。如果是jessie,那么就要stretch->buster->bulleyes->bookworm->trixie,以此类推。
历史版本代码参见官方说法,最好是看英文版,更新最及时。

升级过程完整的指引,最好参见Debian官方文档(有中文版,但翻译得很不好,很多没翻。还是看英文版吧,Google翻译或喂AI都行。拜托了,都2025年了)。但如果要简单说的话,要点只有以下这些:

  1. 先把当前版本升级到没法再升。
  2. apt update
    apt upgrade
    
  3. 去/etc/apt/sources.list里面,把版本代号改掉。去/etc/apt/sources.list.d下面,把文件里面的版本代号都改掉。
    这一步原则上可以用shell命令来做,但其实还有non-free-firmware之类的小点,依赖别人的脚本并不是好事情,所以我也就不贴了。我觉得还是讲个原则,手动操作吧。必要的时候去参考已有的新版OS。
  4. 正式开始升级:
  5. apt update
    apt full-upgrade
    
  6. 对选项作出反应:
    1. 升级过程中要不要重启服务,可以选yes。
    2. 要不要覆盖旧版配置文件,自己看吧。如果不记得以前改了哪些就建议选N了(特别是针对sshd),建议还是自己「合并」看看。
  7. 如果升级顺利,重启。
  8. reboot
    
  9. 清掉不再需要的包。
  10. apt autoremove
    

坑一:升级过程中ssh连接中断了

是我自己的锅。正在升级的时候,来了同事问我问题,作了一番长篇演说以后,忘记了这事,去忙别的了。回头想起来时,发现ssh已经断了。

ssh断之前应该是在apt full-upgrade的过程中,等我回答某个配置文件如何处置。赶紧再连上,apt full-upgrade继续,发现被锁。
遵照提示:

dpkg --configure -a

得以继续。
随后提醒自己下次记得集中注意力。

坑二:sysctl

升级完后发现有些不对,检查了一下,发现/etc/sysctl.conf配置文件被dpkg给备份起来了,后缀是dpkg-bak。

改名回来后sysctl -p,以为解决问题。重启之后发现BBR还是没能启用。翻找资料,发现是机制改了。现在得把这些配置写到/etc/sysctl.d/下面去,自己建conf文件。

当然,这样也有好处。现在可以把不同的内容分别写在不同的配置文件里面,不用像以前那样全部放在sysctl.conf里面,找起来比较麻烦了。

另外,记得用sysctl --system而不是sysctl -p来进行参数的临时加载。机制不一样了。

坑三:haproxy启动不起来

算是一个小坑,因为报错信息在日志中写明白了。
我的haproxy是早期版本安装的,需要在haproxy.cfg中把ulimit-n设为524288。

global
        ulimit-n  524288

坑四:其它软件还没提供trixie源

我周一把Debian升级到trixie的时候,顺手把Nginx/PHP/Redis在/etc/apt/sources.list.d下面的Repo也给改了。然后就发现PHP已经有了trixie源,但Nginx还是404,Redis是403。

截止本文刊发的时候,Nginx已经OK了 ,Redis还没好。后来直到过完十一长假,我发现redis有更新,再去看,才发现也提供trixie源了。

还有一个问题是simple-obfs在trixie官方源中没有提供,而bookworm是提供的。git然后源代码编译是一个解决方法。如果还是想从apt直接安装省些事情,请在bookworm的时期先完成simple-obfs的安装。

坑五:GFW捣什么乱

这个就坑我大发了,几乎可以专门写一篇。不过我还没完全弄明白,以后搞清楚了再说吧。

我家里的网络访问Debian官方源不算快(应该说很慢),我又不想改源,于是用了SS代理来「加速」。
apt update的时候发现,Debian源没问题,但Nginx和PHP一直连接超时。区别就在于,Debian源是http,后二者是https。
用curl -x -I简单试了一下,https还真是走不了SS代理。http就可以。

如果答案是「GFW检测并干扰了TLS over SS」,那我没话说。我知道它有这能力,TLS的确特征明显,尤其是握手时。这可能也是最合理的一种解释了。
但我HTPC上有一台VM使用自己的ss-local是OK的。如何解释?同样的OS版本,同样的SS版本,同样的网络环境、节点、线路、协议、密钥、插件,同样的payload和访问特征,连TTL和MTU我都看了,实在是想不明白。

有问题的VM只是说TLS握手出问题的概率很高,但并非100%。我开了Verbose猫在两端看了一下,发现有问题的时候貌似有replay attack。我拿不准,但看起来像。两端的节点都换过,没有什么差别,该replay还replay。

在公司没问题,在家里有两台都有问题,可见应该跟家里接入的上海电信宽带有关。然而家里HTPC上从Windows去用那两台上的ss-local/privoxy作代理都没有问题,在我遇到问题的时候,儿子还在欢看YouTube呢,线路没被封。SS是AEAD版本,cipher不对时的反应是No Data Transfer,GFW肯定拿不准。

那台没问题的VM就是不会引发,100%地OK,让我始终想不通的终归还是这一点。在SS上面再叠一层tor,也是OK的。最后不得已,我让apt走了tor。没去试SS over FRP的方式。先这样吧,也没慢多少就是了。

2025-08-15

能用的东西就别动!

一直以来,以为只有程序员需要在意这句话,然而今天我也遇上了。

图片来自网络

用「夸克云盘」下电视剧的时候,一直弹框提示我升级。升级了以后发现,超过云盘容量的内容,即使是第一次也无法保存了。回退到3.20.0版本,又可以做到了,看来这个逻辑是客户端在控制,而新版已经把这个「Bug」给堵上了。

曾经也吃过这种亏,只能说我「好了伤疤忘了疼」。以前用「阿里云盘」,也是一直提示升级。有一天升级完以后直接进不去了,应该是那个版本的EXE跟我的OS之间出了些问题。但进不去也就意味着再没机会修正,而且官网上也只能下载到这个有问题的版本,于是我只好又去找了旧版的安装包。还好网上还能找到,存起来当「传家宝」,现在也还能用,但再也骗不到我升级了。

而且这个4.x版的「夸克云盘」客户端,还把我的默认浏览器给改了。我一开始还纳闷,你个网盘客户端,动我WebBrowser干什么?后来进去后发现它其实就是一个浏览器了。好吧,中国人还真是好收拾。

我以后什么客户端都不敢升级了,起码国产软件得是如此。我已经给它们「最惠国待遇」了,单独放在一个虚拟机里面跑,没想到还是不够。当然,说起来它们也是可以搞「强制升级」的,希望架构师忘记了这一出。但它们也可以搞一个「以旧换新」,等旧客户端市占率低了以后就把服务掐了。没办法,谁叫我有求于人呢?只希望这一天晚些到来,而我动作要加快了。

这次下载到的3.20.0版的「夸克云盘」客户端,我也会当作「传家宝」存起来。有需要的可以从这里来拿。我找到的地方本身也是一个「夸克云盘」的资源网页分享,没有安装客户端就无法下载。搞墨比乌斯没意思,我就直接放Dropbox共享链接了。

再强调一遍:能用的东西就别动!


五天后记:现在夸克云盘大概已经把这个漏洞从服务端给堵上了。看来我还是太乐观。好吧,Life will find a way。

2025-08-08

惊闻Pocket关站

今天用Pocket的Chrome插件把两篇文章收藏了起来。收藏过程比较慢,引起了我的一点点注意。想起已经很久没去整理过里面的文章,于是打开了网站,才惊讶地发现一个月前它已经宣布要关闭了。

图片来自网络

还好留了三个月给用户导出数据,10月8日截止。赶紧去申请,收到邮件一看,一个不到700行的csv,压缩了还没有50KB。说我数据少吧,600多篇文章也不算少了。但下载附件的时候我就心里一惊:估计只有标题和URL,那些爬下来的内容,怕是都没了。

我当初用Pocket不用Delicious(顺便说一句,Maciej Cegłowski现在连更新Let's Encrypt的SSL证书的acme.sh脚本也懒得去放一个了)的原因,其实就是因为Delicious只保存链接,不存内容。「社交」是我并不需要的功能,「推荐」也是。Pocket后来渐渐地也很多页面都爬不下来内容了,所以我也渐渐远离了它,只是通过Chrome插件往里面扔那种「将来可能会有用」的东西,但再也不去看。一个网站若是用户都是我这种样子,关闭也是必然的,我应该早有心理准备才对。

当今「互联网」的一个很大的问题,就是许多网页已经消失了,不见了。有伏地魔的原因,有赵公明的原因,也有乔布斯的原因。不管怎么说,事实就是如此。我试了我导出的数据里面比较古早的几个URL,都打不开了。有的虽然页面没了,网站还在,还有的甚至连网站都没有了。我现在甚至开始有点怀念Evernote,但它其实也没有多好用。Web不管几点零的时代,好像都已经过去了。

我现在转到了Instapaper下面,刚开始用,还没什么心得。尝试导入Pocket的数据,Instapaper告诉我还要等几个小时。从早上到现在也还没动静,我觉得这是好事。花的时间多,意味着它真的会去爬内容,否则只是URL应该几个毫秒就结束了。

Instapaper的Premium会员不便宜($5.99/Mo,$59.99/Yr),比Pinboard的含永久存档和全文检索功能的会员($39/Yr)还要贵。总之对于我而言都有点肉疼,因为我还买了Medium和Dropbox,而且普通中国人都比较穷。

让AI对比了一下,我最后如果要成为付费用户,可能还是会去考虑Pinboard吧。我的核心需求是永久存档,全文检索也是羡慕的,笔记并不是必须的。毕竟Instapaper免费也不是不能用。

而且,见鬼,我对Maciej Cegłowski的不少理念还挺认同的。

2025-08-05

是谁动了我的HDC?

最近工作上倒是查了不少问题,然而到了末尾都发现只是一些低级错误,完全不好意思拿出来说。但今天遇到一个,还算有一些意思,可以讲讲。


问题的表现是我们的软件上某些部位偶尔会「花」掉,显示的是之前覆盖在上面的内容。有经验的程序员一看就知道是GDI的问题,但到底是什么问题呢?

图片由Google Gemini生成

刚开始的时候,以为是GDI泄漏了。曾经有过一个例子,漏到了好几千,后来到了1万,触发了CEF的CollectGDIUsageAndDie被Dump了。还没到1万的时候,界面上的表现就是开始花,其实就是有部分GDI函数已经开始调用失败了。

然而这次并不是,GDI对象数很正常。开发人员远程调试跟了一下,发现是HDC拿不到。CreateCompatibleDC()得到了一个NULL,因此MemDC创建不出来。


什么情况下CreateCompatibleDC()会调用失败呢?GDI对象数不多,内存也很充足。软件中其它部位的MemDC是能正常创建的,因此全局性的因素都可以排除。什么光栅设备、显卡驱动之类也就不可能是原因了。
除此之外,就只剩下了一个可能性:CreateCompatibleDC()传进去的HDC参数有问题。

试了一下,乱传一个不存在HDC,的确会导致CreateCompatibleDC()返回NULL。如果传的是个NULL进去,倒是还好一点。看来是窗口上的HDC有问题,当然也有可能是窗口本身就有问题。然而其它地方也在用同一个HWND创建MemDC,一切正常。所以还是某些HDC有问题。

HDC的值看起来并不奇怪,也没有什么好办法确认它到底有什么问题。HWND还能用Spy++来看,HDC我是一筹莫展。还好可以OutputDebugString。日志打出来,有意思的地方来了。

我看出问题了:当某个HDC失效的时候,它一定是被连续拿到过两次,中间没有ReleaseDC()过。这两次GetDC(),都得到了同一个HDC,肯定不正常。
我把this指针和HWND的值也加到了日志里面,这下看得更清楚了。两次GetDC()分别是不同的HWND。而HDC失效之时,就是当它被最终ReleaseDC()的时候。只不过这次ReleaseDC()的HWND是一个旧的窗口,那个窗口此时应该已经被销毁了。


窗口OnDestroy()的时候,没能把它的HDC一并归还,这当然是我们软件中的代码错误,也是我们遇到的问题的直接原因。但故障现象的根本原因是什么呢?我们确实没有按照规范「一借一还」,至少窗口还「在世」的时候没有。不过ReleaseDC()难道不管三七二十一,只要有人拿着某个HDC来释放,它就答应吗?都不用看看HWND对不对得上吗?

微软关于ReleaseDC()的API函数说明在这一点上就有点语焉不详了。大概它没想到有人会这样去实践?的确也没人问这种问题,完全找不到资料,只好自己动手做了个实验:

HDC hDC = ::GetDC(hWnd);
int nRet = ::ReleaseDC(hWnd + 0x1000, hDC);

随后再在这个DC上用GDI函数画东西,确实画不出来。nRet也的确是1,按照微软的说法,返回值1表示DC被释放,这倒是没有骗人。我把hDC也加了个数字,然后再跑一遍,这次nRet变成0了。

所以说,微软是在ReleaseDC()的时候搞了个「容错」逻辑?只要HDC对得上,就给释放,不管HWND对不对得上号?我一开始跟Google Gemini探讨这个问题的时候,它还不相信,直到我告诉它测试结果。


回过头来看,为什么两次GetDC()能得到同一个HDC呢?
我们的主窗口,经历了销毁后重建的过程。在OnDestroy()的时候,没有及时执行ReleaseDC()。但Windows可能认为,窗口不在了,DC也就没了。于是另一个新建起来的窗口又通过GetDC()拿到了同一个HDC。等到主窗口的C++对象开始析构,调用ReleaseDC()的时候,新窗口拿到的HDC就被背刺了。系统的DC应该是在放一个池子里面,所以是有可能被重用的。这当然需要「运气」,也正因为如此,故障现象不是很稳定。

会遇到这种问题的人,应该不多。现在还在用GDI做开发的项目本来也就不多了。我在网上没能找到什么可以参考的信息,还好勉强算能够重现,就抓住机会解决了问题。经验值又+1了。

最后说明一下:我这个实验是用VS2013在Win10下面做的。不同的OS以及VS版本可能会有不一样的情况。毕竟是所谓的「未定义」行为。

2025-07-26

一路向西

为期一周的自驾游,又接了下一个任务,如今终于缓过劲来,开始整理游记。

婺源

婺源在我的印象中,是因为油菜花而出名,大约得有二十年了。我们这次去的时间不是看油菜花的时间,没办法,孩子只有暑假寒假有空。但现在婺源也不只有油菜花了。

订了一间民宿。没有重蹈去年日照的覆辙,至少在干净、卫生方面,太太这边算是「过关」了。离婺女洲度假区只有一个街区,不过我们还是开车过去的。天气实在是太热了。

婺源民宿

两个房间,中间并没有门。主卧的阳台部分还是挺不错的,视野很好,只可惜朝向一般。
老板是个设计师,风格还算简单明了,没有我们不喜欢的地方。室内储物空间少了一些,更适合年轻人。卫生间相当吵,但其它房间意外地隔音还不错。

闷骚老板整了个大厅吧台,可以提供一些鸡尾酒。第一天Check In的时候,有两个女生在吧台抱着哭。第二天凌晨一点多,有年轻人在房间摔门数次,太太不得不出门干涉。现在的年轻人到底怎么回事啊?

婺女洲度假区

没能拍到合意的照片,勉强用这个来代表吧。

婺女洲度假区

大致是一个人造的网红景点,面积倒是不小。有不少刻意的摆设,适合年轻人拍照片。景点里面也有酒店,不知道住起来感觉怎么样,价格肯定比我们的民宿贵。话说我们刚订的第二天,民宿在携程上就涨价了近100元间/夜。

这个景区也有一个水上乐园,有不少游客其实是冲着这个来的,特别是夜里。我们没带泳具,也无意把自己整成大虾,就免了。

为了看「打铁花」,在高温下等了四十分钟,基本上到了大家的极限了。然而整场表演波澜不惊,离得还元。比起我二十多年前在铜梁看的打铁花表演都要差上不少,也难怪我近来各种「今不如昔」的长吁短叹。

停车费10元。在停车场目睹了有大神开车推着「雪糕桶」到处跑,保安边追边骂也不管用。只能说还好「推」的不是小朋友。

卧龙谷

本来第二天是想去篁岭的,但一来嫌价格贵,二来天气也太热,最后换成民宿老板推荐的这个「卧龙谷」景区。据说还比较凉快,毕竟是去山里玩水。

卧龙谷

我们也没有去玩水,直接索道上了半山腰,然后一路玩下来。
风景不错,拍了不少照片,不少都具备做成Wallpaper的资格。图上这座索桥上很凉快,风不小。再往上就到顶了,最后一个景点大龙瀑就在前面不远处。可惜太太爬不动了,在中途停了下来歇脚,拒绝继续。最后这一段是我和儿子「攻克」的。

弦高古城

上午去过卧龙谷,下午稍事休息,也是避开夏日的锋芒,然后傍晚去了民宿老板推荐的另外这个景点。

弦高古城

老板建议我们把车停在县政府停车场,走过去两分钟就到了。去的时候还好,回来的时候发现停车场门前的路上已经堵得水泄不通。不管是汽车还是电瓶车或行人都很多,被迫走了另外一个方向绕回去。

这个景点还是有一些意思。虽然也是人造的,但相比起其它「古城」,它多了一些「立体感」,有一些高低错落。在长三角就很难见到这样的地形。

傍晚还能好好拍照,入夜了人变得很多,行走更像是推搡,大概之前都在躲太阳。
年轻人还是很多,感觉婺源各个景点现在面向的游客就是年轻人为主。在当下这个时代,不确定这对它是不是好事,我也要想一想。

景德镇

「瓷都」名声在外,既然顺路经过,也就进去看了一眼。
没有留下任何值得放出来的图片。太太本来想找几个免费的景点玩玩,打发掉大半天的时间。然而这里的景点大多都要钱,而且不是一百多就是大几十。好不容易找到了一个「抚州弄」,发现只是一个售卖地摊货和开苍蝇馆子的地方,十分钟就「逛」完了。
停车费也付了10元,相比起来,弦高古城昨晚只有3元的停车费简直良心。吃了午饭我们就头也不回地走了。

KFC里面,也有外地游客在抱怨景德镇「哪里都要钱」。话说这种「自来熟」的Guest我们这趟在路上已经遇到过不止一次了。
感觉景德镇整个城市就是一个中国不同时期的混杂物。有荒废的厂房(是真的荒废了,不是景点),有老旧的小区,《钢的琴》里面那种。然而对面可能就是一个新修的商场,却特意修成红砖风格,只是从系统窗上看得出来端倪。

走马观花,匆匆一瞥留下的印象,不一定对。
我不是太喜欢这种风格,但它是事实,是现在正在发生且存在的事实。这就足够了。起码它是真实的。

瑞昌

九江下面的一个县级市,主要不是来玩的。

瑞昌老小区

这种老小区,外观都很破旧。其实好好装修一下,房间里面还可以不错。
底商是餐饮,因此卫生状况不好,时不时污水横流。不过我在重庆的老房子也差不多,每个城市都会有自己不那么光鲜亮丽的一面。

瑞昌城隍庙附近

因为不是来游玩的,没怎么拍照片。勉强拿出这一张。
过去的位置上是什么,我已经忘却了。总之图上的这些东西是新修建的,看起来还像模像样。据说是改建了一座「城隍庙」。

另外,市中心也搞了一个「柳湖公园」,晚饭后去遛达了一圈,单从游人数量上,也可以说是不少,但明显都是当地居民,年轻人不多。
也遇到有人在直播,以及大批的老年广场舞团体。这个时代就是如此。

月亮湾

安徽宣城下的泾县辖区内的一个景区。太太从「移动互联网」上看到「皖南川藏线」,有点神往,于是回程的时候安排了这样一个行程。

月亮湾

皖南跟川藏线搭什么界?我对此是一脸问号。其实也就是山路窄风景好适合自驾游的意思,有点「蹭」的感觉。

主要也是玩水,所以我们又是当「看客」了。太太光着脚到小河里走了走,水量是上游控制的,白天大一些,夜里不大。有一些浅滩用来让汽车过河,直接开过去,两边还有游客泼水。

我们在河边的民宿住了一宿,第二天准备继续去六道弯,但看了一下回程的路线太耽搁时间,于是改去了桃花潭。

桃花潭

没错,就是那个桃花潭。「桃花潭水深千尺,不及汪伦送我情」。
只是不知道为什么是在这个角落里?古时候这里很繁华吗?

桃花潭

风光还是不错的,特别是在据说是李白当年喝小酒的小阁楼上。小小的,是我喜欢的风格。视野挺好,看得到下面的渡口有船在来回摆渡。

我们一开始本来是导航到的景区入口,门票又是要大几十。太太从「小红书」上看别人的攻略,说好看的景点都在西岸,汪伦墓什么的。收费的景区是东岸,于是我们上车过河,其他的游客也纷纷拔营。

这个景区感觉有点乱,几股势力把各个景点瓜分了,各自为政。听别的游客说,渡船摆渡一次60元,从东岸到西岸要70元。我在想这个生意真好做,我也可以做,只要一半价钱就好。

2025-07-25

编程随想:文档很重要

公司的文档水平一向不好,习惯也很不好。在代码中能写个注释,已经算是有好习惯了。在我看来最低限度的ReleaseNotes,都是有人去推动后才建立起来的制度。大言不惭一下:看起来正式一点的文档,大多出自我的手笔。

前段日子,下了狠心,盯着同事们整理了一篇文档。大约三、四个月的开发内容,最后写了82页。我觉得不算多,但可能已经多得让不少人懒得去看了。也正常,文档不是小说,不是让你没事从头翻到尾的。有需要的时候去查上一查,还能有所收获,这就已经算是有价值的文档了。尽管离我认为的「先写文档后编码」还有不少差距,但要是能事后真真正正地补上,也是功德一件。


现在流行AI,公司上上下下都在搞自己部门的RAG。这推动了一波文档热潮。AI没有东西吃,吐出来的东西也就质量不咋地。这样一来,文档就愈发的重要了。

对我而言,这是好事。我倒是喜欢写文档。比起写代码,写文档更接近我的舒适区。何况偶尔我也会塞点「私货」进去,甚至把文档写得像小说一样。反正是内部文档,调皮一下也无妨。将来万一有人看到,也许会有会心一笑。

而且,为了能安心退休,我倒是也愿意把自己的「毕生所学」给「贡献」出来。知识这种东西,有的人会藏私,但我觉得藏着掖着没意思。真正的能力,并不在于别人学不到的东西,而是别人学不会的东西。


有的时候,有些文档会让人觉得很没意思。完全是形式主义,没有什么有价值的内容。对这种文档,我个人是并不喜欢的,但偶尔也必须得去做一做,还好不是太多。

在现在的公司,基本碰不到这种事情。就算有,可能也不是我的事情。但在以前的公司,就会有不少。看起来厚厚的一叠文档,比词典还厚。有没有人看?没有。有没有用?有。你得有它。有就行。

曾经向当时的主管抱怨过,得到的回答是:这些文档的确没有意义,但规定要求必须得有它们。可能是因为如果能沉住气把这些都完成了,那这个项目的总体质量应该也不会差到哪里去。

也就是说,这是甲方的一个测试,一个考验,或者说是一个保证下限的东西。肯把这些无聊的事情搞完的,大概率也就不那么草台班子了。

或许有几分道理,也或许其实是歪理。但不管怎么说,总之当时的我是被说服了,埋下头继续写。


又有的时候,有些文档,真的是必不可少的。

记得以前说过这个观点,可能是在Google+上。我认为如果要自杀,一定要写遗书。悄咪咪地去死也就算了,别给后人留悬案。如果有遗书,家人或许还可以帮你讨个公道,没有遗书的话,很多时候就白死了。反正都是要死了,干嘛不把后事办好一点呢?

图片来自网络

反正车费你都拿不回来。

2025-07-23

编程随想:可以delete this吗?

在C++中能不能delete this,去问AI,它能给你一个基本上算是标准答案的回答。面面俱到,滴水不漏。

在C++中,从技术上讲,你可以在类的成员函数中调用 delete this。然而,强烈不推荐这样做,因为它非常危险,并且会带来很多潜在的问题。……

看起来是不太好的,至少是不推荐。
但是如果你改一个问法,去问可不可以「对堆上new出来的非模态对话框在PostNcDestroy中做delete this操作」,那它又会改口了。

在MFC中,当你在堆上new了一个窗口类,并且它是一个非模态对话框,那么PostNcDestroy中调用delete this是完全安全且合理的。这是一种标准的MFC编程模式,专门用于解决你所描述的生命周期管理问题。……

所以,事情都得分场合来看。有些情况下「坏事」也可以变成「好事」,至少会是合理的。反过来也一样。大多数情况下,对具有某个「标签」的事物并不应该有唯一的判断结论,因为它可能还有别的标签(不知道3D人士看不看得懂)。


上述资讯,其实算是C++开发的基本功。MFC开发如果入了门,也不应该有此疑惑。不过呢,世间的事情很多都比较复杂,并不像示例或教科书上那样简单、清晰、明了。夹杂了别的东西之后,情况就又发生了变化。

最近在查一个问题,就遇到了一个案例。
有个小弟,在PostNcDestroy里面,去上了一把锁。std::mutex,成员变量,用std::unique_lock辅助管理。
然后程序就Crash了。调试起来倒也容易,因为这个虽然看起来跟多线程有关,但也并不是真正的多线程问题,还是很容易复现的。

我也不多啰嗦。到了这把年纪,很多抖擞精神去查的问题,结论出来以后都失望无比,最后写都懒得去写,何况世上还有AI。有经验的程序员应该一眼就看出问题了:std::unique_lock在PostNcDestroy函数退出时,才会把自己管理的std::mutex给解锁,但那个时候这把锁的主人已经把自己给毙了。这就相当于访问了无主内存。

所以,「自毙」这种事情,虽然不是不可以,但后事还是要先安排好。


图片由Google Gemini生成

比如,「禁诉令」这件事就做得很好。否则法院可能哪天就得直接关门了。

2025-07-04

「伟大」的独立日

收到美股基金定投失败的消息,咕哝着「狗日的美国佬又放假了」,看了日历才想起来是「独立日」到了。

还没看过同名电影,据说是科幻片。我的阅片量,说低不低,说高也不高。但是拜最近的bttt11.com和cunpian.cc被404所赐,将来估计是会持续走低了。

在这「伟大」的独立日,美国国会通过了一项同样「伟大」并且还「美丽」的法案。具体内容我也不清楚,不评论。反正川普和MAGA是想它通过的,对了还有万斯,就是让泽连斯基去穿西服的大聪明。然后马斯克是反对的,态度还挺激烈,以至于川普说要把他遣送回南非去。

美国就是美国,还是挺文明的,要收拾人讲起来也就是「遣送」。你看像人家赫斯还得自己开飞机,林副主席不知道是不是自己开的三叉戟,当然也不能排除马斯克最后是不是也还会落得一个只能自己开星舰的下场。

图片由Google Gemini生成

美国从英国独立,说起来自然是个大事件。但英国其实也没有那么「坏」,至少后来也成功地把权力关进笼子里了。相对而言,制宪在我看来对于今天的影响其实要更大一些。然而美国的宪法日并不是一个法定节假日。我对此的理解是公民与政府的权力斗争是一个长期持续的过程,并且现在仍然在继续,宪法修正案都二十几条了,所以也没有什么值得纪念和庆祝的。

Blog上黑白色的祭奠,已经持续了一个月。这一个月以来,我作为一个色觉正常的人士,也体验了一把色觉障碍者的感觉。去感受,去理解,然后去思考,我觉得是自己人生路上的一种应该要去践行的方式。在这方面肯定有人比我做得更好,无意追赶或比较,也无意标榜什么,只是希望自己还来得及。

刚好那位总理讳莫如深的冥寿也过完了。因此把网站的配色恢复正常吧。明年见。

2025-07-01

我的电脑史(三)——80486DX2-80

已经忘了是初三还是中考结束后的假期里面。我的电脑升级成了486。

初三的学业还是很紧张的。我在初一和初二的时候,成绩并不是很好。数学当然还是班里第一,物理和化学也没有问题。尤其初三加上的化学,因为只涉及到一些常识性的东西,我小学就通过科普读物了解过了,基本没费什么力气。但语文和英语这些文科并不突出,特别是语文,因为是班主任教的科目,一个老头子,跟班里绝大部分男生都不对付,所以成绩很一般。初一的时候历史还不及格过,还好只有那一次而已。

所以我现在回想起来,觉得父母真的是有魄力,敢在那个时候给我换电脑。升级以后的电脑,具备了彩显、声卡、光驱,可以被称为「多媒体」了,娱乐性大大增强,不亚于如今的手机。对于当时还是个初中生的我,无疑具有莫大的诱惑,很容易走上「邪路」。

转折点来了,初三我们班换了班主任。

图片由Google Gemini生成

老头子本来就有劣迹(私下有传言他以前有跟女生不清不楚过,按我外婆的说法是「犯过错误」),带的班级成绩也不好,在年级里面的评价是学生都比较顽劣,有时候还有老师和学生拳打脚踢的事情发生。于是到了初三的时候,年级组把我们的班主任换成了一位三十来岁年富力强的青年女老师。

女老师的作风很是强横,个性鲜明突出,很快把整个班级收拾得服服贴贴,不再敢乱来。当然她也不只是强硬而已,在提升考试成绩上的确有真才实学。通过一些完全是针对应试教育的突击工作,学生们的成绩提升明显,家长们也服气。我直到现在都还会在梦中时不时梦到又去参加考试,然后心里暗自发愁背过的东西过了这么久怎么可能还记得。


升级是去的电脑城,那个时候重庆的整机DIY行业才刚刚开始起步,一切都很原始。商家自己也没货,带着我们四处找零配件。印象中很深刻的是,主板是去一家专卖店里面选的,门店在电脑城之外,嘉陵江索道那边。当时在选Hippo 10还是12这件事情上纠结了蛮长的时间,最后还是选了12。

图片来自网络,但确是当年的模样

CPU用的是TI的486DX2-80。内存则升级到了4MB,用上了72线的SIMM,印象中是两根,2×2MB。386SX的机箱已经太过窄小,放不下HIPPO 12主板,所以也一起换掉了。新的机箱其实很简陋,盖子的铁皮挺薄,打开的时候还会变形。当时不太在意,也无从对比,后来我大学时DIY接触到了其它机箱以后,才知道它的品质相当不行。

这次升级的时候,准备加一部光驱。商家给到我两种选择:1x或2x,也就是单倍速和倍速光驱。当然当时也有4倍速光驱,不过价格明显偏高。我们选了2x倍速光驱,但商家死活装不上,换了1x光驱就可以。
之前还在用386主机的时候,硬盘已经升级成了一块三星420MB。最后的诊断结果说是这块硬盘跟光驱冲突。偏偏1倍速和2倍速的差距在某些场合又非常明显(比如看VCD),最后不得已把硬盘换成了Maxtor的420MB。旧硬盘抵了一部分金额,但还是额外出了一笔钱。

光驱已经忘了是什么品牌,好像是Acer。当时坚持不用1倍速光驱的原因,有一部分也是因为那个可以兼容三星硬盘的单倍速光驱的品牌我没听过。后来这部光驱用了蛮长时间。面板上有外接3.5mm耳机的接口,也有按键可以直接播放CD,不过音频是从这个外接接口出去的。后来的光驱就都有一根音频线,可以接到主板或声卡上,走声卡输出了。

图片来自Reddit

既然是「多媒体」电脑,声卡也是必不可少的。声卡是OPTi 82C929A MAD16 Pro,兼容性倒是还不错,大致相当于Sound Blaster Pro/16的程度。Driver在一张1.44MB软盘上,其中测试MIDI的Demo音乐我听了不知道多少遍,随口就能哼。后来进大学看了NBA才知道原来是美国国歌。这块声卡一直用了五六年,到我大学中期才淘汰掉。

声卡接了一对塑料音箱,一直用到我大学毕业。另外还配置了鼠标。键盘已经有点失灵,于是顺便也换掉了。因此,说起来留下的只有显卡和显示器,以及两个软驱。其余的配件都换掉了,相当于新买了一台电脑。因此老的80386主机我就收了起来,加上之前换下来的双频单显,怀旧的时候可以装起来玩玩。


说起怀旧,那个年代我就已经开始了。我偶尔会把一台「大屁股」电视搬到我家里睡的「上铺」去,接上FC开始玩「魂斗罗」。那台电视据说是我大舅年轻时玩过的,整个像一个小柜子。透过木质外壳的缝隙,看得到里面有电子管,开机后的确需要预热一段时间才有图像。屏幕是黑白的,都不知道有没有十寸,不说的话我还以为是个示波器。当时不知道DPI为何物,反正我觉得它清晰度还不错,比家里18寸彩电要高。

图片来自网络,大致长这样

有了光驱作为输入设备,电脑的可玩性骤然高了起来。装机的时候,店员用了一张游戏光碟作为试机碟,我看到里面游戏挺多也挺不错,死乞白赖地找人家要了过来。这张光碟我现在还留着。
第一个玩的游戏是《悲恋湖杀人事件》,因为目录的名字「SADLAKE」是我第一眼看到并且能看得懂的。
第二个学会的单词则是「KOEI」。我很幸运,玩的第二个游戏的目录名字是「KOUKAI2」。它让我知道了,即使是在那个年代,那种硬件条件下,一个好游戏也能做到什么程度。

图片来自网络

此后,我也时常往电脑城跑,自己去淘光碟了。到上大学为止,大概攒了两个光盘包,40张碟片左右。一开始光碟要40至50元一张,后来慢慢降到10元左右,说起来也是花了接近一千块钱。看来,90年代中后期,不仅我们家,大家的收入水平都在慢慢往上走了。

高一的时候,我去买过我上大学以前唯一的一件正版游戏,就是96年发售的《金庸群侠传》,79元。当时是从《大众软件》杂志上看到,于是刚一上市我就去买了。还记得是在文化宫中门对面的那个大厦里面买的,从天桥进二楼,有一些卖IT软硬件的商店。国内正版软件市场那个时候刚刚开始起步,国人的意识也是一样。我妈把我痛骂了一顿,说我乱花钱。然而我也不花什么别的钱,连零食都不吃,她也拿我没什么好办法。

不过这并不是我买的第一款正版软件。第一次换硬盘的时候,我当时提出来要把他们的一些软件目录上的内容给拷贝到硬盘上带走,后来放不下,又买了一些软盘。作为交换条件,对方则提出来,要我们把他们的一套正版软件给买下带走。

图片来自网络,我的是5.25'磁盘的载体

那套软件放在他们玻璃橱窗的最顶层,看上去包装很正规,很高大上。后来拿回家拆开一看,的确也是。里面至少有10张5.25寸软盘,以及好几本手册。手册有厚有薄,软件看起来是全英文的,我后来安装过。说明书里面有部分具备中文,也有一些是全英文的。

软件名字叫做——Visual C++ 1.0。可惜现在肯定已经随着老房子的清空和出售而毁损了,不然还可以跟大舅的小黑白电视机一样当作收藏品。


初三的我,跟小学六年级一样地幸运。奥数竞赛再一次得奖,这次是省二等奖。复赛的时候一共就三道题。按照同学的说法,我上来就把第一道题做了,看看第二道题有点难,翻过来把第三道题也做了,剩下的时间研究了一下第二道题,然后把它也给解决了。

物理竞赛我也捞了个三等奖。最后顺利晋升本校高中部,并且在高中两个重点班的「选秀」环节被第一顺位选走。我只记得中考数学150分拿了143.5,其它科目都忘记了,想来也不会差。

我们班也成功逆袭。原来的「重点班」,不少学生都「跳槽」去了所谓更好的「一三八」。我们班的成绩紧随其后,原来班上那帮顽劣之徒,成了本校高中一年级的骨干力量,后来高中各个班的「尖子生」,都是从我们这个初中班级开枝散叶出去的。

高中的时候,我的成绩开始「泯然众人」,班主任一直有点遗憾。她总觉得是我高一的时候一次体育课后的意外导致的,被「摔傻了」。
当时是一次下午的体育课后,体育老师让我们把一些体育用品搬进仓库。我们几个学生干完活以后,看到仓库中有跳高用的垫子,于是就自己在那边跳着玩。我大概是一次脚勾到了什么东西,摔到了垫子外面,接下来的记忆就是被人扶着坐起来,中间的一段已经失忆了。

现在看来应该还只是轻微的脑震荡。送去了急救中心,班主任的老公是那里的医生,看过之后判断无大碍,于是叫了出租车让同学把我背回了家。同学虎背熊腰,我瘦瘦小小。他家里也有电脑,到了家以后他看到我的「玩具」,心里有了数,后来三年我们就成为了玩伴。
我用了一大叠软盘把《仙剑奇侠传》给了他,他也给了我《风尘三侠之金箭使者》和《妖魔道》。不过他后来热衷于玩格斗类游戏,大学以后我们就分道扬镳了。

图片来自网络,我好不容易才想起游戏名字

游戏多了,自然不需要自己来写。因此程序开发的事情,算是渐渐撂下了。


高一的时候,学校开了电脑课。电教老师找我恢复过两次误删的文件,他居然连undelete都不会用,我有点惊讶。剩下的时间,我就在他电脑上玩《FIFA94》和《波斯王子》。

其实初一的时候,开过电脑兴趣班。当时我有参加。这位电教老师发了一份考卷让大家做,当作入门测试。我一看,这不就是我上学期刚考过的奥数之类的东西吗?卷子是油印的,不是很清楚,老师边念题,就要学生马上做,没给什么思考时间。大多数学生都跟不上,但我发现自己做起来比之前六年级时又简单了许多,时间还真是够用。旁边一个家伙在抄我的答案,后来他大学期间去创业开了个网站卖旗袍,卖了很多年。

初一时候学校的机器,好像都还不是x86。有一台CEC-I,数量是不少,机器感觉还没我小学好。到了高中时候,机器换过一批了。有80286出现,那些非x86的机器已经看不到了。我不知道他们上课学了些啥,反正我都在老师办公室里面呆着,没怎么上过课。

后来期末考试,电教老师来发完考卷之后,班主任直接让我上台带着大家把题目做掉了。还冲我挤眼睛,问我说感觉好哇?搞得我很尴尬。题目的确是简单,对我而言是很基础的IT知识,里面我只有「五笔输入法」的那道题不会做,其余都有把握拿满分。

图片由Google Gemini生成

高一下半学期,电教老师让我去参加一个比赛。编程相关的,一开始说还有一个高二的学长也要参加。老师为我俩指点了一些要复习的内容。那个学长据说只是自己在家瞎玩玩,估计期末考试题目还是会做的,竞赛就不行了。后来他知难而退,竞赛最后就只有我一个人去。

比赛记得是去的三中,老师带我去。难度不小,跟小学那次不可同日而语,四道题我可能只做出来一道半,拿了个三等奖。碰上初中那帮从我们学校「跳槽」过去的「尖子生」在三中玩Novell网,我这种自学成才的也只能干瞪眼,不知道他们在干什么。


这台电脑后来加了两根内存,组了一个四槽8MB内存。过了几年,内存突然便宜了不少,有一次我跟我爸去逛电脑城,发现已经是这个价钱了,随手就买回来了。
再后来,硬件也没有升级过了。不过我在高中最后冲刺的时期,踏上了一块全新的领域。
我们买了一台Modem,外猫,33.6k。当时已经有了56k的Modem,但我机器UART不行,波特率有限,权衡了一下之后没有买。

图片来自网络,外观有点像,大差不差

再次佩服我爸妈胆子大,竟然让一个高三学生去上网。尽管一开始是FIDO网,但那也是很容易就陷进去的东西。现在哪个家长敢在学生高三的时候突然把手机给他让他随便玩?
话又说回来,可能我那个时候的成绩也比较能让人放心,以至于他们相信我能hold得住。可能我从高中开始成绩一直比较「稳」吧。

虽然一开始去了城市的FIDO里面逛了一阵子,不过后来我其实更多地是固定呆在一个BBS「GAMEBOY」上玩,相当于在泡一个论坛。站长Xiang Tao是一个公司里面的运维,用自己家的电话线路开了个拨号BBS,后来又加了一条线路。高中的时候,城市里面家用固定电话开始普及了,资费也算还好,一小时还不到10块钱。于是每天用Telix拨上去收数据,然后用BlueWave慢慢看慢慢回,就成了我回家以后做的第一件事情。当然,睡觉之前还会再做一次。这样做,电话费其实要不了多少,后来拨号上Internet就不一样了。

这个BBS比较有特色,是当时国内唯一的一个具有模拟股指期货的BBS。开发者Huang Hui是个程序员,写了个插件让BBS有了这个功能。站长也在玩,还有几个成年人。我们这种小屁孩就在里面瞎胡闹,灌水什么的。

感谢PCem,感谢WinImage

不过我也贡献了一些资源到站内, 有一些科幻小说,还因此混了个科幻区的版主当当。在学校里面我是从来不想担任任何职务的,但班主任强迫我当「数学课代表」,结果导致我的数学成绩在高中阶段并不出色,我也开始讨厌数学。高考时勉强考了个110多,不算出色。

高考完了以后,GAMEBOY站长从报纸上看到了录取信息,向我祝贺。川大(当时还叫四川联合大学)计算机系软件专业,录取名单第一个。随后我也收到了录取通知书。

去上大学,也就意味着我与GAMEBOY告别了。不过在学校有更大的BBS「蓝色星空」。去上大学前的那个暑假的一个夜晚,我在WPS上敲下了一篇长文,祭奠我的青春。那可能是我最后一次密集使用双拼双音了。后来我把密码忘了,加密的文档再也解不开。传说有万能密码,可我再也未能找回。

2025-06-30

Win11不能访问匿名SMB了?

要跟同事交换大量的数据,还涉及到手机。Samba还是比较靠谱的选择。无论是Android还是iPhone都可以访问,用我一位手机开发组的同事的话来讲:「这比网盘好用多了」。

然而有一位同事说SMB目录打不开,过去一看,发现他电脑已经升级到Win11了,自己还浑然不觉,有点惊奇这种神经是怎么炼成的。

Win11默认不准匿名SMB了,大概是出于某些「安全性」方面的考虑。但是我又不想去加上用户名/密码,于是琢磨了一下怎么把他的电脑给「降级」。这帮家伙Windows更新都停掉不装的,一个匿名SMB又怎么了?

组策略中改一改

先运行gpedit.msc,然后「计算机配置」->「管理模板」->「网络」->「Lanman工作站」,把「启用不安全的来宾登录」从「未配置」改为「启用」,就可以了。
有的人说还要改另外一处地方。反正我只改这一处就OK了。

2025-06-27

不明白的变化快

图片由Google Gemini生成

在我看来,所谓「盲盒」,其实是我们当年玩剩下的东西。

我小学低年级的时候,比较喜欢「糖关刀」。看别人的手艺是一回事,但更「刺激」的是不知道自己这一把能转到什么。偶尔看见有人转到龙、花篮,甚至大龙,附近的小孩都会围过来「开眼界」,羡慕的目光都能把龙头融化掉。

大龙,3D立体的,后来我没见过有这种手艺的艺人,大概已经失传了吧。
我转到过一次大龙,刚好是早上上学的时候。我妈和我一起蹲在路边吃,吃不过来,拦住其他同学要他们帮忙吃,闹得全校都知道了。

大约到了高一点的年纪,路边摊有开始卖一种零食。贵得出奇,要一块钱一盒。里面除了一颗糖,还有一个小玩具。最值钱的是一把小的左轮手枪,花一块钱买一把,还算是赚到。另外的就是纯亏。但大家都想着能赌一把,于是送了不少钱给老板。
我也跟风买过一次,当然,没什么好运气。我也心疼钱,于是此事到此作罢。一套整个包下来可以稳「中奖」,一共十六盒,老板开价15元。在我看来那就是冤大头了。

再后来,有了游戏机摊,然后是游戏机厅,就没那些东西什么事了。

昨天在Lawson门口等人,看到两个女青年在柜台前指指点点,店员上前询问,才知道想买福彩,刮刮乐。
公司年会的时候,也发过一张。「玩法」很复杂,然而终究还是一早就印好的。我在心里暗自嘀咕:有没有奖,不是早就知道么?看来红十字会也还是有新韭菜的。

应该怎么说当今这种现象呢?
可能是因为年轻人太有钱了吧。难怪无论银行还是京东都在怂恿客户把积分拿去抽奖。这其实是一种回收货币的方式嘛,与萝格营地基德先生的生意是一回事啊。

但他们其实也没钱,至少没什么钱,不够多。大概只是单纯地想赌吧?
我有个同事,曾经说过:赚钱的生意,不外乎「吃喝嫖赌毒」。说得或许也有三分道理。如果能激发人类的原始欲望,自己又能跳出五毒之外,兴许就能发财吧。
不过他到底还是没有能发财。说到底,还是普通人。普通人,啥好事不用排队呢?

世界变了吗?也许变了许多,也许其实也没变。

愿天下普通人都能抢到心仪的Labubu。

2025-06-21

昨天会更好

看标题就知道,是老生常谈的怀旧节目。

太太单位刚刚通过了一次「监管部门」的突击检查,安排集体散心游。儿子刚好也考完了试,不知道分数多少,反正回家就抄起了手机,还约了三五「狐朋狗友」假期来家里玩游戏。太太怕儿子宅出味来,给儿子也报了名,于是今天同去,剩我一个闲散人员赋闲在家。

把猫和自己关在儿子房间,开了空调,清理了他的写字台,摆上笔记本。放在Dropbox里面打算周末加班完成的工作不想去做,去买了打二折的《死亡空间》,也不想玩,一个人看着六天的日记大纲发呆。
想起了许久没听过音乐,从厨房找来了太太闲置已久的蓝牙音箱,擦拭干净,试了一下还能开机,于是打开YouTube Music,搜了一个「1980年代华语流行金曲」就开始听了起来。

边听边开始想流泪。我到底是戴了什么滤镜,那些已经早已成为过去的岁月,怎么感觉如此美好?

图片来自维基百科,尺寸方面有所调整

曾经跟着发姐的录像回味过1985版《明天会更好》。不少人我都不确切认识,只听过歌,没见过人,特别是没见过当年的脸,看过字幕才能知道是谁。那个唱腔如此熟悉的人,我都不敢认,但的确是费玉清,小哥。实在没想到年轻时他是那个样子。 
人们的发型现在看来很扎眼,但是又很熟悉。是记忆中爸爸妈妈的发型,是马盖先和李麦克他们的发型,也是那个曾经虽然问题遍地但也朝气蓬勃的年代的影子。

上半年已经给儿子看完了《龙珠》全部剧集,现在开始看《圣斗士星矢》。我现在看了都感觉有点尴尬,他倒是没觉得,可能因为刚好到了接近中二的年龄。《天空战记》我当年还没看完过,至少没有看完的印象,晚些时候打算借机补上。
现在的小孩,除了垃圾短视频,还能看什么?《斗罗大陆》?现在就算是《Doraemon》都没有当年的好看了。尽管画质和技术改进得不是一星半点,但如果要我去看,还不如半途杀了我。

或许,这就是前浪为什么需要死在沙滩上。像我这样的人死光了,就不会有人觉得今不如昔了。「厚古薄今的老顽固」将成为我的注脚,本文的标题也就完全可以改上一改。尽管我觉得经典是永不磨灭的,但是人类是在越变越蠢。过不了多久,无论是我还是经典,都会形神俱灭,历史和属于我的记忆也都将被改写。

这是人类的不幸,也将是大幸。

2025-06-20

只是冒个泡

最近一两个星期,非常忙,也非常不开心。主要是工作上的事情,顺带自己的个人生活也受到了影响。

「一系列的意外事件,引爆了一些潜伏已久的矛盾。」

至少在我看来,工作上的事情,可以作出如上的陈述。在这些事件中,我都不是当事人,但是也不可避免地受到了影响。加上我在公司的风评,和展现给众人看到的那些「性格」特质,又使得我被当作倒苦水的对象、潜在的调停者,最后收下了不少的负面情绪。忙就算了,还要闹得不开心,以至于数度在脑海中模拟过G力扑面而来的感觉。

事关公司,很多事情没法细说。但是大环境的恶化,在我看来是决定性的推动因素。坏掉的零件当然是可以看得到的东西,但是越来越大的压力,才是导致整个系统出现问题的关键。不管是气压、血压,还是心理压力,都是这个道理。
在此也郑重提醒各位,高血压一定要按时吃药,定期检查。我的眼压,也应该是如此。

本周还没正常吃过一顿午饭,写日记的事情就更不提了,已经压了一周的份量。每天记录日记,而且动辄数千字,压力确实不小。但是仍然不想随意放弃这个已经坚持了三年多的习惯。或者说,坚持写日记压力大,要放弃它,压力更大。每天都在感慨和反省自己的记忆力越来越差,更加不甘心自己的人生就这样溜走,Fade away在时间的迷雾之中。

图片来自Google Gemini

在此先冒个泡。我的事情,自然会去解决。太太也好,儿子也好,同事们也是,也都有自己的事情需要去解决。或简单或困难,但不往前走也是不行的,不然不知道会被水冲到什么地方,下场可能更惨。且看看我能「扛」到什么时候吧。

2025-06-05

每天都应该是哀悼日

图片来自网络

人还真是的,以前怎么没想到可以用这种方法呢?

这是一种态度。对于我而言,想说的更多,慢慢来吧。如果事情没有得到解决,那么每一天都应该是哀悼日。

黑白色,就这么说定了。没有什么理由去高兴。活在养猪场有什么可高兴的?26层楼,周围的正常人都被臭跑了。猪还可以拉屎,学生连屎都不让拉了。

每天写一点,每天一点改变。如此活着还能干什么呢?从一点一滴做起吧。

2025-06-04

今天不穿黑色什么时候穿

去年这个时候干了什么?不太记得了。但是身上的衣服,也是黑色。
今天不穿黑色,什么时候穿?

图片来自网络

港人已经连纪念都不被允许了。镇压速度之快,令我咋舌。但其实也并不意外。当初的镇压,也不过就是一夜,或者几天而已。

但我不相信数十万人一转眼就已经不见。或许去国怀乡,或许转入地下,但他们还没有死绝。使出的这一招,看似严厉无比,实则打草惊了蛇。并不是看轻它们的智商,确实也只能做到这种地步了。

星星之火,我是已经传下去了。很高兴得知世上没有时光机器,而且所有人终难逃一死。

咱们走着瞧。