列表2024-week08

#最近做的事

#自建网盘

构建网盘本身是很简单的过程,网上有很多开源的项目,比如:https://github.com/cloudreve/cloudreve

但是相应的生态太难跟进了

目前调研已知问题:

  • webdav 传数据会丢失文件本来的时间信息(其它信息待确定)
  • 很难有通用的手机 app

#golang struct对齐

#相关链接

#w3m

一个命令行网页浏览工具,比较方便阅读:

1
brew install w3m

不过不能被wakatime记录,突然有点不想用了。

#golang 范型

如果你经常要分别为不同的类型写完全相同逻辑的代码,那么使用泛型将是最合适的选择
在使用泛型的时候我们只能放弃使用匿名结构体,对于很多场景来说这会造成麻烦(最主要麻烦集中在单元测试的时候,为泛型做单元测试会非常麻烦)

列表2024-week07

#最近做的事

#tmux

每次要恢复一堆窗口好烦,用 tmux 了。
因为日常开发需要开 10 多个命令行窗口,每次重启都要手动开启,没想到这是我用tmux的原因= =

1
brew install tmux
1
2
3
4
cd
git clone https://github.com/gpakosz/.tmux.git
ln -s -f .tmux/.tmux.conf
cp .tmux/.tmux.conf.local .

prefix c:创建一个新窗口,状态栏会显示多个窗口的信息。
prefix p:切换到上一个窗口(按照状态栏上的顺序)。
prefix n:切换到下一个窗口。
prefix <number>:切换到指定编号的窗口,其中的<number>是状态栏上的窗口编号。
prefix w:从列表中选择窗口。
prefix ,:窗口重命名。

prefix %:划分左右两个窗格。
prefix ":划分上下两个窗格。
prefix <arrow key>:光标切换到其他窗格。<arrow key>是指向要切换到的窗格的方向键,比如切换到下方窗格,就按方向键 ↓。
prefix ;:光标切换到上一个窗格。
prefix o:光标切换到下一个窗格。
prefix {:当前窗格与上一个窗格交换位置。
prefix }:当前窗格与下一个窗格交换位置。
prefix Ctrl+o:所有窗格向前移动一个位置,第一个窗格变成最后一个窗格。
prefix Alt+o:所有窗格向后移动一个位置,最后一个窗格变成第一个窗格。
prefix x:关闭当前窗格。
prefix !:将当前窗格拆分为一个独立窗口。
prefix z:当前窗格全屏显示,再使用一次会变回原来大小。
prefix Ctrl+<arrow key>:按箭头方向调整窗格大小。
prefix q:显示窗格编号。

开启自动保存会话只需要把.tmux.conf.local的几行注释打开即可:

1
2
3
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
set -g @continuum-restore 'on'
  • 自动保存会话的地址为:/Users/onns/.local/share/tmux/resurrect

#相关链接

列表2024-week06

#最近做的事

#WaitGroup 原理

是我看到众多文章中逻辑最清晰的。
通过信号量控制并发问题,信号量的实现原理待继续阅读。

#《火星救援》

重新看了一遍经典影片,并查询了一些当初有疑问的点。

  • 原著说维生素、蛋白质都足够生存,缺的只是卡路里(通过土豆获取)。
  • 电影只交代了如何制造食物和水,没有谈及氧气,查了一下,已经有通过二氧化碳制取氧气和碳的设备。

#熟悉 Obsidian

有一款可以在里面边看网页边记笔记的浏览器插件,可用性有待研究。

目前已经逐步在把工作中的文档迁移到Obsidian,真的很利于检索文件或者内容。

想跨仓库引用笔记好像不可行,会被拷贝一份文件到当前仓库= =

#信号量

这篇文章底部有一些链接也可以同步阅读。

#内联函数inline

C 语言中的定义,在调用处展开函数。

#tmux 了解

了解下来是 screen 的升级版,但是目前应该没有类似的需求,因为工作无法远程所以不会有保持会话的需求。

