自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

李树花开,风中摇曳

吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。

原创 quagga相关代码的阅读

最近的工作涉及到了rip和ospf两个相关的协议,虽然仅仅是修两个bug,但是个人还是对这两个协议是如何实现的产生了很浓厚的兴趣。因此,就抽了一段时间读了一下quagga的源码。相比于我之前读的ovs相关的代码,quagga的代码简单了不少,毕竟可供参考的资料太多了。大致花了一个月的空闲时间读完了rip和ospf的源码(其他协议没用到,也就没有读了)。真的如果静下心来的话,估计10来天就够了。...

2019-10-04 16:09:56 287 5

原创 8021x认证以及portal认证的参考资料

最近几个月一直在阅读和认证相关的东西,到如今,也基本上将认证的流程摸得比较清楚了,所以在这里写一篇文章,记录一下自己的心得,同时也给希望了解这些认证的同学一些参考资料。(说实话,在没有别人的帮助下,自己一个人去琢磨各种代码是很痛苦的一件事情,我就是这么过来的。)认证的本质简单一点来说,所谓认证,指的是控制终端(sta)的访问权限,在sta没有通过认证的情况下,不让其访问网络资源,只有当sta通...

2019-07-14 20:00:40 504

原创 怎么样来读ovsdb的源码?

ovsdb数据库是NOSQL数据库的一种,大部分人应该都没有听说过这个数据库。虽然这个数据库默默无闻,但是它在交换机以及云计算这两个方向上占据了比较重要的地位。本人所在的公司恰好也用到了这个数据库。平时虽然经常使用这个数据库,但是关于这个数据库是如何来实现的,还真是不清楚。所以在工作之余,心里就产生了读一读它的源代码的想法。说干就干,直接从github下载了源代码,放到了机器上,编译出来了程序...

2019-02-02 15:56:59 540 5

原创 visio中图形旋转任意角度

这是一个非常简单,但是某些时候又非常有用的技巧。 你可能或说,直接按住旋转按钮即可,如下图: 这个技巧大部分时间可用,但是做不到很高的精度,如果你需要更加精细的控制,有下面的办法。废话不多说,一图胜千言。

2018-01-16 17:17:07 9284 5

原创 没事,就想瞎写一下

好吧,好长时间没写过总结了,今天可能是一个新的阶段的开始,所以我就记一篇流水帐吧,记录一下这一段时间做的事情.很遗憾,也很惭愧,这两周,真心没干什么有意义的事情,本来想读一下protobuf的源码,但是我没有用过这东西,干读的话,读不动.另外,总体上来说,我放荡了大致有两个星期了,现在想一想,实在不应该,以前沉迷于读书编码的时候,中间总是夹杂了非常多的杂事,老是觉得时间太少,不过反而是那段时间

2018-01-10 16:46:02 1157 3

原创 numpy的unwrap函数

最近处理相位角的时候用到了这个函数,所以在这里稍稍用一点篇幅来记录一下我的理解.unwrap函数究竟是用来是用来干什么的呢?它是用来解卷绕的.至于什么是卷绕,网上的说法是: 要计算一个系统相频特性,就要用到反正切函数,计算机中反正切函数规定,在一、二象限中的角度为0~pi,三四象限的角度为0~-pi。 若一个角度从0变到2pi,但实际得到的结果是0~pi,再由-pi~0,在w=pi处发生跳

2017-12-15 14:16:46 4604

原创 RedBase点滴

RedBase是斯坦福数据库课程的一个Project,在网上找不到最初的代码,不过在github上有这个project的成品.很多大牛在推荐数据库实现的时候,大抵都会推荐一下这份源码,所以我就将代码clone了下来,准备动手来处理一下这些代码.总而言之,就我得到的代码而言,这份源代码的质量真不敢恭维,看着看着我就坐不住了,忍不住想将这份糟糕的成品重构一遍,所以没有什么废话,直接就动手了.这个Pro...

2017-11-04 21:54:52 2656 4

原创 lower_bound以及upper_bound

lower_bound以及upper_boundSTL中实现了这两个算法,但是代码看起来非常晦涩,如果要快速写出这两个算法的话,参照STL的实现,恐怕会非常费劲.这里,我提供一种非常简洁的实现.代码仅供参考.lower_bound给定一个有序数组 vals, 寻找 vals 中第一个为 k 的值的下标,没有找到的话,返回 -1. 举个栗子, vals = [0, 1, 1, 1, 2, 3], 那

