2023年已过去 9.84%
淘旧书    @ 2023-02-01, 11:45

过年期间,在孔夫子网淘到四本自己二十多年前写的旧书,兜兜转转回到作者手里。

无酒无花 | 5 个评论 | 156 次阅读
简短地址:http://ncblog.net/1961/
2022 乏善可陈    @ 2023-01-01, 14:32

2022年过得着实乏善可陈:春天被封城整两个月;夏天被40+摄氏度连续烘烤了近两个月;秋天被带状疱疹折磨了近一个月;冬天全家阳了一个星期。

如果非要找一些积极的:春天在封城中完成了 Effie 对图片的支持;夏天儿子考上了他理想的高中,我把家里的11年前配置的PC更新换代了;秋天完成了 Effie 的 Android 版本;冬天全家阳过了,始终令人惶惶不安的封控式防疫终于结束了。

时间已经踏入2023年,但又似乎并没有什么让人期待、令人兴奋的。

农码生涯 | 1 个评论 | 821 次阅读
简短地址:http://ncblog.net/1958/
电车难题    @ 2022-12-27, 14:12

所谓电车难题,有很多个大同小异的版本,我最初听到的是这样的:有五个小朋友在一条铁轨上玩耍;铁轨前有个分岔,岔道另一边是废弃的铁轨,上面有一个小朋友在休息。而列车即将飞速驶来,你可以控制一个拉杆来决定列车是保持正常路线行驶导致五个小朋友面临危险,还是让列车驶入岔道牺牲那个原本不该遭遇危险的小朋友。

在以前,遇到这种问题,我也会装模作样去思考一下如何选择,仿佛真的是一个两难选择。今年以来,发生的一系列事情,让我对电车难题有了自己的答案:我,或者说任何人,都不应该也没有资格去选择(不知道算不算康德主义了)。

按功利主义的所谓人数多少去权衡利弊,本身就是很荒谬的。人多就一定是利益最大化吗?少数就必然该死吗?如果两边人数旗鼓相当呢?

纯理性来看,这世界上,每时每刻,由于各种原因(自然的、社会的、人为的、意外的……)导致不限于人类的很多生命体处于不幸中。绝大多数是没有人力可以避免的,“拯救”这个词本身就有点自大的意味。

而现实中很多时候,可能真的如同电车难题那样,“拯救”行为本身就意味着另一群体被牺牲。是不是有的群体,就值得牺牲其他群体被拯救?这种判断,即使上升到一个国家决策层,我觉得都是无法做出的——考虑了政治的,就意味着牺牲经济的,反之亦然。所谓“符合大多数人的利益”,无论是“大多数人”的界定,还是这句判断其本身是否代表正义,都是虚幻的。它只能是一句政治口号,而不应该成为任何决策的依据或者借口。

持续的封控确实一定程度上拯救了一些人群,这是否正义呢?那些因为封控而使得其自身其它疾病没有得到及时治疗而“枉死”的灵魂是否认同这种正义呢?放开后的大爆发是可以预见的,这在一年前世界上其他大多数国家放开时早已演示过一遍。大爆发中也必然有人会离去,所以放开就非正义了吗?

很多人已经忘了,放开才是常态,封控是异常态。维持异常态是需要不断给系统做功输入能量的,社会终究会回归常态,要么平和地,要么激烈地。

回到电车难题,任何人都没有资格去改变既定的轨道去伤害任何人,那是杀人。如果你是决策者,你应该做的,是在列车驶来前通知那五个小朋友,告诉他们这里危险,或者预先多竖一些警示牌。

谁的错误谁承担,谁的命运谁承受,很无情,但很道德。

胡言乱语 | 2 个评论 | 759 次阅读
简短地址:http://ncblog.net/1957/
谈谈 Effie 的原生实现    @ 2022-11-16, 14:31

Effie 是一款跨平台(macOS、Windows、iOS、Android)的集严肃写作、随手笔记、大纲和思维导图于一身的极简写作 App。

写作笔记 App 市面上已经非常多,跨平台也早已属于标配。抛开产品设计和云端同步层面,就客户端实现来说,Effie 与一众的套浏览器(Chromium 或者 WebKit)以 JavaScript 实现的编辑器最大的区别,或者说独步江湖的特性,就是所有平台均以原生技术实现

原生实现的劣势

所有平台都用原生实现,最大的劣势,就是开发成本极高。产品的核心功能,需要在每个平台上单独实现一遍。比如编辑器本身的交互、排版、渲染等功能,需要使用平台提供的特定的 API 或者框架,编写大量的基本上无法在其它平台复用的代码。只有一些算法性的代码可以在不同平台上用不同的开发语言实现一遍,这已经算是最大程度的“复用”和“共享”了。

