centOS 配置使用 openvpn
1 install
1 | yum install openvpn |
2 config
在 /etc/openvpn 下建立目录,如 config/,用于存放配置文件,将服务器生成的证书、配置文件等放入其中。
3 run
1 | openvpn --cd /etc/openvpn/config --config client_a.open |
-
–cd 配置文件所在的目录,openvpn命令会先进入到此目录
-
–config 配置文件名称
1 | yum install openvpn |
在 /etc/openvpn 下建立目录,如 config/,用于存放配置文件,将服务器生成的证书、配置文件等放入其中。
1 | openvpn --cd /etc/openvpn/config --config client_a.open |
–cd 配置文件所在的目录,openvpn命令会先进入到此目录
–config 配置文件名称
在 C++ 中,可调用对象一般是指:
一个函数指针
一个重载 () 操作符的类对句(仿函数)
一个可被转换为函数指针的类对象
一个类成员函数指针
1 | #include <iostream> |
上例中的这些对象(func_ptr,foo,bar,mem_func_ptr,mem_obj_ptr) 均可称之为 “可调用对象”。相应的,其类型可被称作“可调用类型”。注意这里只有成员函数有成员函数指针而没有函数类型或函数引用类型,这是因为函数类型并不能直接用于定义对象,而函数引用或以看做一个 const 的函数指针。 可调用对象具有比较统一的调用形式,即使用括号操作(除成员函数指针),而定义的方法各不一样。这样我们在试图使用统一的方式保存,或传递一个可调用对象时,会十分烦琐。
std::function 是一个类模板,它可以容纳除了类成员(函数)指针之外的所有可调用对象。通过指定它的模板参数,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟调用它们。

python 为脚本自动化操作 Word 提供了可能。最为常用是 python-docx .使用它可以方便地创建或更新 Microfoft Word(.docx) files.
下图是其官网给出的一个使用 python-docx 创建的 word 文档的 Demo:
文档地址:http://python-docx.readthedocs.io/en/latest/index.html
github: https://github.com/python-openxml/python-docx
这是官网给出的代码:
1 | from docx import Document |
可以使用 pip 或 easy_install 来进行安装
1 | pip install python-docx |
也可以直接下载安装文件来进行安装:
1 | tar xvzf python-docx-{version}.tar.gz |
要求Python 版本在2.6 以上或 3.3 以上,lxml 版本在 2.3.2及以上。 在 Windows 10 / Python 2.7 环境下安装时出现 lxml3.7.2 安装失败的问题,可降低版本进行尝试:
1 | pip install lxml==3.4.2 |
1 | from docx import Document |
新建一个空的 word 文档。当然,也可以打开一个已存在的 word 文档,只要传入相应的路径就好。
1 | //version.h |
这个类提供了单独返回当前版本号的主、次、补丁版本号的的访问函数。它们返回各 define 定义的值。GetVersion 方法向用户返回友好的字符串版本号信息。 当用户相比较版本号时,他们通常不关心版本号本身,而是想知道某些特性在该版本的API中是否存在。HasFeature() 方法 不是告诉用户哪个版本的 API 引入了哪些特性,而是让亿们直接测试某个特性是否可用。
一般的大型项目通常会涉及到某种形式的分支策略,这需要同步开发、维护不同的软件版本发布。我们将讨论为项目选择分支策略和方针时需要考虑的一些事项。
每个软件都需要一条 trunk (主干)代码路线,它是