2017-08-21 23:07:44 505

翻译 如何实现STL中的next_permutation函数?

问题,实现 STL 中的 next_permutation() .回答来自stackoverflow:先让我们来看一些排列:1 2 3 41 2 4 31 3 2 41 3 4 21 4 2 31 4 3 22 1 3 4...我们如何从一个排列转移到下一个排列呢?首先,让我们用另外一个角度来看待这个问题.如果将排列中每个元素视作一个数字(当然这里就是数字,但是元素是’a’, ‘b’的

2017-08-13 17:40:01 627

原创 二叉树的遍历

二叉树的遍历二叉树是一种常见的数据结构,对于这种结构的操纵一定要烂熟于心,这篇文章想记录一下的,是二叉树的遍历操作.实现的方式二叉树的遍历,事实上有两种是实现方法,一种是递归,这种方法过分简单,所以这里不会讲,第二种方式是非递归,你可能会问,既然递归实现这么简单,我们为什么还要非递归版本的实现,这个问题很好,这个实际上和递归的内存开销有关,每一次递归,程序便要堆栈,每次堆栈,便会占用比非递归昂贵得多

2017-08-13 17:37:00 528 5

翻译 leetcode -- Single number

Single number I给定一个整数数组, 数组中的每个数都出现了 2 次,除了一个数, 它只出现了 1 次,请将它找出来.思路位操作 ^ 有着非常漂亮的性质,首先,它支持交换律:A ^ B = B ^ A其次,它还支持结合率:A ^ B ^ C = A ^ (B ^ C) = (A ^ B) ^ C然后, ^ 本身具有这样的语义:A ^ A = 0, A ^ 0 = A我们可以很清楚地知道:

2017-08-05 02:53:06 337

原创 子集生成算法

子集生成算法属于暴力法中一类非常重要的算法.题目描述给定一个集合,请写一个算法,得到其所有的子集.这里假定该集合不存在重复的元素.举个栗子,给定集合[1, 2, 3], 你返回这样一堆子集:[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]如果我们将集合中每个数对应的位置对应到所在位向量法根据离散数学的知识,我们可以知道,一个长度为 n 的集合的

2017-07-09 01:03:07 1259

原创 leetcode -- Combination Sum

这是一套非常有意思的套题,我想在这里总结一下个人的心得.一. Combination Sum给定一组没有重复的,候选的数字 C ,以及一个目标数字 T ,找到在 C 中所有的组合,使得该组合的和为 T.在 C 中的每一个数字可以重复无数多次.注意:所有的数字,包括 T, 都为正数.最终输出的方案中不应该包含重复的组合.举个栗子,给定 C 为 [2, 3, 6, 7] , 以及 T 7.可以得到

2017-06-23 00:42:59 461

原创 leetcode -- Word Break

题目描述给定一个非空的字符串s以及一个包含了很多非空词语的字典,判断s是否能够拆解为一个以及多个词典词语,你可以假定,字典中不会包含重复的词语.下面是一个例子:s = "leetcode",dict = ["leet", "code"]这个例子应该返回true,因为leetcode可以被拆解成为leet code.题目扩展给定一个非空的字符串s和一个包含了很多非空词语的字典,在s中添加空格来构建一

2017-06-19 00:37:08 446

原创 leetcode -- Unique Binary Search Trees

题目描述给定一个n,我们可以构建多少棵二叉搜索树呢?使用值1~n填充树的节点.举个例子,如果n=3,那么一共会存在5棵这样的树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \

2017-06-17 23:00:25 308

转载 tcpdump抓包命令

我并没有写这些东西,我做的事情仅仅是将网上的一些东西整合了起来,然后删掉了一些不常用的命令,仅此而已.tcpdump抓包命令tcpdump是一个用于截取网络分组,并输出分组内容的工具。tcpdump凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具。tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdu

2017-06-12 21:50:57 3168

转载 TUN/TAP设备浅析(三) -- TUN/TAP设备的应用

上一篇文章主要讲述了TUN/TAP设备的一些原理,你可能会好奇,TUN/TAP设备究竟有什么用处呢?所以这篇文章,我想用一些实际的例子来回答这个问题。例子源自陈硕老师的博客,博文中关于TUN/TAP设备的使用非常典型,对原文感兴趣的同学可以查看这里:http://blog.csdn.net/solstice/article/details/6579232背景:在一台 PC 机上模拟 TCP 客户端程

2017-06-12 21:41:14 2772

原创 TUN/TAP设备浅析(二) -- TUN/TAP的编程

这篇文章想详细阐述一下有关于 TUN/TAP 设备的编程。其实关于这两种设备的编程,基本上属于八股文,大家一般都这么干。启动设备之前有的linux 并没有将tun 模块编译到内核之中,所以,我们要做的第一件事情就是检查我们的系统是否支持 TUN/TAP 。具体如何检查和解决,请查看这里http://blog.csdn.net/lishuhuakai/article/details/70305543,

2017-06-12 21:37:27 3853

原创 TUN/TAP设备浅析(一) -- 原理浅析

TUN/TAP设备浅析TUN设备TUN 设备是一种虚拟网络设备,通过此设备,程序可以方便地模拟网络行为。TUN 模拟的是一个二层设备,也就是说,通过它可以处理来自网络层的数据,更通俗一点的说,通过它,我们可以处理 IP 数据包。先来看看物理设备是如何工作的:上图中的 eth0 表示我们主机已有的真实的网卡接口 (interface)。网卡接口 eth0 所代表的真实网卡通过网线(wire)和外部网络

2017-06-12 21:34:56 15882 1

原创 一个简易的基于tun/tap设备的协议栈

从上一次准备开坑开干,到现在初步完成,已经过了一个半月了,造一个轮子确实是非常耗时耗力的一件事情,但是不管怎样,我终究还是做完了,完成了当初的目标,虽然代码还有非常多值得改进的地方,但是现在已经不是很着急了,一步一步慢慢来吧,接下来的一段时间里,我会将这个协议栈背后涉及到的一些知识贴成博文,但是我不会去讲实现,没有任何意义.自己去读吧,代码非常简洁.接下来一直到毕业,估计都很难像这个学期一样,花上这

2017-05-27 13:49:30 1154

原创 使用ioctl函数打开tun设备时遇到的问题--operation not permmitted!

最近在写一些很重要的东西,但是流年不利,总是遇到很多很多问题,这不,上篇文章刚解决了如何安装tun模块的问题.还没有得瑟多久呢,立马踩到坑了,我用c编码时,试图打开虚拟的tun设备的时候老是出现这个玩意.确定你的设备存在tun模块之后,你用下面的命令建立一个设备文件:mknod /dev/net/tun c 10 200参数c表示是字符设备,10和200分别是主设备号和次设备号.接下来,我们可以测试

2017-04-23 14:02:29 2456

原创 Ubuntu 16.04虚拟网络设备tun安装

Ubuntu 16.04虚拟网络设备tun安装最近编写网络程序,需要用到tun模块,但是官方给的发行版中压根就没有这个模块.不信的话,你可以测试一下:root@ubuntu:~# modinfo tunmodinfo: ERROR: Module tun not found.当然,如果你测试的结果是这样的:root@ubuntu:~# modinfo tunfilename: /li

2017-04-20 21:23:06 8198 4

原创 开坑了...

前段时间初步完成了一个简易版yacc的编写,我原本以为这个东西会花费我三个月到五个月的时间,但是很不幸,没有,一个多月就吭哧吭哧写完了,代码量也不大,2000多行,即使自己实现一个正则表达式引擎来做词法分析,总体的代码量也不会超过5000行.没有小型的项目支撑的话,日子真是太无聊了,光刷那些算法真的是很没有意思,所以最近一段时间准备再入一个坑,那就是实现一个简易的tcp/ip协议栈.flag已经立好

2017-04-18 12:42:09 727 4

原创 一个简易的语法分析器

写一个Parser其实是很简单的一件事情.你之所以会觉得困难,是因为你对这个东西并没有足够深入的了解.又或者说,你被龙书上那堆深奥的理论吓到了.如果你某一天头脑发热,想写一个Parser了,我推荐给你一些好东西,首先是轮子哥的博客http://www.cppblog.com/vczh/archive,我是看了他写的三篇关于正则表达式的实现的文章,撸了一个正则表达式引擎之后,突然一下子知道了Parse

2017-04-12 11:19:35 1651

原创 N皇后问题的位移解法

N皇后问题以八皇后为例,在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,皇后可以在其所在位置的对应的行,列,对角线,反脚线上发动攻击,请问一共有多少种摆法.如果我们将这里的8拓展一下,变成N,那么这个问题就变成了N皇后问题. 算法 下面是算法的高级伪码描述,这里用一个N*N的矩阵来存储棋盘: 1. 算法开始, 清空棋盘,当前行设为第一行,当前列设为第一列; 2. 在当前行,当

2017-03-03 20:25:01 691

原创 python单元测试

说实话,我写了这么久的代码,真正写起来让人感觉非常舒爽的语言,不多,python算是一门,和其他强类型的语言相比,python是在是灵活的很,编码的各种范式你都可以用,缺点也显而易见,就是太灵活,有时候错误是埋藏在深处的,你很可能一不小心在你的代码里就埋下了雷区,强类型的语言可能还会给你检查一下这种类型有没有这个方法,这个属性,python你没法检查,没人知道你传入的是个什么,所以,为了保证代码的

2017-01-11 00:10:30 501

原创 scikit-learn点滴

scikit-learn点滴scikit-learn是非常漂亮的一个机器学习库,在某些时候,使用这些库能够大量的节省你的时间,至少,我们用python,应该是很难写出速度快如斯的代码的.scikit-learn官方出了一些文档,但是个人觉得,它的文档很多东西都没有讲清楚,它说算法原理的时候,只是描述一下,除非你对这种算法已经烂熟于心,才会对它的描述会心一笑,它描述API的时候,很多时候只是讲了一些常

2017-01-02 17:12:27 3366 2

转载 直接聚类法的代码实现

作者: peghoty 出处: http://blog.csdn.net/itplus/article/details/10088283 上面的图片大致介绍了直接聚类法的基本原理,但是没有给出实现代码,我这里给出一份吧.使用python语言实现:""" 目标: ~~~~~~~~~~~

2016-12-31 16:51:53 1164

原创 numpy点滴

numpy点滴这篇博文会陆陆续续更新的,因为numpy这个东西,还是熟一点的话,会更加得心应手.约定后面的东西中,都已经假设我们做了如下的导入:import numpy as np1. 构建一个对称矩阵其实并没有很好的办法,但是我们可以通过几个命令的组合来构建一个对角矩阵,举个栗子,假设我们有这样一个矩阵:In [88]: a = np.arange(9).reshape((3, 3))In [89

2016-12-31 14:25:41 465

原创 python3字典排序

python3 字典排序说实话,对字典进行排序,这个说法本身就有问题,实际上,你无法对操纵字典说,字典,在你的底层实现里,你就得按照我指定的顺序来排列,如果这样的话,字典就丧失了它的速度优势,它也不是一个字典了.好了,废话不多说,我这里稍微记录一下我的做法吧.python2里面原来是有dict.iteritems这样一个函数的,但是在python3里面给消除掉了,dict.itemitems实际返回

2016-12-30 19:54:23 15990 1

原创 基于图像形状的一种比较漂亮的分类算法

我首先讲一下我所遭遇到的情况吧:有n类似于下图的图片:我这里有一个需求就是,将这些图片分类,分类的效果至少也应该是这样的:将一些形状非常类似的图片分在一起.我大致查阅了一下挺多的分类算法,这些算法大致分为了两类:一类是通过对分类器进行训练,比如说要识别猫,那就要喂给分类器非常多的猫的图片,得到一些参数之后才能够比较精确地对图片进行识别.当然,这一大类

2016-12-11 15:29:52 6014 2

原创 开始读redis的源码了

Redis是一个很简单的nosql类型的数据库,代码量相对来说是比较少的.但是代码风格确实比较漂亮.我打算花一段时间剖析一下它的代码,不光是看啦,看的话,收获是不大的.我打算从Redis那纷繁复杂,令人眼花缭乱的代码里剥出一个单机的数据库,能够运行的,但是没有那么多的错误处理代码,这样以来既可以学到作者的代码风格,也可以看到如何来实现一个数据库,同时还可以学习网络编程,确实是一举多得的

2016-11-24 15:54:03 9368 5

原创 一起来写ftp server 03 -- 加强版本

这一次的版本我们在第一版的基础上添加了一些有意思的东西,增强了我们的功能.下载限速和上传限速代码的实现里有一些很有意思的地方,下载限速和上传限速就是其中一例,这些东西听起来非常高大上,可是如果你真的做了的话,会发现这些东西真的也就是这样.限速的原理很简单,如果发现下载速度过快,那么我就休息一下,不下那么快,这样速度就降下来的.上传同理.SpeedBarrier/* 下载或者上传速度限制器 */cl

2016-11-15 22:42:38 795

原创 一起来写ftp server 02 -- 一次失败的尝试

上一个版本之中,最基本的功能已经实现了,但是可以明显地看得到, CmdHandle这个类过大,而DataHandle这个类又过小,所以,我想平衡一下,将CmdHandle这个类的数据传输部分分散至DataHandle这个类中,起先并没有想太多,只是想这么来干一下.这里需要注意一下的是,CmdHandle和DataHandle两个类的代码分别在两个进程中执行.不过,写着写着,我发现,这个想法是很愚蠢的

2016-11-15 21:59:35 855

原创 一起来写ftp server 01 -- 简易版本

一些坑,踩了就好了.写这个ftp server只是为了练一下手,写这种文章只是想记录一下我在编写这个ftp server的过程中的一些想法和收获.虽然编写这个玩意有点耗时,但是有一些坑,你不踩,你永远都不知道.我们应该用什么样的方式来实现我们的程序?这是一个老生长谈的问题,使用多线程,多进程还是别的什么方式?鉴于我们已经有了一个web server的经验,我们自然会想,可不可以采取多线程的方式来处

2016-11-15 21:27:58 2964

原创 一起来写web server 09 -- 最终版本

这次的代码是在前一次代码的基础上做一些点滴的修改.实现更好的封装,更漂亮的抽象.同时也是我们这个web server的最后一个版本了.这次的版本应该修改的幅度是最大的.EPOLLONESHOT 即使我们使用ET模式,一个socket上的某个事件还是可能被触发多次,这个并发程序中就会引起一个问题,比如说一个线程(或进程,下同)在读取完某个socket上的数据后开始处理这些数据,而在数据处理的过程中

2016-11-04 14:37:44 1064 1

原创 一起来写web server 08 -- 多线程+非阻塞IO+epoll

到了多线程,一些东西就变得耐人寻味了.这个版本是在前面单线程epoll的基础上引入了线程池,当然不是前面玩具一样的线程池,而是一个通用的组件,生产者消费者队列.生产者消费者队列生产者消费者问题是操作系统中一个很经典的同步互斥问题,已经有了很不错的解决方案,将它的解决方案拓展一下,就可以用于我们的实践啦.我自己写了一个生产者消费者的队列,然后发现muduo中已经内置了这种模型,而且使用起来比我写的更

2016-11-04 10:24:11 980

原创 一起来写web server 07 -- 单线程非阻塞IO加强版本

这次的这个版本相对于前面的第6个版本有些许加强,那就是将epoll由LT模式变成了ET模式. 对于采用了LT工作模式的文件描述符,当epoll_wait检测到其上有事件发生并且将事件通知应用程序后,应用程序可以不立即处理该事件,这样,当应用程序下次调用epoll_wiat时,epoll_wait还会向应用程序通告此事件,直到该事件被处理.而对于采用ET工作模式的文件描述符,当epoll_wait

2016-11-04 09:24:46 759

原创 一起来写web server 06 -- 单线程非阻塞IO版本

阻塞IO的效率是在是低下,你如果要写高性能的web server的话,你必须使用非阻塞IO.非阻塞IO的读写在谈到非阻塞IO之前,必须先谈一谈阻塞IO,在网络编程中,我们假设有一个监听套接字的sockfd,这个sockfd是你调用了socket,listen, bind这一大票的函数得到的一个文件描述符.其实它默认就是阻塞的,具体的表现是:使用accept函数监听sockfd时,如果没有连接到来,

2016-11-04 08:44:04 1954 1

原创 一起来写web server 05 -- 多线程进阶版本

这个版本的web server比第4版稍微做了一点改进,那就是由主线程统一接收连接,然后连接的处理由子线程来完成.因此,这里就引入了条件变量以及同步互斥的问题.同步机制muduo库中有一个关于同步机制的封装,我这里就直接采用了.我这里来介绍一下这个封装吧.下面是Conditon这个类的代码:class Condition : noncopyable{ private: Mu

2016-11-04 01:22:23 563

提示
确定要删除当前文章?
取消 删除