V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  CLMan  ›  全部回复第 3 页 / 共 8 页
回复总数  146
1  2  3  4  5  6  7  8  
231 天前
回复了 TestOPS 创建的主题 生活 大家好,我已经准备正式成为一名矿工了
@CLMan 更正下,是我的亲表哥(亲舅舅的儿子),是 2020 年,煤炭的一氧化碳事故,去世的,当时才 28 岁。

并不是劝退楼主,只是刚好有这么一件事,对我触动蛮大的。
231 天前
回复了 TestOPS 创建的主题 生活 大家好,我已经准备正式成为一名矿工了
我有个表哥,92 年的,他在矿里是负责安全检查的(具体职位我也不清楚,感觉应该不是专门下矿那一批),2021 年的时候,矿里渗水,人没了。
你应该是指前端对明文密码进行 hash ,也就是用 hash 值作为密码,避免后端因为日志等原因导致用户原始密码泄露,从而被拿去撞库。

这里存在几个问题:

- 这种方式,唯一的作用就是密码传输的中间环节泄露后防止撞库其它应用。对用户而言,不同应用使用不同密码是个人信息安全的基本准则。对开发者而言,避免日志记录密码明文是常识。此外,密码明文在 TLS 的中间环节被泄露,而服务器却没有被攻破的场景太过理想。
- 这是一种魔改,不符合已有的密码认证协议,比如 Basic access authentication 。
- 对于多端应用,现有系统改造,需要废弃掉旧的应用版本。

简单来说,有用但没太大用,而且存在兼容性问题,以及升级成本。
274 天前
回复了 rookiemaster 创建的主题 C c 语言是如何给汉字编码的?
美国是现代计算机的发源地,当时的先驱们只考虑了英文字符,也即是 ASCII 。C 语言诞生的时候,还处于计算机的早期发展阶段(大陆同期还在文革),因此当时只考虑到 ASCII ( char 类型的概念及相关标准库)。

后来,C 语言流传到各个国家,对汉字等非英文字符的支持,都是非官方标准,需要修改编译器和标准库实现。主要考虑两点:

- 字符常量的编码,字符串常量被编码为字节存储在库或者可执行文件里面
- printf 等涉及编码的标准库函数

再后来,C 标准更新,以增加对非英文字符的支持,比如:

- C99 支持使用转义字符形式的 Unicode 标识符
- C11 在语言上支持 u,U,u8 前缀表示的 UTF16,UTF32,UTF8 字符串,在标准库 uchar.h 里提供了 Unicode 支持
- C23 支持使用 u8 前缀表示的 UTF-8 单字节字符

------

字符集和字符编码应当是 CS 专业的基础知识(计算机科学概论),ASCII,ISO-8859,GB2312,GBK,Unicode(包括 UCS-2,UCS-4),UTF-8&UTF-16&UTF-32(以及 LE,BE,BOM)是计算机发展史在字符上的一个切面,可以参考阮一峰的博文: https://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
279 天前
回复了 anUglyDog 创建的主题 程序员 程序员第二门语言
在我第一次尝试学习第二门语言时也会有你一样的想法,也给我带来了许多困扰。我的思路是这样:

1. 掌握编程的常识,《 SICP 》或者说 CS 61A 就是提供这方面的知识,好一点的科班教育在入门阶段基本都会提供类似的课程。

变量、常量、类型、运算符、语句表达式、函数、对象、递归、异常、OOP 、函数式...,要对这些概念的内涵和用途有所理解。

现代的商业编程语言都离不开这些通用的概念,可能会添加新的概念,可能会做语法变更。

2. 掌握 CS 的常识,这对非科班出身的人来说是一个障碍,编程语言里面的很多概念来自于其它的 CS 领域,比如数据结构(hashmap,list)、操作系统(同步、异步、线程),编程语言的书籍由于预设你具有相关领域知识,或者由于语言封装的原因,并不能很好的帮你学习这些概念。

