代码 > 代码架构更新26.07.10
2026-07-10
这两天整理了下,把自己的代码架构(GUI/WEB)再更新下
所有的层节都是从上向下的,如果需要反向,通过事件和订阅机制来解决。
UI层,Web/GUI/CUI
核心层-Service,具体的业务逻辑,BLL
核心层Repo,数据的读取筛选和维护,数据库/接口/文件
核心层Remote,程序与其他服务/设备的通讯,抽象为事件和重新后抛出,由Service消费和调用
基础层Context 全局数据,全局配置
基础层Adaptor 适配器层,一些接口的实现
基础层Interface 模型接口
基础层Model 基本数据模型
基础层Utils 工具类
每个大层有一个门面单体实例提供向上一层使用的统一接口
然后有一个 Applaction层负责生命周期,Init/Config/Start/Stop,并负责进行依赖注入,配置各门面实例
Linux > 开始使用marktext转md到pdf
2026-05-14
之前使用的vscode,转出时没法指定位置,很蛋疼
pandoc,也试了下,实在太复杂。
最后用了这个,很不错,一个appimage,还带md编辑,导出为pdf文件也方便
记录一下
代码 > C#的优势
2026-05-13
有点想把代码的中心转到C#上了。
首先,不论是c#还是go,对我而言最大的优势还是打包成单文件的部署方式。
那么,c#对Go的优势呢?
1. gui的支持
2.Windows下msvc更容易接入环境
3.可以方便的导出为其他语言能够使用的DLL
4.有大量商业化方案兜底。
可以说,语言选择还是要看使用场景的。
Go的最佳使用场景其实离我还是有点远
代码 > 把HMM的Avalonia版本升级的到12了
2026-05-11
其实也没用啥12的新特性,只是单纯的不想在处于积极更新期的项目留下技术债而已。
之前升级失败,因为以来的组MessageBox.Avalonia还没有对应的更新(avalonia没自带的Dialog其实算个小缺陷)。
等到这个项目更新后,基本就没啥问题了。
Avaonia的稳定性还是比flutter的稳定性高不少的。
每次flutter更新上手就是修不兼容性,对于个人项目来说有点心累了。
代码 > 发现golang对自己代码习惯的一个潜移默化的影响
2026-05-11
不再喜欢用类。
喜欢把类退化成结构struct,把大部分方法写在类外
不管 go/c#/dart/js都是这样。
仔细想了下,对于我而言。
只有数据是静态(永恒的)。
这个数据,只要写了下来,过来20年,还是这个数据。
而处理数据的代码,则是动态一直变化的,可能是优化,可能是需求变化,可能是bug修复。
所以,一个动态和一个静态的东西,在实际操作中,放在一起,是不合适的。
数据就是数据,过100年还是这个数据。
而方法,则只有过了测试,过了整合,实际上线跑过,才能说是当前可用的方法。
那种把相关的数据和方法放一起的想法,太不成熟。
代码 > 开始把C#的AOT项目导出为动态链接库给lua调用
2026-03-21
20年前做过的事情,现在又反过来做了一遍,摊手。
但是,这个事的实际意义是不一样的
c#,哪怕是aot项目,也是带gc,不要管理内存的。
能直接暴露给脚本调用,那整个工作的复杂度完全不是一个层级的了。
Linux > kde桌面内存泄漏的元凶-akonadi
2026-02-10
前一阵gnome 接外接显示器有点问题,换了kde
发现32g内存的笔记本内存很不经用,动不动oom杀进程
排查了一圈后,基本锁定akonadi,毕竟10多年前就被它坑过。
卸载之后,果然就没oom的问题了。
真的有点无语了。
代码 > 魔改了v8go,实现了long live引擎
2026-01-12
https://github.com/rogchap/v8go
最后是搞定了FinalizationRegistry释放go里的资源了。
首先一同魔改,
auto default_platform = platform::NewDefaultPlatform(0,v8::platform::IdleTaskSupport::kEnabled);
创建platform时加入idletask支持。
然后把PumpMessageLoop和RunIdleTasks extend给go。
通过写了多个snapshot在chrome里分析,具体的gc过程是这样的。
首先,Context Release变量,这时候,变量本身会释放
然后PumpMessageLoop,这时候,变量会从FinalizationRegistry里消失
然后再PumpMessageLoop return true时RunIdleTasks一下,这时候held value会从FinalizationRegistry里消失
这时候要再执行一次RunIdleTasks,才会制定回调。
也就是一次释放,要至少经过3次空闲。
这个问题终于被我搞定了,我都会觉得自己是v8小能手了