马哥Python 开发9期
LVS工作模式:
传输层
会话保持:负载均衡
(1) session sticky:同一用户调度固定服务器
Source IP:LVS sh算法(对某一特定服务而言)
Cookie
(2) session replication:每台服务器拥有全部session
session multicast cluster
(3) session server:专门的session服务器
Memcached,Redis
路由表:
接口:本路由器出口
网关:
直接相连:0.0.0.0
间接相连:下一个路由器邻近本路由器的接口的IP
DHCP:
第一步:discover(发现)
第二步:offer
第三步:request
第四步:ack
锁:
with 上下文管理锁
__enter__,__exit__魔术方法
非阻塞锁:用if语句,获取锁则返回True
cond=threading.Condition()
with cond:
cond.notify_all()
with cond:
cond.wait()
基础知识补充:
__slots__属性
模块化:
import语句:
加载和初始化它,生成模块对象,在自己的作用域内关联模块对象名称加入名词空间并绑定其模块对象,让后引用它。
sys.modules----查看作用域中加载的模块
dir()----------查看当前作用域名词空间
字典----不重复导入
__name__设置为__main__-----顶层代码
异常与错误:
def foo2():
try:#捕获异常
foo1()
except Exception as e:#异常处理
print('foo2 deal')
open('abcde')
finally:#清理工作
print('foo2 fin')
class MyException(Exception):
pass
try:
raise MyException('My Error')
except MyException as e:#e =MyException('My Error')
print(e)
魔术方法:
描述器:
自己写一个@classmethod函数------partial函数
class ClassMethod:
def __init__(self,fn):
print(fn)
self.fn = fn
def __get__(self, instance, cls):
print(self,instance,cls)
# return self.fn(owner)
return partial(self.fn,cls)
__get__()、__set__()、__delete__()
一个类的类属性是一个描述器,并且是一个数据描述器,对它实例同名属性的操作,相当于类属性。
class A:
def __init__(self):
print('A.init')
self.a1 = 22
def __get__(self, instance, owner):
print('__get__',self.__class__,instance,owner)
return self
def __set__(self, instance, value):
print('__set__',self,instance,value)
class B:
x = A()
def __init__(self):
print('B.init')
self.x = 100
运行时动态添加属性----反射
编译期已固定-----装饰器,mixin继承
内建函数:getattr,setattr,hasattr
反射魔术方法:__getattr__()、__setattr__()、__delattr__()
def timeit(fn):
@wraps(fn) # a = wraps(fn)(wrapper)----拿到源函数属性
def wrapper(*args,**kwargs):
start = datetime.datetime.now()
ret = fn(*args,**kwargs)
delta = (datetime.datetime.now() - start).total_seconds()
print('{} took {}s'.format(fn.__name__,delta))
return ret
return wrapper
class TimeIt:
"""This is a class"""
def __init__(self,fn):
print('init')
self._fn = fn
# self.__doc__ = self._fn.__doc__
# self.__name__ = self._fn.__name__
wraps(self._fn)(self)----拿到源函数属性,_fn为源,self目标
class Point:
def __init__(self):
print('init')
def __enter__(self):
print("enter")
return self
with p as f:-----f为return返回值
set集合先调is 再调==
hash值相同和值是否相等---》去重
hash:
hash冲突
def hash(x):
return x % 3
hash(4)和hash(7)冲突。
python3实现方法链:
class Person:
def name(self, value):
self.name = value
return self
def age(self, value):
self.age = value
return self
def introduce(self):
print "Hello, my name is", self.name, "and I am", self.age, "years old."
person = Person()
person.name("EarlGrey").age(21).introduce()
# => Hello, my name is EarlGrey and I am 21 years old.
那么return self返回的结果是什么呢?
class Foo(object):
def __init__(self):
self.myattr = 0
def bar(self):
self.myattr += 1
return self
f = Foo()
print(type(f.bar()))
输出结果为:
<class '__main__.Foo'>
链表用列表实现的原因:
借有序的列表存放无序的node,无序的node间关系用类的next连接一起实现
在栈上与内建关键字冲突,没关系,加载即消失。但是函数名称与内建函数冲突会产生递归调用。
class Shape:
@property
def area(self):
raise NotImplementedError('基类未实现')------------基类为模板,子类必须实现,不然抛异常。
实例的__dict__字典序列化。类属性不用序列化(每个实例属性不同,变量),类属性一般为常量,可以直接拿到。
书籍推荐:UML,算法导论
实例属性:个性化,多份,每个实例都不同,放在每个实例自己的__dict___中
类属性:抽象,一份,共用,通用(方法),
class Pair:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return 'Pair({0.x!r}, {0.y!r})'.format(self)
def __str__(self):
return '({0.x!s}, {0.y!s})'.format(self)
import random
class RandomGenerator:
'''
1 解决随机数边界问题
2 随机数生成
3
'''
# @classmethod
def __init__(self,count=10,start=1,stop=100):
self.count = count
self.start = start
self.stop = stop
self.gen = self._generate()
def _generate(self):
while True:
yield [random.randint(self.start,self.stop) for _ in range(self.count)]
def generate(self,count):
self.count = count
return next(self.gen)
rg = RandomGenerator()
gen = rg.generate(3)
print(gen)
面向对象----猴子补丁
大数据领域采集日志(Flume,Scribe)
https://www.cnblogs.com/liujiacai/tag/-----RD文档
多使用内建函数:过滤:filter,排序:sort,映射:map,dic
names = os.listdir(src)
if ignore is not None:
ignored_names = ignore(src, names)
else:
ignored_names = set()
zip和lambda用法技巧思路:
def wordcount(file='sample.txt'):
chars='''~!@#$%^&*()_+{}[]|\\/""'=;:.-<>'''
with opoen(file,encoding='utf-8') as f:
word_count={}
for line in f:
words line.split()
for k,v in zip(words,(1,)*len(words)):
k=k.strip(chars)
k=k.lower()
word_count[k] = word_count.get(k,0)+1
lst= sorted(word_count.items(),key=lambda x:x )
4.SHELL脚本基础
格式要求:首行shebang机制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
脚本调试
检测脚本中的语法错误
bash -n /path/to/some_script
调试执行
bash -x /path/to/some_script
bash中变量的种类
根据变量的生效范围等标准划分下面变量类型:
局部变量:生效范围为当前shell进程;对当前shell之外的
其它shell进程,包括当前shell的子shell进程均无效
环境(全局)变量:生效范围为当前shell进程及其子进程
本地变量:生效范围为当前shell进程中某代码片断,通常
指函数
位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调
用通过命令行传递给它的参数
特殊变量:$?, $0, $*, $@, $#,$$
$1, $2, ...:对应第1、第2等参数,shift [n]换位置
测试命令:
• test EXPRESSION
• [ EXPRESSION ]
• [[ EXPRESSION ]]
注意:EXPRESSION前后必须有空白字符
$(seq [start [step]] end)
引用数组中的元素:
数组切片:${ARRAY[@]:offset:number}
offset: 要跳过的元素个数
number: 要取出的元素个数
取偏移量之后的所有元素
${ARRAY[@]:offset}
3.包管理
rpm
yum
yum repository: yum repo,存储了众多rpm包,以及包的相关的元数据
文件(放置于特定目录repodata下)
文件服务器:
http://
https://
ftp://
file://
repo文件格式
yum仓库
程序包编译:
2.Linux基础
判断内外部命令;tpye
查看内部命令:enable
PS1="\[\e[1;33m\][\u@\h \W]\\$\[\e[0m\]"
PATH环境变量设置,外部命令查找机制,搜索路径为PATH
which查看命令路径
whereis hostname:查看外部命令位置,帮助文档路径,相关文件
外部命令第一次在磁盘找,根据PATH变量,放到hash表。第二次执行时,从hash表调出
hash查看哈希表
alias别名:设置常用路径,存放.bashrc,
unalias取消别名,-a取消所有别名
tty显示终端类型命令
lsb_release -a
uname -r
clock -w与系统时间同步,clock -s系统时间与硬件时间同步
/etc/localtime时区文件二进制
修改网卡名称为eth0样式
http://blog.51cto.com/oldboy/1722101
gedit /boot/grub2/grub.cfg
修改行:linux16 后加 net.ifnames=0
reboot
ntpdate IP 同步时间
https://www.cnblogs.com/freeweb/p/5390552.html
vim /etc/ntp.conf
server IP iburst
systemctl restart ntpd.service
/etc/localtime ------时区文件
localectl list-locales---------列出所有语言
localectl ---所有参数> list-keymaps set-keymap set-x11-keymap list-locales set-locale status
cal -y 日历
timedatectl----时区命令参数>list-timezones set-ntp set-timezone set-local-rtc set-time status
shutdown---关机参数>A,B两台机连同一台电脑主机
w命令:显示用户主机,显示正在执行操作命令。
screen命令:远程协助,共享桌面给别人操作,同步桌面。
A:screen -S help 开启回话,回话名称help
B:screen -ls 查看回话
B:screen -x help 加入回话help
A:Ctrl +a,d----->临时退出
screen -r help 恢复回话
B:exit 退出回话
echo命令
echo -e '\033[43;31;5mmagedu\033[0m'
引号,括号的用法
https://www.cnblogs.com/liujiacai/p/7828620.html-----引号用法总结
https://www.cnblogs.com/liujiacai/p/7841246.html------括号用法总结
结论:
反引号`` 等于$(),反向单引号,命令调用另一个命令的执行结果时使用
echo {1..10..2}
echo {A..a}
history--命令>存放文件,家目录的.bash_history,这是重启机器后history还有记录的原因
!1026(序号)执行1026序号命令
!-3执行倒数第三条命令
!s执行以s开头最近的一条命令
!?it包含it结尾的最近一条命令
默认系统保留1000个命令,可以修改/etc/profile文件HISTSIZE=1000------这条参数
帮助命令:
whatis----显示命令的简短描述,man –f同样
内部命令:type command
help COMMAND
man bash
外部命令: (1) COMMAND --help
COMMAND -h
(2) 使用手册(manual)
man COMMAND
(3) 信息页
info COMMAND
(4) 程序自身的帮助文档
README
INSTALL
ChangeLog
(5) 程序官方文档
官方站点:Documentation
(6) 发行版的官方文档
(7) Google
umask
特殊权限:
passwd:普通用户能改密码的原理
suid权限:通过拥有suid权限的文件以主用户权限访问任务文件,二进制文件。
sgid权限:一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
用途解决痛点:通常用于创建一个协作目录,同组人新建文件统一为父目录属组。
粘制位权限Sticky 位:
解决痛点:具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置Sticky 位,只有文件的所有者或root可以删除该文件
sticky 设置在文件上无意义
chmod o+t DIR...
chmod 1644 /DIR
例如:/tmp目录
访问控制列表:
cat -A 查看特殊字符
-E: 显示行结束符$
-n: 对显示出的每一行进行编号
-A:显示所有控制符
-b:非空行编号
-s:压缩连续的空行成一行
tac命令:倒着显示结果
rev命令:倒着显示结果
more
less
cut
paste
head
tail
用上诉所学命令写取IP脚本
文本处理工具:
tr压缩:http://blog.csdn.net/sunnyyoona/article/details/52986893
pate粘贴,横向、纵向合并文件:http://www.xfcodes.com/linuxcmd/mulu/10211.htm
sort
wc
diff
uniq
last:每个用户登入过记录情况
seq
grep
/dev/null----->垃圾回收站
正则表达式
扩展正则表达式
vi
vim
处理文本的工具sed:
行编辑器原理,模式空间
用法:
sed [option]... 'script' inputfile...
常用选项:
-n:不输出模式空间内容到屏幕,即不自动打印
-e: 多点编辑
-f:/ PATH/SCRIPT_FILE : 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式
-i.bak: 备份文件并原处编辑
script:
'地址命令'
sed 's/BASH/'''$USER'''/' /etc/passwd
awk介绍
awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出
有多种版本:New awk(nawk),GNU awk( gawk)
gawk:模式扫描和处理语言
基本用法:
awk [options] ‘program’ var=value file…
awk [options] -f programfile var=value file…
awk [options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file ...
awk 程序通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块,共3部
分组成
program通常是被单引号或双引号中
选项:
-F 指明输入时用到的字段分隔符
-v var=value: 自定义变量
awk语言
基本格式:awk [options] 'program' file…
program:pattern{action statements;..}
pattern和action:
• pattern部分决定动作语句何时触发及触发事件
BEGIN,END
• action statements对数据进行处理,放在{}内指明
print, printf
分割符、域和记录
• awk执行时,由分隔符分隔的字段(域)标记$1,$2..$n称为
域标识。$0为所有域,注意:和shell中变量$符含义不同
• 文件的每一行称为记录
• 省略action,则默认执行 print $0 的操作
awk工作原理
第一步:执行BEGIN{action;… }语句块中的语句
第二步:从文件或标准输入(stdin)读取一行,然后执行
pattern{ action;… }语句块,它逐行扫描文件,从第一行到最后一
行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{action;…}语句块
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个
可选的语句块,比如变量初始化、打印输出表格的表头等语句通常
可以写在BEGIN语句块中
END语句块在awk从输入流中读取完所有的行之后即被执行,比如
打印所有行的分析结果这类信息汇总都是在END语句块中完成,它
也是一个可选语句块
pattern语句块中的通用命令是最重要的部分,也是可选的。如果没
有提供pattern语句块,则默认执行{ print } ,即打印每一个读取到的
行,awk读取的每一行都会执行该语句块
awk
print格式: print item1, item2, ...
要点:
• (1) 逗号分隔符
• (2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式
• (3) 如省略item,相当于print $0
示例:
awk '{print "hello,awk"}'
awk –F: '{print}' /etc/passwd
awk –F: ‘{print “wang”}’ /etc/passwd
awk –F: ‘{print $1}’ /etc/passwd
awk –F: ‘{print $0}’ /etc/passwd
awk –F: ‘{print $1”\t”$3}’ /etc/passwd
tail –3 /etc/fstab |awk ‘{print $2,$4}’
begin----相当于表头,与文件没关系,在读取文件之前操作
pattern-----处理文件,一行一行
end-------汇总,
if,for,while语句
break:结束本次循环
continue:跳过这一循环进入下一循环
next:提前结束对本行处理而直接进入下一行处理(awk自身循环)
Linux基础一:
Python全能自动化开发环境软件之pyenv的安装说明
http://www.magedu.com/73921.html
1.分区
MBR分区
主分区:一块硬盘最多四个主分区,一个或多个,可以格式化ntfs,存数据
扩展分区:一块硬盘最多1个扩展分区,可以没有,划分为更小的单元,即逻辑分区
逻辑分区:可以格式化ntfs,存数据
lscpu
lsmem
lsblk
free -h