ProtoBuff 介绍
【Protobuf】Pb GenerationConnection1.0 - XMPP协议XMPPXMPP(Extensible Messaging and Presence Protocol),是一种通信协议,用于即时消息传递和传递在线状态信息。
XMPP 有很好的安全性、可读性高、并且是物联网的标准协议,有更好的开放性和可拓展性。
XMPP 缺点
基于 TLS 握手和 SASL challenge,前后台握手交互次数太多(超过 8 次),握手时间太长。
包体是 xml 文本,虽然可读性高,但是包体比较大,信息载荷比低,带宽占用高。
Connection2.0 - PBPBPb(Protocol Buffers),是谷歌开发的数据描述语言,有更高的拓展性。
优点:
高效性: Protobuf 是二进制格式,因此它生成的数据通常比 XMPP 小很多,这使得 Protobuf 在网络传输中更加高效。同时,Protobuf 的解析和序列化速度也比 XMPP 快
体积小且数据结构清晰,pb 的消息是二进制协议,无法直接阅读,使用 pb 协议需要预先定义数据结构(.proto 文件):
...
【AWD】主机发现与端口扫描
【AWD】主机发现与端口扫描nmap端口扫描比赛时建议扫两次,如果结果相同,则可信。
12345678910# 扫描 ip 地址(mask为24全扫描)sudo nmap -sn 172.16.200.0/24# 端口扫描(指定速率,-p-表示全端口,默认 TCP)sudo nmap --min-rate 10000 -p- 172.16.200.131# 强制扫描 UDPsudo nmap -sU --min-rate 10000 -p- 172.16.200.131# 服务与环境扫描(-sV打印服务版本,-O打印操作系统信息)sudo nmap -sT -sV -O p-80,111,777,52497,40444 172.16.200.131# 使用内置脚本扫描漏洞sudo namp --script=vuln p-80,111,777,52497,40444 172.16.200.131
主机发现不能用 kali 和 nmap 的情况下,写BASH脚本,利用 ping 命令发现主机。
1234# -c表示数量,-W表示超时时间,指定开放的主机ip范围for i in ...
【配置教程】M2 Mac 配置 QT 的 MYSQL 驱动
【配置教程】M2 Mac 配置 QT 的 MYSQL 驱动经过了足足两天的折磨配置,博主终于配置好了 QT 的 mysql 驱动,不经感叹,QT 是不是和 mysql 有什么深仇大恨,这里记录一下整个过程,以免不时之需。
Mac 配置 QT我这里使用QT5,没有那么多问题,安装指令
12brew install qt@5brew install qt-creator
安装好之后打开 qt-creator,然后在 creator 里配置 qt 的环境,qt 的环境要找到刚刚安装好的 qt 目录,然后在里面找到 qmake,可以直接搜索去找,配置好后如下:
Kits 这里记得也要选上 Qt-version
配置 Mysql 驱动这一步是最折磨的,配置了足足一天半,首先我们使用 brew install 安装下来的 Qt 默认是没有 mysql 驱动的,只有 sqlite 的驱动,所以我这里的解决方法就是自己编译一个。
去qt 官网下载和自己版本一样的 qt 源码:
https://download.qt.io/archive/qt/
下载好后解压打开,进入目录 /qtbase/src ...
【算法】图论算法
【算法】图论算法图的基本表示方法已经在搜索算法那一节讲过了,在开头补充一个本节要用到的概念-度
对于无向图,一个点的度就是与这个点关联的边的个数,而对于有向图,分为出度和入度,出度就是离开这个点的边数,入度就是流入这个点的边数。
握手定理:各点度数之和等于边数的两倍。即对 $n$ 阶 $m$ 条边的图有
$$ \sum_i^nd(v_i) = 2m $$
接下来是常见的图论算法
拓扑排序基本概念拓扑排序是基于有向无环图的一种关联排序算法,经过拓扑排序后的序列,对于所有的有向边和对应的节点 u->v ,都有点 u 排序在点 v 的后面。
eg
拓扑排序不是唯一的,而且只要存在环就不存在拓扑排序,$n$ 个节点的有向无环图中,最多存在 $n!$ 个拓扑排序(离散点无边的情况),最少有 $1$ 种拓扑排序(完全有序的情况)。
算法流程拓扑排序的算法是基于图的度来进行的,基本的思想就是对于入度为 0 的点,就可以直接放到序列里,放到序列之后,将这个点的所有出边都删掉,然后又会产生新的入读为 0 的点。重复以上步骤直到所有点都被加入到序列当中。
如果算法过程中存在一个点没有加 ...
【算法】字符串
【算法】字符串基本操作c 中读取字符的函数为 getchar() ,他会读取任意单个输入的字符,用法 char ch; ch = getchar()。读取字符串的函数为 gets() 和 cin.getline(),它允许输入的字符串中存在空格,但不允许存在回车,因为gets()不会检查缓冲区溢出,所以是不安全的,在 C11 标准中已经被移除,getline()是 c++ 中的方法,相对安全。
一些常用的 string 类的库函数
12345678910#include<string>using namespace std;string str = "you are us";//查找字符串if((pos = str.find("you"))!=-1){ cout>>strlen(str); // 返回长度} string s("12345asdf");//获得字符串s中从第0位开始的长度为5的字符串string a = s.substr(0,5);
字典树字典树是一个树形数据 ...
【算法】高级数据结构
【算法】高级数据结构并查集并查集简要来说就是一个聚类操作,然后选区类里面的一个元素作为代表,用于将一类的元素划分到一个集合当中。
例题
并查集标程,并查集的构造需要三个核心功能:
初始化并查集
合并元素集合
查找集合代表元素
如何查有多少个集合:直接 for 循环遍历,查找有多少个 s[i]=i ,就有多少个集合
问2,查找,合并的复杂度是多少:合并操作的复杂度其实就是查找的复杂度,查找最坏情况下要遍历所有的节点,所以是$O(n)$
标程代码123456789101112131415161718192021222324252627282930313233343536373839#include<iostream>using namespace std;int s[5001];int n,m,p;void init(){ for(int i=1;i<=n;i++){ s[i]=i; }}int find_set(int x){ return x==s[x]?x:find_set(s[ ...
【算法】搜索技术
【算法】搜索技术大部分搜索技术都是基于图进行搜索的,这里先列出几种图的简单表示方式
邻接链表
邻接矩阵
暴力搜索搜索过程有两种常见的基础策略,分别是 DFS(深度优先搜索)和 BFS(广度优先搜索)
对于 DFS,深度优先,具体代码实现就要使用栈来实现,每次加入路径时,实现先进后出。对于 BFS,具体代码实现就要使用队列,先进先出的访问路径。
给一道例题,提供 BFS 和 DFS 的标程
标程例题
很简单的搜索题,这里没有卡时间空间,暴力搜索就可以了,具体代码实现时可以定义一个方向数组来方便搜索。
代码( BFS 和 DFS 的都在一起)
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485#include<iostream>#include<queue>#include<sta ...
【算法】动态规划
【算法】动态规划动态规划是一个递推的问题解法,每一步递推都会获得当前情况下的最优解,与贪心不同,会根据当前情况去更改策略,要使用动态规划必须满足一下几个性质:
最优子结构:大问题的最优解可以由小问题的最优解推出
重叠子问题:要求子问题很小,而且在求解当前子问题的时候不会产生新的子问题
无后效性:当前的最优解不会因为后面的求解而改变。
0-1 背包问题方法0-1 背包问题是个很经典的动态规划问题,对于下面这个问题:
上述问题可以证明贪心策略是不可行的(通过性价比去选取会忽略能够最大化利用背包空间的情况),使用动态规划的核心就是根据递推公式来维护一个动态规划表。
对于 0-1 背包问题,通常会选取背包容量作为纵坐标,选取物品个数作为横坐标,即 $P(i,c)$ 标识在容量为 $c$ 时,前 $i$ 个物品的最大价值,然后进行初始化,没有商品时 $P(0,c) = 0$,没选择商品时$P(i,0) = 0$:
我们从选择物品开始逐行遍历,当面对下一个物品时,无非只有两种选择:
选取这个物品,然后加上占用背包容量和价值
不选取这个物品
即只可能出现在当前点的左上 ...
【数字图像处理】 SRCNN 图像超分辨率
使用深度卷积网络实现图像超分辨率简介单图像超分辨率(SR)是从一张模糊的低分辨率图像创建出一张清晰的高分辨率图像的技术。这个过程在计算机视觉中既常见又复杂,因为低分辨率图像中的每个像素可以对应多种高分辨率版本。为解决这个问题,研究者们通常使用已知的信息来指导图像的高分辨率重建。
最新的一种方法是使用深度学习,特别是一种叫做超分辨率卷积神经网络(SRCNN)的技术。与传统方法不同,SRCNN不是通过学习和重复使用图像块的模式来提高分辨率,而是通过一个深度网络直接学习从低分辨率到高分辨率图像的转换。这个网络减少了需要的预处理和后处理步骤,并且能够在保持简单结构的同时,提供优于传统方法的图像质量。
SRCNN的另一个优势是它可以快速运行,即使是在普通的计算机CPU上也能实现实时处理。此外,随着训练数据集的扩大和模型结构的深化,SRCNN的性能还有进一步提升的潜力。它甚至可以同时处理彩色图像中的三个颜色通道,从而进一步提高图像的超分辨率效果。简而言之,SRCNN是一个更高效、更强大的图像超分辨率工具。
这篇论文的主要贡献有三个方面:
提出了一个全卷积神经网络用于图像超分辨率。这个网络直接学习 ...
【算法】贪心算法
【算法】贪心算法贪心算法在解决问题上的策略就是每次选取局部最优, 无论将来有什么结果, 这个选择都不会改变, 贪心算法能够获得近似最优解, 所以在使用贪心算法时要尝试去证明可行或者亲自去跑一下样例.
霍夫曼编码霍夫曼编码其实也是一种贪心策略, 霍夫曼编码在每次编码时都会对出现频数少的字符进行编码, 示意图:
通过每次对最少频数的字符编码来构造一颗霍夫曼树, 在最后高频词的字符就会被分配到短的二进制码.
例题:
题目就是霍夫曼编码的模板题, 优先挑选消耗体力少的果子合并, 避免重复对消耗体力多的果子合并.
这里要注意的是如何通过代码去构造霍夫曼编码, 用到的方法是 STL 中的 priority_queue , 构建一个小根堆, 每次合并完后 pop 掉合并的两个元素, 在 push 合并后的元素即可.
代码:
1234567891011121314151617181920212223242526#include<iostream>#include<queue>#include<vector>using namespace std;int main ...