V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  kuanat  ›  全部回复第 5 页 / 共 17 页
回复总数  330
1  2  3  4  5  6  7  8  9  10 ... 17  
265 天前
回复了 kuanat 创建的主题 Go 编程语言 基于 Go 语言谈软件开发效率
@tonyjia87 #6

对于编程语言来说,资本介入是好事。放在 1990 年可能还好,放到 2025 ,没有靠山的编程语言是没有生命力的。
265 天前
回复了 kuanat 创建的主题 Go 编程语言 基于 Go 语言谈软件开发效率
@ninjashixuan #2

这里可能涉及到编程语言的设计哲学,即要在多大程度上暴露或者封装操作系统的抽象。

在 go 看来,内核 fd 是没有抽象过的 Reader Writer Closer 有用的,这种用接口的实现方式是对“万物皆文件”非常好的诠释。

同理,socket 相关的抽象也是一样。我个人认为这些都是有意的设计,最初就把跨平台作为目标之一,官方库就对如何封装如何抽象,实现哪些功能做了规划。

所以很多人说 go 的设计定位是 better c ,但我认为这不是重点,语言层面做个 better c 不难,其他语言一样做得很好。像 c 一样把操作系统底层完全暴露出来是没用的,go 优于 c 同时抢占了部分 c 的市场的原因是它解决了 c 工程化的很多问题。
265 天前
回复了 kuanat 创建的主题 Go 编程语言 基于 Go 语言谈软件开发效率
@pursuer #1

编译速度说的是和编译类型的语言比,而且即使和 vm+jit 类型相比也是快的。

JS 的整个生态都建立浏览器之上,能力的边界取决于浏览器实现了多少对操作系统的封装。

如果一定要拿出数据作证的话,js 的份额一直就是在浏览器这个笼子里,别的进不来它也出不去。
关于 Go 日志的话题之前也有过几个帖子,可以参考一下,恰好我在那几个帖子里也有论述一些观点做法。

如何更好的打印日志 https://ex.noerr.eu.org/t/1043663
golang 日志记录 https://ex.noerr.eu.org/t/1038327
Golang 中的 Context 为什么只有上文没有下文?一般如何传递下文? https://ex.noerr.eu.org/t/1012453


回到这个帖子的重点,关于“定位代码出错位置”这个需求,需要先明确调用栈的定义。除了代码层面的 call stack ,业务逻辑上 trace 也可以叫作调用栈。

从 OP 的描述来看,主要矛盾是业务流程上比较长,日志中间件的报错不足以定位特定模块代码层面 call stack 的问题。

我在上面引用的第一个帖子里提到过一些笼统的解决思路。

帖子里我提到的 debug/release 双版本具体实现是用 build tags 做一个开关,release 版本没有任何额外输出,debug 版本会输出 code path 的相关信息。或者理解成单元测试 coverage 的做法。这样不仅可以知道当前模块的输入、输出,也知道具体代码的分支路径。

这个做法给我节省了大量 debug 的时间,之前经常需要单步看执行逻辑,现在基本上看下分支流程就能大致定位问题了。并不是一定要通过反射或者什么方式获得出错的代码行才叫定位。
关于 Go 日志的话题之前也有过几个帖子,可以参考一下,恰好我在那几个帖子里也有论述一些观点做法。

如何更好的打印日志 https://ex.noerr.eu.org/t/1043663
272 天前
回复了 chengrui0428 创建的主题 Linux mexport:多节点环境变量声明工具
REPL 或者 shell 首先是编程语言,然后才有变量,所以声明或者导出变量是个 built-in 的功能。

既然是变量,就有作用域。
281 天前
回复了 hongchangpz1 创建的主题 程序员 高通车机 8295camera 分辨率问题
会不会是对应的接口被拆分了,原本 4lane 变成了 2lane 这样?
我只用 Linux 所以只能提个思路,这个功能在 linux 异常简单。

现代桌面的窗口管理器的渲染逻辑是基本一致的,就是分配给应用程序一个矩形空间,由应用程序决定窗体内部的内容,然后窗口管理器(合成器)负责将其和标题栏部分合成起来。换个说法,标题栏不是应用程序决定的。

