Skip to main content

New Blog

代码人生:编织技术与生活的博客之旅

  • 拿到了 GitHub Copilot 的使用权,真的很香,
  • 为此开始尝试使用 vscode 编程折磨自己。
  • 以前总说小体积 vscode 比不上 IDE pycharm,
  • 确实没有插件啥也不是,有插件了估计比 pycharm 还重。
  • vs code 选插件真的是很痛苦的事情,弄个表做个备份。

  • aw-watcher-vscode - ActivityWatch 监控插件
  • Code Spell Checker - 代码拼写检查
  • Darcula PyCharm Theme Darcula - PyCharm 主题
  • Deploy - 服务器部署
  • Docker - docker 插件
  • Foam for VSCode - 思维导图生成插件
  • GitHub Copilot - github 代码补全插件
  • GitLens — Git supercharged - 查看改动记录 ,文件历史
  • IntelliJ IDEA Keybindings - IntelliJ IDEA 快捷键
  • Jupyter ms-toolsai.jupyter - python jupyter 插件
  • MagicPython - python 调试插件
  • Markdown All in One - markdown 插件
  • Markdown Links - markdown 链接图生成插件
  • Markdown Notes - Markdown 贴条插件
  • Markdown Preview Mermaid Support - markdown Mermaid 图插件
  • markdownlint - markdown 代码检查
  • Marp for VS Code - markdown 转 ppt
  • Mermaid Markdown Syntax Highlighting - markdown Mermaid 语法高亮
  • Note Sync - 把 vscode 当笔记用的时候的同步插件
  • npm - npm 拓展
  • Open Window Tab Context - 右键 tab 再新打开一个窗口
  • Paste Image - markdown 贴图小助手
  • Prettier - Code formatter - 代码格式化
  • Pine Script Syntax Highlighter - pine 脚本语言代码高亮
  • Pylance - python 拓展包
  • Python - python 拓展包
  • Python Docstring Generator - google 风格 python 文档快速生成
  • Remote - Containers - docker 助手
  • Remote - SSH - 远程连接助手
  • Remote - SSH: Editing Configuration Files - 远程连接助手 2
  • Remote - WSL - wsl 远程连接助手
  • Remote Development - 远程部署合集包
  • Vetur - vue 拓展包
  • vscode-pdf - pdf 打开插件
  • vsinder - 交友插件
  • WakaTime - 活动记录统计插件
  • vim - vim 拓展包
  • git graph - git 图表
  • Markdown Mind Map Preview - markdown 转思维导图
  • vscode-office - markdown 所见所得

编程2 min read

Microsoft Todo List 最近一直连接不上, 根据 这个帖子, 设置使 To Do 网络连接独立就好了,非常有用

因为安装了 Todo List 的设备很多,一个一个设置比较麻烦。 于是写了一个 python 代码来执行。

需要的同学直接运行下列代码执行:

python -c "from urllib.request import urlopen ;exec(urlopen('https://github.com/AngusWG/TestProject/raw/master/%E5%B7%A5%E5%85%B7/to_do_list_sync_error.py').read())"
  • 不能访问 github 的记得开全局翻墙

  • 写了个直接性 github 上代码的工具,用这个好看一丢丢。

pip install run_web_pycode
pyw https://github.com/AngusWG/TestProject/raw/master/%E5%B7%A5%E5%85%B7/to_do_list_sync_error.py


源码如下:

#!/usr/bin/python3
# encoding: utf-8
# @Time : 2021-06-20 11:44:27
# @author : zza
# @Email : z740713651@outlook.com
# @File : to_do_list_sync_error.py
import os
import winreg

from typing import Optional

def get_todos_key() -> Optional[str]:
reg_path = r"Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Mappings"
access_key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, reg_path)
try:
n = 0
while True:
sub_key_name = winreg.EnumKey(access_key, n)
sub_key = winreg.OpenKey(access_key, sub_key_name)
display_name = winreg.QueryValueEx(sub_key, "DisplayName")[0]
# print(display_name)
n += 1
if "Todos" in display_name:
print(display_name)
print(sub_key_name)
return sub_key_name
except WindowsError:
return None

def service() -> None:
key = get_todos_key()
if key is None:
raise KeyError("Can't find Microsoft.Todos key in registry")
command = f"CheckNetIsolation.exe loopbackexempt -a -p={key}"
os.popen(command).read()
result = os.popen("CheckNetIsolation.exe LoopbackExempt -s").read()
assert key in result, "设置失败"
print("设置成功")

if __name__ == "__main__":
service()

随笔One min read

fire 是一个比 click 更有使用体验的命令行工具包。

