Go1.21发布

golang每隔6个月发布一个新的次版本号升级。一般是是2月一个版本,8月一个版本 语言层面 增加内置函数 min() max() 参考 https://tip.golang.org/ref/spec#Min_and_max The built-in functions min and max compute the smallest—or largest, respectively—value of a fixed number of arguments of ordered types. There must be at least one argument. The same type rules as for operators apply: for ordered arguments x and y, min(x, y) is valid if x + y is valid, and the type of min(x, y) is the type of x + y (and similarly for max)....

2023-08-10 11:20:47 · 2 min · Eddie Wang

Tutorial  [draft]

语法 targets: prerequisites command command command targets是文件名,可以用空格分开多个文件名,一般情况下,只有一个 command是一系列的指令,可以多行分开 prerequisites是依赖项目,可以用空格分开多个 参考 https://makefiletutorial.com/#makefile-cookbook

2023-08-10 09:47:46 · 1 min · Eddie Wang

困在coc错误弹窗中

请注意,VIM的光标现在位于错误弹窗上了。光标只能左右移动,无法上线移动。 我的光标被困在了错误提示框中。 因为错误提示只有一行,所以无法上下移动。 一直以来,我并没有把错误提示框也看成一个窗口,所以我可能多次按了ctrl + w w, 然后光标跳转到了错误提示框上。 正常的错误提示框,当光标不在关键词上时,错误弹窗会自动关闭的。 但是由于我已经进入了错误弹窗里面。 所以除非按窗口切换的快捷键,我会始终困在这个错误窗口中。 我觉得,VIM实在是太博大精深了。很多概念性的理解不到位,就会越到很多困难。 这些困难会给人造成极大的挫折感。 能解决困难,则学到东西。 否则就只能放弃VIM, 回到VScode的怀抱中。 但是,我已经习惯了不使用鼠标的快捷编辑方式。 我只能学会解决并适应VIM, 并且接受VIM的所有挑战。

2023-07-10 12:27:47 · 1 min · Eddie Wang

VIM typescript 跳转到定义

在VScode中,可以使用右键来跳转到typescript类型对应的定义,但是用vim的gd命令却无法正常跳转。 因为无法正常跳转的这个问题,我差点放弃了vim。 然而我想别人应该也遇到类似的问题。 我的neovim本身使用的是coc插件,然后我就再次到看看官方文档,来确定最终有没有解决这个问题的方案。 功夫不负有心人。 我发现官方给的例子中,就包括了如何配置跳换的配置。 首先说明一下,我本身就安装了coc-json coc-tsserver这两个插件,所以只需要将如下的配置写入init.vim " GoTo code navigation nmap <silent> gd <Plug>(coc-definition) nmap <silent> gy <Plug>(coc-type-definition) nmap <silent> gi <Plug>(coc-implementation) nmap <silent> gr <Plug>(coc-references) 这样的话,在普通模式,按gy这个快捷键,就能跳转到对应的类型定义,包括某个npm包的里面的类型定义,非常好用。 亲测有效。

2023-07-10 09:30:46 · 1 min · Eddie Wang

安装NodeJS, N命令似乎卡住了

我一般会紧跟着NodeJS官网的最新版,来更新本地的NodeJS版本。 我的系统是ubuntu 20.4, 我用tj/n这个工具来更新Node。 但是这一次,这个命令似乎卡住了。 我排查后发现,是n这个命令在访问https://nodejs.org/dist/index.tab这个地址时,卡住了。 请求超时,因为默认没有设置超时时长,所以等待了很久才显示超时的报错,表现象上看起来就是卡住了。 首先我用dig命令查了nodejs.org的dns解析,我发现是正常解析的。 然后我又用curl对nodejs官网做了一个测试,发现也是请求超时。 curl -i -m 5 https://nodejs.org curl: (28) Failed to connect to nodejs.org port 443 after 3854 ms: 连接超时 这样问题就清楚了,然后我就想起来npmirrror上应该有nodejs的镜像。 在查看n这个工具的文档时,我也发现,它是支持设置mirror的。 其中给的例子用的就是淘宝NPM 就是设置了一个环境变量。然后执行source ~/.zshrc export N_NODE_MIRROR=https://npmmirror.com/mirrors/node 但是,我发现在命令行里用echo可以打印N_NODE_MIRROR这个变量的值,但是在安装脚本里,还是无法获取设置的这个mirror。 我想或许和我在执行sudo n lts时的sudo有关,这个.zshrc在sudo这种管理员模式下是不生效的。普通用户的环境变量也不会继承到sudo执行的环境变量里 最后,我用sudo -E n lts, 成功的从npmmirror上更新了nodejs的版本。 关于curl超时的这个问题,我也给n仓库提出了pull request, https://github.com/tj/n/pull/771

2023-07-09 14:20:45 · 1 min · Eddie Wang

JS运行时构建独立二进制程序比较

很早以前,要运行js,则必须安装nodejs,且没什么办法可以把js直接构建成一个可执行的文件。 后来出现一个pkg的npm包,可以用来将js打包成可执行的文件。 我好像用过这个包,但是似乎中间出过一些问题。 现在是2023年,前端有了新的气象。 除了nodejs外,还有其他的后来新秀,如deno, 还有最近表火的bun 另外nodejs本身也开始支持打包独立二进制文件了,但是需要最新的20.x版本,而且我看了它的使用介绍文档,single-executable-applications, 看起来是有有点复杂,光一个构建就写了七八步。 所以今天只比较一些deno和bun的构建出的文件大小。 准备的js文件内容 // app.js console.log("hello world") deno构建指令: deno compile --output h1 app.js, 构建产物为h1 bun构建指令: bun build ./app.js --compile --outfile h2, 构建产物为h2 -rw-r--r--@ 1 wangduanduan staff 26B Jun 1 13:34 app.js -rwxrwxrwx@ 1 wangduanduan staff 78M Jun 1 13:59 h1 -rwxrwxrwx@ 1 wangduanduan staff 45M Jun 1 14:01 h2 源代码为26b字节 deno构建相比于源码的倍数: 3152838 bun构建相比于源码的翻倍: 1804415 deno构建的可执行文件相比bun翻倍:1.7 参考 https://bun.sh/docs/bundler/executables https://deno.com/manual@v1.34.1/tools/compiler https://nodejs.org/api/single-executable-applications.html