即便都是 Apple 的 iOS 和 macOS,两套框架(UIKit 和 AppKit)的差异,也远超过最初的预期。UITextViewNSTextView不能说一模一样,可以说毫不相干。如果你认为改造完 UITextView,接着改造 NSTextView 会比较轻松,那你必然大失所望。接着面对 Windows 时,Win32 提供的基础组件 richedit32.dll,基本还是停留在上世纪的水准,在 Windows 平台另起炉灶是更明智也是无奈的选择。再来看 Android 的 EditTextTextView)时,又是一个全新的世界。

如果在大厂,选择这样的技术路径,必然会成立多个平台的开发小组,各自在不同平台开发产品。这样的实现方式,其实也很难保证,同一个产品在不同平台上有非常一致的内在逻辑和使用细节上的一致感受。而现实中,即便是大厂,也大多选择用所谓前端技术(套浏览器的 JavaScript 实现)来降低开发成本。

Effie 是个创业团队,不是大厂。Effie 所有平台的客户端的核心模块,是我一个人完成的,花了两年多时间,近30万行代码,这是一个看似非常“任性”的决策。Effie 在不同平台上,既能和平台本身风格完全融合,又能给跨平台使用的用户,带来使用上的一致感受。

Effie 为什么选择原生实现

其实,最早的 Effie 桌面原型,也是使用前端框架 Electron 来实现编辑器的。但随着原型的日渐丰满,越走越发现使用 JavaScript 实现带来的问题——无论如何优化,那种“不丝滑”的感觉——始终挥之不去。Effie 的产品经理李自然对于这个问题,也越来越无法忍受,即便市面上的同类产品皆如此。

在我加入 Effie 团队后,我在 iOS 平台尝试用 Objective-C/UIKit 实现了编辑器和思维导图的基础功能。李自然试用后,对这种“丝滑”再也欲罢不能。

之后,我用 Objective-C/AppKit 重写了 macOS 的客户端,与 iOS 版一起发布了 Effie 最初的公开版本。

再之后开发 Windows 版,也选择了 Native Win32,而没有考虑 .NET 框架。原本打算使用 Lazarus/Free Pascal 作为开发工具的,但 Lazarus 的 LCL 框架对触摸屏的支持尚不完善,另外,对多显示器的 DPI 处理也有问题,遂放弃。最终还是用我最熟悉的 Delphi,基于一套第三方付费编辑器组件,完成了 Windows 版的编辑器。而用户界面,全部使用 GDI+ 来渲染,并自己实现了所有过场动画(Win32 API 对动画几乎没有任何支持)。有用户反馈在 Windows 版 Effie 的安装包中,也带有 Chromium 库的文件,以为 Effie 也是套了浏览器内核的 JavaScript 实现。Effie 中带的这些 Chromium 库文件,是为了支持苹果登录的,与编辑器以及其它功能的实现没有关系。

最艰难的可能还是要数最后的 Android 版了,相对其它平台,Android 是我个人使用最多的(一直使用 Android 手机),却又相对最陌生的(开发层面)平台。Android 的“碎片化”也带来不少麻烦,不同的版本,不同的 Android 分支,有时简直就是另外一个系统。可能这也是为什么我使用 Android 这么多年,也基本上找不到一个趁手的笔记 App 的原因吧——现在有 Effie 了。

原生实现的优势

原生实现的优势,就是能在不同的平台,最大化的利用平台本身的特性,无论从界面元素的风格、还是交互,都带给用户最“地道”的感受。同时,编译生成的本地二进制代码(除了 Android 的 Java 不算)的执行效率,也给用户使用时带来不可忽略的所谓“丝滑”感受。

另外,对于一些极端情况,比如超大文本的情况,JavaScript 实现依赖浏览器处理,经测试,大部分这类实现的产品,都无法在人类忍受时间范围内处理好。我做过一个测试,在 Windows 版 Effie 中,将整部《三国演义》大纲化,每个段落作为一个列表项,一共2617项,生成思维导图。Effie 整个过程中占用内存不超过50M(作为对比,XMind 占用大约2G左右的内存),滚动思维导图,过程中完全跟手不卡顿,切换风格2秒内完成。

也有人问,为什么不选择跨平台的原生框架,比如 Qt。个人觉得,跨平台框架,为了跨平台,一定需要牺牲很多平台特性,去迁就共性。这样是无法做出 Effie 这样风格的产品的。Qt 这类框架只是让你可以用同一种语言,而语言对我而言,并不是一个多大的困扰。