但是在 help 命令中,会进入 man 的交互模式里,不能直接打印到标准输出里。

看了下 Issue,有几种解决方案,记录一下。

修改 fire.core.Display

if __name__ == "__main__":
# Make Python Fire not use a pager when it prints a help text
fire.core.Display = lambda lines, out: print(*lines, file=out)
fire.Fire(...)

更改 PAGER 环境变量(推荐)

* windows 上设置 setx PAGER type
* linux 上设置 export PAGER=cat

在程序中修改环境变量

os.environ["PAGER"] = 'cat'

  • 一个写完后发现没必要的代码
def _fire_print_prepare() -> None:
"""help to print mode `setx PAGER cat`"""
import os
import platform
from shutil import which

if os.environ.get("PAGER"):
return
if which("cat"):
os.environ["PAGER"] = "cat"
elif platform.platform().startswith("Windows"):
os.environ["PAGER"] = "type"
PythonOne min read

  • 证书
  • [[搭建 xray-shadowsock]]
  • 推荐一个新的证书申请 certbot
  • [[certbot 证书]]

ssl

通过 acme.sh 生成证书并自动更新

curl  https://get.acme.sh | sh
apt install socat
/root/.acme.sh/acme.sh --register-account -m my@example.com
/root/.acme.sh/acme.sh --issue -d www.mydomain.com --standalone
/root/.acme.sh/acme.sh --upgrade --auto-upgrade

编写一键更新脚本

需要先关闭 nginx systemctl start nginx

  • 写了个脚本:vim /root/script/acme_job.sh
    • 更新 acme
    • 更新证书
  • 官方说两个月会自动更新。因为 Nginx 占用会失败。
echo "start acme.sh $(date +"%Y-%m-%d %H:%M:%S")"
systemctl stop nginx
/root/.acme.sh/acme.sh --upgrade --auto-upgrade
/root/.acme.sh/acme.sh --renew -d www.mydomain.com --force
/root/.acme.sh/acme.sh --renew -d www.mydomain2.com --force
systemctl start nginx
echo "finish acme.sh $(date +"%Y-%m-%d %H:%M:%S")"
echo "==========================="

设置自动执行时间

设置执行时间:

  • 05:02 执行脚本 (大概率不在这个时间段玩电脑)
  • vim /var/spool/cron/crontabs/root
2 5 * * * /usr/bin/bash /root/script/acme_job.sh > /var/log/acme_job.log
查看自动更新脚本日志
tail /var/log/acme_job.log
tail /var/log/cron.log

认证超时问题

查看日志

查看日志docker logs ss-libev -f --tail 20

2021/09/10 10:08:03 http: TLS handshake error from 192.168.1.1:999: remote error: tls: bad certificate
2021/09/10 10:08:04 http: TLS handshake error from 192.168.1.1:999: remote error: tls: bad certificate
2021/09/10 10:08:05 http: TLS handshake error from 192.168.1.1:999: remote error: tls: bad certificate
2021/09/10 10:08:06 http: TLS handshake error from 192.168.1.1:999: remote error: tls: bad certificate
  • 证书过时了
  • 输入命令更新证书:/root/.acme.sh/acme.sh --upgrade --auto-upgrade
  • 然后报错了:
