10月 26

转帖记录“十个最值得阅读学习的C开源项目代码”

原地址:http://my.oschina.net/zhoukuo/blog/335788

1. Webbench

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

tinyhttpd是一个超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个 Http Server 的本质。下载链接:http://sourceforge.net/projects/tinyhttpd/
3. cJSON

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

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

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

主要特点:

免费且开源,google提供技术支持;

轻量级的框架,使测试更加快速简单;

避免使用复杂的编译器特性,对老版本的编译器来讲,兼容性好;

并不强制要求待测代码必须依赖C99标准,这一特性对许多嵌入式系统的开发很有用

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

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

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

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

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

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

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

另一方面,最近的操作系统,例如Linux 最新版的内核源代码据说超过了1000 万行。就算不是初学者,想完全理解全部代码基本上也是不可能的。下载地址:http://minnie.tuhs.org/cgi-bin/utree.pl?file=V6
10. NETBSD

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

10月 13

trondb 返回值简单处理

trondb在处理数据库update部分后,因为没有返回值,所以报错如下。
File “/usr/local/lib/python2.7/site-packages/torndb.py”, line 137, in query
column_names = [d[0] for d in cursor.description]
TypeError: ‘NoneType’ object is not iterable

我的原则是不修改框架内容,将来框架升级了此问题可能忘了修改,如果不升级,框架有了漏洞不升级也不现实。所以还是修改自己代码比较现实。
直接在提交数据后用try屏蔽,然后在用select进行一次查询。

def init_pass(user, passwd):
    try:
        idb.query('UPDATE user SET passwd=\'%s\' where user=\'%s\'' % (passwd, user))
    except:
        pass
    _v = odb.query('SELECT count(*) as count FROM user WHERE passwd=\'%s\' and user=\'%s\'' % (passwd, user))
    if int(_v[0]['count']) == 1:
        _get = 'OK'
    else:
        _get = 'ERROR'
    return _get
9月 25

CentOS6.5_64 安装python3.4.0rc3 测试

CentOS6.5_x64操作系统自带的是python2.6.6r266。
升级操作系统
yum makecache
yum -y update
yum -y upgrade
yum -y install gcc* gcc-c++ sysstat ncurses ncurses-devel make automake openssl* zlib*
yum -y install vim ntpdate lsof setuptool net-snmp tcpdump zip unzip svn wget curl git
yum -y install libevent libevent-devel uuid-devel libboost libboost-devel gd gd-*
yum -y install crontabs net-tools ntpdate
yum -y install mysql-client mysql-devel
yum -y groupinstall “Chinese Support”
ntpdate pool.ntp.org

开始安装python
wget https://www.python.org/ftp/python/3.4.0/Python-3.4.0rc3.tgz

/bin/tar zxvf Python-3.4.0rc3.tgz
cd Python-3.4.0rc3
./configure
make && make install

运行速度测试代码参考:http://www.simonzhang.net/?p=1844

python 2.7.6rc1 测试结果如下:

20.5176548958

real 0m20.568s
user 0m20.546s
sys 0m0.025s

Python-3.4.0rc3 测试结果如下:

18.61501383781433

real 0m18.674s
user 0m18.656s
sys 0m0.010s

python-3.4 自带pip工具
pip3 install PyMySQL
pip3 install tornado
pip3 install torndb

#!/bin/python
#-*- coding:utf-8 -*-
# Filename:    testpython3.py
# Revision:    1.0
# Date:        2014-09-22
# Author:      simonzhang
# web:         www.simonzhang.net
# Email:       simon-zzm@163.com
### END INIT INFO
import pymysql

def sql_comm(sql_run,comm):
    try:
        conn = pymysql.connect(host = '192.168.0.1', \
                               port = 3306, \
                               user = 'test', passwd = '123456', \
                               db = 'tt', charset = 'utf8', \
                               connect_timeout = 30)
    except pymysql.MySQLError:
        pass
    cur = conn.cursor()
    try:
        cur.execute(sql_run)
        if comm == 'y':
            cur.execute("commit")
        result_set = cur.fetchall()
        return(result_set)
        cur.close()
        db.close()
    except:
        pass


if __name__== '__main__':
    sql_run = "select count(*) from user"
    comm = "n"
    _get = sql_comm(sql_run, comm)
    print(_get)

总结python3的语法更标准化,但是速度提升不明显。通过查询资料显示第三方库的稳定性也是不特别好。所以当前我还是老老实实使用python2。

9月 22

RAD Studio XE 想爱你不容易

  在浏览技术站的时候看到,多年前学习的delphi也能开发android,十分高兴(当年放弃是因为找工作不好找,所以开始学习别的)。因为在学习android的java过程中发现,自己还是很不适应。
  赶紧下载RAD Studio XE6。ISO有5G多下载回来。我的操作系统是win7 64位,C盘保留了18G。悲催的是C盘被写满了,还是没有装完,只能重装。费了不少力气把软件删除。安装过程中把执行部分放到其他盘,但是装完不能启动。
  无奈下载了RAD Studio XE7,又是5G多,使用网上写的30天试用码,还是不能用。下载安装等工作用了差不多两天,还是没有搞定。真是想说爱你不容易。
  再等等,如有确认能安装成功的文档,我在测试吧。