0%

安装

sudo easy_install xlrd
sudo easy_install xlwt

xlutils(依赖于xlrd和xlwt)提供复制excel文件内容和修改文件的功能。
其实际也只是在xlrd.Book和xlwt.Workbook之间建立了一个管道而已.

简单应用

import xlrd
data = xlrd.open_workbook('demo.xls') # 打开demo.xls
data.sheet_names()        # 获取xls文件中所有sheet的名称
table = data.sheets()[0]  # 获取xls文件第一个工作表
table = data.sheet_by_index(0)        # 通过索引获取xls文件第0个sheet
table = data.sheet_by_name(u'Sheet1') # 通过工作表名获取 sheet
# 获取行数和列数
nrows = table.nrows
ncols = table.ncols
# 获取整行和整列的值(数组)
table.row_values(i)
table.col_values(i)
# 循环行,得到索引的列表
for rownum in range(table.nrows):
    print table.row_values(rownum)
# 获取单元格
cell_A1 = table.cell(0,0).value
cell_C4 = table.cell(2,3).value
# 分别使用行列索引
cell_A1 = table.row(0)[0].value
cell_A2 = table.col(1)[0].value
# 简单的写入
row = 0
col = 0
ctype = 1 # 类型 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
value = 'liluo'
xf = 0 # 扩展的格式化 (默认是0)
table.put_cell(row, col, ctype, value, xf)
table.cell(0,0) # 文本:u'lixiaoluo'
table.cell(0,0).value # 'lixiaoluo'
Read more »

主要用到 requestsbs4 这两个包


import requests
import bs4

proxy = {"http":"http://127.0.0.1:8787","https":"https://127.0.0.1:8787"}

url = 'http://www.lyngsat.com/asia.html'

#results = [[data.get_text() for data in row.find_all('td')] for row in allRows]

def get_info_from_table(table):
    rowspan_count = 0
    current_tr = 0
    trs = table.find_all('tr')

    for i in range(0, len(trs))[2:-1]:
        #print i
        if rowspan_count != 0:
            td = trs[i].find_all('td')
            if i == current_tr + 1:
                print "\t" + td[1].getText()
            else:
                print "\t" + td[0].getText()
            rowspan_count = rowspan_count - 1
            continue

        for td in trs[i].find_all('td'):
            if td.has_attr("rowspan"):
                rowspan_count = int(td["rowspan"]) - 1
                current_tr = i
                #print "rowspan_count : %d" % (rowspan_count)

        td = trs[i].find_all('td')
        #print td[1].b.getText() + " " + td[6].getText()
        sym = td[6].getText().split("-")[0]
        print "\n" + td[1].b.getText().strip(' ') + " " + sym
        print "\t" + td[3].getText()

def get_one_satellite(url):
    print "Start get data from %s" % (url)
    response = requests.get(url, proxies = proxy, verify=False)
    soup = bs4.BeautifulSoup(response.content, "lxml")
    #print soup.prettify()

    for table in soup.find_all('table', width=720, cellspacing=0, cellpadding=0):
        for tr in table.find_all('tr')[0:len(table.find_all('tr'))-1]:
            for td in tr.find_all('td',colspan=10, align="center"):
                print td.string
                get_info_from_table(table)
                print 

    #tables[6].find_all('tr')[2].find_all('td')[1]


def get_urls():
    response = requests.get(url, proxies = proxy, verify=False)
    soup = bs4.BeautifulSoup(response.content, "lxml")
    #print soup.prettify()

    #links = [a.attrs.get('href') for a in soup.select('tr a[href]')]
    #for link in soup.find_all('a'):
    #    print(link.get('href'))

    #tables = soup.find_all('table', align="center", width=720)
    #for link in tables[0].find_all('a'):
    #    print link.string
    #    print(link.get('href'))

    #tables = soup.find_all('table', align="center", width=720)
    #tds = tables[0].find_all('td', width=70)
    #for i in range(0, len(tds)):
    #    link = tds[i].find_all('a')
    #    print(link[0].get('href'))

    #tables = soup.find_all('table', align="center", width=720)
    #tds = tables[0].find_all('td', width=70)
    #for td in tds:
    #    for link in td.find_all('a'):
    #        print link.get('href')

    for table in soup.find_all('table', align="center", width=720):
        for td in table.find_all('td', width=70):
            for link in td.find_all('a'):
                get_one_satellite(link.get('href'))


def main():
    get_urls()

if __name__ == "__main__":
    main()
Read more »

  • toc
    {:toc}

Lists

$ > git stash -h
usage: git stash list [<options>]
   or: git stash show [<stash>]
   or: git stash drop [-q|--quiet] [<stash>]
   or: git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
   or: git stash branch <branchname> [<stash>]
   or: git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet]
                       [-u|--include-untracked] [-a|--all] [<message>]]
   or: git stash clear

$ > man git stash

$ > man git log
Read more »

  • toc
    {:toc}

IFS

在弄清楚循环语句前,先看看字段分隔符的作用。
字段分隔符(Internal Field Separator, IFS)是shell脚本中的一个重要概念
处理文本数据的时候非常的有用,
是把单个数据流划分成不同数据元素的定界符。
系统环境默认的IFS是空白字符(换行符、制表符或者空格)

当 shell 处理”命令替换”和”参数替换”时,
shell 根据 IFS 的值,默认是 space, tab, newline 来拆解读入的变量,
然后对特殊字符进行处理,最后重新组合赋值给该变量。

以下是值得注意的地方:

  1. IFS is the space, tab, and newline characters by default,连续多个空白被看做一个处理
  2. $* 使用IFS中的第一个字符作为分隔符,把参数连接
  3. awk中的FS(域分隔符)也和IFS有类似的用法和作用
Read more »

Vim是一个文本编辑器,并且文本编辑器经常是对文本文件进行操作。
文本文件是在文件系统里进行管理的,我们需要通过文件路径来指定文件。
当你需要对路径进行操作的时候,vim提供了一些很有用的内置函数。

绝对路径

有些时候外部脚本取得某些文件的路径是很简单的。运行下面的命令:

:echom expand('%')
:echom expand('%:p')
:echom fnamemodify('foo.txt',':p')

第一条命令用来显示你当前在编辑的文件的相对路径。%代表“当前文件”。vim里还有很多可以用expand()来进行替换的字符串。

第二条命令会输出当前文件的全路径。字符串里的:p用来告诉vim取文件的全路径。vim里也有很多这样的修饰符可以使用。

第三条命令根据当前路径显示foo.txt文件的绝对路径,而不用考虑这个文件是否存在。
fnamemodify()是一个vim函数,它比expand()函数更加灵活,因为它可以指定任何文件,不仅仅只是expand()的特殊字符。

列出文件

有时候你会需要取得某个目录下的文件列表。运行下面的命令:

:echo globpath('.','*')

Vim会列出当前目录下的所有文件。globpath()函数返回一个字符串,包含所有的文件名,文件名之间用回车分割。如果想要拿到第一个列表的话,你可以自己用split来切分。运行下面的命令:

:echo split(globpath('.','*'),'\n')

这次vim会输出一个包含所有文件的列表。

golbpath函数的通配符基本上也是按照你所认为的方式去工作的。运行下面的命令:

:echo split(globpath('.','*.txt'),'\n')

Vim输出当前目录的下所有的以.txt结尾的文件的列表。

你可以通过\*\*来递归地列举当前文件夹下的所有文件。运行下面的命令:

:echo split(globpath('.','**'))

Vim会输出当前文件夹下的所有文件和文件夹。

globpath的功能非常强大,在你完成本章的练习之后,你会学到更多东西。

fnamemodify

:help filename-modifiers

可用选项如下:

:echo fnamemodify("main.c", ":p:h")

:_%: ::8 ::p ::. ::~ ::h ::t ::r ::e ::s ::gs ::S 
    %:8 %:p %:. %:~ %:h %:t %:r %:e %:s %:gs %:S 

