晒晒我家小院子

0%

Virtualenv&Virtualenvwrapper

virtualenv是一个python虚拟环境,能够和系统环境相隔离,保持环境的纯净。

virtualenvwrapper可以方便的管理虚拟环境。

安装

1
2
pip install virtualenv
easy_install virtualenvwrapper

配置

1
2
3
4
5
6
# vim ~/.bash_profile
export WORKON_HOME=$HOME/virtualenvs
export VIRTUALENVWRAPPER_SCRIPT=/Library/Frameworks/Python.framework/Versions/3.6/bin/virtualenvwrapper.sh
export VIRTUALENVWRAPPER_PYTHON=/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
export VIRTUALENVWRAPPER_VIRTUALENV=/Library/Frameworks/Python.framework/Versions/3.6/bin/virtualenv
source /Library/Frameworks/Python.framework/Versions/3.6/bin/virtualenvwrapper.sh

使用virtualenv

1
virtualenv virenv1

使用virtualenvwrapper

1
2
3
4
5
6
7
mkvirtualenv env1  # 默认创建
mkvirtualenv --python=/usr/bin/python2.7 env # 创建 --python可以指定python
lsvirtualenv -b # 列出虚拟环境
workon env1 # 切换虚拟环境
cpvirtualenv env1 env3 # 复制虚拟环境
deactivate # 退出虚拟环境
rmvirtualenv env1 # 删除虚拟环境

Supervisor

专业名称解释

1
2
3
supervisor:要安装的软件的名称。
supervisord:装好supervisor软件后,supervisord用于启动supervisor服务。
supervisorctl:用于管理supervisor配置文件中program。

环境

  • centos7

安装

1
2
3
4
5
6
yum install epel-release
yum install -y supervisor
systemctl enable supervisord # 开机自启动
systemctl start supervisord # 启动supervisord服务
systemctl status supervisord # 查看supervisord服务状态
ps -ef|grep supervisord # 查看是否存在supervisord进程
1
2
3
# 可以看到配置文件位置
# 主配置文件在/etc/supervisord.conf
# 子配置文件放在/etc/supervisord.d目录里面 # 以.ini结束的配置文件

配置为supervisor服务

1
2
vim /usr/lib/systemd/system/supervisord.service
# 将下面一段配置信息粘贴进去(类似/usr/bin/supervisord的路径需要自己修改对应的)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=Process Monitoring and Control Daemon
After=rc-local.service nss-user-lookup.target

[Service]
Type=forking
PIDFile=/var/run/supervisord.pid
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure # 非正常退出,会重启
RestartSec=42s # 重启之前等待42秒

[Install]
WantedBy=multi-user.target
1
2
3
4
启动服务
systemctl enable supervisord
检查是否启动成功
systemctl is-enabled supervisord # 出现enabled,则启动成功
1
2
3
4
5
6
# 可以使用如下命令管理supervisor服务了
systemctl stop supervisord
systemctl start supervisord
systemctl status supervisord
systemctl reload supervisord
systemctl restart supervisord

supervisor简单使用

开放到外网

1
2
3
port=*:9001                ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
username=user ;登录管理后台的用户名
password=123 ;登录管理后台的密码

子进程配置

  • 讲解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#项目名
[program:blog]
#脚本目录
directory=/opt/bin
#脚本执行命令
command=/usr/bin/python /opt/bin/test.py

#supervisor启动的时候是否随着同时启动,默认True
autostart=true
#当程序exit的时候,这个program不会自动重启,默认unexpected,设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的
autorestart=false
#这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1
startsecs=1

#脚本运行的用户身份
user = test

#日志输出
stderr_logfile=/tmp/blog_stderr.log
stdout_logfile=/tmp/blog_stdout.log
#把stderr重定向到stdout,默认 false
redirect_stderr = true
#stdout日志文件大小,默认 50MB
stdout_logfile_maxbytes = 20M
#stdout日志文件备份数
stdout_logfile_backups = 20
  • 例子
