Skip to main content

New Blog

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

# https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xiii-i18n-and-l10n
# 请在rqlicense-server 目录下操作
# 生成翻译文件模版
pybabel extract -F babel.cfg -k _l -o messages.pot .
# 生成翻译文件 一般只需要 init 一次
pybabel init -i messages.pot -d rqlicense/translations -l en
# 更新翻译文件
pybabel update -i messages.pot -d rqlicense/translations -l en
# 编译
pybabel compile -d rqlicense/translations
  • 附赠 messages.po 谷歌翻译脚本
#!/usr/bin/python3    
# encoding: utf-8
# @Time : 2019/12/13 15:25
# @author : zza
# @Email : 740713651@qq.com
# @File : 翻译messages.po文件.py
import re
from tqdm import tqdm
from googletrans import Translator

proxies = {"http": 'http://localhost:9999',
"https": 'https://localhost:9999'}
translate = Translator(proxies=proxies)


def service(messages_po_path):
with open(messages_po_path, "r", encoding="utf8") as f:
messages_body = f.read()
messages_lines = messages_body.split("\n")
result_lines = []
msgid = ""
msgstr = ""
for line in tqdm(messages_lines):
if line.startswith("msgid"):
msgid = line
elif line.startswith("msgstr"):
msgstr = line
if msgid == 'msgid ""':
pass
elif msgstr == 'msgstr ""':
translate_str = re.findall(r"msgid \"(.*)\"", msgid)[0]
en_str = translate.translate(translate_str).text
msgstr = msgstr.replace('""', '"{}"'.format(en_str))
result_lines.append(msgid)
result_lines.append(msgstr)
else:
result_lines.append(line)
result_body = "\n".join(result_lines)
messages_po_to_path = messages_po_path.replace(".po", "bak.po")
with open(messages_po_to_path, "w", encoding="utf8") as f:
f.write(result_body)


if __name__ == '__main__':
messages_po_path = r"D:\PycharmProjects\rqlicense\rqlicense-server\rqlicense\translations\en\LC_MESSAGES\messages.po"
service(messages_po_path)

PythonOne min read

logging 模块多进程解决方案 concurrent-log-handler 0.9.12

错误日志

PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: 'E:\\logs\\contest\\contest.log' -> 'E:\\logs\\contest\\contest.log.1'    

解决

  • bash
pip install concurrent-log-handler    
pip install pypiwin32
  • python
from logging import getLogger, DEBUG    
from concurrent_log_handler import ConcurrentRotatingFileHandler
import os

logger = getLogger()
# Use an absolute path to prevent file rotation trouble.
logfile = os.path.abspath("mylogfile.log")
# Rotate log after reaching 512K, keep 5 old copies.
rotateHandler = ConcurrentRotatingFileHandler(logfile, "a", 512*1024, 5)
logger.addHandler(rotateHandler)
logger.setLevel(DEBUG)

logger.info("Here is a very exciting log message, just for you")

  • 如果有很多日志 建议多弄几个 logger

其他参考

PythonOne min read

参考自 利用 frp 透穿访问内网的树莓派

安装

服务器设置

[common]    
bind_addr = 服务器 ip
bind_port = 7000
  • nohup ./frps -c ./frps.ini 跑起程序

设置客户端

  1. 下载 最新版 frp 程序
  2. 解压 frp 并设置 frpc.ini,大概设置成这样:
[common]    
server_addr = 服务器 ip
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
  1. nohup ./frpc -c ./frpc.ini 跑起程序

验证

ssh -oPort=7000 pi@服务端 ip,正常的话将以 ssh 的方式进入树莓派


开机自启

服务端

vim /etc/rc.local

nohup /home/zza/frp_0.23.1_linux_amd64/frps -c /home/zza/frp_0.23.1_linux_amd64/frps.ini &    

客户端

vim /etc/rc.local

nohup /home/zza/frp_0.23.1_linux_arm/frpc -c  /home/zza/frp_0.23.1_linux_arm/frpc.ini &    

使用 Systemd 实现自动启动 frp

Systemd, 可以保证在树莓派意外重启时,能自动启动 frp 相关服务。这样,我们就不用整天提心吊胆,担心各种意外了。

服务端管理 frps

  • 需要先 cd 到 frp 解压目录。