#vim 技巧

  • 高亮选区的范围由其两个端点界定。其中一端固定,而另一端可以随光标自由移动,我们可以用 o 键来切换其活动的端点。
  • 启用了wrap之后,长度会折叠,出现屏幕行与实际行不同的情况。gj作用于屏幕行,j作用于实际行。
  • 一个单词由字母、数字、下划线,或其他非空白字符的序列组成,单词间以空白字符分隔。而字串的定义则更简单,它由非空白字符序列组成,字串间以空白字符分隔。
  • WBEgE是面向字串的移动方式。
  • 可视模式下,会有范围限定词,t是一个特殊的,代表 xml 或者 html 这类的标签选定(感觉算是特殊优化)。
  • m{a-zA-Z}命令会用选定的字母标记当前光标所在位置。小写位置标记只在每个缓冲区里局部可见,而大写位置标记则全局可见。
  • '{mark}命令跳到位置标记所在行,并把光标置于该行第一个非空白字符上;而 `{mark} 命令则把光标移动到设置此位置标记时光标所在之处,也就是说,它同时恢复行、列的位置。

跳转位置

列表2024-week05

#最近做的事

#Obsidian 入门

因为经常会有使用知识库这样一个需求,所以需要类似的软件,小红书经常推Obsidian,所以尝试入门。

优点:

  1. 只基于 markdown 文件,方便整理、保存、备份等
  2. 有关系图谱,方便在信息之间寻找

缺点:

才开始使用,不知道能否找到相应的解决方案,目前主要为了整理开发文档+快速索引

  1. 代码格式化很不友好,我格式化的多行带缩进的代码粘贴进去会乱。
  2. 软件提供了文档链接功能,并且支持链接标题,但是当你修改标题后,对应的链接不会自动更新,官方的论坛:https://forum.obsidian.md/t/automatic-inline-update-of-links-to-headers-and-blocks-when-they-are-modified-no-extra-dialog-window/25412/61,说是性能问题= =

列表2024-week04

#最近读的东西

#github 仓库问题

2024 一开年开始,我就发现github.com在大陆的主 ip20.205.243.166访问不通了= =,感觉每次都要专门开个梯子好麻烦,研究了一番,改 hosts 解决。

https://tool.chinaz.com/dns/github.com可以查看所有 ip,我选了第二个,在/etc/hosts里添加了一条:

1
140.82.121.4 github.com

问题解决。

BTW,我用的是 ssh 的模式,这个模式在之前网页访问不通的情况下依然可以很快拉仓库,结果现在原来的 ip 也不行了(新换的这个依旧可以)。

~/.gitconfig添加:

1
2
[url "git@github.com:"]
insteadOf = https://github.com/

就会都走 ssh 模式。(很好用,我之前用来拉 nvim 仓库包的)

列表2024-week03

#最近读的东西

#perl 用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[2024/01/21 9:47:32] mbp ➜  ~  perl -h