软件项目源码
的持久库。对于对于每次版本的发布
,可以从主干进行。每次新版本的开发,可以从主干的代码添加分支,而使主干的代码不受开发的影响而保持稳定。右图是一种常见的分支策略。
在API发布以后,对其所有的更改都应该表现为一个连续的过程,即不发布不兼容的非线性版本的API,一个版本的API应该是前一个版本功能的严格超集。在大型项目中,通常会有几条并行的代码分支在进行同时开发,这就会产生若干个并行维护的API版本。因此,工作在不同并行分支上的团队互不引入不兼容的特性是非常重要的。下列方法可以帮忙处理这种潜在的问题:
在c++11以前,我们获取当前时间的时间戳,需要借助于第三方库,如 boost ,或者针对不同的操作做不同的处理:
1 | #ifndef _MSC_VER |
而在c++11中,这个问题得到解决。 c++11 标准库中提供 chrono库,用来处理时间相关的数据。
duration 表示一段时间间隔。其原型:
1 | template <class _Rep, class _Period> |
_Rep 为一个数值类型,如 int, long, 用来表示时钟数的类型。 _Period 为一个默认的模板参数 std::ratio,表示时钟周期。 ratio的原型:
1 | template <intmax_t _Num, intmax_t _Den = 1> |
它表示一个时钟周期的秒数。_Num 代表分子,_Den代表分母,它们的比值就是一个时钟周期,可以通过调整分子与分母来表示任意一个时钟周期。如 ratio<1> 表示一个时钟周期为1秒,ratio<3600>表示一个时钟周期为1小时,ratio<1,1000>表示一个时钟周期为1毫秒,ratio<1,2>表示一个时钟周期为0.2秒,ratio<9/7>表示一个时钟周期为9/7秒。 标准库将一些常用的时钟周期做了定义:
1 | typedef ratio<1LL, 1000000000000000000LL> atto; |
在不同的时钟周期中,我们可以使用 chrono_cast 来进行转换。两个 duration还可以进行加减运算:
1 | #include <chrono> |
Homepage: http://www.python-excel.org/
Pip install:https://pypi.python.org/pypi/xlrd
在C++ 中,遍历一个容器的方法一般是这样的:
1 | #include <iostream> |
对STL比较熟悉的程序员肯定还知道在
1 | int main(void) |
这里借助了 auto 关键字和 lambda 表达式简化了操作。 std::for_each 比起前面 for 循环,最大的好处是不再需要关注迭代器的概念,而只需要关心容器中的元素类型即可。 但这两种方法,都必须显式的给出容器有开头和结尾(begin,end).这是因为上面的两种方法都不是基于范围(range)来设计的. 范围的概念在很多高级语言中都有涉及。例如下面这段 python 代码:
1 | arr = [1,2,3,4,5] |
在这种循环中,不再需要关心容器的两端,循环会自动以容器的范围进行展开。而且这种语法可以清楚地表明它的意义。使用这种方式进行循环无疑会使编码和维护更加简便。 现在,c++11 可有了基于范围的 for 循环:
使用 class 关键字来创建一个类。
1 | class ClassName: |
类的注释可由 ClassName.doc 来查看。class_suite 由类的成员、方法、属性组成
实例
1 | #-*- coding:utf-8 -*- |
init() 可以看作是类的构造函数。(其实类的构造函数是 new ,它是一个类方法 ,在类的实例初始化之前调用。init 实际是类的初始化函数)
self 代表类的实例,类的方法必须有一个额外的形参,按惯例它的名称为self,但在调用时不必传入该参数。
del() 是类的析构函数,在对象被销毁的时候调用。
要创建一个类的实例,可以调用该一特殊的函数来完成。该函数的名称为类的名称,参数为该类的 init()的参数。
1 | >>> from Student import Student |
还可以使用下列函数来访问属性:
getattr(obj,name[,default]) 访问对象的属性
hasattr(obj,name) 检查是否存在一个属性
setattr(obj,name,value) 设置一个改改。如果不存在,则创建之
delattr(obj,name) 删除一个属性

