跳到主要内容

博客

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


根据 https://www.v2ex.com/t/858946?p=1#r_11758561

https://us.flow.microsoft.com 登陆这个,然后新建一个流把收到的邮件放到收件箱就行了。看下面的文章有详细说明步骤。 反正 Outlook 的邮箱过滤功能就是一坨屎。

https://zhuanlan.zhihu.com/p/403170937

虽然最开始会进入垃圾邮箱,过一段时间就会移动到收件箱了。


搬运知乎原贴

利用Power Automate创建流来把归类到垃圾邮件里面的邮件重新移到收件箱,虽然同样的会错过规则,但至少普通邮件不受影响。

首先打开Power Automate然后登陆,直接百度就行,国内委托给世纪互联运营所以应该没问题。

1

我的流》新流》自动化云端流

2

流名称选自己喜欢的就好,注意触发器一定要http://outlook.com的新邮件触发器。如果是office 365 outlook的触发器后面会提示说你账号不存在,只有工作账号和学生账号(Exchange)可用。

3

文件夹》垃圾邮件》新步骤

4

选择操作》http://outlook.com(和前面一样注意不要选到Office 365 Outlook了)

5

搜索“移动”》选择“移动电子邮件”

6

点选消息ID文本输入框》选择消息ID

6

点选文件夹》选择收件箱(或者其它文件夹都可)

7

点击保存即可

8

之后可以拿别的邮箱塞一封垃圾邮件试试。比如下面这种标榜自己就是垃圾邮件的邮件

标题:spam

正文:spamspamspamspamspam

我的情况是先被塞到垃圾邮箱里,过一会就被移出来了。

不想翻垃圾箱的同志们可以试试,上面原文链接里面还有添加筛选的功能,我垃圾邮件不多,广告邮件都建立了规则自动归类所以还OK。

而且这是在新邮件进来的时候才执行,且邮件ID唯一,所以自己移动到垃圾邮件不受影响。


先说结论:使用 outLook 网页版 就 ok 了。

最近因为调试 github action , 疯狂发报错邮件,导致 outlook 判定 github 为垃圾邮件,全部发到 outlook 垃圾箱里了。

我用的是 outlook 客户端 (outlook client)。网上已经明确说,客户端设置的是个 bug,垃圾邮件过滤规则不生效。对客户端已经摆烂了。

有效方案:完全不使用 outlook 客户端, 用 网页版 outlook 邮箱

在已关闭 outlook 垃圾邮箱 筛选器 的情况下,就不会默认放进垃圾邮件。 - 关闭客户端后,担心没有提示的,建议在设置打开 邮件桌面提醒

- 客户端与网页端的主要区别是邮件过滤规则中,不能开启标记邮件并提示到 Microsoft To Do List

结合之前还出了一个 office 365 网页版本 的推行。

看来巨硬已经完全放弃客户端了。

屁大点事阅读需 3 分钟

  • 参考 (doc just the docs 主题蛮好看的)
  • 基本不用,现场不方便改代码 debug。
python -m pdb my_script.py

cat my_script.py

import pdb

def make_bread():
pdb.set_trace()
return "I don't have time"

print(make_bread())

命令列表:

  • c(continue): 继续执行
  • w(where): 显示当前正在执行的代码行的上下文信息
  • a(args): 打印当前函数的参数列表
  • s(step): 执行当前代码行,并停在第一个能停的地方(相当于单步进入)
  • n(next): 继续执行到当前函数的下一行,或者当前行直接返回(单步跳过)

单步跳过(next)和单步进入(step)的区别在于,单步进入会进入当前行调用的函数内部并停在里面,而单步跳过会(几乎)全速执行完当前行调用的函数,并停在当前函数的下一行。

Python阅读需 1 分钟

In [1]: 0.1 + 0.2 == 0.3
Out[1]: False

In [4]: round(2.675, 2)
Out[4]: 2.67

浮点数的二进制表示

2.25 的二进制表示是? 整数部分的二进制表示为 10, 小数部分我们逐步来算 0.25 2 = 0.5 整数部分取 0 0.5 2 = 1.0 整数部分取 1 所以 2.25 的二进制表示为 10.01

0.1 的二进制表示是 0.00011001100110011001100110011……0011 0011 作为二进制小数的循环节不断的进行循环。

浮点数的二进制存储

Python 和 C 一样,采用 IEEE 754 规范来存储浮点数。IEEE 754 对双精度浮点数的存储规范将 64 bit 分为 3 部分。

decimal 模块

我一开始的使用方式是

# 错误用法
In [14]: Decimal(2.675) * Decimal(1.2)
Out[14]: Decimal('3.209999999999999668043315637')
# 正确的用法是
In [15]: Decimal('2.675') * Decimal('1.2')
Out[15]: Decimal('3.2100')
屁大点事阅读需 1 分钟