3. 不要去死记硬背语法细节,而是在使用中熟悉语法,信任语法手册、笔记、现代 IDE 、ChatGPT 。语法遗忘是正常的,是否学会一门语言并不是你能否将语法倒背如流,而是你用该语言编写了项目从而给你了信心。

4. 关注 diff ,当你以及有了足够的知识,学习新的编程语言时,只需要带着该语言的设计思想与你学过的语言(同生态位,或者设计上存在渊源)进行比较,区分不同。
@kneo 用户反馈的,好像是 360 和微软。
小项目用 wails 写过几版,因为国产杀毒软件报毒所以切换到了 tauri ,但还是有报毒的问题,最后换成了 flutter 。
这种简单页面用 vue,react 手撸要不了几分钟,右键 chrome 打印。
288 天前
回复了 wangpugod2003 创建的主题 程序员 三天入门 go 语言
《 A Tour of Go 》是官方极简的入门教程,相比传统的书籍,个人认为其内容薄了点,支撑不了知识体系。

《 The Go Programming Language 》是致敬《 TCPL 》的一本书,由 Go 团队成员和《 TCPL 》作者之一编写的,早期中文社区的翻译叫做《 Go 语言圣经》,书倒是不错,就是存在《 TCPL 》一样的毛病:出版时间太早,后续没有更新。该书基于 Go 1.4 。

Go 1.5 到现在 Go1.22 ,除了模块和泛型,新增的内容补一下官网的 Release History 就够了,不到一个小时就能看完。模块导致《 TGPL 》第 10 章过时(理论知识并没有太大错误,只是缺少了模块,以及工具链存在一些变更)。

官网上关于模块和泛型的内容足以补充这两方面的知识。

《 100 个 Go 语言错误》我看过部分,有点类似《 Effective Java 》,并不适合入门阶段看,里面的内容比较零散,一些内容属于观点而非共识(不能作者说啥就是啥),如果没有实际经验,看类似的书籍很难有所收获。
FastStone Capture 是收费软件,Snipaste 免费版存在限制,只有 ShareX 是开源免费的(最近几个版本自带了 ffmpeg 来录制特定区域的视频,所以显得有点大,如果不需要这功能完全可以把 ffmpeg 删除了)。
293 天前
回复了 hankli 创建的主题 程序员 一个工具管理所有运行时版本!
反馈下:下载因为网络问题阻塞,Ctrl+C 后,安装未成功显示成功。

我已经通过删除 cache 解决,但程序能做优化更好。
你是想证明上帝存在吗,祝你好运。
这个问题的核心是你业务逻辑的“线程安全”是如何定义的(只有你自己知道),至于是用锁、读写锁、Semaphore 、无锁、volatile 等,这些纯粹是实现细节,取决于你对并发相关基础知识(操作系统领域)以及特定语言(这里是.NET )相关库和语法的熟悉程度。

由于不了解你的业务逻辑实现细节,我只能提问:

- 线程 0 是只写吗,是否依赖 Device 当前的状态?
- 监控线程统计所有设备状态时,以及执行异步操作时,是否允许线程 0 进行更新?
- 监控线程的异步任务与线程 0 是否存在写入相同的内存区域的情况?
- 监控线程的异步任务是否可能执行超过 100 毫秒,如果超过,是否允许多个监控线程的异步任务同时执行?如果允许,它们的写是否冲突?

你至少需要补充以上细节,才能让回答者更好的帮你解决问题。
296 天前
回复了 fgasdzxc 创建的主题 Go 编程语言 想探讨下 Go 中的网络编程模式
同步、异步、阻塞、非阻塞,本来就没有一个精确的定义,很容易因为理解不同而鸡同鸭讲,个人博客更是造成理解冲突的重灾区(个人博客充斥着二手知识,用词并非精确)。

“异步”和“异步 IO”当然不是一回事,“异步”可以用来描述任何一段子程序的执行方式,而“异步 IO”,只能用来描述 IO 操作(读写文件和网络等)的执行方式。

按照 Unix 的 IO 模型(《 Unix 网络编程卷 1 》,6.2 IO 模型),同步和异步用于描述内核和用户空间之间数据复制的过程,而阻塞和非阻塞用于描述等待资源就绪(网络资源、文件资源等)的过程。