Usage: perl [switches] [--] [programfile] [arguments]
-0[octal] specify record separator (\0, if no argument)
-a autosplit mode with -n or -p (splits $_ into @F)
-C[number/list] enables the listed Unicode features
-c check syntax only (runs BEGIN and CHECK blocks)
-d[:debugger] run program under debugger
-D[number/list] set debugging flags (argument is a bit mask or alphabets)
-e program one line of program (several -e's allowed, omit programfile)
-E program like -e, but enables all optional features
-f don't do $sitelib/sitecustomize.pl at startup
-F/pattern/ split() pattern for -a switch (//'s are optional)
-i[extension] edit <> files in place (makes backup if extension supplied)
-Idirectory specify @INC/#include directory (several -I's allowed)
-l[octal] enable line ending processing, specifies line terminator
-[mM][-]module execute "use/no module..." before executing program
-n assume "while (<>) { ... }" loop around program
-p assume loop like -n but print line also, like sed
-s enable rudimentary parsing for switches after programfile
-S look for programfile using PATH environment variable
-t enable tainting warnings
-T enable tainting checks
-u dump core after parsing program
-U allow unsafe operations
-v print version, patchlevel and license
-V[:variable] print configuration summary (or a single Config.pm variable)
-w enable many useful warnings
-W enable all warnings
-x[directory] ignore text before #!perl line (optionally cd to directory)
-X disable all warnings

Run 'perldoc perl' for more help with Perl.

最近处理线上问题,需要捞日志,因为日常Perl风格的正则写的比较多,所以希望能直接一条命令导出,省的多个编辑器之间来回切换。

但是目前几乎所有命令都只支持POSIX风格的正则,记录一下解决方案:

  1. grep 可以通过-P参数,但是必须要下载 gnu 的 grep 才支持,mac 本身的不支持
  2. sed不支持Perl风格,也不会支持,解决方法是换命令,perl几乎 mac 都是装机自带的。
  3. -p会打印输出,比较适合做管道处理。-e就是执行后面的命令。
1
cat 240120.json | ggrep -P "\"args\": \"mid" | perl -pe 's/\s+"args": "mid:([0-9]+)([ \S]+)/$1/'

#https://go.dev/doc/gc-guide

Until Go 1.19, GOGC was the sole parameter that could be used to modify the GC’s behavior. While it works great as a way to set a trade-off, it doesn’t take into account that available memory is finite. Consider what happens when there’s a transient spike in the live heap size: because the GC will pick a total heap size proportional to that live heap size, GOGC must be configured such for the peak live heap size, even if in the usual case a higher GOGC value provides a better trade-off.

GOGC在配置的时候没有考虑内存有限的情况,当出现有临时的内存突增时,要么 gc 阈值过高导致 oom,要么考验开发/运维,要在配置时考虑到内存激增的情况,配置对应可用的 GOGC。

为了避免参数滥用,golang 限制了 gc 时间,使得理论上的最坏情况是程序性能下降两倍。

#-1%3=?

差点因为这个表达式写了一个 bug,测试了多个语言,发现只有 python 会返回 2。
数学定义上没有对负数的取模进行精确定义,所以只依赖具体语言实现。
对于go/c/php,这个值会返回 -1

列表2023-week50

#最近读的东西

#你真的知道如何设置数据库连接池的大小吗

#Go 函数指针是如何让你的程序变慢的?

#Go 1.22 中的 For 循环

#Go1.21 速览:Context 可以设置取消原因和回调函数了,等的可太久了!

列表2023-week49

#最近读的东西

#自己的一些项目该如何组织

#github 仓库拉取优化

背景是neovim的插件都在 github 上,大陆拉不下来。

解决方案:全局配置 Git 使用 SSH

1
vi ~/.gitconfig

加入 👇

1
2
[url "git@github.com:"]
insteadOf = https://github.com/

#https 证书

阿里云免费的证书有效期变成 3 个月了= =

免费方案 👆

#快速 csv 文件处理

为压测准备数据

  1. 从源数据中选取指定列作为待选数据:
1
cut -d',' -f6 raw.csv > res.txt
  • -d指定分隔符
  • -f指定选的列,比如我只要第 6 列数据
  1. 拆分数据集合:

因为我的数据从 100 个表取出来的,然后需要分成多个数据集合,我选择的第一种方法是把奇数行和偶数行拆分成两个文件(假设数据集只需要 2 个)

1
awk '{if (NR % 2 == 0) print > "res_1.txt"; else print > "res_2.txt"}' res.txt
  1. 打散数据:

因为数据是按尾号聚合的数据,具有不均匀性,需要打乱。

1
2
shuf res_2.txt  > res_2_suf.txt
shuf res_2.txt > res_2_suf.txt

感觉 chatgpt 出来之后,笔记已经显得不那么重要了= =