Articles

  • Openconnect Used as an Alternative for Cisco Anyconnect

    Introduction

    Open client for Cisco AnyConnect VPN
    OpenConnect is a client for Cisco’s AnyConnect SSL VPN, which is supported by the ASA5500 Series, by IOS 12.4(9)T or later on Cisco SR500, 870, 880, 1800, 2800, 3800, 7200 Series and Cisco 7301 Routers, and probably others.

    Homepage http://www.infradead.org/openconnect/

    Install

    Ubuntu

    [will@ubuntu.vmg ~]$ sudo apt-get install network-manager-openconnect-gnome

    OS X

    homebrew openconnect.rb

    Configure

    Gateway: server address

  • C++ memory management

    因为你所编写的循环语句根本不能正确运行,所以当编译成可执行代码后,也不可能正常运行。语言规范中说通过一个基类指针来删除一个含有派生类对象的数组,结果将是不确定的。这实际意味着执行这样的代码肯定不会有什么好结果。多态和指针算法不能混合在一起来用,所以数组与多态也不能用在一起。

    C++中虚析构函数的作用--这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。

  • Linux 网络模型

    全文针对linux环境。tcp/udp两种server种,tcp相对较复杂也相对比较常用。本文就从tcp server开始讲起。先从基本说起,看一个单线程的网络模型,处理流程如下:

    socket-->bind-->listen-->[accept-->read-->write-->close]-->close
    

    []中代码循环运行,[]外的是对监听socket的处理,[]内的是对accept返回的客户socket的处理。这些系统调用的参数以及需要的头文件等,只需要在linux下man就好。

  • /usr/bin/install

    Introduction

    install命令的作用是安装或升级软件或备份数据,它的使用权限是所有用户。

    Syntax

    install [OPTION]... [-T] SOURCE DEST
    install [OPTION]... SOURCE... DIRECTORY
    install [OPTION]... -t DIRECTORY SOURCE...
    install [OPTION]... -d DIRECTORY...
    

    在前两种格式中,会将复制至或将多个文件复制至已存在的,同时设定

    权限模式及所有者/所属组。在第三种格式中,会创建所有指定的目录及它们的主目录。长选项必须用的参数在使用短选项时也是必须的。

  • C\C++ string

    using namespace std;
    
    string num[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
    string suf[] = {"shi", "bai", "qian", "wan", "yi"};
    vector<string> v;
    
    string n2s(const string& n) {
        int l = n.length();
        if (l == 1) {
            return num[n[0]-'0'];
        } else if (n[0] == '0' && n[1] == '0') {
            return num[n[0]-'0'] + n2s(n.substr(2, l-2));
        } else {
            return num[n[0]-'0'] + (n[0] == '0' ? "" : suf[l-2])
                + n2s(n.substr(1, l-1));
        }
    }
    
    string ln2s(const string& n) {
        int l = n.length();
        if (l < 5) {
            return n2s(n);
        } else if (l < 9) {
            return n2s(n.substr(0, l-4)) + "wan" + n2s(n.substr(l-4, 4));
        } else {
            return n2s(n.substr(0, l-8)) + "yi" + ln2s(n.substr(l-8, 8));
        }
    }
    
    int test() {
        cout << n2s("1001") << endl;
        cout << n2s("1010") << endl;
        cout << n2s("1101") << endl;
        cout << ln2s("11101") << endl;
        cout << ln2s("101101") << endl;
        cout << ln2s("1101") << endl;
        return 0;
    }
    
  • C\C++ sizeof

    关于sizeof的一般性的问题比较多见, 需要强调的是,sizeof运算符的计算是发生在编译期的。 以下讨论几点细节和实现方法。

  • Read Lua Source Code

    Lua logo Lua logo

    介绍

    Lua 应用比较广泛,主要是作为插件解释器。例如mysql proxy,VLC 等。Lua 源代码比较规范,代码也不长,2w 多行,分布也是比较均匀的,就想看一看,顺便在这里做个笔记。

  • The Architecture of Open Source Applications

    介绍

    最近在看 The Architecture of Open Source Applications,顺便翻译了一些我比较有兴趣的文章。以下是目录1,不定期更新:

    1. nginx
    2. LLVM
    3. The Bourne-Again Shell

     

    声明

    说明

    1. 其中橘红色表示只翻译了一部分,等待进一步翻译和校对。绿色表示已经校对。未做标记的是已经翻译完成,但是没有校对。
  • LLVM

    英文作者:Chris Lattner

    原文链接:LLVM

    许可协议:Creative Commons License

    这一章讨论一些有关构成 LLVM1 的设计决策,是一个 umbrella 项目承载和开发了一套联系紧密低级工具链组件(例如, 汇编器、编译器、调试器等等),被设计来与 Unix 系统上的存在的工具保持兼容。名称 "LLVM" 曾今是一个首字母缩写,但是现在只是 umbrella 项目的商标(brand)。同时 LLVM 也提供一些独有的能力,也因为一些伟大的工具(例如 Clang2 编译器,是一个相比 GCC 有很多优点的 C/C++/Objective-C 编译器),使得 LLVM 同其他编译器区别开来的主要是它的内部架构。

    从2000年十二月开始,LLVM 被设计作为一套具有良好定义接口的可重用库[LA04]。在那个时候,开源编程语言的实现被设计作为特殊目的的工具,通常具有单个可执行文件。例如,从一个静态编译器(例如 GCC)重用解析器(parser)来做静态分析和重构是非常困难的。同时脚本语言经常提供一种把它们的运行时和解释器(runtime and interpreter)嵌入到更大的应用程序之中的方法,这个运行时就是一个单独的代码块被包含或者排除。没有方法可以做到跨语言实现的重用和共享。

  • The Bourne-Again Shell

    英文作者:Chet Ramey

    原文链接:The Bourne-Again Shell

    3.1. 介绍

    一个 Unix shell 提供了一个用户通过运行命令来和系统交互的接口。但是一个 shell 也是一门相当丰富的编程语言:具有流程控制、修改、循环、条件、基本的数学操作,命名函数、字符串变量和 shell 与它运行的命令之间的双向通信。

    shells 可以交互使用,从终端或者终端模拟器例如xterm,也可以非交互使用,从文件中读取命令。大多数现代shells, 包括 bash, 提供命令行编辑 command-line editing, 使得命令行输入的时候可以使用类似 emacs 或者 vi 的命令进行编译,具有不同的命令历史记录。

    bash 处理更像一个shell管道:在从终端或者脚本中读取之后,数据被传送经过一系列阶段,在每一个阶段中进行变换,直到shell最终执行一个命令并手机它的返回状态。