cp frps /usr/local/bin/frps mkdir /etc/frp cp frps.ini /etc/frp/frps.ini

  • 编写 frp service 文件,以 centos7 为例,适用于 debian

vim /usr/lib/systemd/system/frps.service

[Unit]    
Description=frps
After=network.target

[Service]
TimeoutStartSec=30
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.ini
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target
  • 启动 frp 并设置开机启动

systemctl enable frps systemctl start frps systemctl status frps

  • 部分服务器上,可能需要加 .service 后缀来操作,即:

systemctl enable frps.service systemctl start frps.service systemctl status frps.service

树莓派管理 frpc

  • 需要先 cd frp 解压目录。复制文件

cp frpc /usr/local/bin/frpc mkdir /etc/frp cp frpc.ini /etc/frp/frpc.ini

  • 编写 frp service 文件,以 centos7 为例,适用于 debian

vim /usr/lib/systemd/system/frpc.service

[Unit]    
Description=frpc
After=network.target

[Service]
TimeoutStartSec=30
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.ini
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target
  • 启动 frp 并设置开机启动

systemctl enable frpc systemctl start frpc systemctl status frpc

  • 部分服务器上,可以需要加 .service 后缀来操作,即:

systemctl enable frpc.service systemctl start frpc.service systemctl status frpc.service

  • 注意:
    • frps 或 frpc 启动无效时,可以尝试先停止服务,如:

systemctl stop frpc

编程2 min read

https://gist.github.com/laispace/666dd7b27e9116faece6

git 设置全局代理

git config --global https.proxy http://127.0.0.1:1080
git config --global https.proxy https://127.0.0.1:1080
git config --global http.https://github.com.proxy socks5://127.0.0.1:9999
git config --global http.https://github.com.proxy socks5://192.168.31.2:9999

git 删除全局代理

git config --global --unset http.proxy
git config --global --unset https.proxy

git 设置只对 github 的代理

git config --global http.https://github.com.proxy socks5://127.0.0.1:9999

git 删除只对 github 的代理

git config --global --unset http.https://github.com.proxy

在用户目录下 ~\.gitconfig 下查看配置


pip 设置豆瓣源

顺便贴一下

pip config set global.index-url https://pypi.douban.com/simple
随笔One min read

需求

  • 插入数据
  • 在默认排序中 数据显示在中间而不是最后

实验思路:

  • 按正常顺序插入 x 条数据
  • 拿第一条数据 加字段 id 不变 删除后加入

代码:

#!/usr/bin/python3    
# encoding: utf-8
# @Time : 2019/1/3 11:37
# @Author : zza
# @Email : 740713651@qq.com
import datetime
import time
from pprint import pprint

import pymongo
from mongomock import ObjectId
from tqdm import tqdm

mongo_url = "mongodb://127.0.0.1:27017", 'sort_db'
mongo_db = pymongo.MongoClient(mongo_url[0])[mongo_url[1]]

def made_data():
mongo_db['demo'].drop()
print("开始造数据")
for i in tqdm(range(10)):
time.sleep(1)
mongo_db['demo'].insert({"timestamp": datetime.datetime.now()})

def set_data():
# 之前想造个数据放进去 保存一下 如何生成 _id
# http://api.mongodb.com/python/current/api/bson/objectid.html
pprint(list(mongo_db['demo'].find()))
gen_time = datetime.datetime(2019, 1, 1, 14, 12, 26)
dummy_id = ObjectId.from_datetime(gen_time)
dummy_id = str(dummy_id)[:8] + "5c2da85ffc904a3c84335788"[8:]
dummy_id = ObjectId(dummy_id)
print(dummy_id)
result = mongo_db['demo'].insert({"_id": dummy_id, "info": "id made by python", "timestamp": gen_time})
print(result)
pprint(list(mongo_db['demo'].find()))
pprint(list(mongo_db['demo'].find({}).sort([("_id", -1)])))

def re_insert_first():
a = mongo_db['demo'].find()[0]
mongo_db['demo'].delete_one({"_id": a["_id"]})
a.update({"info": "change by py"})
mongo_db['demo'].insert(a)
pprint(list(mongo_db['demo'].find()))

made_data()
# set_data()
re_insert_first()

发现还是不行