1
2
3
4
5
6
7
8
[program:test] 
directory=/root
command=/usr/sbin/tinyproxy -c /etc/tinyproxy/tinyproxy.conf
autostart=true
autorestart=false
stderr_logfile=/root/tmp/tinyproxy/test_stderr.log
stdout_logfile=/root/tmp/tinyproxy/test_stdout.log
#user = test

排序算法

术语
1
2
3
4
5
6
稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;
不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;
内排序:所有排序操作都在内存中完成;
外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
时间复杂度:一个算法执行所耗费的时间。
空间复杂度:运行完一个程序所需内存的大小。
算法总结

算法总结.png

1
2
3
4
5
图片名词解释
n: 数据规模
k: “桶”的个数
In-place: 占用常数内存,不占用额外内存
Out-place: 占用额外内存
算法分类

算法分类.png

算法详解

1. 冒泡 Bubble Sort
1
相邻两两比较、交换
1
最佳情况:T(n) = O(n)   最差情况:T(n) = O(n2)   平均情况:T(n) = O(n2)
2. 选择排序 Selection Sort
1
在未排list中找到最小,放到排序后的list末尾
1
最佳情况:T(n) = O(n2)  最差情况:T(n) = O(n2)  平均情况:T(n) = O(n2)
3. 插入排序 Insertion Sort
1
将未排序的list,一个一个插入到已排序的list中
1
最佳情况:T(n) = O(n)   最坏情况:T(n) = O(n2)   平均情况:T(n) = O(n2)
4. 希尔排序 Shell Sort
1
插入排序的变种:定义增量,以增量为间隔,进行插入排序,逐渐减小增量
1
最佳情况:T(n) = O(nlog2 n)  最坏情况:T(n) = O(nlog2 n)  平均情况:T(n) =O(nlog n)
5. 归并排序 Merge Sort
1
2
将list不断分为两个子序列,直到只有1个或者2个元素(递归)
将两个排序好的子序列合并成一个最终的排序序列(返回值)
1
最佳情况:T(n) = O(n)  最差情况:T(n) = O(nlogn)  平均情况:T(n) = O(nlogn)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def merge_sort(arr):
# divide to two
if len(arr) < 2:
return arr
mid = int(len(arr)/2)
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)

def merge(left, right):
result = []
j = 0
i = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
# add the larger part both left and right
result += left[i:]
result += right[j:]
return result
6. 快速排序 Quick Sort
1
一个基准,左边list小于或等于基准,右边list大于list
1
最佳情况:T(n) = O(nlogn)   最差情况:T(n) = O(n2)   平均情况:T(n) = O(nlogn)
1
2
3
4
def qucik_sort(alist):
if len(alist) <= 1:
return alist
return qucik_sort([i for i in alist[1:] if i < alist[0]]) + alist[0:1] + qucik_sort([i for i in alist[1:] if i >= alist[0]])
1
2
一行快排
def qs(a): return qs([i for i in a[1:] if i <= a[0]]) + a[0:1] + qs([i for i in a[1:] if i > a[0]]) if len(a) > 1 else a
7. 堆排序 Heap Sort
1
https://blog.csdn.net/weixin_40596016/article/details/79711682
8. 计数排序 Counting Sort
1
它只能对整数进行排序
1
最佳情况:T(n) = O(n+k)  最差情况:T(n) = O(n+k)  平均情况:T(n) = O(n+k)
9. 桶排序 Bucket Sort
1
桶排序是计数排序的升级版
1
最佳情况:T(n) = O(n+k)   最差情况:T(n) = O(n+k)   平均情况:T(n) = O(n2)
10. 基数排序 Radix Sort
1
最佳情况:T(n) = O(n * k)   最差情况:T(n) = O(n * k)   平均情况:T(n) = O(n * k)

Shell脚本格式

