我们公司的VPN用的是Pulse Secure + MOTP(一种动态口令验证)。目前只有在Windows系统和MacOS系统中才能连接成功;在Linux系统上,由于MOTP的存在,Pulse Secure总是连接不上。还好,平时为了使用只有Windows下才有的一些软件,我的Linux上一直都有VirtualBox的Win7虚拟机。折腾好久之后,最后终于摸索出一种基于VirtualBox的Win7虚拟机连接的VPN的方法:通过VirtualBox Win7虚拟机来进行Pulse Secure VPN的连接,再通过ICS将VPN连接共享给Linux系统使用。
HTTPS and OpenSSL
Format JSON with Python
现在以json为数据传输格式的RESTful接口非常流行。为调试这样的接口,一个常用的办法是使用curl命令:
curl http://somehost.com/some-restful-api
对于返回的json字符串,一般在服务端不加处理的情况下,都是没有任何’\t’和’\n’的。为了方便查看,在bash上可以简单地对它进行格式化:
curl http://somehost.com/some-restful-api | python -mjson.tool
当然这要求机器上安装了python,其实也就是利用了json.tool这个程序。
然而有时候还有一个问题,就是若返回的json字符串中包含中文,那么这样打印出来之后,中文会变成以’\u’开头的转义形式,从而让程序员无法直接观察到中文的内容。这并非是一个bug,而是json本身的标准,它要求json的内容都是ascii编码的。标准的json编码器和解码器都会遵循这一点。
Implement Single-Host-Multiple-IPs on Linux
单主机可发起的总连接数受限于本地端口数,即基本上只能有(65535 - 1024)个。有时候这个量级的连接数并不够用,比如在测试可支持百万长连接的服务的时候,为了节约测试机的数量,则需要尽量增大单机可发起的连接数。解决这个问题需要利用TCP协议的性质,考虑到TCP的本质是一个四元组(源IP,源Port,目的IP,目的Port),在这种情况下,目的IP和目的Port相同,为了突破源Port的限制,办法就只能是增加主机上源IP的数量。
达成这个目标的办法有很多,比如在一台主机上虚拟出多个主机,这样就可以在每个虚拟主机上发起(65535 - 1024)个连接,但是这样做太重了,而且严重浪费了许多资源。一个更好的解决办法是给一台主机分配多个IP,这种做法很轻,不会造成资源的浪费,而且能很好地达到效果。在客户端发起连接之前,可以通过调用bind系统调用将一个socket绑定到一个指定的IP和Port上再发起连接,就可以完全利用所有的(源IP,源Port)组合,这样理论上可以发起并建立的连接数就是 本机拥有的IP的数量 * (65535 - 1024)。
有很多办法可以给一台主机分配多个IP,但各有各的问题,比如使用IP alias就没办法使用DHCP来获得IP,需要网络管理员来手动指派,自己指派则有可能冲突;之前也试着使用macvlan来解决,但是怀疑是不是被交换机给Ban了,比如STP,导致主机的网络很不稳定,一会儿就上不了网了。这里记录一下Network Namespace + VETH + Bridge的方法,这种方法到目前为止工作良好。
High Throughput TCP Server
在Linux上开发高吞吐量、高并发,即C100K的Server时,默认的一些系统参数已经不能满足性能的需求,从而会导致性能瓶颈。现记录一些自己在学习过程中已知的解决方案。(C1000K的解决方案与此不同,要从内核入手。)
1、打开文件数限制
使用命令ulimit -a
可以查看系统给出的所有限制。其中,由-n
指出的open files限制了一个进程同时能够打开的最大的文件数,其实也就是最大的文件描述符数。由于在程序中每一个打开的TCP连接也都由系统抽象成一个文件,因此这个值也直接限制了进程可以打开的TCP连接的数量。
修改办法:在/etc/security/limits.conf中添加:
* soft nofile 793937
* hard nofile 793937
其中,793937指定最大可以打开文件数量,这个值由系统通过内存大小来推荐,通过cat /proc/sys/fs/file-max
或sysctl fs.file-max
来查看。如果系统默认的fs.file-max值也过小,那么也可以直接修改这个值。
iOS上PhoneGap与平台互操作
PhoneGap是手机平台上流行的一款中间件。它构建在各种手机平台所提供的WebView(浏览器内核)组件的基础之上,使用javascript语言对应用开发者提供统一的接口(如调用相机、调用其他本地组件),从而屏蔽了各手机平台上OS的异构。在无线小组的调研任务中,我的任务主要是负责iOS平台上的调研,本文简单描述了iOS平台上PhoneGap与平台本地的互操作性的实现。
GRASP设计模式及OO设计原则
目前反对OO的声音越来越多。很多人开始厌倦OO的反模块化、反并行化,以及往往过于复杂的过度设计。其实OO只是众多软件开发方法论中的一种,有优点也有缺点,我们完全可以汲其精华,去其糟粕。在这里贴一篇多年前的文章。
面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳出相关的类;然后定义各个类之间的关联关系,并给这些类分配相应的职责,同时定义这些类之间的协作方式。将相应的职责分配给具体的类是OO过程中非常重要的一步。GRASP设计模式是职责分配过程中的一套非常重要的设计模式。它给出了在给类分配职责的过程中,设计者们所需要遵从的一些原则或者指导性的建议。
说到设计模式,更为人所知的当然是GoF(Gang of Four)的23种设计模式。与GoF的23种设计模式不同的是,GRASP设计模式描述的是在OO设计中为互相协作的类分配职责的原则或者建议,而GoF的设计模式则是在更高的层次上描述一个OO系统或者其局部系统的行为以及结构上的抽象。
GRASP设计模式的全称是General Responsibility Assignment Software Patterns,即通用职责分配软件模式。它定义了9个基本的OO设计原则或基本的设计构件。这9个设计模式分别是:创建者(Creator)、信息专家(Information Expert)、低耦合(Low Coupling)、控制器(Controller)、高内聚(High Cohesion)、多态性(Polymorphism)、纯虚构(Pure Fabrication)、间接性(Indirection)、防止变异(Protected Variations)。
邱奇数前趋操作的推导
邱奇数的详细定义就不再赘述了,这里有邱奇数的一份Scheme实现:https://gist.github.com/nicky-zs/8296596
其他的操作都比较好理解,但是前趋操作pred不是很直观,现将推导过程记录如下:
Build Erlang with wxWidgets
在erlang.org上下载erlang的源代码。解压erlang源代码,进入源代码目录中。
执行
./configure --enable-threads --enable-smp-support --enable-kernel-poll \
--enable-sctp --enable-hipe --enable-native-libs && make && sudo make install
./configure的结果会提示有哪些依赖未找到,因而相应的功能不可用。在所有这些依赖中,其他的依赖都好解决,直接安装依赖库就好了。但是唯独wxWidgets的依赖很难解决,即便安装了wxWidgets后都不一定能解决。这时需要一步一步去寻找原因。
首先,wxWidgets从源代码编译安装的方式在erlang的源代码目录下的./lib/wx/README文件中有详细的描述:
./configure --with-opengl --enable-unicode --enable-graphics_ctx \
--disable-shared && make && sudo make install
cd contrib/src/stc && make && sudo make install