四月工作日志

关于日志

有些事情单独开一篇博客太浪费,但是确实不得不记录一下,所以有了这个日志。目前打算是按月开。

VSCode 远程连接到服务器上开发卡死

不要连接到东西太多的目录,有些插件会扫目录,消耗巨大多内存。

建议是单独开一个 workspace 来干活。

另外远程服务器起码有 4GB 内存,2GB 内存纯属冤大头。

Python slots

Python 的 __slots__ 机制,可以限制实例的属性,只允许在创建实例时定义的属性,不允许动态添加属性。

如果尝试为没有在 slots 中声明的变量赋值,会引发 AttributeError。

git 拉取远端其它分支并与本地关联

1
git checkout -b feature-branch origin/feature-branch

git 删除分支

删除本地分支:

1
git branch -d feature-branch

删除远端分支:

1
git push origin --delete feature-branch

Python lambda 闭包问题

lambda 做函数绑定的时候变量是绑定到上的变量的,而不是绑定到上的。

例如下面循环的例子:

1
2
3
4
funcs = []
for i in range(10):
funcs.append(lambda x: x + i)
print(funcs[0](10))

输出是 19,而不是 10,因为查找到的 i 是循环结束后域里面的 9。

正确的做法是:

1
2
3
4
funcs = []
for i in range(10):
funcs.append(lambda x, i=i: x + i)
print(funcs[0](10))

C++ 全局变量的声明和定义

全局变量的声明和定义是分开的,声明是在 .h 中使用 extern 关键字,定义是 .cpp 中使用 = 赋值。

另外就算是用了 #ifdef XXX_H,也不能在 .h 里面定义。不然多个 .cpp 都包含了 .h,还是分开编译的,就会报重定义的错误。

类的静态成员变量是不允许在声明的时候初始化的,只能定义的时候初始化。

Python 线程独立资源

有时候每个线程需要一些独立的资源来执行一些操作,这个可以用 threading.local() 来实现。

一般需要配合 concurrent.futures 的线程池来使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

def initializer():
"""初始化线程独立资源"""
driver = uc.Chrome(use_subprocess=True, options=options, driver_executable_path=DRIVER_PATH)

def exact(i):
"""任务"""
driver.get(url)

def crawler():
global driver_pools
driver_pools = threading.local()
with concurrent.futures.ThreadPoolExecutor(max_workers=5, initializer=initializer) as executor:
# 提交任务
futures = [executor.submit(lambda i=i: exact(i)) for i in range(1, 100)]
# 等待任务完成
for future in concurrent.futures.as_completed(futures):
future.result()

Python 异步任务、线程任务

这两个任务一般来说只要开始阻塞执行后,都没办法强制中止的。

后台多线程任务可以设置成 daemon=True,关闭主程序的时候自动关闭后台任务。

异步任务一般要避免出现阻塞,否则主线程会卡死。

另外如果一定要强行中止线程,可以考虑 concurrent.futuresThreadPoolExecutor._threads.clear 方法。

Python Queue

线程安全的 Queue.get 在使用的时候不管是不是保证有东西,最好都加点 timeout。

nullptr 和 iterator::end()

处理指针类型一定要想好有没有可能是 nullptr

处理迭代器的时候一定要想好有没有可能是 end()

C++ 容器

迭代的时候别TM的做删除操作,会漏内存。

git 设置代理

有时候 git 走不了系统代理,可以配置一个全局的代理设置:

1
2
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890

C++ iostream

istreamostream 是两个抽象类,不能直接实例化,用的时候应该把一个 ifstream 或者 ostream 的子类实例化,然后绑定到 istream 或者 ostream 上。

cerr, cout 这些都是 ostream 的子类,所以有时候

1
2
ifstream fin("in.txt");
istream &in = fin;

C++ Fsanitize

不要开 O2 优化,开了就定位不了错误。

VMWARE 无法打开内核设备

对应虚拟机 .vmx 文件中,将 vmci0.present 改为 "FALSE"

Win11 自定义快捷键反应慢

参考

就是开始菜单 (建议 Win+Q 搜索 设置)找到 "设置", 点击 "应用设置", 把 "后台组件权限" 改为 "从不" 即可。