1
#!/bin/bash   开头指定解释器
语法
1
2
3
4
# 输出
echo 'Hello World...'
source 配置文件 # 让修改后的配置信息立即生效
# chmod 744 myshell.sh # 授权
变量
1
2
3
4
5
6
7
8
9
10
11
# 系统变量
env命令 可以查看系统全局变量
printenv命令 查看指定环境变量的值 等价于$USER
例子 $HOME $PWD $SHELL $USER
# 用户自定义变量
声明是 echo $A # 可以直接定义,不声明
A=100 # 定义 如果变量值有空格时,必须加双引号。
使用是 B=$A # 定义静态变量:readonly A=90 但是不能unset
unset a # 删除变量 在unset引用变量名时,不要加$。
# set 显示当前shell中所有变量
# 变量一般为大写,等号左右不能有空格
1
2
3
创建全局变量的方法是先创建一个局部变量,然后导出到全局环境中
export A
在子shell中修改全局变量并不会影响到父shell中该变量的值。
将命令结果赋值给变量
1
A=$(ls -a)  等价于 A=`ls -a`  # 反引号 
注释
1
2
3
4
5
# 单行注释
# 多行注释如下
:<<!
语句
!
位置参数变量
1
2
3
4
语法有$n和$*和$@和$#和${10}
$$ 当前进程PID
$! 后台运行的最后一个进程的PID
$? 最后一次执行的命令的返回状态,0正确,非零执行不正确
运算符
1
2
((运算式))和$[运算式]  # 推荐使用$[运算式]  # 没有expr
# expr m + n # 可以 + - \* / % 加 减 乘 除 取余
条件判断
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 基本语法和格式
[ condition ](注意 condition 前后要有空格)
非空返回 true,可使用$?验证(结果为:0 为 true,>1 为 false)
# 常用判断条件(左右两边有空格)
= 字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
# 按照文件权限进行判断
-r 有读的权限 [ -r 文件 ]
-w 有写的权限
-x 有执行的权限
# 按照文件类型进行判断 # 例子 [ -e /root/a.txt ]
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# if 格式
#!/bin/bash
if [ "str" = "s1tr" ]
then
echo "str equal"
elif [ 100 = 101 ]
then
echo "100 equal"
elif [ "str1" = "str1" ]
then
echo "str1 equal"
if [ 123 = 123 ]
then
echo "123 equal"
else
echo "123 not equal"
fi
fi
1
2
3
4
5
6
7
8
9
10
11
12
# case语句
case $变量名 in
"值1")
语句
;;
"值2")
语句
;;
*)
语句
;;
esac
1
2
3
4
5
6
7
8
9
10
11
# for 语句
# 实例1
for i in 1 2 3 4 # 1 2 3 4 可以替换为 "$*"和"$@"
do
echo "$i"
done
# 实例2
for((i=1;i<=100;i++))
do
echo "$i"
done
1
2
3
4
5
6
7
8
9
# while 语句
i=1
while [ $i -le 10 ]
do
echo "num=$i"
i=$[$i+1] # 加一
let i=$i+1 # 加一 # let :用来执行算数运算和数值表达式测试
let i++ # 加一 # let 命令的替代表示形式是 ((算术表达式))
done
控制台输入
1
read -p "请输入一个数num1=" -t 10 NUM1  # -p 为提示符 -t 是等待时间
函数
1
2
3
4
5
6
# 系统函数
basename [string] [suffix] # 返回文件名
suffix 为后缀,如果 suffix 被指定了,basename 会将 string 中的 suffix 去掉。
# 系统函数
dirname 文件绝对路径 # 返回目录
返回完整路径最后'/'的前面的部分,常用于返回路径部分
1
2
3
4
5
6
7
8
9
10
11
12
# 自定义函数
#!/bin/bash
function get_sum(){
local sum=0 #局部变量
sum=$[$sum+$1+$2]
echo $sum
return $?
}
m=100
n=200
total=$(get_sum $m $n)
echo "The sum is $total"
附加
1
2
3
4
5
6
7
8
vim命令
set tabstop=4
set nu
set nonu
G
gg
u # 撤销
shift+g