为了支持特定形态的窗体,一般桌面的窗口管理器也会提供一个叫 client side decoration 的机制,这样窗体相关的部分也交由应用程序负责。可以参考 https://en.wikipedia.org/wiki/Client-side_decoration

所以要实现这个功能一方面需要窗口管理器支持,另一方面要程序自身去适配 csd 机制。


如果只是单纯实现录屏的时候不含窗体,计算好坐标裁剪一下应该没问题。
不负责任的猜测,可能是百度统计被投毒了,文章截图里的几个受影响站点,外链 js 的交集就是 hm.baidu.com 域名下的 hm.js 文件。
287 天前
回复了 allegory 创建的主题 程序员 DPDK 如何学习才能就职相应的岗位
楼上看 id 就知道靠谱。

网络这个领域一定要先有市场需求才有岗位需求,由于相关技术往往和硬件以及架构强绑定,离开了这个环境这些技术就没有用武之地了。

如果你真的想学,DPDK 建议往 ebpf 方向走,RDMA 往分布式存储方向走。
9950x 是基本频率 4.3 然后 Boost 最高到 5.7 ,如果你能接受降低到 4.3 ,有个简单的方法是用 amd-pstate 调度,在执行特定任务的时候限制在 4.3 ,执行完之后再切换回来。

参考 https://docs.kernel.org/admin-guide/pm/amd-pstate.html

```
To manipulate the boost attribute, users can write a value of 0 to disable the boost or 1 to enable it, for the respective CPU using the sysfs path /sys/devices/system/cpu/cpuX/cpufreq/boost, where X represents the CPU number.
```

我不确定是否能限制到 4.7 ,这要看 amd-pstate 是否支持。一个曲线救国的思路是写个假负载的程序然后绑定到 8~16 个核心上,让 cpu 误认为是全核心任务从而降低频率。

另外现在 amd 的 smp 调度还是有问题的,相关的内核补丁不确定能否赶上 6.12 的合并窗口。这一系列补丁主要是调度让单核心的任务跑在体质最好的核心上的。
289 天前
回复了 moyuman 创建的主题 程序员 最“流畅”的终端模拟器是什么?
@moyuman #13

平滑滚动是靠视觉残留形成的错觉,所以平滑滚动光标很容易做,但是平滑滚动内容本身是很难的。

由于终端里的内容基本不存在关联性,平滑滚动这个事情在不牺牲速度的前提下我个人认为不可行。
289 天前
回复了 moyuman 创建的主题 程序员 最“流畅”的终端模拟器是什么?
@adoal #16

OSC 52 确实是非常好的,终端里也不区分本地和远程。

当然我觉得这事属于历史问题,特别是 linux 环境。clipboard 是个桌面层面的实现,x11/wayland 还不一样,所以 vim 与系统剪贴板的交互是比较低效的 ipc ,而且需要编译期增加支持。理论上如果把 * 寄存器与系统寄存器关联也可以,但 vim 的设计 delete 会和 yank 同样使用 * 寄存器,这就导致按一下 x 也会触发一次 ipc ,一方面造成卡顿,另一方面用户也不想删除的内容进系统剪贴板。
289 天前
回复了 moyuman 创建的主题 程序员 最“流畅”的终端模拟器是什么?
我推荐 foot https://codeberg.org/dnkl/foot 另外这个作者其他项目也都非常好。


设计哲学层面我不是很认可 kitty/alacritty 的路线,恰好这个话题我在之前的讨论 zed 编辑器的帖子里提到过 https://ex.noerr.eu.org/t/1056672 可以做参考。

foot 的作者也有专门写过文章论述 https://codeberg.org/dnkl/foot/wiki/Performance


除开渲染层面,foot 的作者同时维护 fcft 一个 rasterization 的库,这个库对于字符的处理我认为是目前最好的,foot 的字符显示就是基于 fcft 。

还有 foot 对于 OSC/escape sequence 的支持非常标准化,很方便做定制或者与其他应用交互。
293 天前
回复了 chopin1998519 创建的主题 程序员 调整 bios, chrome 会失去 session
我没有搜到 chromium 关于“机器码”相关的代码,而且常理上这个设计也很不合理。