后期的解决方案

  • 数据量不大的情况下
  • 删除后面的数据
  • 然后顺序插入
编程One min read

基本教程

  1. 腾讯企业邮箱转发到outlook邮箱 image.png image.png

  2. 将你的转发邮箱设置到安全邮件列表 image.png

  3. 设置普通JIRA规则围观类邮件归入普通文件夹 image.png

  4. 设置@我的JIRA规则 image.png

  5. 标记到微软待办(Microsoft To Do) image.png

  6. 下载微软待办(Microsoft To Do)客户端

  7. 使用你的outlook账号登录微软待办,查看待办事项 image.png

···

高端教程

  • windows下载outlook邮箱客户端
  • 设置规则如下 image.png 如此 只要你的客户端开着 提及到你的邮件就会自动出现在待办事项中

疑难杂症

  • 如果你的邮箱名为全数字无中文类型 则会出现邮件不出现在微软待办的问题 需要更换邮件名 包含英文才行

随笔One min read

pip 命令

运行以下命令就好了

pip config set global.index-url http://pypi.douban.com/simple    
pip config set global.trusted-host pypi.douban.com
pip config set global.disable-pip-version-check true
  • 第三条用于关闭版本检查

部分操作系统可能有写入的位置不对的情况 于是乎有了下列脚本 前面配置已生效的同学可以不用管了

网上教程基本上都说 pip 的配置文件在用户目录下 %HOMEPATH%/.pip/pip 但是实际上在在 pip config list读的不知道是那个文件夹的文件 使用pip config set写入到%HOMEPATH%\AppData\Roaming\pip\pip.ini 用 --global --user 等指令 写入的地方也不同 有待研究

操作代码

#!/usr/bin/python3    
# encoding: utf-8
# @Time : 2020/4/13 14:12
# @author : zza
# @Email : 740713651@qq.com
# @File : pip_douban_source.py
# https://python3-cookbook.readthedocs.io/zh_CN/latest/c13/p10_read_configuration_files.html
# https://www.jianshu.com/p/0cdd647bcc3e
"""
python -c "import requests;res = requests.get('http://cdn.ricequant.com/rqpro/pip_douban_source_v2.py');exec(res.text)"
"""

import os
import sys

from configparser import ConfigParser

conf_dir = os.path.join(os.path.expanduser("~"), ".pip")
os.makedirs(conf_dir, exist_ok=True)
WINDOWS = (sys.platform.startswith("win") or (sys.platform == 'cli' and os.name == 'nt'))
CONFIG_BASENAME = 'pip.ini' if WINDOWS else 'pip.conf'
conf_path = os.path.join(conf_dir, CONFIG_BASENAME)

cfg = ConfigParser()
cfg.read(conf_path, encoding="utf8")

if not cfg.has_section('global'):
cfg.add_section('global')

cfg.set('global', 'index-url', 'http://pypi.douban.com/simple')
cfg.set('global', 'trusted-host', 'pypi.douban.com')
cfg.set('global', 'timeout', "60")
cfg.set('global', 'disable-pip-version-check', "true") #关闭版本检查

if not WINDOWS:
if not cfg.has_section('install'):
cfg.add_section('install')
cfg.set("install", "use-mirrors", "true")
cfg.set("install", "mirrors", "https://pypi.douban.com/simple/")
cfg.set("install", "trusted-host", "pypi.douban.com")

with open(conf_path, "w", encoding="utf8:") as f:
cfg.write(f)

print("save to {}".format(conf_path))

一行命令跑起来

  • 这个文件我放公司 cdn 上了
  • 需要用到 python exec 方法 如下:
python -c "import requests;res = requests.get('http://cdn.ricequant.com/rqpro/pip_douban_source_v2.py');exec(res.text)"    

Python2 min read

  • 按 ctrl+V 不能贴贴,ctrl+C 能复制
  • 选中文字后按 Backspace 不是删除,而是选定行往后继续+1
  • 原因:Pycharm 启动了 Vim 编辑模式
  • 解决方式:Tools -Vim Emulator 关闭就行了
  • 字典中,用变量名。get(key1) 和 变量名 [key1] 的区别
  • 变量名。get(key1) 如果没有给 0 值
  • 变量名 [key1] 没有则抛出 KeyError 异常
PythonOne min read