各种效果如下:

Examples, when the file name is "src/version.c", current dir
"/home/mool/vim": >
  :p            /home/mool/vim/src/version.c
  :p:.                       src/version.c
  :p:~                 ~/vim/src/version.c
  :h                       src
  :p:h            /home/mool/vim/src
  :p:h:h        /home/mool/vim
  :t                       version.c
  :p:t                       version.c
  :r                       src/version
  :p:r            /home/mool/vim/src/version
  :t:r                       version
  :e                           c
  :s?version?main?               src/main.c
  :s?version?main?:p    /home/mool/vim/src/main.c
  :p:gs?/?\\?        \home\mool\vim\src\version.c

Examples, when the file name is "src/version.c.gz": >
  :p            /home/mool/vim/src/version.c.gz
  :e                             gz
  :e:e                           c.gz
  :e:e:e                       c.gz
  :e:e:r                       c
  :r                       src/version.c
  :r:e                           c
  :r:r                       src/version
  :r:r:r                   src/version

练习

  • Read :help expand().
  • Read :help fnamemodify().
  • Read :help filename-modifiers.
  • Read :help simplify().
  • Read :help resolve().
  • Read :help globpath().
  • Read :help wildcards.

  1. 路径
  2. Vimscript编程指南

安装

Ubuntu Linux x64

sudo apt-get install build-essential cmake
sudo apt-get install python-dev python3-dev

.vimrc 中:

Bundle 'Valloric/YouCompleteMe'

下载完成之后需要编译,支持语义分析:

cd ~/.vim/bundle/YouCompleteMe
./install.py --clang-completer

编译完成后,完成安装,接下来需要配置

配置

在vim启动后,YCM会找寻当前路径以及上层路径的 .ycm_extra_conf.py .

~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py 中提供了默认的模板.

可以使用 newycm_extra_conf.py 来生成模板

使用-isystem添加系统的头文件进行解析,使用-I添加第三方的头文件进行解析,在flags部分后添加如下内容:

'-isystem',
'/usr/include',

修改之后用于C工程配置文件如下:

# This file is NOT licensed under the GPLv3, which is the license for the rest
# of YouCompleteMe.
#
# Here's the license text for this file:
#
# This is free and unencumbered software released into the public domain.
#
# Anyone is free to copy, modify, publish, use, compile, sell, or
# distribute this software, either in source code form or as a compiled
# binary, for any purpose, commercial or non-commercial, and by any
# means.
#
# In jurisdictions that recognize copyright laws, the author or authors
# of this software dedicate any and all copyright interest in the
# software to the public domain. We make this dedication for the benefit
# of the public at large and to the detriment of our heirs and
# successors. We intend this dedication to be an overt act of
# relinquishment in perpetuity of all present and future rights to this
# software under copyright law.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# For more information, please refer to <http://unlicense.org/>

import os
import ycm_core

# These are the compilation flags that will be used in case there's no
# compilation database set (by default, one is not set).
# CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.
flags = [
'-Wall'
, '-Wextra'
#'-Werror', # Fucking unused parameter 'argc'
, '-Wno-long-long'
, '-Wno-variadic-macros'
, '-Wno-unused-parameter'
, '-Wno-missing-field-initializers'
, '-fexceptions'
, '-DNDEBUG'
, '-DUSE_CLANG_COMPLETER'
, '-Wno-int-to-pointer-cast'
, '-Wno-pointer-to-int-cast'
, '-Wno-sign-compare'
# THIS IS IMPORTANT! Without a "-std=<something>" flag, clang won't know which
# language to use when compiling headers. So it will guess. Badly. So C++
# headers will be compiled as C headers. You don't want that so ALWAYS specify
# a "-std=<something>".
# For a C project, you would set this to something like 'c99' instead of
# 'c++11'.
, '-std=c99'
# ...and the same thing goes for the magic -x option which specifies the
# language that the files to be compiled are written in. This is mostly
# relevant for c++ headers.
# For a C project, you would set this to 'c' instead of 'c++'.
, 'c'
, '-isystem'
, '../BoostParts'
, '-isystem'
# This path will only work on OS X, but extra paths that don't exist are not
# harmful
, '/System/Library/Frameworks/Python.framework/Headers'
, '-isystem'
, '../llvm/include'
, '-isystem'
, '../llvm/tools/clang/include'
, '-I'
, '.'
, '-I'
, './ClangCompleter'
, '-isystem'
, './tests/gmock/gtest'
, '-isystem'
, './tests/gmock/gtest/include'
, '-isystem'
, './tests/gmock'
, '-isystem'
, './tests/gmock/include'
, '-I'
, '/usr/include'
, '-I'
, '/usr/local/include'
, '-I'
, './solution/app/include'
, '-I'
, './solution/bsp/include/'
, '-I'
, './solution/app/log/include'
, '-I'
, './driver/gxcoreapi/ecos3.0/packages/isoinfra/v3_0/include'
]

# Set this to the absolute path to the folder (NOT the file!) containing the
# compile_commands.json file to use that instead of 'flags'. See here for
# more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html
#
# Most projects will NOT need to set this to anything; you can just change the
# 'flags' list of compilation flags. Notice that YCM itself uses that approach.
compilation_database_folder = ''

if compilation_database_folder:
  database = ycm_core.CompilationDatabase( compilation_database_folder )
else:
  database = None


def DirectoryOfThisScript():
  return os.path.dirname( os.path.abspath( __file__ ) )


def MakeRelativePathsInFlagsAbsolute( flags, working_directory ):
  if not working_directory:
    return list( flags )
  new_flags = []
  make_next_absolute = False
  path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ]
  for flag in flags:
    new_flag = flag

    if make_next_absolute:
      make_next_absolute = False
      if not flag.startswith( '/' ):
        new_flag = os.path.join( working_directory, flag )

    for path_flag in path_flags:
      if flag == path_flag:
        make_next_absolute = True
        break

      if flag.startswith( path_flag ):
        path = flag[ len( path_flag ): ]
        new_flag = path_flag + os.path.join( working_directory, path )
        break

    if new_flag:
      new_flags.append( new_flag )
  return new_flags


def FlagsForFile( filename ):
  if database:
    # Bear in mind that compilation_info.compiler_flags_ does NOT return a
    # python list, but a "list-like" StringVec object
    compilation_info = database.GetCompilationInfoForFile( filename )
    final_flags = MakeRelativePathsInFlagsAbsolute(
      compilation_info.compiler_flags_,
      compilation_info.compiler_working_dir_ )
  else:
    relative_to = DirectoryOfThisScript()
    final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )

  return {
    'flags': final_flags,
    'do_cache': True
  }

  1. Vim自动补全神器–YouCompleteMe
  2. YouCompleteMe安装遇到的问题及解决办法
  3. Vim 自动补全插件 YouCompleteMe 安装与配置
  4. newycm_extra_conf.py
  5. YouCompleteMe

最近github可以使用ssh方式,https存在问题

git clone https://github.com/Valloric/YouCompleteMe.git                         
正克隆到 'YouCompleteMe'...
fatal: unable to access 'https://github.com/Valloric/YouCompleteMe.git/': Failed to connect to github.com port 443: 拒绝连接

修改为 SSH 方式可以解决问题 Changing a remote’s
URL

但是vim 插件安装会使用 https ,尝试使用代理来解决问题:

git config --global http.proxy 192.168.1.1:8083
git config --global http.proxy //查询
git config --global --unset http.proxy //取消

启动lantern并找到PAC文件

Jul 18 01:02:23.713 - 0m0s DEBUG flashlight: pac.go:155 Serving PAC file at
http://127.0.0.1:16823/proxy_on.pac

打开浏览器输入该url可以得到PAC文件,如下:

var bypassDomains = ['ss1.baidu.com', 'static.zhihu.com',
    'camo.githubusercontent.com', 'sugar.zhihu.com',
    'pagead2.googlesyndication.com', 'ss0.baidu.com', 'link.zhihu.com',
    'www.isupergeek.com', 'ss2.baidu.com', 'www.cnblogs.com', 'blog.marchtea.com',
    'secure.gravatar.com', 'ocsp.startssl.com', 'pic2.zhimg.com',
    'static.cnblogs.com', 'www.baidu.com', 'www.googletagservices.com',
    'ss3.baidu.com', 'code.jquery.com', 'gn.symcd.com', 'www.zhihu.com',
    'ssum-sec.casalemedia.com', 'zhstatic.zhihu.com', 'tpc.googlesyndication.com',
    'sp2.baidu.com', 'ocsp.digicert.com', 'sp0.baidu.com',
    'zhihu-web-analytics.zhihu.com', 'engine.adzerk.net', 'pic1.zhimg.com',
    'collector.githubapp.com', 'api.ad.cnblogs.com', 'sync.xmarks.com',
    'sp1.baidu.com', 'avatars3.githubusercontent.com', 'pic4.zhimg.com',
    'cloud.xmarks.com', 'pixel.quantserve.com', 'stats.g.doubleclick.net'];
    function FindProxyForURL(url, host) {
        if (isPlainHostName(host) // including localhost
                || shExpMatch(host, "*.local")) {
            return "DIRECT";
        }
        // only checks plain IP addresses to avoid leaking domain name
        if (/^[0-9.]+$/.test(host)) {
            if (isInNet(host, "10.0.0.0", "255.0.0.0") ||
                isInNet(host, "172.16.0.0", "255.240.0.0") ||
                isInNet(host, "192.168.0.0", "255.255.0.0") ||
                isInNet(host, "127.0.0.0", "255.255.255.0")) {
                return "DIRECT";
            }
        }
        // Lantern desktop version proxies only http(s) and ws(s)
        if (url.substring(0, 4) != 'http' && (url.substring(0, 2) != 'ws')) {
            return "DIRECT";
        }
        for (var d in bypassDomains) {
            if (host == bypassDomains[d]) {
                return "DIRECT";
            }
        }
        return "PROXY 127.0.0.1:8787; DIRECT";
}

最后一行代理地址 http://127.0.0.1:8787
获取了代理地址后就可以设置git的代理了,shell脚本如下:

    git config --global http.proxy 127.0.0.1:8787
    git config --global https.proxy 127.0.0.1:8787

文本对象

vim-grammar

  • aw:一个词
  • as:一句。
  • ap:一段。
  • ab:一块(包含在圆括号中的)。

y, d, c, v都可以跟文本对象。

Read more »

文本对象

vim-grammar

  • aw:一个词
  • as:一句。
  • ap:一段。
  • ab:一块(包含在圆括号中的)。

y, d, c, v都可以跟文本对象。

寄存器

  • a-z:都可以用作寄存器名。”ayy把当前行的内容放入a寄存器。
  • A-Z:用大写字母索引寄存器,可以在寄存器中追加内容。
    如”Ayy把当前行的内容追加到a寄存器中。
  • :reg 显示所有寄存器的内容。
  • “”:不加寄存器索引时,默认使用的寄存器。
  • “:当前选择缓冲区,”yy把当前行的内容放入当前选择缓冲区。
  • “+:系统剪贴板。”+yy把当前行的内容放入系统剪贴板。

Insert Mode

  • ctrl-y,重复当前光标上一行的字符
  • C-r =,然后输入表达式,就能在 光标处得到计算结果

