22-12-25更新

副标题设计

在站点配置文件_config.yml下更改 subtitle,但是在网页上找不到在哪

1
2
3
4
5
6
7
8
# Site
title: 盒盒のbox
subtitle: 没有奇迹,没有惊喜
description: ''
keywords:
author: 盒盒
language: zh-CN
timezone: Asia/Shanghai

在网上搜了一下说Mist主题作者把副标题隐藏了,所以换成Muse主题试一下
没有用又改回来了

给文章分类及打tag

在文章的最开头like this:

1
2
3
4
5
6
7
8
9
---
title: 搭建blog中遇到的一些小问题汇总
date: 2022-12-25
categories:
- hexo
tags:
- hexo
- blog
---

categories后面的就是文章的分类,好像一个文章只能有一个分类,tags后面的就是文章的tag,可以有很多个

今天就整这么多吧,摆了(

22-12-26更新

博文置顶功能

在需要置顶的文章的Front-matter中加上top: true即可,like this:

1
2
3
4
5
6
7
8
title: 搭建blog中遇到的一些小问题汇总
date: 2022-12-25
categories:
- hexo
tags:
- hexo
- blog
top: true

1、Adapter

1.1、 MVC模式的理解

一个商业程序通常由多人一同开发完成,比如有人负责操作接口的规划与设计,有人负责程序代码的编写,所以必须在程序的结构上做合适的安排

良好的程序架构师将程序项目划分为如图的三个部分

avatar

1.2、常用Adapter

常用的adapter有四个:BaseAdapter SimpleAdapter ArrayAdapter SimpleCursorAdapter

BaseAdapter:基础数据适配器,它的主要用途是将一组数据传到例如ListView等UI显示组件,继承自接口类Adapter,由于是基础类型,所以自由度高, 可以修改的地方多。

SimpleAdapter:简单适配器,系统自定义了一些方法,可以重写这些方法。

ArrayAdapter:数据和UI一对一,传入数据源和布局文件,完成显示。

SimpleCursorAdapter:指向性适配器,指向数据库,可以方便地把数据库的内容以列表的形式展示出来

好像又看拐了这个是安卓的

2、import和from……import *的区别

今天在看代码的时候看到了一个用法

1
from operator import *

当时在想如果*代表任意的意思的话那这么做和直接用import导入有什么区别,所以就去网上搜了搜,解答如下

import:导入一个模块(相当于导入了一个文件夹,在后面使用的时候需要使用相对路径),比如import os,在后面使用os中的函数的时候就要给程序说明是os这个模块中的某个函数,也就是os.xxx

from......import......:导入一个模块中的一个函数(相当于直接导入了一个文件,在后面使用的时候直接拿来用),比如from bs4 import Beautifulsoup,在后面使用Beautifulsoup的时候就可以直接用Beautifulsoup()

所以直接导入一个模块和导入模块中所有函数的区别就是在引用时是否需要路径的区别

3、langid语种检测

langid包能够识别97个不同的语种并返回他们的ISO 639-1编码,

阅读全文 »

还是看到什么写什么

1、format()方法的基本使用

<模板字符串>.format(<逗号分隔的参数>)

感觉这么说有点干,不如举个具体的栗子

1
a="{}顶针,鉴定为{}".format("一眼","纯纯的弱鸡")

很明显可以看出来format按照顺序将"顶针""纯纯的弱鸡"填到了前面的两个{}内,这样做的好处有什么呢

好处就是如果有隋唐测试,要求更改语句,我们不用去重新输入整条语句,只用改变format中的参数,就能创造一个顶针世界(bushi

format中也有参数的序号,同样以上面那个句子为例,我如果稍作改动

1
a="{0}顶针,鉴定为{1}".format("一眼","纯纯的弱鸡")

这样的输出结果跟之前的是一样的,但如果再把0和1交换位置,变成

1
a="{1}顶针,鉴定为{0}".format("一眼","纯纯的弱鸡")

这种情况下输出的语句就会有很大变化

warning:必须满足空格数对应参数数量时,才可以不加参数序号使用

format()另外的用处之——格式控制

{<参数序号>:<格式控制标记>}

填充 对齐 宽度 , .精度 类别
用于填充单个字符 <左对齐;>右对齐;^居中 设定输出宽度 数字的千位分隔符,适用于整数和浮点数 浮点数小数部分的精度或字符串最大输出长度 整数类型B,c,d,o,x,X浮点数类型e,E,f,%

可以随意选择这六个里面的一个或多个使用,注意在使用的时候按照表格所示顺序排列

详细解释

2、WebDriver

一个提供了各种语言环境的API来支持更多控制权和编写符合标准软件开发实践的应用程序,官方文档:概述 | Selenium

感觉像是前端的东西,不确定再看看

尝试着写了一个万宝楼抢东西的脚本,但是卡在了登录验证和购买验证这里,打算再试试淘宝抢相机

3、global全局变量

Python 关键字global全局变量详解

看到什么写什么

1、for index,value in enumerate(host_tr):

enumerate函数用于将一个可遍历的数据对象组合为一个索引序列,同时列出数据和数据下标,一般都用在for循环中

在这个例子中,enumerate(host_tr)之后的结果是((0,host_tr[0]),(1,host_tr[1]),(2,host_tr[2]),,,,,,,,),所以有index和value的循环

2、if __name__ == '__main__':

每次开启一个程序,都必须写一个主函数作为程序的入口,也就是我们常说的main函数

与Java、C、C++等几种语言不同的是,Python是一种解释型脚本语言,在执行之前不同要将所有代码先编译成中间代码,Python程序运行时是从模块顶行开始,逐行进行翻译执行,所以,最顶层(没有被缩进)的代码都会被执行,所以Python中并不需要一个统一的main()作为程序的入口。在某种意义上讲,“if name==’main:”也像是一个标志,象征着Java等语言中的程序主入口,告诉其他程序员,代码入口在此——这是if __name__==__main__:这条代码的意义之一。

__name__属性是python的一个内置属性,记录了一个字符串

  • 若是在当前文件,则__name__='__main__'

  • 若是导入的文件,__name__是模块名

一般来说开发人员会在模块的最后带有测试代码,为了不在导入模块之后测试代码被执行,就可以在测试代码前加上一条if __name__ == '__main__'

详细解释

3、代码(未完成)

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from lxml import html
import json
import requests
import sys

def GetInformationFromIpshu(ip: str) ->str:
try:
return requests.get(
'https://zh-hans.ipshu.com/ipv4/{}'.format(ip),
headers={
# 根据要爬的网站去按f12看具体的请求头
'accept-encoding': 'gzip,deflate'
# 'cookie':'*******'
# 'accept-language':'******'
# 'sec-ch-ua'
# 'sec-ch-ua-mobile'
# 'sec-ch-ua-platform'
# 'sec-fetch-dest'
# 'sec-fetch-mode'
# 'sec-fetch-site'
# 'sec-fetch-user'
# 'upgrade-insecure-requests'
# 'user-agent'
}
)
except Exception as e:
sys.exit(
print(e)
)

def get_info(ip: str) -> None:
r = GetInformationFromIpshu(ip)
maps = {}
if r.status_code == 200:
tree = html.fromstring(r.content)
host_tr = tree.xpath('//table//td')
k = ''
v = ''
if host_tr:
for index,value in enumerate(host_tr):
if value.tag == 'td':
print(value)
if value.xpath('/a'):
k = str(value.xpath('/a/text()')[0])
print(k)
elif k != '' and v != '':
maps[k] = v
v = ''
k = str(value.xpath('text()')[0])
print(k)
else:v += value.text.strip()
if value.tail.strip() != '':
v += ' ' + value.tail.strip() + ' '
print(v)
if index == len(host_tr) - 1:
maps[k] = v
pass
pass
pass





if __name__ == '__main__':
get_info('13.227.62.117')

4、json文件

JavaScript 对象表示法(JSON)是用于将结构化数据表示为 JavaScript 对象的标准格式,通常用于在网站上表示和传输数据(例如从服务器向客户端发送一些数据,因此可以将其显示在网页上)


Q1:在爬虫写请求头的时候,是在哪个网页按f12,如果是在请求页,在请求有变的时候会有影响吗?e.g.在上面的代码中请求头是在https://zh-hans.ipshu.com/ipv4/13.227.62.117界面按f12查看还是上一个搜索界面按f12查看还是都可以

Q2:在代码中我用xpath拿到了所有table属性的名为td的后代,但在输出的时候发现,由于原网页在某些字段上加了超链接,在输出时value的text值是一个空格,导致无法输出,而真正要输出的值在td下的<a>标签中,目前的思路是在value遍历host_tr的时候加上一个判断判断下面是否还有<a>标签,但是语法方面不太能够实现

2023-5-7 A2:检查输出,添加一个判断,如果输出的text值是一个空格,则取当前td元素下的a元素再提取文本,代码如下

1
2
3
4
5
k = str(value.xpath('text()')[0])
if k == ' ':
a_element = value.xpath('./a')
k = str(a_element[0].xpath('text()')[0])
print(k)

Q3:后续还有text值为空导致整个程序结束的bug,报错原因是IndexError:list index out of range

2023-7-5 A3:在网上查询后暂时的解决方案为使用try——except语句跳过空值,具体如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if host_tr:
for index,value in enumerate(host_tr):
try:
if value.tag == 'td':
if k != '' and v != '':
maps[k] = v
v = ''
k = str(value.xpath('text()')[0])
print(k)
else:v += value.text.strip()
if value.tail.strip() != '':
v += ' ' + value.tail.strip() + ' '
print(v)
if index == len(host_tr) - 1:
maps[k] = v
pass
pass
except IndexError:
continue
pass

git学习

1、初始化项目

进入新项目的文件夹并初始化项目,只需要

1
git init

2、创建一个github仓库

点击页面右上角的+符号,然后选择 “New repository”。给版本库起个名字,然后向下滚动并点击 “Create repository”。

3、一个文件被git跟踪的阶段

已经提交的阶段

一个文件的所有修改都已经被保存在本地的repo中时,该文件就处于提交(commit)状态。这种状态下的文件可以被推送到远程repo上

已修改状态

处于暂存(staged)状态的文件意味着可以被提交。在这种状态下,所有必要的修改已经完成,下一步就是把文件移到提交状态

文件——>暂存——>提交——>推送

提交是提交到本地,推送才是push到github仓库

4、如何在git中添加文件

使用以下命令:

1
git add .

如果想添加一个特定的文件(e.g. aboutyou.txt),也可以使用:

1
git add aboutyou.txt

这样的格式

添加完后文件就处于暂存状态,下一步就是提交

5、如何提交文件

使用如下命令:

1
git commit -m "first commit"

其中git commit告诉git所有被暂存的文件都已经准备好被提交了,-m "the first commit"是提交信息,m是信息的缩写,the first commit是具体的信息

现在文件就处于提交状态了

6、推送仓库到github

创建完仓库后浏览器会跳转一个页面,告诉你怎么在本地新建一个仓库或者推送现有仓库,跟着一步步把代码运行一遍就可以了

问题

1、在搭建机器人的时候,按照官网的步骤创建虚拟环境后用pycharm打开项目找不到环境(我就又在pycharm上重新创了一个)

有空研究下(

2023-05-22更新:

默认下载了pycharm并且安装好了poetry

先创建一个新的项目文件夹,进入项目文件夹并用pycharm打开,左下角选择终端,输入命令poetry init在已有项目中添加poetry管理,执行完后会发现项目根目录下出现了一个pyproject.toml文件,这就是poetry的配置文件

添加完poetry管理后,再用poetry添加虚拟环境,查询官方文档可知,通过配置参数可以把虚拟环境安装到项目文件夹下而不是C盘😡,具体代码如下

1
poetry config virtualenvs.in-project true
1
poetry env use python

添加完虚拟环境后用poetry env info查看虚拟环境

创建完虚拟环境后就是为当前项目使用这个环境,在pycharm的右下角选择添加解释器,找到刚刚创建的.venv/Scripts/python.exe并添加,再选择这个环境作为当前项目的解释器

最后poetry shell启动虚拟环境即可

SDN

[toc]

———————–2023-5-13

概述

历史->威胁->发展

三大主流SDN标准化技术:OpenFlow、Overlay(网络虚拟化叠加)&I2RS(路由系统接口)、NFV

NFV与SDN的基础都是通用服务器、云计算以及虚拟化技术

NFV与SDN存在互补性,二者相互独立,没有依赖关系

OpenFlow改变了网络结构——NetworkOS

定义和架构

SDN——软件定义网络

架构:ONF所定义的典型架构:应用层、控制层、基础设施层

南向接口:向下与设备交互的接口称为南向接口

北向接口:控制器向上为SDN APP提供的编程接口(API)就称为北向接口

​ SDN最本质的特征就是允许通过编程的方式控制网络

东西向接口:定义控制器之间通信的接口

基本概念——传统网络设备的数控分离

​ SDN数控分离:SDN主要特征之一

​ SDN网络可编程:另一个重要属性,主要体现在北向接口

SDN仿真基础

Linux系统

虚拟化

通过虚拟化技术将一台计算机虚拟为多台逻辑计算机

虚拟化架构

两种虚拟化方案:裸金属型、宿主型

Mininet软件

网络构建参数:

–topo

–switch:定义mininet要使用的交换机(默认使用OpenVSwitch交换机,即OVSK)

–controller:定义要使用的控制器

–mac:自动设置设备的mac地址

内部交互命令

net/nodes/links/pingall

net:显示链接信息

nodes:节点信息

links:链路健壮性信息

pingall:验证所有主机间通信

iperf:两节点间进行带宽测试

iperfudp:同上

link:禁用或开始节点间链接

dpctl:所有交换机上增删改查流表

Mininet可视化

直接在界面上编辑任意拓扑

启动miniedit

进入mininet/examples

1
./miniedit.py

Miniedit拓扑建立

Miniedit属性配置

Miniedit全局配置

左上角edit选项

Miniedit运行

左下角run

Miniedit保存脚本

File-Export Level 2 xxxxxxx(来不及)

脚本执行

chmod -R 777 sdnlab.py

./sdnlab.py

SDN平面

硬件路由器数据平面

主控板

组成:CPU,X86通用处理器芯片

路由器操作系统

管理员命令行操作平台

背板

功能:设备板卡间总线:数据总线,控制总线,管理总线

集群机柜间总线:设备间互通总线

总线架构:多级Clos架构(无阻塞、理论无限扩展)

接口板

组成:光模块

中低性能ASIC芯片或FPGA芯片处理器

功能:实现光电转换

上报主控板接入状态

线卡板

数据平面/控制平面最重要的部分

分上下行两部分板卡

PULL型交换调度算法

POP型交换调度算法

软件路由器数据平面

Click

c++编写,基于Linux实现

SDN数据平面

OVS简单架构

用户数据空间和内核

管理层

vswitched

OVS的核心模块

通过vswitched可以配置一系列特性

OVS下的快速交换转发通道

OVS下的慢速交换转发通道

看到别人在qq调教自己的机器人有点心动也想自己搭一个

网上搜到了mirai框架,下面是他们的开发文档

Mirai | mirai (mamoe.net)

官方文档的搭建教程:Mirai - Console Terminal | mirai (mamoe.net)

ariadne社区文档的搭建教程:Mirai 的安装与配置 | GraiaX 文档

感觉社区文档的更清楚一点,我就跟着社区文档走了

mirai部分搭建就几个步骤:
1.安装java11

打开cmd

1
winget install Microsoft.OpenJDK.17

2.下载解压mcl

下载地址:https://github.com/iTXTech/mirai-console-loader/releases/download/v2.1.0/mcl-2.1.0.zip

不会有人不会解压吧

3.安装mah插件并配置mah信息

进到上一步解压出来的文件夹中先双击mcl.cmd运行,然后shift+右键,然后选择启动Windows powershell:

1
2
./mcl --update-package net.mamoe:mirai-api-http --channel stable-v2 --type plugin
./mcl -u

image-20221228151545140

这样就是成功了

image-20221228152231637

登录账号试试,不建议按照教程设置自动登录,因为每次登录要验证,会增加风险

登陆时弹出界面要验证

image-20221228152709301

复制url到浏览器打开,先别急着验证,按f12打开开发者工具,选择网络一栏,再回去验证

复制得到的ticket到下面一栏按回车

image-20221228153912749

这样就是成功了

CTRL+C退出服务,接着去配置mah

配置完出了点问题(暂时不知道寄在哪)先往后做着吧

插一嘴

记得安装poetry

跟着教程走,要致富,先撸树!

忙了一下午终于

image-20221228181423079

我的8080端口被占用了

找了半天的bug

虽然没干什么事但是累死了

2022-12-29更新:

安装saya

saya可以帮助管理机器人中不同的功能,就像是往里打mod,saya就是mod管理器

来一点文件头()

1
2
3
4
5
6
7
8
9
10
11
from graia.ariadne.app import Ariadne
from graia.ariadne.event.message import GroupMessage
from graia.ariadne.event.message import FriendMessage
from graia.ariadne.message.chain import MessageChain
from graia.ariadne.model import Group
from graia.ariadne.model import Friend

from graia.saya import Channel
from graia.saya.builtins.broadcast.schema import ListenerSchema

channel = Channel.current()