开始使用 note 做笔记后,大事小事都记录在笔记里,已经不怎么屁大点事都会发博客了。

痛点在于,需要手动同步文章和关联的图片到博客项目,push 到 github 后,触发自动部署更新静态页面。

想做一个类似点击公开,自动分享到博客项目的持续继承功能。

设想如下:

  • 本身 markdown 有 attribute 数据。
  • 增加 article: true 表示是需要发表到博客的项目。
  • 每次提交的时候,通过 github 提供的免费的 CI 功能 actions,扫描带有 article: true 的 markdown 文件,发送到博客项目单独分支。
  • 博客项目生成一个 pr , 方便检查文章格式等,通过人工审核后,同意合并至 master 分支,更新静态页面。

下面讲讲各个步骤细节,方便大佬们抄作业。

博客项目 同步相关

博客相关 actions 配置

  • 需要获取一个提交用的 github token , 我这里设置的名称为 blog_sync
name: sync-note
on:
push:
branches:
- develop # Change this to your default branch
paths:
- "note/docs/articles/*.md"
jobs:
make-html-send-email:
name: make-time-file
runs-on: ubuntu-latest
steps:
- name: get blog repository
uses: actions/checkout@master
- run: |
cd ..
git config --global user.email "z740713651@outlook.com"
git config --global user.name "AngusWG"
git config --global credential.helper cache
git clone https://${{secrets.blog_sync}}@github.com/AngusWG/AngusWG
cd AngusWG
git checkout dev_auto 2>/dev/null || git checkout -b dev_auto

- name: cd into note repo
run: cd ../WG & pwd

- name: install python script requirement
run: pip install .

- name: run the script sync note to blog repo
run: python wg sync_note note /home/runner/work/WG/AngusWG/docs

- name: commit note
run: |
cd /home/runner/work/WG/AngusWG
git add .
git commit -m "sync note $(date +"%Y-%m-%d %H:%M:%S")" || true
git push origin dev_auto

同步博客的 python 脚本

  • 直接用的话 需要做入参适当修改。
  • 设置 article: true 的文章会自动发表到博客。
  • 当 date 不一样时,会自动同步笔记的内容到博客。

需要笔记文件夹和博客有以下目录结构

  • sorce_note_dir: 笔记文件夹
    • articles: 可以发布的文章文件夹
      • a.md (article: true)
      • b.md (article: true)
      • c.md (article: false)
    • images: 笔记图片文件夹
      • a1.png
      • a2.png
      • c1.png
  • target_note_dir: 笔记文件夹
    • articles: 已经发布的博客文件夹
      • a.md (article: true)
      • b.md (article: true)
    • images: 博客图片文件夹
      • a1.png
      • a2.png
#!/usr/bin/env python
# encoding: utf-8
# @Time : 2022/04/18 18:22:22
# @author : zza
# @Email : z740713651@outlook.com
# @File : sync_markdown_note.py
"""同步笔记用"""

import os
import frontmatter
import re
import shutil

default_dir = "articles"
article_attribute = "article"

def _need_sync(file_path: str, output_dir: str) -> bool:
"""
判断是否要同步笔记

1 笔记里存在 属性 publish:true
2 笔记日期 > 已发布笔记日期
"""
post = frontmatter.load(file_path)
# publish
if not post.get(article_attribute):
return False
# update date
old_file = os.path.join(output_dir, default_dir, os.path.basename(file_path))
if os.path.exists(old_file):
current_date = post.get("date")
old_date = frontmatter.load(old_file).get("date")
if current_date == old_date:
return False
return True

def sync_pic(file_path: str, output_dir: str) -> None:
"""copy pic to output dir"""
# find pic in markdown file
with open(file_path, "r", encoding="utf-8") as f:
markdown_body = f.read()
pic_str_list = re.findall(r"\!\[.*\]\((.*)\)", markdown_body)
for pic_str in pic_str_list:
print(f" find pic {pic_str}")
pic_file = os.path.join(os.path.dirname(file_path), pic_str)
if not os.path.exists(pic_file):
continue
# copy pic
output_pic_file = os.path.join(output_dir, "images", os.path.basename(pic_file))
print(f" copy {os.path.abspath(pic_file)} to {output_pic_file}")
shutil.copyfile(pic_file, output_pic_file)
return

def handler_file(root: str, file: str, output_dir: str) -> None:
"""处理单个 markdown 文件"""
file_path = os.path.join(root, file)
if not _need_sync(file_path, output_dir):
return
# copy file
output_file_path = os.path.join(output_dir, default_dir, file)
print(f"copy {file_path} to {output_file_path}")
shutil.copyfile(file_path, output_file_path)
# copy pic
sync_pic(file_path, output_dir)

