服务器可视化_这6个服务器监控工具,系统管理员不要错过

服务器监控工具对系统管理员的重要性不言而喻。今天给大家介绍6个服务器监控工具。

%title插图%num

1、Conky
Conky能在多个的平台上运行,像Windows,Linux,Mac OS,大多数BSD都可以。它有简单的文本、总线进度条,图形窗口不同字体和颜色来显示信息,用户界面简单,300多个内置对象,对于系统管理员来说是个神器。

2、Glances
Glances是一个跨平台监控工具,它用Python编写,仅支持python2.7或python3.4以上版本,并且使用python库来收集系统信息。

3、Linux Dash
Linux Dash的UI基于Angular构建,作用相当于Linux系统的Web仪表板。它支持多种语言,系统状态选项卡显示有关RAM使用率,CPU平均负载,CPU使用率等等信息,非常全面。此外,Linux Dash还可以用WebSocket提供实时系统数据可视化。

4、Netdata
Netdata是一个开源软件,用来实时监控系统和应用程序,可在Linux,FreeBSD,macOS,docker容器,IoT设备上运行,还能轻松和其他工具集成,如Prometheus,AWS Kinesis,Graphite,MongoDB等。我们可以在系统,应用程序或容器上安装Netdata代理,它会提供所有性能和运行状况信息。对了,它是免费的。

5、Prometheus+Grafana
Prometheus是用来监控系统指标的开源工具,Grafana是开源可视化平台。它们集成后是一个强大的环境,可高效地监控服务器。Prometheus服务器负责收集数据,成为Grafana的数据源,而Grafana负责在仪表板上可视化所有指标,而且可查询。

6、Ward
Ward和几乎所有流行的操作系统兼容,它主要使用OSHI(一个免费的Java库),检索操作系统和硬件信息。它可以共享操作系统版本,CPU使用率,磁盘和分区,处理器,内存等信息。

python碎片|多态的定义及特点

python碎片|多态的定义及特点

定义:
多态是指一类事物有多种形态。
在不考虑实例类型的情况下使用实例,不同类型的实例有相同的调用方法。

特点:
1.增加灵活性

以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)

2.增加可扩展性

通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用

例子:
class dog:
def info(self):
print(‘hello dog’)

class cat:
def info(self):
print(‘hello cat’)

class rat:
def info(self):
print(‘hello rat’)

animal = [dog, cat, rat]
for i in animal:
i().info()

运行结果:
hello dog
hello cat
hello rat

 

python碎片|Python对象自省机制

python碎片|Python对象自省机制

 

自省是通过一定的机制查询到对象的内部结构。

Python中比较常见的自省(introspection)机制(函数用法)有: dir(),type(), hasattr(),
isinstance(),通过这些函数,我们能够在程序运行时得知对象的类型,判断对象是否存在某个属性,访问对象的属性。

class A(object):
def __init__(self):
print(“A”)

class C(A):
def __init__(self):
print(“B”)
super().__init__()

class B(A):
def __init__(self):
print(“C”)
super().__init__()

class D(B,C):
def __init__(self):
print(“D”)
super().__init__()

if __name__ == ‘__main__’:
d = D()

运行结果:

(<class ‘__main__.D’>, <class ‘__main__.B’>, <class ‘__main__.C’>, <class ‘__main__.A’>, <class ‘object’>)

python碎片|Python类属性描述

python碎片|Python类属性描述

__getattr__是当类调用一个不存在的属性时才会调用getattr魔法函数,他传入的值item就是你这个调用的不存在的值。
class User(object):
def __init__(self, name, info):
self.name = name
self.info = info
ls = User(“李四”,{“gender”:”male”})
print(ls.info)

运行结果:
{‘gender’: ‘male’}

如果想获得male属性,则需要用到__getattr__魔法方法。

class User(object):
def __init__(self, name, info):
self.name = name
self.info = info

def __getattr__(self, item):
return self.info[item]

ls = User(“李四”,{“gender”:”male”})
print(ls.gender)

运行结果:
male

属性描述符是一个强大的通用协议。它是properties, methods, static methods, class methods
和super()的调用原理。
属性描述符是实现了特定协议的类,只要实现了__get__,__set__和__delete__三个方法中的任意一个,这个类就是描述符,它能实现对多个属性运用相同存取逻辑的一种方式,通俗来说就是:创建一个实例,作为另一个类的类属性。
如果一个对象同时定义了__get__和__set__方法,它被称做数据描述符(data descriptor)。
只定义__get__方法的对象则被称为非数据描述符(non-data descriptor)。
使用类方法创建描述符 • 定义一个IntField类为描述符类 • 创建IntField类的实例,作为另一个User类的属性
class User:
def __init__(self, age):
self.age = age