[Fri 10 Sep 2021 10:11:37 AM CST] Renew: 'www.mydomain.com'
[Fri 10 Sep 2021 10:11:37 AM CST] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Fri 10 Sep 2021 10:11:37 AM CST] Standalone mode.
[Fri 10 Sep 2021 10:11:37 AM CST] LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1481169,fd=8),("nginx",pid=898219,fd=8))
LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=1481169,fd=9),("nginx",pid=898219,fd=9))
[Fri 10 Sep 2021 10:11:37 AM CST] tcp port 80 is already used by (("nginx",pid=1481169,fd=8),("nginx",pid=898219,fd=8))
80 [
[Fri 10 Sep 2021 10:11:37 AM CST] Please stop it first
[Fri 10 Sep 2021 10:11:37 AM CST] _on_before_issue.

  • ubuntu 需要 打开 crontab 日志
    • vim /etc/rsyslog.d/50-default.conf
    • 打开文件,在文件中找到 cron.*,把前面的 '#'去掉,保存退出,输入
    • sudo service rsyslog restart
  • 重启系统日志,然后稍微等下应该就能在 /var/log 目录下看到 cron.log,vim cron.log 就可以查看 cron 运行日志了。

acme.sh 报错 can not get domain token

Error, can not get domain token "type":"http-01","url":"https://acme.zerossl.com/v2/DV90/chall/ZlNEi3nO05c_rSrqfaId_A","status":"invalid","error":{
Please add '--debug' or '--log' to check more details.
  • 参考
  • /root/.acme.sh/acme.sh --issue -d www.mydomain.com --standalone --server https://acme-v02.api.letsencrypt.org/directory
编程2 min read

参考

ssl

通过 acme.sh 生成证书并自动更新

curl  https://get.acme.sh | sh
apt install socat
/root/.acme.sh/acme.sh --register-account -m my@example.com
/root/.acme.sh/acme.sh --issue -d www.mydomain.com --standalone
/root/.acme.sh/acme.sh --upgrade --auto-upgrade

配置配置文件

mkdir /etc/shadowsocks-libev

# vim /etc/shadowsocks-libev/config.json
{
"server":"0.0.0.0",
"server_port":9000,
"password":"password",
"timeout":300,
"method":"aes-256-gcm",
"fast_open":true,
"nameserver":"8.8.8.8",
"mode":"tcp_and_udp",
"plugin":"xray-plugin:tls;host=www.mydomain.com",
"plugin_opts":"server"
}

docker 启动 shadowsocks

docker pull teddysun/shadowsocks-libev
docker run -d -p 9000:9000 -p 9000:9000/udp --name ss-libev --restart=always -v /etc/shadowsocks-libev:/etc/shadowsocks-libev -v /root/.acme.sh:/root/.acme.sh teddysun/shadowsocks-libev

客户端配置

  • xray-plugin 下载对应软件
  • 放到 shadowsocks 客户端文件夹里
  • 写入配置
    {
"server": "www.mydomain.com",
"server_port": 9000,
"password": "password",
"method":"aes-256-gcm",
"plugin": "xray-plugin",
"plugin_opts": "tls;host=www.mydomain.com",
"plugin_args": "",
"remarks": "mydomain.com",
"timeout": 5
},
  • 安卓用户点 这里 下载

编程One min read

随便写写

1. 监控与错误报警

  1. 普罗米修斯监控响应速率 由运维管理 grafana
  2. sentry 收集报错日志 保存错误触发条件 并报警
  3. traceback_with_variables 在日志中打印完备触发条件
  4. traceback.format_exc() 打印错误栈

2. 跟踪调试

  1. pysnooper 打印每一步
  2. IPython.embed 直接打开命令

3. 开发环境完备

  1. CI\CD 托管测试发布上线 节约时间
  2. PYPI 托管包
  3. versioneer 用 git tag 管理包版本
  4. pip-tools requirements 管理
  5. Git-hook 提交时单元测试检查

4. 偷懒

  1. cookiecutter 建立项目 单元测试 版本管理一步到位
  2. docker 自己弄个全家桶 pypi jenkins grafana sentry mongo redis mysql 一步到胃 # todo
  3. 弄个项目做为自己的脚本集入口

5. 项目结构问题

建议直接使用 cookiecutter

  1. 项目名中划线 包名下划线 避免环境疑难杂症
  2. models 文件夹 数据结构+数据库+对象行为
  3. views/apis 文件夹 视图相关只管接口
  4. env.py 定义基础组件
  5. config.py 配置管理

6.python 代码检查

Linting

  • PyCharm 需要修改格式化 jetbrains://Python/settings?name=Editor--Code+Style--Python Continuation indent = 4
flake8 # 代码检查
flake8-black # black 风格检查
flake8-import-order # import-order(isort)check
flake8-bandit # 安全代码
flake8-annotations # 函数注释检查
flake8-builtins # python builtins 是否被变量名占用
flake8-variables-names # 变量名可读性检查
flake8-functions # 函数检查 长度+参数长度+返回值长度
flake8-expression-complexity # 函数复杂性检查(层数)

# not use
flake8-bugbear # For Flake8 finding likely bugs and design problems in your program.

随笔2 min read

  • [[自建 RSS 订阅]]

  • 在博客或者项目底端找到RSS连接,获取URL。

eg. https://anguswg.github.io/AngusWG/rss.xml

rss

  • IFTTT注册账号
  • CREATE NEW 创建一条新规则
  • IF RSS 增加条件 如果rss更新

search rss add RSS URL

  • THEN EMAIL

Trigger email

feedly

这里有另一个订阅方式 feedly 操作上也是获取RSS,贴上去就好了~

Outlook RSS(目前使用中)

outlook自带了一个rss订阅方案

  • 首先会把所有的文章都下载下来。
  • 我每天都会检查邮件,放在outlook反而更方便。
  • 不足是找不到订阅连接,所以都先放到了友情链接

编程One min read

之前借着 v2ex 帖子
总结了下自己的咖啡感受。
顺便发个帖子。
屁大点事发个文系列

关于速溶

我一直喝的是速溶的

优缺点

  • 首先耗时不大,勺子挖一瓢,放热水按一下(电动的自动搅拌杯)。
  • 其次咖啡因摄入量可以自己控制。 不用一杯喝到晚上失眠。
  • 缺点是要洗杯子。偷懒就喝完咖啡再来杯热水,自动搅拌一下就当洗了。

牌子

  • 之前喝的 日本的 UCC117
  • 后面喝的 德国的 Tchibo (目前在喝这个)

知乎上推荐的就哪几种 一个一个试着来,
或者一次性一样都买一个,
好喝留着,不好喝的放公司让同事们自助。

关于自动搅拌杯

  • 之前买的热力转磁力的,转动不受控制、容易坏 、杯子容量还小。
  • 后面换了上电池的,400ml,其实容量也小,将就着用了 。( 31 ¥,要买请挑容量最大的)
  • 不用充电的、一是怕漏电,二是接口没得 typc-C 、麻烦、电池公司也有,而且基本上一个季度都不用换。
  • 电池仓防水做的也还行。

其他配件

牛奶+制冰机

在上家公司,和小伙伴 aa 买了制冰机。
公司本身有大盒脱脂牛奶无限量提供。
幸福感直接拉到最高。
这家马上也都要到位了。
改善工作环境小能手

关于咖啡机

  • 公司有咖啡机* 2,
  • 也有胶囊咖啡机* 1。

共同的问题是声音大,吵,听着就容易暴躁。

胶囊咖啡机要长期放水箱,水放久了就不太想用。

咖啡机我刚来的时候喜欢玩,后期发现是小强之家
把我恶心吐了。特别是放豆子和水箱的地方,简直就是自助餐。
只有公司请人清洗后,才会用一下(磨个豆子冲杯咖啡,中午可以打个奶泡玩) 。 清洗后第二天就不会用了(亲眼看到马上爬进去)。

小强之家

人会因为喝咖啡兴奋而胡说八道吗

是有可能的。喝咖啡后兴奋的原因主要是中枢神经系统受到咖啡因的刺激而产生的生理反应。

  • 一些可能会因此胡说八道的原因包括:
    1. 咖啡因的兴奋作用会增加脑内多巴胺等神经递质的分泌,降低自我约束能力。
    2. 兴奋状态下心率升高,血压变化,容易情绪化和不注意微细细节。
    3. 长期沉浸在兴奋状态下会降低逻辑思考和判断力,更容易随意想东想西。
    4. 个性因素,有些人激动起来更难控制自身。
    5. 太多咖啡中毒会引起焦虑不安等负面影响,信息输出难免涉及错误。
    6. 与他人交流时以上生理变化也难维持正常的社交技巧。

不过,这种可能性并非绝对,还会受个人体质影响。一般享受咖啡带来的好处即可,不建议狂饮成习惯。控制咖啡分量和精神状态尤为重要。

屁大点事3 min read

相关资料:

安装依赖

pip install pstats  
pip install snakeviz

获取程序运行数据

通过cProfile获取性能分析数据

  • cProfile自python2.5以来就是标准版Python解释器默认的性能分析器。
  • cProfile是一种确定性分析器,只测量CPU时间,并不关心内存消耗和其他与内存相关联的信息。
def run_1():  
"""your function """
pass


def profile_func(func):
import cProfile
file_name = "prof_{}_1.pstat".format(func.__name__)
cProfile.run("{}()".format(func.__name__), file_name)
import pstats
p = pstats.Stats(file_name).sort_stats("cumtime")
# p.print_stats("rqalpha_mod_ricequant_data")
p.print_stats("base_position")
return p


if __name__ == '__main__':
p = profile_func(run_1)

通过pycharm直接获取运行数据

Pycharm 右上角启动按钮旁边有性能分析按钮,
点击后会自动弹出pycharm自带的性能分析界面,
当然也可以复制.pstat文件地址,使用snakeviz进行分析(推荐)。


snakeviz 生成剖面图

运行目录下 命令行输入:snakeviz prof_run_1_1.pstat

点击生成的连接 查看柱状剖面图

image.png


gprof2dot 时间分析图

gprof2dot -f pstats mkm_run.prof | dot -Tpng -o mkm_run.png

image.png

PythonOne min read

  • 屁大点事发个博文系列。
  • 参考

首先 QQ 输入法输入 now 会有一个自带的当前时间短语。

改成 iso 格式的日期

  • QQ 输入法自定义时间语句 $(Year)-$(month)-$(date) $(hour):$(minute):$(second)

添加自定义短语

好了,以后写 History.md 格式就好统一了。


.

屁大点事One min read