既然选择了原生

归根结底,JavaScript 的实现受制于浏览器内核是其最大的“缺陷”。就目前的机器性能来说,纯 JavaScript 实现还是很难摆脱这个“缺陷”,即便强大如 Visual Studio Code。开发决策没有绝对的对错,只是不同的团队做出的不同的选择。

今年,Effie 已经实现了全平台覆盖(除了 Andriod 版还没有支持思维导图),也增加了全平台的图片支持,已经是一个成熟可用的,体验绝佳的写作、笔记、思维导图 App。

Effie 既然“任性”地选择了原生,作为 Effie 的开发者,我会尽可能让 Effie 永远保持这份“丝滑”。

Effie | 4 个评论 | 1,152 次阅读
简短地址:http://ncblog.net/1954/
今日霜降,凛冬将至    @ 2022-10-23, 20:11

当我们想象历史场景,总是灰白的。其实,当下鲜亮的每一天,在后人眼里何尝不是灰白的历史画面。

一切都会成为历史,每一天都是历史的开端。

凛冬将至。

胡言乱语 | 7 个评论 | 2,331 次阅读
简短地址:http://ncblog.net/1952/
返沪十年    @ 2022-10-09, 19:11

2012年10月长假后全家从珠海回到上海,至今已有十年。

十年前,可乐还是个幼儿园大班的小朋友,现在已然是人高马大的高一学生。这十年间,有过紧绷的创业,有过放松的生活,有过面临老人病倒的无措,也有安稳的苟且,以及面对疫情的无奈……

而不变的,是键耕不辍的敲代码。十年前,和李自然合作开启,以及合伙创业做 Mera,项目遗憾地失败了。最近的两年多,再次和李自然合作,全情投入了 Effie 这个项目。两年多写了四大平台(macOS、iOS、Windows、Android)的编辑器和思维导图,近30万行代码,如果要我再写一个平台的编辑器,真的会吐了吧。全部原生实现,就是会面对这样的境地,需要无比的耐心——面对时间、金钱以及精力的全方面考验。幸运的是,李自然给了足够的耐心,我也算不辱使命,Effie 全平台的里程碑基本达成了。

成功的合作,基础无非是互相成全。感谢。

疫情已经三年,今年实实在在地捶打到了上海。全城2500万人封控61天,以及全国大小城市、乡镇陆续的封控和所谓静默,已经彻底颠覆了人生前四十多年的认知——活久见。

无论是人到中年的自己,还是社会,似乎都已经告别了那个蒸蒸日上的年岁。叹息。

农码生涯 | 6 个评论 | 3,166 次阅读
简短地址:http://ncblog.net/1948/
Effie for Android    @ 2022-10-08, 18:24

前所未有的艰难,近两年写的第四个平台的编辑器,终于完成了。

Effie | 1 个评论 | 1,924 次阅读
简短地址:http://ncblog.net/1946/
高中生可乐    @ 2022-08-11, 20:03

对于可乐上学,我们从来没有花费精力和金钱去操办学区房和校外补课等,九年义务教育都是随缘上了一般的(世俗认知中属于垃圾的)学校,而给可乐在校外答疑解惑的,主要是可乐妈负责。

今年因为上海封控了两个月,初三学生在家上网课三个月,最后一个月回校。可能因此,我个人觉得今年上海中考似乎呈现出一种比较奇怪的分布,高分数量多(700分以上),但总体分数线比去年低,普通高中分数线 520(去年 540)。我的解释是,因为封控,某些副科(比如体育,英语听力测试等)所有学生都按满分算,拔尖学生不会因为在家上网课而放松,而普通学生普遍是受到了不去学校的影响的。

可乐的人生第一场重要考试的总分是 682,在他初中学校本届学生中排第二,也如愿被他所向往的第一志愿高中学校录取了。以这样的结果结束九年义务教育,作为家长我还是很欣慰的。想想没有弄学区房,也没花钱去校外补课,感觉省下了一千万。

可乐百事 | 2 个评论 | 2,304 次阅读
简短地址:http://ncblog.net/1942/
新文件服务器(NAS)    @ 2022-07-17, 19:28

台机更新升级完成后,文件服务器成了家里唯一“大个头”的机器了。前两年一直想把它换成群晖之类的成品 NAS,但群晖的四盘或者更多盘的 NAS 价格实在没什么性价比,配置又差强人意,实在下不去手。nate 去年淘汰了一个群晖的 DS216se 给我,放了两块盘做了一个同步盘,取代 Dropbox,但取代不了文件服务器。这次趁着这股折腾劲,决定把闲置的一个旧 ITX 小板和一块第三代 i3 做一个新的小型化的文件服务器。