long long 数据类型,提供至少 64 位的整型数据。
C++11 推荐使用 nullptr 表示空指针,不再推荐使用 NULL 或 0 表示空指针。 NULL为从 C 语言中引进的,在 C 语言中一般被定义为宏:
1 | #ifdef __cplusplus |
在 C 语言中,可以将 void* 隐式转换为任意指针类型,而在 C++ 中,可以为任意类型的指针赋 0 值。所以 c++ 将 NULL 定义为 0. nullptr 是指针类型(nullptr_t),该类型的对象不允许转换到非指针类型。
是指值不会改变且在编译过程中就能得到计算结果的表达式。字面量属于常量表达式,使用常量表达式初始化的 const 对象也是常量表达式。一个对象或表达式是不是常量表达式要由它的数据类型和初始值共同决定:
1 | const int max = 1024; // max 是常量表达式 |
尽管 size 变量的初始化值是字面常量 ,但是它的定义数据类型是 int 而不是 const int 。 尽管 sz 定义为 const int ,但其值需要运行时才能得到,所以它也不是常量表达式。
C++11 中,允许将变量声明为 constexpr 类型,以便由编译器检查变量是否为一个常量表达式:声明为 constexpr 的变量一定是一个常量 ,且必须使用常量表达式初始化:
1 | constexpr int max = 1024; //是常量表达式 |
constexpr 可用于指示函数是一个常量表达式。这需要满足:
返回值类型是字面值类型
形参类型是字面值类型
函数体中必须有且仅有一条 return 语句
1 | const int* p = nullptr; //p 是一个指向整型常量的指针 |
这里的 p 和 q 本质是不一样的。指针 p 指向的整数是常量,而指针 q 本身是常量,其指向的整数则可以不是常量:
1 | *p = 5; //错误 ,p 指向的整数是一个常量,即 *p 是不可修改的 |
其中的关键在于constexpr把它所定义的对象置为了顶层const.
noexcept 指示一个函数不会抛出异常。如果一个使用 noexcept 修饰的函数内部抛出了异常,编译器并不会报错,但

](https://code.wandoer.com/wp-content/uploads/2016/11/http.jpg)概述
HTTP(HyperText Transfer Protocal)超文本传输协议, 是一个基于请求与响应模式的、无状态的应用层协议。它是 WEB 上应用最广泛的协议。它一般基于 TCP 的连接方式。其主要特点有:
支持 C/S 通信模式
简单快速。HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信快。
灵活。HTTP 协议允许客户端和服务端传输任意类型任意格式的数据。不同的类型由 Content-Tyoe 标记
面向无连接。无连接是指每次建立的连接只处理一个文请求。
无状态。无状态是指协议对于事务处理没有记忆能力。如果后续处理需要前面的信息,则它必须重传。这样可有导致每次连接传送的数据量增大。
URL(Uniform Resource Locator) 统一资源定位符,它包含了查找某个资源的信息。其格式如下:
1 | http://host[:port][abs_path] |
http 指定协议的名称,表示要通过 HTTP 协议来定位网络资源。 host 是一个合法的网络域名 或 IP 地址。 port 指定使用的网络端口,缺省值为 80 。 abs_path 指定请求的资源的 URI .如果 URL 中没有给出 URI, 则必须以 “/” 符号结束(这个工作通常由浏览器完成)。
浏览器与服务器联系的最常用方法是与服务器的 80 端口建立 TCP 连接。使用 TCP 的意义在于,浏览器和服务器都不需要担心如何处理长消息、可靠性与拥塞控制,这些事将由 TCP 来处理。 在早期的 HTTP1.0 中,连接建立起来后会在一个请求和一个响应后立即释放。因为那时的 HTML 很简单,基本只有文本,使用这种模式就够了。但是随着时代的发展,HTML里包含了太多的东西,使用单独的 TCP 来传递每个资源代价太大。于是 HTTP1.1诞生了,它支持持续连接(persistent connection),它可以在一个 TCP 连接上进行多次请求响应,还可以发送流水线请求。这种做法减少建立多个 TCP 连接所用的时间,减少服务器的空闲时间,提高了性能。
每个 HTTP Request (请求) 由一行或多行 ASCII 文本组成。其中第一行的第一个词为请求方法的名称,然后是请求资源的 URI,再后是协议的版本。这几个部分使用空格分开:
1 | Method Request-URI HTTP-Version CRLF |
Method 为请求方法,必须为大写。 Request-URI 是一个统一资源标识符。 HTTP-Version 表示请求的 HTTP 协议版本。 CRLF 表示换行符。 例如:
1 | GET about.html HTTP/1.1 |
常用的请求方法如下: