<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[NK_test的博客]]></title><description><![CDATA[大部分人愿意做任何事来逃避真正的思考]]></description><link>https://blog.csdn.net/NK_test</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; NK_test]]></copyright><item><title><![CDATA[基于protobuf service使用rpc入门教程]]></title><link>https://blog.csdn.net/NK_test/article/details/72682780</link><guid>https://blog.csdn.net/NK_test/article/details/72682780</guid><author>NK_test</author><pubDate>Wed, 24 May 2017 21:38:33 +0800</pubDate><description><![CDATA[protobuf简介什么是protobufProtocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言，类似于XML能够将结构化数据序列化，可用于数据存储、通信协议等方面。现阶段支持C++、JAVA、Python等三种编程语言。在解析速度、数据描述文件大小方面都相比xml有着很大的提高，同时，我们不用再写那些吃力不讨好的协议解析类的]]></description><category></category></item><item><title><![CDATA[Muduo 网络库源码分析 之 关键技术点总结]]></title><link>https://blog.csdn.net/NK_test/article/details/60615894</link><guid>https://blog.csdn.net/NK_test/article/details/60615894</guid><author>NK_test</author><pubDate>Fri, 28 Apr 2017 18:41:59 +0800</pubDate><description><![CDATA[最近又把muduo网络库仔细研究了一遍，收获良多。本文将对muduo中的设计思想以及关键的技术细节进行总结和分析，当然由于篇幅的原因这里更多的是对关键技术的简略提及，具体细节还需要读者自己去查找学习资料。muduo/base
Date类 
日期类的封装，使用Julian（儒略日）可以方便的计算日期差。具体公式和思想见 儒略日的计算
Exception类 
异常类的封装，对外提供what()输出错误信]]></description><category></category></item><item><title><![CDATA[从wireshark中学网络分析(二)]]></title><link>https://blog.csdn.net/NK_test/article/details/59491747</link><guid>https://blog.csdn.net/NK_test/article/details/59491747</guid><author>NK_test</author><pubDate>Thu, 02 Mar 2017 17:34:27 +0800</pubDate><description><![CDATA[在上一篇文章中提到了TCP的延迟确认，延迟确认并不一定能提高性能，在某些场景下，开启延迟确认甚至会严重降低网络传输性能。（一）下面列出几个开启延迟确认降低网络性能的场景：场景一：想象这样一个场景，服务端开启了延迟确认，客户端在同一时刻发送了9个TCP包，其中3、4、5号因为拥塞丢失了。那么传输过程中发生了以下事件：
  
  到达服务器的6、7、8、9号包触发了4个“Ack 3”，于是客户端快速重传]]></description><category></category></item><item><title><![CDATA[从wireshark中学网络分析(一)]]></title><link>https://blog.csdn.net/NK_test/article/details/56509688</link><guid>https://blog.csdn.net/NK_test/article/details/56509688</guid><author>NK_test</author><pubDate>Sun, 26 Feb 2017 17:34:07 +0800</pubDate><description><![CDATA[网络是很抽象的，但是在wireshark里面却又是相对直观的。这里我们列举了5个问题来进一步直观地学习TCP协议，并且从中了解分析网络性能的一般方法。
问题一：关于子网掩码和网关服务器A和B的网络配置如下：
A：
IP address： 192.168.26.129
Subnet mask: 255.255.255.0
Default gateway: 192.168.26.2
B:
IP addr]]></description><category></category></item><item><title><![CDATA[搭建基于openvswitch vxlan协议的多主机KVM虚拟机连接环境]]></title><link>https://blog.csdn.net/NK_test/article/details/53455675</link><guid>https://blog.csdn.net/NK_test/article/details/53455675</guid><author>NK_test</author><pubDate>Sun, 04 Dec 2016 18:43:00 +0800</pubDate><description><![CDATA[背景通过在物理机上启动多个KVM的方式可以用来模拟需要使用大量物理机的环境，并进行服务功能的一些验证。同一物理机上的KVM之间是可以进行通信的，但是不同物理机之间的KVM通信就需要使用openvswitch来进行连接。VXLAN(Virtual eXtensible Local Area Network)是一种将二层报文用三层协议进行封装的技术，可以对二层网络在三层范围进行扩展。VXLAN屏蔽了UD]]></description><category></category></item><item><title><![CDATA[2016小米在线编程题解]]></title><link>https://blog.csdn.net/NK_test/article/details/52882231</link><guid>https://blog.csdn.net/NK_test/article/details/52882231</guid><author>NK_test</author><pubDate>Fri, 21 Oct 2016 12:57:13 +0800</pubDate><description><![CDATA[题目一世界上有10种人，一种懂二进制，一种不懂。那么你知道两个int32整数m和n的二进制表达，有多少个位(bit)不同么？思路：很简单啊，异或操作，然后右移算出1的个数。class Solution {
public:
    /**
     * 获得两个整形二进制表达位数不同的数量
     * 
     * @param m 整数m
     * @param n 整数n
     * ]]></description><category></category></item><item><title><![CDATA[Effective C++ 简要条款分析（一）]]></title><link>https://blog.csdn.net/NK_test/article/details/52717784</link><guid>https://blog.csdn.net/NK_test/article/details/52717784</guid><author>NK_test</author><pubDate>Sat, 01 Oct 2016 22:57:44 +0800</pubDate><description><![CDATA[Effective C++ 简要条款分析（一）c++实在是一门深奥晦涩的语言，不同专业水准的程序员写出来的代码质量有着天壤之别，以至于必须出版一本图书提供一些“专家经验”来引导c++程序员写出更加高质量的代码。《Effective C++》就是这样一本书。建议你在有一定的代码积累后阅读这本书，这里我总结一些我读完有感触的条款，和大家一起分析。
  为驳回编译器（暗自）提供的机能，可将相应的成员函数声]]></description><category></category></item><item><title><![CDATA[CPU 负载观察和性能监测]]></title><link>https://blog.csdn.net/NK_test/article/details/52694143</link><guid>https://blog.csdn.net/NK_test/article/details/52694143</guid><author>NK_test</author><pubDate>Wed, 28 Sep 2016 22:55:39 +0800</pubDate><description><![CDATA[CPU负载和利用率CPU 的负载和利用率是两个不同的概念，但是他们都可以在top命令中查看。CPU利用率显示的是程序在运行期间实时占用的CPU百分比，而CPU负载显示的是一段时间内正在使用和等待使用CPU的平均任务数。CPU利用率高，并不意味着CPU的负载大。两者之间没有必然的关系。常用命令介绍：* uptime首先我们需要明白load average后面的三个数字代表什么，他们分别代表前一分钟，]]></description><category></category></item><item><title><![CDATA[使用Muduo完成数独和八数码问题求解服务器]]></title><link>https://blog.csdn.net/NK_test/article/details/51525015</link><guid>https://blog.csdn.net/NK_test/article/details/51525015</guid><author>NK_test</author><pubDate>Sat, 28 May 2016 21:08:50 +0800</pubDate><description><![CDATA[在剖析完Muduo网络库源码之后，我们试着完成一个高效的数独和八数码问题求解服务器。
先说说为什么要选择这两个问题？数独问题一直是陈硕老师很喜欢的问题，在muduo网络库中多次提到并有示例。八数码问题是我很喜欢的问题，所以在此综合完成求解数独和八数码问题的高效服务端程序。
编写这样一个看似简单的服务程序的技术含量远高于所谓的控件堆砌型开发，虽然有muduo网络库帮助我们处理网络事件，我们只需要]]></description><category></category></item><item><title><![CDATA[编译原理：LL(1)文法 语法分析器（预测分析表法）]]></title><link>https://blog.csdn.net/NK_test/article/details/51476663</link><guid>https://blog.csdn.net/NK_test/article/details/51476663</guid><author>NK_test</author><pubDate>Sun, 22 May 2016 20:54:31 +0800</pubDate><description><![CDATA[设计要求：对于任意输入的一个LL(1)文法，构造其预测分析表，并对指定输入串分析其是否为该文法的句子。
思路：首先实现集合FIRST(X)构造算法和集合FOLLOW(A)构造算法，再根据FIRST和FOLLOW集合构造出预测分析表，并对指定的句子打印出分析栈的分析过程，判断是否为该文法的句子。



指定文法：
//文法
E->TK
K->+TK
K->$
T->FM
M->*FM
M]]></description><category></category></item><item><title><![CDATA[C++ 捕获本机网卡的IP包并对其解析的实现]]></title><link>https://blog.csdn.net/NK_test/article/details/51347926</link><guid>https://blog.csdn.net/NK_test/article/details/51347926</guid><author>NK_test</author><pubDate>Sun, 08 May 2016 21:54:19 +0800</pubDate><description><![CDATA[编程要求：捕获本机网卡的IP包，对捕获的IP包进行解析。要求必须输出以下字段：版本号、总长度、标志位、片偏移、协议、源地址和目的地址。


TCP/IP协议定义了一个在因特网上传输的包,称为IP数据报(IP Datagram).这是一个与硬件无关的虚拟包,由首部和数据两部分组成.首部的前一部分是固定长度,共 20 字节,是所有IP数据报必须具有的.在首部的固定部分的后面是一些可选字段,其长度]]></description><category></category></item><item><title><![CDATA[python: 知乎大规模（34k）用户爬虫]]></title><link>https://blog.csdn.net/NK_test/article/details/51330971</link><guid>https://blog.csdn.net/NK_test/article/details/51330971</guid><author>NK_test</author><pubDate>Fri, 06 May 2016 14:51:25 +0800</pubDate><description><![CDATA[前些天学习python,完成了python练习册的大部分习题：https://github.com/Show-Me-the-Code/python（我的github上有习题代码，欢迎自取）。之后看到@salamer的一个python爬虫项目，觉得很不错。于是自己花了４天的时间完成了一个大规模爬取知乎用户信息的爬虫，由于个人网络原因，爬取12小时，获得了34k用户的信息（理论上可以爬全站的信息，可能]]></description><category></category></item><item><title><![CDATA[编译原理：C语言词法分析器]]></title><link>https://blog.csdn.net/NK_test/article/details/51245559</link><guid>https://blog.csdn.net/NK_test/article/details/51245559</guid><author>NK_test</author><pubDate>Mon, 25 Apr 2016 22:09:57 +0800</pubDate><description><![CDATA[编译原理的实验：完成对C++语言的词法分析


先说一下整体框架：
基类：Base  封装了一些基础的字符判断函数，如下：
int charkind(char c);//判断字符类型
	int spaces(char c); //当前空格是否可以消除
	int characters(char c);//是否是字母
	int keyword(char str[]);//是否是关键字
	in]]></description><category></category></item><item><title><![CDATA[Muduo网络库源码分析（六）TcpConnection 的生存期管理]]></title><link>https://blog.csdn.net/NK_test/article/details/51220204</link><guid>https://blog.csdn.net/NK_test/article/details/51220204</guid><author>NK_test</author><pubDate>Fri, 22 Apr 2016 15:29:13 +0800</pubDate><description><![CDATA[TcpConnection是使用shared_ptr来管理的类，因为它的生命周期模糊。TcpConnection表示已经建立或正在建立的连接，建立连接后，用户只需要在上层类如TcpServer中设置连接到来和消息到来的处理函数，继而回调TcpConnection中的 setConnectionCallback和setMessageCallback函数，实现对事件的处理。用户需要关心的事件是有限的，]]></description><category></category></item><item><title><![CDATA[Muduo网络库源码分析（五）Acceptor和TcpServer类]]></title><link>https://blog.csdn.net/NK_test/article/details/51165871</link><guid>https://blog.csdn.net/NK_test/article/details/51165871</guid><author>NK_test</author><pubDate>Sat, 16 Apr 2016 01:09:29 +0800</pubDate><description><![CDATA[首先，我们先提一下对Socket的封装（不复杂，所以简单说一下）。


Endian.h ： 封装了字节序转换函数（全局函数，位于muduo::net::sockets名称空间中）。
SocketsOps.h/ SocketsOps.cc ：封装了socket相关系统调用。
Socket.h/Socket.cc（Socket类）： 用RAII方法封装socket file descrip]]></description><category></category></item><item><title><![CDATA[Muduo网络库源码分析（四）EventLoopThread和EventLoopThreadPool的封装]]></title><link>https://blog.csdn.net/NK_test/article/details/51159979</link><guid>https://blog.csdn.net/NK_test/article/details/51159979</guid><author>NK_test</author><pubDate>Fri, 15 Apr 2016 13:34:02 +0800</pubDate><description><![CDATA[muduo的并发模型为one loop per thread+ threadpool。为了方便使用，muduo封装了EventLoop和Thread为EventLoopThread，为了方便使用线程池，又把EventLoopThread封装为EventLoopThreadPool。所以这篇博文并没有涉及到新鲜的技术，但是也有一些封装和逻辑方面的注意点需要我们去分析和理解。
EventLoopTh]]></description><category></category></item><item><title><![CDATA[Muduo网络库源码分析（三）线程间使用eventfd通信和EventLoop::runInLoop系列函数]]></title><link>https://blog.csdn.net/NK_test/article/details/51138359</link><guid>https://blog.csdn.net/NK_test/article/details/51138359</guid><author>NK_test</author><pubDate>Tue, 12 Apr 2016 23:59:56 +0800</pubDate><description><![CDATA[先说第一点，线程（进程）间通信有很多种方式（pipe,socketpair），为什么这里选择eventfd？


eventfd 是一个比 pipe 更高效的线程间事件通知机制，一方面它比 pipe 少用一个 file descripor，节省了资源；另一方面，eventfd 的缓冲区管理也简单得多，全部“buffer” 只有定长8 bytes，不像 pipe 那样可能有不定长的真正 buf]]></description><category></category></item><item><title><![CDATA[Muduo网络库源码分析（二） 定时器TimeQueue，Timer,TimerId]]></title><link>https://blog.csdn.net/NK_test/article/details/51057879</link><guid>https://blog.csdn.net/NK_test/article/details/51057879</guid><author>NK_test</author><pubDate>Mon, 04 Apr 2016 19:53:11 +0800</pubDate><description><![CDATA[首先，我们先要明白为什么需要设计这样一个定时器类？


在开发Linux网络程序时，通常需要维护多个定时器，如维护客户端心跳时间、检查多个数据包的超时重传等。如果采用Linux的SIGALARM信号实现，则会带来较大的系统开销，且不便于管理。

Muduo 的 TimerQueue 采用了最简单的实现（链表）来管理定时器，它的效率比不上常见的 binary heap 的做法，如果程序中大]]></description><category></category></item><item><title><![CDATA[连接两个链表的实现]]></title><link>https://blog.csdn.net/NK_test/article/details/51056798</link><guid>https://blog.csdn.net/NK_test/article/details/51056798</guid><author>NK_test</author><pubDate>Mon, 04 Apr 2016 15:38:59 +0800</pubDate><description><![CDATA[题目：
有以ha为头结点的链表，元素个数为m；以hb为头结点的链表，元素个数为n。现在需要你把这两个链表连接起来，并使时间复杂度最小，请分析并实现。
思路：
很简单的链表操作的题目，逆序头部插入，并将长度较长的一方接到较短的后面，时间复杂度为O(min(m,n))。
#include 
#include 
#include 
using namespace std;
typedef int]]></description><category></category></item><item><title><![CDATA[Muduo网络库源码分析（一） EventLoop事件循环（Poller和Channel）]]></title><link>https://blog.csdn.net/NK_test/article/details/51052539</link><guid>https://blog.csdn.net/NK_test/article/details/51052539</guid><author>NK_test</author><pubDate>Mon, 04 Apr 2016 00:05:33 +0800</pubDate><description><![CDATA[从这一篇博文起，我们开始剖析Muduo网络库的源码，主要结合《Linux多线程服务端编程》和网上的一些学习资料！
（一）TCP网络编程的本质：三个半事件
1. 连接的建立，包括服务端接受(accept) 新连接和客户端成功发起(connect) 连接。TCP 连接一旦建立，客户端和服务端是平等的，可以各自收发数据。
2. 连接的断开，包括主动断开(close 或shutdown) 和被动断开]]></description><category></category></item></channel></rss>