def main(
markdown_path: str = r"E:\PycharmProjects\WG\note",
output_dir: str = r"E:\PycharmProjects\AngusWG\docs",
) -> None:
"""
遍历 note 文件夹 articles 文件夹下所有的 md 文件

并同步到另一边文件夹下的 articles 文件夹下
- sorce_note_dir: 笔记文件夹
- articles: 可以发布的文章文件夹
- a.md (article: true)
- b.md (article: true)
- c.md (article: false)
- images: 笔记图片文件夹
- a1.png
- a2.png
- c1.png
- target_note_dir: 笔记文件夹
- articles: 已经发布的博客文件夹
- a.md (article: true)
- b.md (article: true)
- images: 博客图片文件夹
- a1.png
- a2.png
"""
# walk directory
root = os.path.join(markdown_path, default_dir)
for file in os.listdir(root):
if file.endswith(".md"):
handler_file(root, file, output_dir)

if __name__ == "__main__":
main()
# handler_file(
# r"E:\PycharmProjects\WG\note\docs\创作",
# "笔记自动发布。md",
# r"E:\PycharmProjects\AngusWG\docs",
# )

博客项目生成 pr

name: SYNC NOTE
on:
push:
branches:
- dev_auto
jobs:
SYNC_NOTE:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
ref: master
- run: ls
- name: Reset main branch
run: |
git fetch origin dev_auto:dev_auto
git reset --hard dev_auto
- name: Create Pull Request
uses: peter-evans/create-pull-request@v4
id: cpr
with:
commit-message: publish note to blog
title: sync note pull request
body: $(date +"%Y-%m-%dT%H:%M:%S%z")
branch: dev_auto
base: master

小坑:

报错 Branch 'X' no longer differs from base branch 'Y'

actions 好像将本地的分支提交一次,最开始的时候写错了, 导致反向 master 覆盖了 dev_auto 分支, 然后因为没有 git fetch ,认为无修改不生成 pr。 看 action 日志+看 issus 解决的。 action 的运行方式有点想当然了。

总结

最开始想用 tag: publish 去识别是否要发布,但是刷 attribute 的脚本不支持增加,支持覆盖, 想了想还是新弄个属性,反正人也看不到。

目前还有一个问题是,这个 action 是每次提交就会检测一遍,然后装 python 依赖的时候,其实挺慢的, 找了一下,并没有限制最小部署间隔的参数(有知道的小伙伴请告诉我)想想机器又不累,不要在乎这么多。

笔记阅读需 5 分钟

屁大点事写个帖子

pycharm 格式化 Ctrl+Shift+L, 每次写完(改完)顺手格式化一下, 非常的舒服。

最近开始接触开源项目, 很多用的 black 格式化工具, 还有 mypy 等等代码检查工具。

冲突点在于 pycharm 另起的一行的参数空 8 格, black 空四格。

在用 black 风格检查的代码的情况下, pycharm 的格式化显得不友好了。

最开始想直接 pycharm reformat 用上 black,但是看了看 jetbrain 的插件:

BlackConnect 要起服务端,而且快捷键不同 (Alt + Shift + B)

解决方案

提交时修改

后面还是妥协普通编写时用 pycharm reformat 提交时统一 black 格式化

需要的是把Continuation indent 改为4

后期再通过 git hook 格式化或者检查代码

更换 pycharm format 工具

step1 安装

windows 下 先 python 安装 black isort

pip install black isort -U pip install black==22.1 isort==5.10 -U # 安装指定版本

step2 工具位置

然后找到 black 和 isort 的命令位置

  • windows
    • where black
    • where isort
  • mac
    • which black
    • which isort

step3 pycharm 配置扩展工具

File -> Settings -> Tools -> External Tools

+号按钮 增加新的拓展工具

Name: Black
Description: Black is the uncompromising Python code formatter.
Program: <install_location_from_step_2>
# Program: d:/ProgramData/Miniconda3/Scripts/black.exe
Arguments: $FilePath$

Name: Isort
Description: Sort imports in current file
Program: <install_location_from_step_2>
# Program: d:/ProgramData/Miniconda3/Scripts/black.exe
Arguments: -e -m 4 -w 120 $FilePath$

step4 pycharm 配置快捷键

Settings -> Keymap -> External Tools -> External Tools

  • Black. 选择后输入 Ctrl+Alt+L 顶掉原来的快捷键
  • Isort. 同理,输入 Ctrl+Alt+O 顶掉原有的 import 格式化

配置完后 就可以使用 black 和 isort 格式化代码了。

pycharm 原有设置 (方便小伙伴还原)

拓展工具原有快捷键名称快捷键
BlackReformat CodeCtrl+Alt+L
IsortOptimize ImportsCtrl+Alt+O

关于 lint check

参考一下 fastapi

mypy fastapi
flake8 fastapi tests
black fastapi tests --check
isort fastapi tests docs_src scripts --check-only