def get_age(self):
return (str(self.age) + ‘岁’)

def set_age(self, age):
if not isinstance(age, int):
raise TypeError(‘Type Error’)
self.age = age

tt=User(55)
tt.set_age(60)
print(tt.get_age())

运行结果:
60岁

描述符查找顺序 • 当为数据描述符时, get__优先级高于__dict •
当为非数据描述符时,dict__优先级高于__get

 

Python碎片|Python推导式*全用法

Python碎片|Python推导式*全用法

for循环
写一段代码生成1到100之间的数字的平方的列表,答案是:

1,4,9,16…
1
如果你这样写,你就不Pythonic了:

nums = []
for i in range(1,101):
nums.append(i*i)
print(nums)

推导式

nums = [i*i for i in range(1,101)]
1
带条件的推导式
生成一个列表,如果是3的倍数就用平方,否则就用是数字本身:

1,2,9,4,5,36…
1
代码:

nums = [i*i if i%3==0 else i for i in range(1,101)]
1
结合上面的3个例子,来看一下推导式总结:
推导式从一个可枚举数据(列表,元组,集合,字典等)推导出一个列表。也可以推导出生成器,集合或字典。
推导式可以加推导条件,只对符合条件的元素推导 要推导出的元素使用表达式生成,可以用if else生成不同元素

[表达式 if 表达式条件 else 分支 for i in 序列 if 推导条件]
1
使用函数
如果推导条件或者表达式特别复杂,可以使用函数。
推导所有1-100之间的所有质数:2,3,5,7…

def is_prime(num):
if num == 1:
return False
for i in range(2,num):
if (num % i) == 0:
return False
else:
return True

p_nums = [i for i in range(1,100) if is_prime(i)]
print(p_nums)

把推导的条件放在函数中,既可以应对复杂的条件,又可以利用推导式的简洁写法。
同理,如果生成推导结果的过程很复杂,也可以把逻辑放到函数中。
推导1900到2021年之间所有的年份,标记出闰年,生成结果:

1900, 1901, 1902, 1903, ‘闰1904′
1
代码:

“`
def is_run(year):
if (year % 4) == 0:
if (year % 100) == 0:
if (year % 400) == 0:
return True # 整百年能被400整除的是闰年
else:
return False
else:
return True # 非整百年能被4整除的为闰年
else:
return False

ryears = [f’闰{y}’ if is_run(y) else y for y in range(1900, 2021)]
print(ryears)
“`

嵌套表达式
从2000年到2021年,生成每个月份:‘2000年:1月’, ‘2000年:2月’, ‘2020年:3月’, …, ‘2021年:12月’