淘宝上 Tank 家的 NAS 机箱,在去年年初做第一批货的时候,我就看上并下单预定了的。但由于时间太久又担心第一批货不成熟,又对 1U 电源稍微有点抗拒,所以后来取消了。这次在机箱选择上,最后仍然选择了 Tank 家的,因为支持热插拔六盘位,而且这次可以选配海韵的 1U 电源,据说挺安静的。

机箱到手后,颜值确实很高(虽然很多人说有点像微波炉),现在似乎也到了量产成熟阶段,做工很精致。

把主板、CPU 塞进去后,硬件部分就完成了。

把原先的文件服务器(技嘉主板)的硬盘拆下,塞进新的机器(华擎主板),启动系统,然后 Kernel Panic 了。

2010年从 Gentoo 入门开始玩 Linux,随着云服务器的使用越来越多,接触 Gentoo 越来越少。至今好像只有 Linode 还提供 Gentoo,其它的云服务商几乎已经见不到 Gentoo。唯独我的文件服务器,一直坚持 Gentoo,即使 Gentoo 时不时总会带来一些麻烦,比如升级依赖包冲突。而这个 Gentoo 的内核,也一直是祖传的,自己根据硬件编译的,每次硬件升级,都可能需要重新编译内核。

可能年纪确实大了,实在懒得再折腾编译内核了,直接把系统换成了 Ubuntu Server,这次算是彻底告别 Gentoo 了。

相比群晖等成品 NAS,自己装的机器系统虽然多少需要折腾一些,但自由度高得多,性能、配置也高得多。群晖 2G 内存就算高端机了,自己装的至少 16G 起吧,何况 CPU 的选择,对于偶尔需要跑一些脚本(自己额外)的需求来说,也很重要。

好了,“数据中心”搞定。

软硬兼施 | 评论已关闭 | 1,193 次阅读
简短地址:http://ncblog.net/1940/
换新机    @ 2022-07-13, 13:51

最初,说封控四天,于是也就没有把公司的 Windows 笔记本带回家。后来封控的两个月中,在 Windows 平台的开发工作,都只能在自家的 2011年配置的 i7-2600K 电脑和 1080P 显示器上完成。

封控结束后,萌发了换显示器的念头,下手了一台 LG 最新的 27GP95R 的 4K 高刷显示器。这台显示器购买过程也是一波三折,前后都因质量问题(或有黑点,或有划痕,或有蓝线)换了三次货,直到第四台才换到一台完美屏。这个型号良品率看起来很低,幸好是京东自营,换货除了费点时间,其它也没什么。

换了显示器之后,老电脑的显卡(9750)的 DP 口是1.2的,显示器刷新率只能达到60Hz,不能跑满144Hz。于是更新主机的需求也就浮出水面,毕竟也是11年前的机器了,确实该换代了。

换机过程起始于机箱,分形工艺 ERA(蓝色)机箱其实在我购物车里躺了近两年了,垂涎已久。既然要换新机,选型首先确定的就是这个机箱。7月4日在闲鱼上半价淘到一个,成色非常好。后续就把CPU/主板/内存/SSD/电源一一配齐,分享个清单:

  • 机箱(分形工艺 ERA ITX)
  • 主板+CPU(ROG B660-I / i5-12600K)
  • 内存(三星DDR5 4800 16Gx2)
  • SSD(三星 970 EVO Plus 1T)
  • 水冷(利民 Frozen Magic 240 冰封幻境)
  • 电源(Tt 钢影 Toughpower SFX 450)

装完后的样子:

内部走线按高标准来说,只能说一般般,没有扎带什么的。不过,盖上盖子,依然是个美丽成品:

看我折腾新机的朋友中,总会有人问,为啥不搞个 Mac?这其实是很奇怪的问题,我只能回答“不喜欢”。这些年的氛围和主流意见似乎是,所有程序员都应该喜欢 Mac。我不喜欢 Mac,我不喜欢所谓的苹果生态。我的一些“果粉”朋友其实有时候也会有意无意透露出,自己被 iCloud“绑架”了,这就是生态吧。

我自己,只有在开发 Mac/iOS 应用时,不得已才会使用 Mac 系统,以及 Xcode(顺便提一句,Xcode 作为一款优秀的 IDE,我是喜欢的)。平时,尽量还是在 Windows 10上,虽然现在的 Windows 也远谈不上多好。

软硬兼施 | 1 个评论 | 2,092 次阅读
简短地址:http://ncblog.net/1932/