我更倾向于认为是与 PAM 相关的原因导致的。登录凭证比如 cookies 这些是加密存储的,而 chromium 的加密密钥是存储各个平台的 keyring 的,mac/win/linux 都一样。Linux 环境解锁 keyring 与 PAM 相关,一般是登录桌面的同时解锁。

升级 bios 或者某些行为可能会导致 PAM 策略下 keyring 未能正常解锁。
至于是不是符合 Go 哲学的问题,我看不出这样做的意义。正常使用接口就可以了。
我有两个想法:

- 编译时方案,可以交给外部 preprocessor 当作模板来处理,后续代码生成之后再用 Go 编译,当然这个外部工具也可以用 go 写。目前来看基本上都要用特定的模板写法,而不是 Go 代码。

- 运行时方案,理论上这个需求和 hot reloading 应该差不多,对于 JIT 来说是比较好实现的,对于 Go 应该比较难。像 C 没有 runtime 是可以做到的,如果 Go 要实现类似的功能我估计需要魔改 runtime 才行。
我觉得需要重新描述一下,区分依赖注入和依赖注入框架。对 Go 来说,依赖注入几乎无处不在,但没有使用任何依赖注入框架的必要。

一时半会想不到特别合适的开源项目,我就尝试描述一下做法。正文里提到了依赖注入的两个场景,一个是被动初始化,另一个是单元测试。这两个都可以用接口 Interface 来完成,方法也是一样的。

标准库里有非常多传递实例的写法,比如传一个 *http.Client 这样。如果需要多个不同组件按照特定顺序初始化,可以直接用 struct embedding 把各个实例封装起来,然后就可以传递 struct 了。

因为我的组里有很多其他背景的开发者转型而来,对于传递 struct 的做法不认可,主要的理由是他们都有要初始化几十个依赖的经历。我对此的观点是,某个组件依赖几十个其他组件这件事本身就有问题,即便是真的有很多依赖,也只是依赖其中非常小的功能而非全部。我个人认为造成这种结果的原因是用基于 class 实现的继承去套用 Go ,而 Go 的做法是完全不实现继承功能,通过组合来抽象 OO 。

第二个需求单元测试需要对代码做调整,或者说对编程思路做调整。之前我在别的 Go 语言讨论帖子里反复引用过 Accept interfaces 这个说法,如果将调用方的代码依赖从实例改成接口,就可以非常简单地实现 mocking 来做单元测试。

因为调用方无须关心调用的是哪个实例,只要这个实例实现了特定的接口即可。将调用方的方法改写为接收接口,就可以用任意的实现来 mocking 对应的功能。

如果把接口当作继承来用,那自然就会觉得依赖是个复杂的事情,因为这个接口会越来越大,最终变成了模块之间的强耦合。实际上 Go 的思维里,接口越小越好,这里的思想是组合而非继承。一个非常小的接口是很容易 mocking 的。

另外如果观察一下 github 上 Go 的 DI/mocking 相关的项目也能发现一个趋势,相比其他语言这两种框架几乎都不流行。因为真的没有必要。不过反过来说,接口就是依赖注入。
307 天前
回复了 17681880207 创建的主题 程序员 macOS VS Code 窗口透明怎么实现?
技术层面窗口透明是合成器( compositor )的功能,应用自己并不能决定自己是否透明。或者换个思路,窗口合成器提供给应用一个抽象的渲染区域,这个区域出现在屏幕的什么地方,以多少透明度显示都是要窗口合成器控制的。

所以需要一个能控制窗口合成器行为的应用,插件起到了告诉这个应用把什么颜色当作透明色的作用。楼上 issue 链接里的插件就是这样。
307 天前
回复了 godFree 创建的主题 Android 求助 安卓 apk 逆向相关问题
frida-trace 看调用栈。
1  2  3  4  5  6  7  8  9  10 ... 17  
关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1112 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 27ms · UTC 18:19 · PVG 02:19 · LAX 11:19 · JFK 14:19
Developed with CodeLauncher
♥ Do have faith in what you're doing.