monthes = [f'{y}年:{m}月’ for y in range(2000, 2022) for m in range(1,13) ]

这里有两个for循环,类似于:

monthes = []
for y in range(2000, 2022):
for m in range(1,13):
monthes.append(f'{y}年:{m}月’)
是不是下面的特别容易懂?所以两层的循环不推荐使用推导式,哈哈。
那我为什么还要讲?你会碰到有人这么写,知道它的存在还是有点必要的。

生成器
这种情况下,我们应该使用推导生成器,用法很简单:
把方括号改成圆括号就可以了

nums = (i*i for i in range(1,10000000000))
print(nums)
print(next(nums))
print(next(nums))
print(next(nums))

打印出来是一个生成器:

<generator object <genexpr> at 0x7fa0b422feb0>

这是一个生成器,它不会一次性生成100亿个数字,只有调用next()的时候,它才会生成一个新的,返回给你。也就是说,同一个时间,只保存一个数字。

字典推导式
推导字典的方式和推导列表很相似,只不过:
使用大括号
使用键值对
推导一个包含数字和数字平方组成的字典,结果是这样的:

{1: 1, 2: 4, 3: 9, …, 100: 10000}
1
代码:

“`
nums_dict = {n:n*n for n in range(1,101)}
print(nums_dict)
反过来,平方在前面,数字在后面:
nums_dict = {n*n:n for n in range(1,101)}
print(nums_dict)
“`

给下面的字典按照分数排序:

{‘麦叔’:59, ‘张三’:87, ‘FGA’:78, ‘石石’:100, ‘莫名’:90}
1
排序结果:

{‘石石’: 100, ‘莫名’: 90, ‘张三’: 87, ‘FGA’: 78, ‘麦叔’: 59}
1
代码:

“`
scores = {‘麦叔’:59, ‘张三’:87, ‘FGA’:78, ‘石石’:100, ‘莫名’:90}
sored_scores = {item[0]:item[1] for item in sorted(scores.items(), key=lambda item:item[1], reverse=True)}
print(sored_scores)
“`

先把字典scores变成一个元组列表:scores.items()
用sorted函数给元组列表排序:sorted(scores.items(), key=lambda item:item[1],
reverse=True)
排序过程用lambda指定使用元组的第二列排序:key=lambda item:item[1]。默认是是*列。
指定倒着排序,也就是分数高的在前面:reverse=True
使用推导式,把排好序的元组列表,生成一个新的排好序的字典:{item[0]:item[1] for item in … }
集合推导式
推导集合的方式和列表是一样的,区别在于:
使用大括号,类似于推导字典,但它是单个元素,而不是键值对。
集合会自动过滤掉重复的元素。
下面的名字列表,去掉前后空格后去掉重复的名字:

[ ‘麦叔’, ‘张三’, ‘ 麦叔 ‘, ‘FGA ‘, ‘张小三’, ‘FGA’, ‘石石’,’ 莫名’,’莫名’ ]
1
推导结果:

{‘石石’, ‘FGA’, ‘张小三’, ‘莫名’, ‘张三’, ‘麦叔’}
1
代码:

names = [ ‘麦叔’, ‘张三’, ‘ 麦叔 ‘, ‘FGA ‘, ‘张小三’, ‘FGA’, ‘石石’,’ 莫名’,’莫名’ ]
new_names = {n.strip() for n in names}
print(new_names)

python碎片|账本自动分页分行源码

python碎片|账本自动分页分行源码

%title插图%num#!/usr/bin/env python
# _*_ coding: utf-8 _*_
# @Author : zhenbei
# @File : konggang.py
# @Time : 2021/1/11 17:20

import pandas as pd

dat = pd.read_csv(r’C:\Users\giser\Desktop\9.csv’, encoding=’gbk’)
dt = dat.groupby(dat[‘SCODE ‘])
scode = pd.DataFrame(dt.count())
li = scode[‘SID ‘]
s = []
l = []
for i in li:
p = [(c – 1) // 15 + 1 for c in range(1, i + 1)]
s.extend(p)

for a in li:
for b in range(1, a // 15 + 1):
for m in range(1, 16):
l.append(m)
for n in range(1, a – 15 * (a // 15) + 1):
l.append(n)
dat[‘PAGE ‘] = s
dat[‘LINE ‘] = l
dat.to_csv(r’C:\Users\giser\Desktop\res.csv’, encoding=’gbk’)

Python碎片|腾讯位置大数据

Python碎片|腾讯位置大数据

import requests
import json
import pandas as pd
header={
‘User-Agent’:’Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0′}
url = ‘https://xingyun.map.qq.com/api/getXingyunPoints’
for i in range(1,5):
payload = {‘count’: i, ‘rank’: 0}
response = requests.post(url, data=json.dumps(payload))
datas=json.loads(response.text)[‘locs’]
datas=datas.split(‘,’)
datas=[int(i) for i in datas[:-1]]
all_data=[]
a=[]
for n,data in enumerate(datas):
a.append(data)
all_data.append(a)
if (n+1)%3==0:
a=[]
all_data=[[i[0]/100,i[1]/100,i[2]] for i in all_data]
# li={‘dt’:all_data}
df = pd.DataFrame(all_data)
# df.to_csv(‘./res.csv’,encoding=’gbk’)
lat=[float(i[0]) for i in all_data]
long=[i[1] for i in all_data]
weight=[i[2] for i in all_data]
dataframe=pd.DataFrame({‘纬度’:lat,’经度’:long,’人数’:weight})
dataframe=dataframe.drop_duplicates(keep=’first’)
data1=dataframe[(dataframe.纬度.between(39.26,41.03)) & (dataframe.经度.between(115.25,117.30))]
import folium
from folium.plugins import HeatMap
map_data = data1[[‘纬度’, ‘经度’, ‘人数’]].values.tolist()
hmap = folium.Map(
location=[data1[‘纬度’].mean(), data1[‘经度’].mean()], #地图中心坐标
control_scale=True,
zoom_start=13 #地图显示级别
)
hmap.add_child(HeatMap(map_data, radius=5, gradient={.1: ‘blue’,.3: ‘lime’, .5: ‘yellow’,.7:’red’}))
hmap.save(‘shool9.html’)

Python碎片|matplotlib设置中文字体的三种方法

Python碎片|matplotlib设置中文字体的三种方法

matplotlib设置字体的方法

方法一

import matplotlib
font = {
‘family’:’SimHei’,
‘weight’:’bold’,
‘size’:12
}
matplotlib.rc(“font”, **font)

方法二

import matplotlib.pyplot as plt
plt.rcParams[‘font.sans-serif’] = [‘SimHei’] # 步骤一(替换sans-serif字体)
plt.rcParams[‘axes.unicode_minus’] = False # 步骤二(解决坐标轴负数的负号显示问题)

方法三

from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r”c:\windows\fonts\simsun.ttc”, size=14)
x = [1,2,3,4]
y = [3,2,1,3]
plt.plot(x,y)
plt.xlabel(“x轴标签”,fontproperties=font)
plt.show()

数据库|sql简介

数据库|sql简介

SQL介绍
SQL是结构化查询语言,是一种用来操作RDBMS(关系型数据库管理系统)的数据库语言,当前关系型数据库都支持使用SQL语言进行操作,也就是说可以通过SQL操作oracle,sql server,mysql等关系型数据库。

SQL语句主要分为

DDL语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象。
DML语句:数据操纵语句,用于添加、删除、更新、和查询数据库记录,并检查数据完整性
DCL语句:数据控制语句,用于控制不同数据段直接许可和访问级别的语句。
数据完整性
在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证,包括数据字段的类型、约束。

数据类型
常用数据类型
数值类型
日期时间类型
字符串类型
数值类型
整数类型 有符号范围 无符号范围
TINYINT(size) -128~127 0~255
SMALLINT(size) -32768~32767 0~65535
MEDIUMINT(size) -8388608~8388607 0~16777215
INT(size) -2147483648~2147483647 0~4294967295
BIGINT(size) -9223372036854775808~9223372036854775807 0~18446744073709551615
小数类型 描述
FLOAT(size,d) 带有浮动小数点的小数字。在括号中规定*大位数。在 d 参数中规定小数点右侧的*大位数。
DOUBLE(size,d) 带有浮动小数点的大数字。在括号中规定*大位数。在 d 参数中规定小数点右侧的*大位数。
DECIMAL(size,d) 作为字符串存储的 DOUBLE 类型,允许固定的小数点。(定点数类型)
字符串类型
字符串类型 字节大小 示例
CHAR(size) 0-255 char(3)输入’ab’,实际存储为’ab ‘,输入’abcd’,实际存储为’abc’
VARCHAR(size) 0-65535 varchar(3)输入’ab’,实际存储为’ab’,输入’abcd’,实际存储为’abc’
枚举类型
枚举类型英文为ENUM,对1255个成员的枚举需要1个字节存储;对于25565535个成员,需要2个字节存储。*多允许65535个成员。创建方式:enum(“M”,“F”);

日期类型
数据类型 描述
DATE() 日期。格式:YYYY-MM-DD注释:支持的范围是从 ‘1000-01-01’ 到 ‘9999-12-31’
DATETIME() 日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS注释:支持的范围是从 ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’
TIME() 时间。格式:HH:MM:SS 注释:支持的范围是从 ‘-838:59:59’ 到 ‘838:59:59’
YEAR() 2 位或 4 位格式的年。4 位格式:1901 到 2155。2 位格式:70 到 69,表示从 1970 到 2069
TIMESTAMP() 时间戳。格式:YYYY-MM-DD HH:MM:SS注释:支持的范围是从 ‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-09 03:14:07’ UTC
注意

decimal表示定点小数,如decimal(5,2)表示共存5位数,小数占2位。不写则默认为decimal(10,0)
char表示固定长度的字符串,如char(3),如果填充’ab’时会补一个空格为’ab ’
varchar表示可变长度的字符串,如varchar(3),填充’ab’时就会存储’ab’
对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径
枚举类型不区分大小写
约束
主键约束(primary key):它能够唯一确定表中的一条记录,也就是我们通过给某个字段添加约束,就可以使得字段不重复且不为空。
自增约束(auto_increment)
惟一约束(unique):此字段的值不允许重复
非空约束(not Null):此字段不允许填写空值
默认约束(default):当不填写此值时会使用默认值,如果填写时以填写为准
外键约束(foreign key):对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并抛出异常