跳到主要内容

50 篇博文 含有标签「编程」

查看所有标签

每次 Jenkins 走 pipeline 自动构建时,我需要等待构建完成,上到测试环境后再通知测试或者项目去跟近, 最开始想用机器人,后面发现发邮件很简单,我也有邮件弹窗提示,所以让 jenkins 做完后发个做完的邮件给我。

Jenkinsfile 中增加两段代码:

1. 在 stage 该在的地方添加下列代码

        stage("get GIT_COMMIT_NAME/GIT_COMMIT_EMAIL") {    
agent any
steps {
checkout scm
script {
// Git committer name
env.git_commit_name = sh (script: "git --no-pager show -s --format='%an' $GIT_COMMIT",returnStdout: true).trim()
echo "Git committer name: ${GIT_COMMIT_NAME}"
// Git committer email
env.git_commit_email = sh (script: "git --no-pager show -s --format='%ae' $GIT_COMMIT",returnStdout: true).trim()
echo "Git committer email: ${GIT_COMMIT_EMAIL}"
}
}

2. 在文件最后一个花括号前面增加下列代码

    post {    
success {
script {
mail to: "${env.git_commit_email}",
subject: "[Jenkins] SUCCESSFUL: ${env.appName} [${env.BUILD_NUMBER}]",
body: """SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'
分支:${env.BRANCH_NAME}
JOB_NAME: ${env.JOB_NAME}
提交人:${env.git_commit_name}
构建次数:${env.BUILD_NUMBER}
console output:${env.BUILD_URL}
"""
}
}
failure {
script {
mail to: "${env.git_commit_email}",
subject: "[Jenkins] FAILURE: ${env.appName} [${env.BUILD_NUMBER}]",
body: """<p>SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'
分支:${env.BRANCH_NAME}
JOB_NAME: ${env.JOB_NAME}
提交人:${env.git_commit_name}
构建次数:${env.BUILD_NUMBER}
console output:${env.BUILD_URL}
"""
}
}
}

从此自动构建 再也不用盯着构建任务是否结束再通知下游工作人员啦


编程阅读需 1 分钟

  • 线上自动编译时出现错误 SyntaxError: invalid syntax
  • 谷歌上搜 nonlocal open_cite_tag 没有任何相关信息
Running Sphinx v1.7.9    
loading translations [zh_CN]... done

Traceback (most recent call last):
File "/home/docs/checkouts/readthedocs.org/user_builds/rqalpha/envs/develop/local/lib/python2.7/site-packages/sphinx/cmdline.py", line 303, in main
args.warningiserror, args.tags, args.verbosity, args.jobs)
File "/home/docs/checkouts/readthedocs.org/user_builds/rqalpha/envs/develop/local/lib/python2.7/site-packages/sphinx/application.py", line 191, in __init__
self.setup_extension(extension)
File "/home/docs/checkouts/readthedocs.org/user_builds/rqalpha/envs/develop/local/lib/python2.7/site-packages/sphinx/application.py", line 411, in setup_extension
self.registry.load_extension(self, extname)
File "/home/docs/checkouts/readthedocs.org/user_builds/rqalpha/envs/develop/local/lib/python2.7/site-packages/sphinx/registry.py", line 315, in load_extension
mod = __import__(extname, None, None, ['setup'])
File "/home/docs/checkouts/readthedocs.org/user_builds/rqalpha/envs/develop/local/lib/python2.7/site-packages/nbsphinx.py", line 1088
nonlocal open_cite_tag
^
SyntaxError: invalid syntax

Exception occurred:
File "/home/docs/checkouts/readthedocs.org/user_builds/rqalpha/envs/develop/local/lib/python2.7/site-packages/sphinx/registry.py", line 315, in load_extension
mod = __import__(extname, None, None, ['setup'])
File "/home/docs/checkouts/readthedocs.org/user_builds/rqalpha/envs/develop/local/lib/python2.7/site-packages/nbsphinx.py", line 1088
nonlocal open_cite_tag
^
SyntaxError: invalid syntax
The full traceback has been saved in /tmp/sphinx-err-cnpEVe.log, if you want to report the issue to the developers.
Please also report this if it was a user error, so that a better error message can be provided next time.
A bug report can be filed in the tracker at https://github.com/sphinx-doc/sphinx/issues. Thanks!

对照后发现 nbsphinx ==0.3.5 时会成功 requirements.txt 文件加上版本限制就 ok

  • cat requirements.txt
Sphinx    
watchdog
sphinx_rtd_theme
nbsphinx ==0.3.5
jupyter_client

image.png

编程阅读需 1 分钟

https://blog.csdn.net/the_victory/article/details/52781357

  1. 首先打开你的 starUML 安装目录,并找到 LicenseManagerDomain.js,starUML 是用 NodeJS 写的,这个文件就是判断注册用户的文件,我的目录是:D:\Program Files (x86)\StarUML\www\license\node\LicenseManagerDomain.js
  2. 修改该文件,找到第 24 行,加入如下所示区域的代码。
    function validate(PK, name, product, licenseKey) {    
var pk, decrypted;

//edit by ChrisChang, 加入如下几行
return {
name: "Chang",//随意
product: "StarUML",
licenseType: "vip",
quantity: "blog.csdn.net/the_victory",//随意
licenseKey: "later equals never!"
};
//-------------END

try {
pk = new NodeRSA(PK);
decrypted = pk.decrypt(licenseKey, 'utf8');
} catch (err) {
return false;
}
var terms = decrypted.trim().split("\n");
if (terms[0] === name && terms[1] === product) {
return {
name: name,
product: product,
licenseType: terms[2],
quantity: terms[3],
licenseKey: licenseKey
};
} else {
return false;
}
}

  1. 重启 starUML 需要在 help->Enter License 选项里面输入你代码里写的 name 和 licensekey。
  2. 重启 starUML,你会发现已经没有提示了,然后点击 help->about starUML, 结果如下

编程阅读需 1 分钟

参考自 利用 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 分钟

需求

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

实验思路:

  • 按正常顺序插入 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()

发现还是不行

后期的解决方案

  • 数据量不大的情况下
  • 删除后面的数据
  • 然后顺序插入
编程阅读需 1 分钟

[ ] 表示博主没有学过的 [x] 表示博主已经学过的

6 大设计原则

介绍的比较详细 静下心看

[x] 设计模式六大原则

23 种设计模式

每种设计模式 先看 1 再看 2

图解 23 种设计模式 无代码

1《大话设计模式》Python 版代码实现

23 设计模式的代码实现

二十三种设计模式及其 python 实现


数学

[ ] 概率论 [ ] 数理统计 [x] 高等数学 [x] 线性代数 [x] 离散数学 [x] 复变函数与积分变换


编程方面

[ ] 数据挖掘 [ ] 人工智能 [ ] 分布式计算 [x] 数据结构 [x] 算法分析与设计 [x] 软件工程 [x] 面向对象系统分析与设计 [x] 软件项目管理 [x] 软件测试 [x] 计算机网络 [x] 编译原理 [x] 操作系统 [x] 信息安全技术概论 [x] 数据库 Oracle [x] 数据库 SQLServer


其他课

[x] 就业指导 [x] 计算机操作及维护


硬件方面略

编程阅读需 1 分钟

项目创建使用 cookiecutter

使用以下命令创建项目

pip install cookiecutter 
cookiecutter https://github.com/AngusWG/cookiecutter-py-package.git

版本统一由 git + tag (versioneer) 管理 在项目用 setup.py 打包时 versioneer 会根据最近的 tag 标签 放入对应版本号


养成 format 代码习惯

2.1 format code 快捷键 Ctrl + Alt + L
2.2 format import 快捷键 Ctrl + Alt + O


每个项目需要都有单元测

单元测试的入口统一是 Makefile 中的 make check 方便运维建立统一的 CICD


项目需要打包到 pypi 上

4.1 测试 pypi pypi_dev 用于发测试版本包

4.2 正式 pypi pypi_st 用于发正式版本号 此 pypi 上的包 只能是纯数字版本号 不能有 + or dev 字样 正则为 /d+./d+./d+


commit 时自动检查

  • git hook 是指在对应 git 动作中触发的脚本
  • pre-commit 指在提交commit 前触发的动作

以下命令将设置一个默认 pre-commit 在当前项目下有Makeflie的情况下 执行make check命令

python -c "from urllib.request import urlopen ;exec(urlopen('https://github.com/AngusWG/cookiecutter-py-package/raw/master/git_pre_commit_hook.py').read())"
  • make 命令在 windows 上使用 需要安装 cygwin

Cygwin 安装

安装时选择 Make。 并将 cygwin 的 bin 目录加到 windows 环境变量中,为了避免冲突,请尽量让 Cygwin 保持在环境变量第一条。 image.png image.png


编程阅读需 2 分钟

安装

pip install shadowsocks cd /etc/ vim /etc/shadowsocks.json

贴贴下面的配置:

    

{
"server":"0.0.0.0",
"server_port":8381,
"local_address": "127.0.0.1",
"local_port":1080,
"password":"a123456",
"timeout":300,
"method":"aes-256-cfb",
"fast_open": true,
"workers": 1
}

开启

sudo ssserver -c /etc/shadowsocks.json -d start

开机自启

考虑到如果VPS被重启(实际上只会你自己重启……),所以我们将shadowsocks加入开机启动项,配置如下:

vim /etc/rc.local

  • 然后在exit 0之前加入

sudo ssserver -c /etc/shadowsocks.json -d start

  • 然后重启VPS:

sudo reboot now

  • 重启后查看进程:

ps aux | grep shadowsocks

如果shadowsocks正常运行,表明设置成功。


  • 停止服务用

  • sudo ssserver -c /etc/shadowsocks.json -d stop

  • 日志 tailf /var/log/shadowsocks.log

https://www.cnblogs.com/Eason1024/p/8177665.html

编程阅读需 1 分钟