Normal Mode

  • gd,局部变量跳转
  • gf,文件跳转
  • ga,查看当前字符ascii码
  • zz,居中很方便
  • ``, 可以在两个地方来回改
  • Ctrl+a, 自动把光标下的数字加1
  • “+p 让你不丢失格式地将内容从系统剪切板粘贴到vim中,* 和 + 这俩全局寄存器
  • di( 删除()中内容,类似(), {}, [], ‘’, “”
  • ci( 更改()中内容,类似(), {}, [], ‘’, “”
  • da( 删除包括()在内的内容,类似(), {}, [], ‘’, “”
  • ca( 更改包括()在内的内容,类似(), {}, [], ‘’, “”
  • ctrl + o 跳转到上一位置,像浏览器上的 后退 和 前进
  • ctrl + i 跳转下一位置(和ctrl + o配合在代码间跳转)
  • K 查询系统函数(unix、linux),在linux系统函数上用K跳转到man查询页面
  • cc 替换整行

Command Mode

  • :Sex,水平分割一个窗口,浏览文件系统
  • :Vex, 垂直分割一个窗口,浏览文件系统
  • :r !pwd 输入当前路径
  • :%!xxd 转换16进制
  • :set list 显示不可见字符

  1. 老司机乱谈编辑器之神——vim
  2. Best of Vim Tips
  3. Vim 有什么奇技淫巧
  4. VimGolf
  5. vim常用命令
  6. Vim London January in review
  7. operator, the true power of Vim
  8. Practical Vim

值得学习的C语言开源项目

Libev

libev是一个开源的事件驱动库,基于epoll,kqueue等OS提供的基础设施。其以高效出名,它可以将IO事件,定时器,和信号统一起来,统一放在事件处理这一套框架下处理。基于Reactor模式,效率较高,并且代码精简(4.15版本8000多行),是学习事件驱动编程的很好的资源。

下载链接:http://software.schmorp.de/pkg/libev.html

Memcached

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态数据库驱动网站的速度。Memcached 基于一个存储键/值对的 hashmap。Memcached-1.4.7的代码量还是可以接受的,只有10K行左右。

下载地址:http://memcached.org/

Redis

Redis 是一个使用 C 语言写成的,开源的 key-value 数据库。Redis支持的操作和数据类型比Memcached要多,现在主要用于缓存,支持主从同步机制,Redis的学习可以参考<<Redis设计与实现>>一书。

下载地址:http://redis.io/

Webbench

Webbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。

下载链接:https://github.com/LippiOuYang/WebBenchl

APR

Apache Portable Runtime

这是由 Apache 社区维护的 C 开源库,主要提供操作系统相关的功能(文件系统、进程、线程、用户、IPC)。此外还提供了一些网络相关的功能。

APR 原先是 Apache Web 服务器的一个组成部分,后来独立出来,成为一个单独的开源项目。
主页:https://apr.apache.org

Tinyhttpd

tinyhttpd是一个超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个 Http Server 的本质。

下载链接:https://github.com/LippiOuYang/Tinyhttpd

cJSON

cJSON是C语言中的一个JSON编解码器,非常轻量级,C文件只有500多行,速度也非常理想。

cJSON也存在几个弱点,虽然功能不是非常强大,但cJSON的小身板和速度是最值得赞赏的。其代码被非常好地维护着,结构也简单易懂,可以作为一个非常好的C语言项目进行学习。

项目主页:http://sourceforge.net/projects/cjson/

CMockery

cmockery是google发布的用于C单元测试的一个轻量级的框架。它很小巧,对其他开源包没有依赖,对被测试代码侵入性小。cmockery的源代码行数不到3K,你阅读一下will_return和mock的源代码就一目了然了。

主要特点:

  • 免费且开源,google提供技术支持;
  • 轻量级的框架,使测试更加快速简单;
  • 避免使用复杂的编译器特性,对老版本的编译器来讲,兼容性好;
  • 并不强制要求待测代码必须依赖C99标准,这一特性对许多嵌入式系统的开发很有用

下载链接:http://code.google.com/p/cmockery/downloads/list

Lua

Lua很棒,Lua是巴西人发明的,这些都令我不爽,但是还不至于脸红,最多眼红。

让我脸红的是Lua的源代码,百分之一百的ANSI C,一点都不掺杂。在任何支持ANSI C编译器的平台上都可以轻松编译通过。我试过,真是一点废话都没有。Lua的代码数量足够小,5.1.4仅仅1.5W行,去掉空白行和注释估计能到1W行。

下载地址:http://www.lua.org/

SQLite

SQLite是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。 其特点是高度便携、使用方便、结构紧凑、高效、可靠。足够小,大致3万行C代码,250K。

下载地址:http://www.sqlite.org/

UNIX v6

UNIX V6 的内核源代码包括设备驱动程序在内 约有1 万行,这个数量的源代码,初学者是能够充分理解的。有一种说法是一个人所能理解的代码量上限为1 万行,UNIX V6的内核源代码从数量上看正好在这个范围之内。看到这里,大家是不是也有“如果只有1万行的话没准儿我也能学会”的想法呢?

另一方面,最近的操作系统,例如Linux 最新版的内核源代码据说超过了1000 万行。就算不是初学者,想完全理解全部代码基本上也是不可能的。

下载地址:http://minnie.tuhs.org/cgi-bin/utree.pl?file=V6

NETBSD

NetBSD是一个免费的,具有高度移植性的 UNIX-like 操作系统,是现行可移植平台最多的操作系统,可以在许多平台上执行,从 64bit alpha 服务器到手持设备和嵌入式设备。NetBSD计划的口号是:”Of course it runs NetBSD”。它设计简洁,代码规范,拥有众多先进特性,使得它在业界和学术界广受好评。由于简洁的设计和先进的特征,使得它在生产和研究方面,都有卓越的表现,而且它也有受使用者支持的完整的源代码。许多程序都可以很容易地通过NetBSD Packages Collection获得。

下载地址:http://www.netbsd.org/

C++ 资源大全

关于 C++ 框架、库和资源的一些汇总列表,内容包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。

标准库

C++标准库,包括了STL容器,算法和函数等。

框架

C++通用框架和库

  • Apache C++ Standard Library:是一系列算法,容器,迭代器和其他基本组件的集合
  • ASL :Adobe源代码库提供了同行的评审和可移植的C++源代码库。
  • Boost :大量通用C++库的集合。
  • BDE :来自于彭博资讯实验室的开发环境。
  • Cinder:提供专业品质创造性编码的开源开发社区。
  • Cxxomfort:轻量级的,只包含头文件的库,将C++ 11的一些新特性移植到C++03中。
  • Dlib:使用契约式编程和现代C++科技设计的通用的跨平台的C++库。
  • EASTL :EA-STL公共部分
  • ffead-cpp :企业应用程序开发框架
  • Folly:由Facebook开发和使用的开源C++库
  • JUCE :包罗万象的C++类库,用于开发跨平台软件
  • libPhenom:用于构建高性能和高度可扩展性系统的事件框架。
  • LibSourcey :用于实时的视频流和高性能网络应用程序的C++11 evented IO
  • LibU : C语言写的多平台工具库
  • Loki :C++库的设计,包括常见的设计模式和习语的实现。
  • MiLi :只含头文件的小型C++库
  • openFrameworks :开发C++工具包,用于创意性编码。
  • Qt :跨平台的应用程序和用户界面框架
  • Reason :跨平台的框架,使开发者能够更容易地使用Java,.Net和Python,同时也满足了他们对C++性能和优势的需求。
  • ROOT :具备所有功能的一系列面向对象的框架,能够非常高效地处理和分析大量的数据,为欧洲原子能研究机构所用。
  • STLport:是STL具有代表性的版本
  • STXXL:用于额外的大型数据集的标准模板库。
  • Ultimate++ :C++跨平台快速应用程序开发框架
  • Windows Template Library:用于开发Windows应用程序和UI组件的C++库
  • Yomm11 :C++11的开放multi-methods.

人工智能

  • btsk :游戏行为树启动器工具
  • Evolving Objects:基于模板的,ANSI C++演化计算库,能够帮助你非常快速地编写出自己的随机优化算法。
  • Neu:C++11框架,编程语言集,用于创建人工智能应用程序的多用途软件系统。

 

异步事件循环

  • Boost.Asio:用于网络和底层I/O编程的跨平台的C++库。
  • libev :功能齐全,高性能的时间循环,轻微地仿效libevent,但是不再像libevent一样有局限性,也修复了它的一些bug。
  • libevent :事件通知库
  • libuv :跨平台异步I/O。

 

音频

音频,声音,音乐,数字化音乐库

  • FMOD :易于使用的跨平台的音频引擎和音频内容的游戏创作工具。
  • Maximilian :C++音频和音乐数字信号处理库
  • OpenAL :开源音频库—跨平台的音频API
  • Opus:一个完全开放的,免版税的,高度通用的音频编解码器
  • Speex:免费编解码器,为Opus所废弃
  • Tonic: C++易用和高效的音频合成
  • Vorbis: Ogg Vorbis是一种完全开放的,非专有的,免版税的通用压缩音频格式。

 

生态学

生物信息,基因组学和生物技术

  • libsequence:用于表示和分析群体遗传学数据的C++库。
  • SeqAn:专注于生物数据序列分析的算法和数据结构。
  • Vcflib :用于解析和处理VCF文件的C++库
  • Wham:直接把联想测试应用到BAM文件的基因结构变异。

 

压缩

压缩和归档库

  • bzip2:一个完全免费,免费专利和高质量的数据压缩
  • doboz:能够快速解压缩的压缩库
  • PhysicsFS:对各种归档提供抽象访问的库,主要用于视频游戏,设计灵感部分来自于Quake3的文件子系统。
  • KArchive:用于创建,读写和操作文件档案(例如zip和 tar)的库,它通过QIODevice的一系列子类,使用gzip格式,提供了透明的压缩和解压缩的数据。
  • LZ4 :非常快速的压缩算法
  • LZHAM :无损压缩数据库,压缩比率跟LZMA接近,但是解压缩速度却要快得多。
  • LZMA :7z格式默认和通用的压缩方法。
  • LZMAT :及其快速的实时无损数据压缩库
  • miniz:单一的C源文件,紧缩/膨胀压缩库,使用zlib兼容API,ZIP归档读写,PNG写方式。
  • Minizip:Zlib最新bug修复,支持PKWARE磁盘跨越,AES加密和IO缓冲。
  • Snappy :快速压缩和解压缩
  • ZLib :非常紧凑的数据流压缩库
  • ZZIPlib:提供ZIP归档的读权限。

 

并发性

并发执行和多线程

  • Boost.Compute :用于OpenCL的C++GPU计算库
  • Bolt :针对GPU进行优化的C++模板库
  • C++React :用于C++11的反应性编程库
  • Intel TBB :Intel线程构件块
  • Libclsph:基于OpenCL的GPU加速SPH流体仿真库
  • OpenCL :并行编程的异构系统的开放标准
  • OpenMP:OpenMP API
  • Thrust :类似于C++标准模板库的并行算法库
  • HPX :用于任何规模的并行和分布式应用程序的通用C++运行时系统
  • VexCL :用于OpenCL/CUDA 的C++向量表达式模板库。

 

容器

  • C++ B-tree :基于B树数据结构,实现命令内存容器的模板库
  • Hashmaps: C++中开放寻址哈希表算法的实现

 

密码学

  • Bcrypt :一个跨平台的文件加密工具,加密文件可以移植到所有可支持的操作系统和处理器中。
  • BeeCrypt
  • Botan: C++加密库
  • Crypto++:一个有关加密方案的免费的C++库
  • GnuPG: OpenPGP标准的完整实现
  • GnuTLS :实现了SSL,TLS和DTLS协议的安全通信库
  • Libgcrypt
  • libmcrypt
  • LibreSSL:免费的SSL/TLS协议,属于2014 OpenSSL的一个分支
  • LibTomCrypt:一个非常全面的,模块化的,可移植的加密工具
  • libsodium:基于NaCI的加密库,固执己见,容易使用
  • Nettle 底层的加密库
  • OpenSSL : 一个强大的,商用的,功能齐全的,开放源代码的加密库。
  • Tiny AES128 in C :用C实现的一个小巧,可移植的实现了AES128ESB的加密算法

 

数据库

数据库,SQL服务器,ODBC驱动程序和工具

  • hiberlite :用于Sqlite3的C++对象关系映射
  • Hiredis: 用于Redis数据库的很简单的C客户端库
  • LevelDB: 快速键值存储库
  • LMDB:符合数据库四大基本元素的嵌入键值存储
  • MySQL++:封装了MySql的C API的C++ 包装器
  • RocksDB:来自Facebook的嵌入键值的快速存储
  • SQLite:一个完全嵌入式的,功能齐全的关系数据库,只有几百KB,可以正确包含到你的项目中。

 

调试

调试库, 内存和资源泄露检测,单元测试

  • Boost.Test:Boost测试库
  • Catch:一个很时尚的,C++原生的框架,只包含头文件,用于单元测试,测试驱动开发和行为驱动开发。
  • CppUnit:由JUnit移植过来的C++测试框架
  • CTest:CMake测试驱动程序
  • googletest:谷歌C++测试框架
  • ig-debugheap:用于跟踪内存错误的多平台调试堆
  • libtap:用C语言编写测试
  • MemTrack —用于C++跟踪内存分配
  • microprofile- 跨平台的网络试图分析器
  • minUnit :使用C写的迷你单元测试框架,只使用了两个宏
  • Remotery:用于web视图的单一C文件分析器
  • UnitTest++:轻量级的C++单元测试框架

 

游戏引擎

  • Cocos2d-x :一个跨平台框架,用于构建2D游戏,互动图书,演示和其他图形应用程序。
  • Grit :社区项目,用于构建一个免费的游戏引擎,实现开放的世界3D游戏。
  • Irrlicht :C++语言编写的开源高性能的实时#D引擎
  • Polycode:C++实现的用于创建游戏的开源框架(与Lua绑定)。

 

图形用户界面

  • CEGUI : 很灵活的跨平台GUI库
  • FLTK :快速,轻量级的跨平台的C++GUI工具包。
  • GTK+: 用于创建图形用户界面的跨平台工具包
  • gtkmm :用于受欢迎的GUI库GTK+的官方C++接口。
  • imgui:拥有最小依赖关系的立即模式图形用户界面
  • libRocketlibRocket 是一个C++ HTML/CSS 游戏接口中间件
  • MyGUI :快速,灵活,简单的GUI
  • Ncurses:终端用户界面
  • QCustomPlot :没有更多依赖关系的Qt绘图控件
  • Qwt :用户与技术应用的Qt 控件
  • QwtPlot3D :功能丰富的基于Qt/OpenGL的C++编程库,本质上提供了一群3D控件
  • OtterUIOtterUI 是用于嵌入式系统和互动娱乐软件的用户界面开发解决方案
  • PDCurses 包含源代码和预编译库的公共图形函数库
  • wxWidgets C++库,允许开发人员使用一个代码库可以为widows, Mac OS X,Linux和其他平台创建应用程序

 

图形

  • bgfx:跨平台的渲染库
  • Cairo:支持多种输出设备的2D图形库
  • Horde3D 一个小型的3D渲染和动画引擎
  • magnum C++11和OpenGL 2D/3D 图形引擎
  • Ogre 3D 用C++编写的一个面向场景,实时,灵活的3D渲染引擎(并非游戏引擎)
  • OpenSceneGraph 具有高性能的开源3D图形工具包
  • Panda3D 用于3D渲染和游戏开发的框架,用Python和C++编写。
  • Skia 用于绘制文字,图形和图像的完整的2D图形库
  • urho3d 跨平台的渲染和游戏引擎。

 

图像处理

  • Boost.GIL:通用图像库
  • CImg :用于图像处理的小型开源C++工具包
  • CxImage :用于加载,保存,显示和转换的图像处理和转换库,可以处理的图片格式包括 BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K。
  • FreeImage :开源库,支持现在多媒体应用所需的通用图片格式和其他格式。
  • GDCM:Grassroots DICOM 库
  • ITK:跨平台的开源图像分析系统
  • Magick++:ImageMagick程序的C++接口
  • MagickWnd:ImageMagick程序的C++接口
  • OpenCV : 开源计算机视觉类库
  • tesseract-ocr:OCR引擎
  • VIGRA :用于图像分析通用C++计算机视觉库
  • VTK :用于3D计算机图形学,图像处理和可视化的开源免费软件系统。

 

国际化

  • gettext :GNU `gettext’
  • IBM ICU:提供Unicode 和全球化支持的C、C++ 和Java库
  • libiconv :用于不同字符编码之间的编码转换库

 

Jason

  • frozen : C/C++的Jason解析生成器
  • Jansson :进行编解码和处理Jason数据的C语言库
  • jbson :C++14中构建和迭代BSON data,和Json 文档的库
  • JeayeSON:非常健全的C++ JSON库,只包含头文件
  • JSON++ : C++ JSON 解析器
  • json-parser:用可移植的ANSI C编写的JSON解析器,占用内存非常少
  • json11 :一个迷你的C++11 JSON库
  • jute :非常简单的C++ JSON解析器
  • ibjson:C语言中的JSON解析和打印库,很容易和任何模型集成。
  • libjson:轻量级的JSON库
  • PicoJSON:C++中JSON解析序列化,只包含头文件
  • qt-json :用于JSON数据和 QVariant层次间的相互解析的简单类
  • QJson:将JSON数据映射到QVariant对象的基于Qt的库
  • RapidJSON: 用于C++的快速JSON 解析生成器,包含SAX和DOM两种风格的API
  • YAJL :C语言中快速流JSON解析库

 

日志

  • Boost.Log :设计非常模块化,并且具有扩展性
  • easyloggingpp:C++日志库,只包含单一的头文件。
  • Log4cpp :一系列C++类库,灵活添加日志到文件,系统日志,IDSA和其他地方。
  • templog:轻量级C++库,可以添加日志到你的C++应用程序中

 

机器学习

  • Caffe :快速的神经网络框架
  • CCV :以C语言为核心的现代计算机视觉库
  • mlpack :可扩展的C++机器学习库
  • OpenCV:开源计算机视觉库
  • Recommender:使用协同过滤进行产品推荐/建议的C语言库。
  • SHOGUN:Shogun 机器学习工具
  • sofia-ml :用于机器学习的快速增量算法套件

 

数学

  • Armadillo :高质量的C++线性代数库,速度和易用性做到了很好的平衡。语法和MatlAB很相似
  • blaze:高性能的C++数学库,用于密集和稀疏算法。
  • ceres-solver :来自谷歌的C++库,用于建模和解决大型复杂非线性最小平方问题。
  • CGal: 高效,可靠的集合算法集合
  • cml :用于游戏和图形的免费C++数学库
  • Eigen :高级C++模板头文件库,包括线性代数,矩阵,向量操作,数值解决和其他相关的算法。
  • GMTL:数学图形模板库是一组广泛实现基本图形的工具。
  • GMP:用于个高精度计算的C/C++库,处理有符号整数,有理数和浮点数。

 

多媒体

  • GStreamer :构建媒体处理组件图形的库
  • LIVE555 Streaming Media :使用开放标准协议(RTP/RTCP, RTSP, SIP) 的多媒体流库
  • libVLC :libVLC (VLC SDK)媒体框架
  • QtAv:基于Qt和FFmpeg的多媒体播放框架,能够帮助你轻而易举地编写出一个播放器
  • SDL :简单直控媒体层
  • SFML :快速,简单的多媒体库

 

网络

  • ACE:C++面向对象网络变成工具包
  • Boost.Asio:用于网络和底层I/O编程的跨平台的C++库
  • Casablanca:C++ REST SDK
  • cpp-netlib:高级网络编程的开源库集合
  • Dyad.c:C语言的异步网络
  • libcurl :多协议文件传输库
  • Mongoose非常轻量级的网络服务器
  • Muduo :用于Linux多线程服务器的C++非阻塞网络库
  • net_skeleton :C/C++的TCP 客户端/服务器库
  • nope.c :基于C语言的超轻型软件平台,用于可扩展的服务器端和网络应用。 对于C编程人员,可以考虑node.js
  • Onion :C语言HTTP服务器库,其设计为轻量级,易使用。
  • POCO:用于构建网络和基于互联网应用程序的C++类库,可以运行在桌面,服务器,移动和嵌入式系统。
  • RakNet:为游戏开发人员提供的跨平台的开源C++网络引擎。
  • Tuf o :用于Qt之上的C++构建的异步Web框架。
  • WebSocket++ :基于C++/Boost Aiso的websocket 客户端/服务器库
  • ZeroMQ :高速,模块化的异步通信库

 

物理学

动力学仿真引擎

  • Box2D:2D的游戏物理引擎。
  • Bullet :3D的游戏物理引擎。
  • Chipmunk :快速,轻量级的2D游戏物理库
  • LiquidFun:2D的游戏物理引擎
  • ODE :开放动力学引擎-开源,高性能库,模拟刚体动力学。
  • ofxBox2d:Box2D开源框架包装器。
  • Simbody :高性能C++多体动力学/物理库,模拟关节生物力学和机械系统,像车辆,机器人和人体骨骼。

 

机器人学

  • MOOS-IvP :一组开源C++模块,提供机器人平台的自主权,尤其是自主的海洋车辆。
  • MRPT:移动机器人编程工具包
  • PCL :点云库是一个独立的,大规模的开放项目,用于2D/3D图像和点云处理。
  • Robotics Library (RL): 一个独立的C++库,包括机器人动力学,运动规划和控制。
  • RobWork:一组C++库的集合,用于机器人系统的仿真和控制。
  • ROS :机器人操作系统,提供了一些库和工具帮助软件开发人员创建机器人应用程序。

 

科学计算

  • FFTW :用一维或者多维计算DFT的C语言库。
  • GSL:GNU科学库。

 

脚本

  • ChaiScript :用于C++的易于使用的嵌入式脚本语言。
  • Lua :用于配置文件和基本应用程序脚本的小型快速脚本引擎。
  • luacxx:用于创建Lua绑定的C++ 11 API
  • SWIG :一个可以让你的C++代码链接到JavaScript,Perl,PHP,Python,Tcl和Ruby的包装器/接口生成器
  • V7:嵌入式的JavaScript 引擎。
  • V8 :谷歌的快速JavaScript引擎,可以被嵌入到任何C++应用程序中。

 

序列化

  • Cap’n Proto :快速数据交换格式和RPC系统。
  • cereal :C++11 序列化库
  • FlatBuffers :内存高效的序列化库
  • MessagePack :C/C++的高效二进制序列化库,例如 JSON
  • protobuf :协议缓冲,谷歌的数据交换格式。
  • protobuf-c :C语言的协议缓冲实现
  • SimpleBinaryEncoding:用于低延迟应用程序的对二进制格式的应用程序信息的编码和解码。
  • Thrift :高效的跨语言IPC/RPC,用于C++,Java,Python,PHP,C#和其它多种语言中,最初由Twitter开发。

 

视频

  • libvpx :VP8/VP9编码解码SDK
  • FFmpeg :一个完整的,跨平台的解决方案,用于记录,转换视频和音频流。
  • libde265 :开放的h.265视频编解码器的实现。
  • OpenH264:开源H.364 编解码器。
  • Theora :免费开源的视频压缩格式。

 

虚拟机

  • CarpVM:C中有趣的VM,让我们一起来看看这个。
  • MicroPython :旨在实现单片机上Python3.x的实现
  • TinyVM:用纯粹的ANSI C编写的小型,快速,轻量级的虚拟机。

 

Web应用框架

  • Civetweb :提供易于使用,强大的,C/C++嵌入式Web服务器,带有可选的CGI,SSL和Lua支持。
  • CppCMS :免费高性能的Web开发框架(不是 CMS).
  • Crow :一个C++微型web框架(灵感来自于Python Flask)
  • Kore :使用C语言开发的用于web应用程序的超快速和灵活的web服务器/框架。
  • libOnion:轻量级的库,帮助你使用C编程语言创建web服务器。
  • QDjango:使用C++编写的,基于Qt库的web框架,试图效仿Django API,因此得此名。
  • Wt :开发Web应用的C++库。

 

XML

XML就是个垃圾,xml的解析很烦人,对于计算机它也是个灾难。这种糟糕的东西完全没有存在的理由了。-Linus Torvalds

  • Expat :用C语言编写的xml解析库
  • Libxml2 :Gnome的xml C解析器和工具包
  • libxml++ :C++的xml解析器
  • PugiXML :用于C++的,支持XPath的轻量级,简单快速的XML解析器。
  • RapidXml :试图创建最快速的XML解析器,同时保持易用性,可移植性和合理的W3C兼容性。
  • TinyXML :简单小型的C++XML解析器,可以很容易地集成到其它项目中。
  • TinyXML2:简单快速的C++CML解析器,可以很容易集成到其它项目中。
  • TinyXML++:TinyXML的一个全新的接口,使用了C++的许多许多优势,模板,异常和更好的异常处理。
  • Xerces-C++ :用可移植的C++的子集编写的XML验证解析器。

 

多项混杂

一些有用的库或者工具,但是不适合上面的分类,或者还没有分类。

  • C++ Format :C++的小型,安全和快速格式化库
  • casacore :从aips++ 派生的一系列C++核心库
  • cxx-prettyprint:用于C++容器的打印库
  • DynaPDF :易于使用的PDF生成库
  • gcc-poison :帮助开发人员禁止应用程序中的不安全的C/C++函数的简单的头文件。
  • googlemock:编写和使用C++模拟类的库
  • HTTP Parser :C的http请求/响应解析器
  • libcpuid :用于x86 CPU检测盒特征提取的小型C库
  • libevil :许可证管理器
  • libusb:允许移动访问USB设备的通用USB库
  • PCRE:正则表达式C库,灵感来自于Perl中正则表达式的功能。
  • Remote Call Framework :C++的进程间通信框架。
  • Scintilla :开源的代码编辑控件
  • Serial Communication Library :C++语言编写的跨平台,串口库。
  • SDS:C的简单动态字符串库
  • SLDR :超轻的DNS解析器
  • SLRE: 超轻的正则表达式库
  • Stage :移动机器人模拟器
  • VarTypes:C++/Qt4功能丰富,面向对象的管理变量的框架。
  • ZBar:‘条形码扫描器’库,可以扫描照片,图片和视频流中的条形码,并返回结果。
  • CppVerbalExpressions :易于使用的C++正则表达式
  • QtVerbalExpressions:基于C++ VerbalExpressions 库的Qt库
  • PHP-CPP:使用C++来构建PHP扩展的库
  • Better String :C的另一个字符串库,功能更丰富,但是没有缓冲溢出问题,还包含了一个C++包装器。

 

软件

用于创建开发环境的软件

编译器

C/C++编译器列表

  • Clang :由苹果公司开发的
  • GCC:GNU编译器集合
  • Intel C++ Compiler :由英特尔公司开发
  • LLVM :模块化和可重用编译器和工具链技术的集合
  • Microsoft Visual C++ :MSVC,由微软公司开发
  • Open WatCom :Watcom,C,C++和Fortran交叉编译器和工具
  • TCC :轻量级的C语言编译器

 

在线编译器

在线C/C++编译器列表

  • codepad :在线编译器/解释器,一个简单的协作工具
  • CodeTwist:一个简单的在线编译器/解释器,你可以粘贴的C,C++或者Java代码,在线执行并查看结果
  • coliru :在线编译器/shell, 支持各种C++编译器
  • Compiler Explorer:交互式编译器,可以进行汇编输出
  • CompileOnline:Linux上在线编译和执行C++程序
  • Ideone :一个在线编译器和调试工具,允许你在线编译源代码并执行,支持60多种编程语言。

 

调试器

C/C++调试器列表

 

集成开发环境(IDE)

C/C++集成开发环境列表

  • AppCode :构建与JetBrains’ IntelliJ IDEA 平台上的用于Objective-C,C,C++,Java和Java开发的集成开发环境
  • CLion:来自JetBrains的跨平台的C/C++的集成开发环境
  • Code::Blocks :免费C,C++和Fortran的集成开发环境
  • CodeLite :另一个跨平台的免费的C/C++集成开发环境
  • Dev-C++:可移植的C/C++/C++11集成开发环境
  • Eclipse CDT:基于Eclipse平台的功能齐全的C和C++集成开发环境
  • Geany :轻量级的快速,跨平台的集成开发环境。
  • IBM VisualAge :来自IBM的家庭计算机集成开发环境。
  • Irony-mode:由libclang驱动的用于Emacs的C/C++微模式
  • KDevelop:免费开源集成开发环境
  • Microsoft Visual Studio :来自微软的集成开发环境
  • NetBeans :主要用于Java开发的的集成开发环境,也支持其他语言,尤其是PHP,C/C++和HTML5。
  • Qt Creator:跨平台的C++,Javascript和QML集成开发环境,也是Qt SDK的一部分。
  • rtags:C/C++的客户端服务器索引,用于 跟基于clang的emacs的集成
  • Xcode :由苹果公司开发
  • YouCompleteMe:一个用于Vim的根据你敲的代码快速模糊搜索并进行代码补全的引擎。

 

构建系统

  • Bear :用于为clang工具生成编译数据库的工具
  • Biicode:基于文件的简单依赖管理器。
  • CMake :跨平台的免费开源软件用于管理软件使用独立编译的方法进行构建的过程。
  • CPM:基于CMake和Git的C++包管理器
  • FASTBuild:高性能,开源的构建系统,支持高度可扩展性的编译,缓冲和网络分布。
  • Ninja :专注于速度的小型构建系统
  • Scons :使用Python scipt 配置的软件构建工具
  • tundra :高性能的代码构建系统,甚至对于非常大型的软件项目,也能提供最好的增量构建次数。
  • tup:基于文件的构建系统,用于后台监控变化的文件。

 

静态代码分析

提高质量,减少瑕疵的代码分析工具列表


  1. 值得推荐的C/C++框架和库

iperf

Iperf 是一个 TCP/IP 和 UDP/IP 的性能测量工具,能够提供网络吞吐率信息,以及震动、丢包率、最大段和最大传输单元大小等统计信息;
从而能够帮助我们测试网络性能,定位网络瓶颈。

$ iperf3 -h

TCP 模式下 客户端&服务器

在您需要测试启用 Iperf 服务器模式:

$ iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------

使用客户端模式连接第一台服务器。

$ iperf3 -c 127.0.0.1
Connecting to host 127.0.0.1, port 5201
[  4] local 127.0.0.1 port 50924 connected to 127.0.0.1 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  3.74 GBytes  32.1 Gbits/sec    0   1.12 MBytes       
[  4]   1.00-2.00   sec  3.80 GBytes  32.7 Gbits/sec    0   1.25 MBytes       
[  4]   2.00-3.00   sec  3.65 GBytes  31.3 Gbits/sec    0   1.62 MBytes     

server有类似输出:

[  5] local 127.0.0.1 port 5201 connected to 127.0.0.1 port 50924
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec  3.60 GBytes  30.9 Gbits/sec                  
[  5]   1.00-2.00   sec  3.80 GBytes  32.6 Gbits/sec                  
[  5]   2.00-3.00   sec  3.65 GBytes  31.3 Gbits/sec                  
[  5]   3.00-4.00   sec  3.97 GBytes  34.1 Gbits/sec                  
[  5]   4.00-5.00   sec  3.91 GBytes  33.6 Gbits/sec                  
[  5]   5.00-6.00   sec  3.90 GBytes  33.5 Gbits/sec                  
[  5]   5.00-6.00   sec  3.90 GBytes  33.5 Gbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-6.00   sec  0.00 Bytes  0.00 bits/sec                  sender
[  5]   0.00-6.00   sec  25.7 GBytes  36.8 Gbits/sec                  receiver
iperf3: the client has terminated
-----------------------------------------------------------
Server listening on 5201

测试 UDP 使用参数 -u

双向测试使用参数 -d

netperf

与iperf类似,也使用client/server方式工作。
server端是netserver,用来侦听来自client端的连接,client端是netperf,用来向server发起网络测试。
在client与server之间,首先建立一个控制连接,传递有关测试配置的信息,以及测试的结果;
在控制连接建立并传递了测试配置信息以后,client与server之间会再建立一个测试连接,用来来回传递着特殊的流量模式,以测试网络的性能。

  1. netperf 与网络性能测量

tcpdump

TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。
它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

tcpdump tcp port 23 host 172.16.14.107 
tcpdump -w /path/to/log -i eth0 host <CLIENTIP> and port 80

wireshark

Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。

host

用于查询DNS的工具,它通过常转换指定主机名称的主机名称为IP地址。当不指定参数时,它显示host命令的帮助信息

$ host -a www.baidu.com
Trying "www.baidu.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57765
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 4

;; QUESTION SECTION:
;www.baidu.com.INANY

;; ANSWER SECTION:
www.baidu.com.459INCNAMEwww.a.shifen.com.

;; ADDITIONAL SECTION:
www.a.shifen.com.115INA115.239.211.112
www.a.shifen.com.115INA115.239.210.27
www.a.shifen.com.115INA180.97.33.108
www.a.shifen.com.115INA180.97.33.107

Received 122 bytes from 127.0.1.1#53 in 2 ms

nslookup

用于查找域名服务器的程序,nslookup有两种模式:互交和非互交

$ nslookup www.baidu.com
Server:127.0.1.1
Address:127.0.1.1#53

Non-authoritative answer:
www.baidu.comcanonical name = www.a.shifen.com.
Name:www.a.shifen.com
Address: 180.97.33.108
Name:www.a.shifen.com
Address: 180.97.33.107

$ nslookup 
> www.baidu.com
Server:127.0.1.1
Address:127.0.1.1#53

Non-authoritative answer:
www.baidu.comcanonical name = www.a.shifen.com.
Name:www.a.shifen.com
Address: 180.97.33.107
Name:www.a.shifen.com
Address: 180.97.33.108
> set all
Default server: 127.0.1.1
Address: 127.0.1.1#53

Set options:
novcnodebugnod2
searchrecurse
timeout = 0retry = 3  port = 53ndots = 1
querytype = A           class = IN
srchlist = 
> exit

dig

是一个功能类似nslookup命令的工具。能得到更详细的DNS解析报告。在使用上要比 nslookup方便。可以作为网络故障的诊断工具

必要参数:@DNSserver DNS服务器地址 (默认:/etc/resolv.conf 文件查询)

$ dig @127.0.1.1 www.baidu.com

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @127.0.1.1 www.baidu.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46874
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 5, ADDITIONAL: 6

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.baidu.com.INA

;; ANSWER SECTION:
www.baidu.com.817INCNAMEwww.a.shifen.com.
www.a.shifen.com.213INA115.239.210.27
www.a.shifen.com.213INA115.239.211.112

;; AUTHORITY SECTION:
a.shifen.com.1094INNSns1.a.shifen.com.
a.shifen.com.1094INNSns2.a.shifen.com.
a.shifen.com.1094INNSns5.a.shifen.com.
a.shifen.com.1094INNSns4.a.shifen.com.
a.shifen.com.1094INNSns3.a.shifen.com.

;; ADDITIONAL SECTION:
ns1.a.shifen.com.43INA61.135.165.224
ns2.a.shifen.com.274INA180.149.133.241
ns3.a.shifen.com.43INA61.135.162.215
ns4.a.shifen.com.558INA115.239.210.176
ns5.a.shifen.com.204INA119.75.222.17

;; Query time: 3 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Fri Jun 24 15:04:24 CST 2016
;; MSG SIZE  rcvd: 271

用 dig 查看反向解析

dig -x 210.52.83.228 @server

查找一个域的授权 dns 服务器

dig xmgd.com. +nssearch

从根服务器开始追踪一个域名的解析过程

dig xmgd.com +trace

netstat

netstat命令主要用于显示与IP、TCP、UDP和ICMP协议相关的统计数据及网络相关信息,例如可以用于检验本机各端口的网络连接情况。

当你想看看哪个端口被哪个程序占用了;
当你想查看TCP连接状态;当你想统计网络连接信息时,这些都可以用netstat命令来搞定,这就是netstat。

  • 列出所有端口(包括监听和未监听的)
netstat -a      # 列出所有端口
netstat -at     # 列出所有TCP端口
netstat -au     # 列出所有UDP端口
  • 列出所有处于监听状态的Sockets
netstat -l      # 只显示监听端口
netstat -lt     # 只列出所有监听TCP端口
netstat -lu     # 只列出所有监听UDP端口
netstat -lx     # 只列出所有监听UNIX端口
  • 显示所有端口的统计信息
netstat -s      # 显示所有端口的统计信息
netstat -st     # 显示TCP端口的统计信息
netstat -su     # 显示UDP端口的统计信息
  • 显示路由信息
netstat -r

netstat是一个非常强大的命令,特别是和其它命令进行结合时,更能体现出它的强大性,比如统计TCP每个连接状态的数据:

netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}'

又比如查找请求数量排名前20的IP:

netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20

ss

ss命令用于显示socket状态.
他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix domain sockets等等统计.
它比其他工具展示等多tcp和state信息. 它是一个非常实用、快速、有效的跟踪IP连接和sockets的新工具

常用ss命令:

ss -l 显示本地打开的所有端口
ss -pl 显示每个进程具体打开的socket
ss -t -a 显示所有tcp socket
ss -u -a 显示所有的UDP Socekt
ss -o state established '( dport = :smtp or sport = :smtp )' 显示所有已建立的SMTP连接
ss -o state established '( dport = :http or sport = :http )' 显示所有已建立的HTTP连接
ss -x src /tmp/.X11-unix/* 找出所有连接X服务器的进程
ss -s 列出当前socket详细信息:

显示sockets简要信息,列出当前已经连接,关闭,等待的tcp连接

$ ss -s
Total: 1105 (kernel 0)
TCP:   201 (estab 95, closed 4, orphaned 5, synrecv 0, timewait 2/0), ports 0

Transport Total     IP        IPv6
*     0         -         -        
RAW  2         0         2        
UDP  40        27        13       
TCP  197       187       10       
INET  239       214       25       
FRAG  0         0         0        

ss使用IP地址筛选

ss src ADDRESS_PATTERN
src:表示来源
ADDRESS_PATTERN:表示地址规则

如下:
ss src 120.33.31.1 # 列出来之20.33.31.1的连接

# 列出来至120.33.31.1,80端口的连接
ss src 120.33.31.1:http
ss src 120.33.31.1:80

ss使用端口筛选

ss dport OP PORT
OP:是运算符
PORT:表示端口
dport:表示过滤目标端口、相反的有sport

OP运算符如下:

<= or le : 小于等于 >= or ge : 大于等于
== or eq : 等于
!= or ne : 不等于端口
< or lt : 小于这个端口 > or gt : 大于端口

OP实例

ss sport = :http 也可以是 ss sport = :80
ss dport = :http
ss dport \> :1024
ss sport \> :1024
ss sport \< :32000
ss sport eq :22
ss dport != :22
ss state connected sport = :http
ss \( sport = :http or sport = :https \)
ss -o state fin-wait-1 \( sport = :http or sport = :https \) dst 192.168.1/24

netem & tc

netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块。
该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带宽、传输延迟、丢包等等情况。
使用 Linux 2.6 (或以上) 版本内核的很多发行版 Linux 都开启了该内核功能,
比如 Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian 等等。

tc 是Linux 系统中的一个工具,全名为 traffic control(流量控制)。
tc 可以用来控制 netem 的工作模式,也就是说,如果想使用 netem ,需要至少两个条件,一个是内核中的 netem 功能被包含,另一个是要有 tc 。

将 eth0 网卡的传输设置为 100ms ,同时,大约有 30% 的包会延迟 ± 10ms 发送

$  tc qdisc add dev eth0 root netem delay 100ms 10ms 30%

将 eth0 网卡的传输设置为随机丢掉 1% 的数据包

$ tc qdisc add dev eth0 root netem loss 1%

ping

检测丢包

何判断网络是否存在丢包呢?非常简单,通过常用的「ping」命令即可:

$ ping -f <IP>

关于其中的「-f」选项,在手册中是这样解释的:

Flood ping. For every ECHO_REQUEST sent a period “.” is printed, while for ever ECHO_REPLY received a backspace is printed. This provides a rapid display of how many packets are being dropped. If interval is not given, it sets interval to zero and outputs packets as fast as they come back or one hundred times per second, whichever is more. Only the super-user may use this option with zero interval.

简单点说:发送洪水请求,每个请求打印一个点,每个响应删除一个点。
如果网络存在丢包,那么会呈现出一长串不断增加的点,简单易用,童叟无欺。

$ ping -f -i .2 www.baidu.com
PING www.a.shifen.com (115.239.211.112) 56(84) bytes of data.
......^C
--- www.a.shifen.com ping statistics ---
259 packets transmitted, 253 received, 2% packet loss, time 51837ms
rtt min/avg/max/mdev = 2.948/4.136/15.631/1.465 ms, ipg/ewma 200.920/4.055 ms

traceroute

通过Traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。
当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,
但基本上来说大部分时候所走的路由是相同的。
UNIX系统中,我们称之为Traceroute,MS Windows中为Tracert。
Traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。
一条路径上的每个设备Traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其IP地址。

$ traceroute www.baidu.com
traceroute to www.baidu.com (115.239.210.27), 30 hops max, 60 byte packets
1  192.168.110.1 (192.168.110.1)  0.673 ms  0.653 ms  0.655 ms
2  * * *
3  192.168.3.1 (192.168.3.1)  1.267 ms  1.611 ms  1.609 ms
4  * * *
5  115.236.90.217 (115.236.90.217)  13.796 ms  13.775 ms  13.787 ms
6  220.191.159.125 (220.191.159.125)  17.639 ms 61.164.3.241 (61.164.3.241)  3.710 ms 61.164.8.45 (61.164.8.45)  3.654 ms
7  61.164.31.218 (61.164.31.218)  6.728 ms * *
8  * * *
9  115.239.209.10 (115.239.209.10)  11.003 ms 115.239.209.30 (115.239.209.30)  10.396 ms 115.239.209.14 (115.239.209.14)  11.438 ms
10  * * *
30  * * *

记录按序列号从1开始,每个纪录就是一跳,每跳表示一个网关,我们看到每行有三个时间,单位是 ms,其实就是-q的默认参数。
探测数据包向每个网关发送三个数据包后,网关响应后返回的时间;如果您用 traceroute -q 4 www.58.com ,表示向每个网关发送4个数据包。

有一些行是以星号表示的。出现这样的情况,可能是防火墙封掉了ICMP的返回信息,所以我们得不到什么相关的数据包返回数据。


  1. iperf交叉编译和 使用
  2. iperf for Linux 在TOP6410上的交叉编译和使用
  3. 网络性能测试工具iperf编译记录
  4. 域名解析之dig,host,nslookup命令