2023-06-01 13:48:00 · 1 min · Eddie Wang

Build Docker Image With Libpcap

常规构建 一般情况下,我们的Dockerfile可能是下面这样的 这个Dockerfile使用了多步构建,使用golang:1.19.4作为构建容器,二进制文件构建成功后,单独把文件复制到alpine镜像。 这样做的好处是最后产出的镜像非常小,一般只有十几MB的样子,如果直接使用golang的镜像来构建,镜像体积就可能达到1G左右。 FROM golang:1.19.4 as builder ENV GO111MODULE=on GOPROXY=https://goproxy.cn,direct WORKDIR /app COPY . . RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o run . FROM alpine:3.14.2 WORKDIR /app COPY encdec run.sh /app/ COPY --from=builder /app/run . EXPOSE 3000 ENTRYPOINT ["/app/run"] 依赖libpcap的构建 如果使用了程序使用了libpcap 来抓包,那么除了我们自己代码产生的二进制文件外,可能还会依赖libpcap的文件。常规打包就会报各种错误,例如文件找不到,缺少so文件等等。 libpcap是一个c库,并不是golang的代码,所以处理起来要不一样。 下面直接给出Dockerfile # 构建的基础镜像换成了alpine镜像 FROM golang:alpine as builder # 将alpine镜像换清华源,这样后续依赖的安装会加快 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories # 安装需要用到的C库,和构建依赖 RUN apk --update add linux-headers musl-dev gcc libpcap-dev # 使用国内的goproxy ENV GO111MODULE=on GOPROXY=https://goproxy....

2023-05-08 11:45:23 · 1 min · Eddie Wang

VScode激活Tab更容易区分

默认情况下VScode的tab栏,当前的颜色会更深一点。如下图所示,第三个就是激活的。 但是实际上并没有太高的区分度,特别是当显示屏有点反光的时候。 我想应该不止一个人有这个问题吧 看了github上,有个人反馈了这个问题,https://github.com/Microsoft/vscode/issues/24586 后面有人回复了 "workbench.colorCustomizations": { "tab.activeBorder": "#ff0000", "tab.unfocusedActiveBorder": "#000000" } 上面就是用来配置Tab边界的颜色的。 看下效果,当前激活的Tab下有明显的红线,是不是更容易区分了呢

2023-04-18 13:43:07 · 1 min · Eddie Wang

行位结束符引起的问题

CRLF 二进制 十进制 十六进制 八进制 字符/缩写 解释 00001010 10 0A 012 LF/NL(Line Feed/New Line) 换行键 00001101 13 0D 085 CR (Carriage Return) 回车键 CR代表回车符,LF代表换行符。 这两个符号本身都是不可见的。 如果打印出来 CR 会显示 \r LF 会显示 \n 不同系统的行结束符 Linux系统和Mac换行符是 \n Windows系统的换行符是 \r\n 如何区分文件的换行符? 可以使用od命令 od -bc index.md 假如文件的原始内容如下 - 1 - 2 注意012是八进制的数,十进制对应的数字是10,也就是换行符。 0000000 055 040 061 012 055 040 062 - 1 \n - 2 0000007 如果用vscode打开文件,也能看到对应的文件格式,如LF。 换行符的的差异会导致哪些问题? shell脚本问题 如果bash脚本里包含CRLF, 可能导致脚本无法解析等各种异常问题。 例如下面的报错,docker启动shell脚本可能是在windows下编写的。所以脚本无法 standard_init_linux.go:211: exec user process caused "no such file or directory" 如何把windows文件类型转为unix?...

2023-01-16 15:03:03 · 1 min · Eddie Wang

NUC11 安装 Deepin 20.2.4

硬件 内存:金士顿 16*2;869元 固态硬盘: 三星980 1TB; 799元 主机:NUC11 PAHI7; 4核心八线程;3399元 累计5000多一点, 是最新版Macbook pro M1prod的三分之一 启动盘制作 ventoy:试了几次,无法开机,遂放弃 rufus:能够正常使用;注意分区类型要选择GPT。最新款的一些电脑都是支持uefi的,所以选择GPT分区,一定没问题。 U盘启动 开机后按F2, 里面有一个是设置BIOS优先级,可以设置优先U盘启动 磁盘分区 因为之前设置了默认的整个磁盘分区,根目录只有15G, 太小了,所以我选择手动分区 先设置一个efi分区,就用默认的300M就可以,默认弹窗出来,是不需要设置挂在目录的 设置根分区 /, 我分了300G 设置/home分区,剩下的磁盘都分给他 我没有设置swap分区,因为我觉得32G内存够大,不需要swap 其他 后续的配置非常简单,基本点点按钮就能搞定 体验 总体来说,安装软件是最舒服的一件事。不需要像安装manjaro那样,到处找安装常用应用的教程。只需要打开应用商店,点击下载就可以了。 整个安装过程,我觉得磁盘分区是最难的部分。其他都是非常方便的。 感觉深度的界面很漂亮,值得体验 问题 NUC自带的麦克风无法外放声音,插有线耳机也不行,只有蓝牙耳机能用

2022-12-17 13:28:40 · 1 min · Eddie Wang