或者用 python 插件 pre-commit-hooks 配置参考这个项目 simple_calculate_service

# cat .pre-commit-config.yaml
- repo: https://github.com/pre-commit/pre-commit-hooks
sha: v1.11.1
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-json
- id: flake8
exclude: migrations|.*\_local.py|manage.py|settings.py

参考 fastapi-crudrouter

  lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
- name: Run Black Code Formatter
uses: psf/black@stable
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r tests/dev.requirements.txt
- name: Check Typing with mypy
run: |
mypy fastapi_crudrouter
- name: Lint with flake8
run: |
flake8 fastapi_crudrouter

vscode 插件问题

报错:The Black Formatter server crashed 5 times in the last 3 minutes. The server will not be restarted. See the output for more

修改配置 其他不用改:

{
"black-formatter.path": [
"C:\\Users\\z7407\\AppData\\Roaming\\Python\\Python310\\Scripts\\black.exe"
]
}

Ctrl+Alt+L 不起作用

快捷键配置 看是否能搜索到

命令窗 搜索 Format Document with... 设置 black 为 Default

屁大点事阅读需 3 分钟

投资理财

  • 简单的投资方式分为

  • 高风险

    • 股票 股票型基金
  • 中风险

    • 混合型基金
  • 低风险

    • 债券
    • 理财产品 (注意看类型 也有高风险的原油宝)
    • 货币基金等
  • 日常的一份收入 , 按一定比例投入

  • 例如(比例因人而异,有的人不用付房租):

    • 30% 日常花销
    • 20% 房租
    • 30% 低风险理财
    • 15% 中风险理财
    • 05% 高风险理财
  • 日常花销或者房租占比大,其对抗失业的风险的能力就小。

做账

  • 建议每月做账
  • 目的是定期回顾下自己的资产
  • 思考一下如何改进
  • 多总总结复盘,了解自己的资金去向(了解一个 bug 的原理,就知道如何修复 bug)
  • 不是为了做账而做账。

长期收益

这方面网上教程很多,有空我再整理。

  • 博客广告
  • 外单
  • 做自媒体
  • ...
随笔阅读需 1 分钟

Hi!我是 AngusWG👋

  • 🧑 一个在深圳的 Python 程序员(调包侠)。
  • 📣 生命有限,学习无限。学习并做有趣的事情,并用 Python。
  • 🎵 最近我听的 歌单,希望与你共享美好时光。

我会什么

  • Python 后端开发。
  • 自动化脚本。
  • 爬虫编写(没有弄 IP 池,快不起来😟)。
  • ps.做了一些东西,向外提供一些服务

联系方式

  • 欢迎在需求明确的情况下,来找我做外包。

AngusWG

z740713651@outlook.com

wx:微信请备注:博客

Angus_Zou


嘿嘿


水群连接


DRAFTING

这里有一个留言板,随便画点什么吧~


AND MORE

都翻到关于了,请作者喝个咖啡把~

咖啡使我精神百倍


既然都看到这了,不妨留下你的评论。

来了就写点吧🎶

阅读需 2 分钟

在项目中写了 doctest,但是需要先初始化环境才方便使用。

在运行 pytest 的目录下创建conftest.py

#!/usr/bin/python3
# encoding: utf-8
# @author : zza
# @File : conftest.py
""" FOR DOCTEST """
import pytest

@pytest.fixture(autouse=True)
def init_env(doctest_namespace):
print("doctest_namespace", doctest_namespace)
import os
sql_url = "sqlite:///data.db"
os.environ['sql_uri'] = sql_url
init(sql_url)
  • pytest 启动就用 pytest 命令就好了:pytest
  • coverage 启动时使用该命令启动:coverage run --source my_pachage -m pytest

更多使用案例建议 github 直接 搜索conftest.py文件。

Python阅读需 1 分钟

配置完后,感觉 gitalk 的 clientID 和 clientSecret 不能直接放项目中,毕竟是开源的。

参考 action 的配置,在项目设置中找到 secert 配置,增加两个环境变量。

.github\workflows\ci.yml下面的 action 配置,增加如下配置:

GITALK_CLIENTID: ${{ secrets.GITALK_CLIENTID }}
GITALK_CLIENTSECRET: ${{ secrets.GITALK_CLIENTSECRET }}

config.js 中使用配置的环境变量名称就好了。

clientID: process.env.GITALK_CLIENTID,
clientSecret: process.env.GITALK_CLIENTSECRET,

本地测试因为填写了 feedback 为博客地址,会导致登陆后默认指向线上博客地址,所以本地测试没有成功。

好了博客评论系统开启了,其实相关评论都到 issus 里去了,还有点不习惯。

具体配置有啥不懂的,可以看看本项目的源码。

编程阅读需 1 分钟