在某些书籍、博客中,或者非 IO 操作的上下文中,会相对抽象,将`阻塞`和`同步`都解释为等待,将`非阻塞`和`异步`都解释为立即返回,我无法评价这种解释是否正确,但至少在 Unix IO 模型中,这种解释是错误的。
------
回归正题,“Go 中的网络编程模式”,你的困扰无非是该用其底层实现,还是其提供的 API 风格来描述,我个人是倾向于后者,但除非 Golang 团队亲口所说,纠结用什么定语来修饰“Go 的网络编程模式”没太多意义。
Vue 项目用 electron,wails,tauri 等 web ui 解决方案打包成桌面端程序。

java 项目有技术就用 graalvm 编译成 exe ,没技术可以安装 JRE/JDK ,或者绿色版 JRE/JDK 。

Nginx 是什么鬼,本地部署哪里需要 Nginx 。

这其实就是 shadowsocks,clash for windows,clash verge 之类翻墙软件用的解决方案,去看看它们的源码就懂了。

唯一麻烦点就是 java 程序需要虚拟机,比纯 exe 麻烦点,但你想想,IDEA 还不是照样自带了个虚拟机。
------
归根到底,你这项目最佳的部署方案就是桌面端 GUI 程序。
相应的功能在 chrome 下能通过吗,你先按照 Chrome v3 的相关文档来开发,最后再考虑兼容性问题。
@CLMan 补充:
1. “函数内部代码会貌似会同步执行”,我理解了,你指的内部代码会作为一个整体被执行,这是正确的。返回 Future 是语法层面的规定,表示这个异步函数的异步执行情况。正如我上面所说的,返回结果会自动包装为 Future ,比如 B 函数,熟练以后是这样:

```dart
//省略上面内容
return "请求到的数据:" + result.toString();
```
1. JS 的 async 会将返回结果自动包装为 Future ,Dart 也是类似的原理。异步函数会异步执行,返回结果为 Future 类型,跟里面是否使用 await 没什么关系。

你所认为的同步,其实只是因为你这测试用例过于简单,只有 A,B ,给你带来的错觉。

2. 你为什么会认为“遇到 B 函数的 Future.delay 时直接返回了 Future 对象给 A”,你用打印下结果就知道不是你想得那样:
//修改 A 函数的 print(B());为:
var result = B();
result.then((value) => print(value));

3. await 有两个作用:1. 让“await doSomething()”的 doSomething()异步执行( JS,DART 就是“抛事件循环”,其它语言可能就是多线程、协程等) 2. 等待 doSomething()对应的异步任务执行完成,然后再执行剩余部分。所以只有 B 执行完后,才返回执行 A 的后半部分,也就是你说的“同步调用 B 函数第一行打印语句”。

“抛事件循环”,是一种抽象化的模型,容易让人理解得云里雾里。沿用这种模型来说明,应该是先抛 B()到事件循环,再抛 A 的剩余部分到事件循环。

事实上,当 JS 和 Dart 的代码混合了异步逻辑,很难只用事件模型来描述代码的执行情况。比如,假设 B()函数里面`await C()`,那 C()是不是就抛到 A 的剩余部分后面了,岂不是 A 的剩余部分还先于 C()执行。当然,你可以再给这个模型补充很多细节,问题是这些细节就牵涉到具体的实现,比如 chrome,mozilla,quickjs 等完全可以采用不同的底层实现。

这并不是说事件模型是错误的,只是说当存在异步逻辑时,事件模型需要补充很多细节,不然就会像你一样陷入混乱,此时可以不用事件模型来理解程序的执行。

4. 不了解,我这里 IDE 提示:“可以去掉 await ,且 await 无效”。无论是还是不是,这种代码没有啥实际价值。
1  2  3  4  5  6  7  8  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3034 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 184ms · UTC 14:05 · PVG 22:05 · LAX 06:05 · JFK 09:05
Developed with CodeLauncher
♥ Do have faith in what you're doing.