Skip to content

{ Category Archives } 开发学习

记录点学习实践的东东

部署小型软件项目开发管理平台

介绍
一个软件项目的开发一般包括文档管理、代码管理、版本管理、进度管理、bug管理等,这方面的支持工具也很多。我觉得Trac是一个很优秀的代表,用它搭配SVN作为前端工作,差不多可以把这些任务都顺利解决了。Trac有如下一些特点:
ticket
Trac利用ticket的概念,把feature提交、task分配以及bug管理很完美的整合到了一起。

可以设置ticket的优先
ticket和roadmap结合,并且能够图形化显示项目进度
自定义条件生成bug报告

wiki
wiki功能贯穿在整个工具里,可以很方便的组织说明文档。同时增加了许多bug管理的专用标记,能方便的创建到ticket、代码行甚至修改历史的链接。
subversion
Trac可以作为subversion的前端,和svn搭配得很好。比如可以在timeline中看到所有的提交记录,可以在source view里方便的对比历史版本,并且具备语法高亮。

Tagged

[翻译]把STL容器放入共享内存

昨天在上篇blog里描写了如何把STL容器放到共享内存里去,不过由于好久不写blog,发觉词汇组织能力差了很多,不少想写的东西写的很零散,今天刚好翻看自己的书签,看到一篇挺老的文章,不过从共享内存到STL容器讲述得蛮全面,还提供了学习的实例,所以顺便翻译过来,并附上原文地址。
共享内存(shm)是当前主流UNIX系统中的一种IPC方法,它允许多个进程把同一块物理内存段(segment)映射(map)到它们的地址空间中去。既然内存段对于各自附着(attach)的进程是共享的,这些进程可以很方便的通过这块共享内存上的共有数据进行通信。因此,顾名思义,共享内存就是进程之间共享的一组内存段。当一个进程附着到一块共享内存上后,它得到一个指向这块共享内存的指针;该进程可以像使用其他内存一样使用这块共享内存。当然,由于这块内存同样会被其他进程访问或写入,所以必须要注意进程同步问题。
参考如下代码,这是UNIX系统上使用共享内存的一般方法(注:本文调用的是POSIX函数):

Tagged , ,

STL容器放入共享内存

STL可以说是C++的重要的组成部分,它提供了一系列方便使用的容器,可以供我们存放数据,节省了很多开发时间。不过如果打算在多个进程之间共享一个STL容器,却常常会遭遇一些困难。比如你正在使用一个map,一般的IPC方法,可能下意识的你就会选择使用共享内存,如果可以把这个map放入一块共享内存供多个进程操作,那该多方便呢。然而问题却没这么简单,由于STL帮我们完美的封装好了map的内部方法,包括内存分配方案,这也导致了我们没法把map直接简单的用placement new放置到已知的共享内存上。
要完成这个任务就需要我们自己实现一个基于共享内存的allocator,替换map默认的allocator,在这个allocator中实现map的内存分配方案。关于allocator的讲解可以看侯捷的《STL源码剖析》这本书,写一个简单的allocator直接套下边的模板就可以了,主要实现的是这几个函数:

max_size() 容器的最大容量
allocate(num) 为num个元素分配内存
construct(p) 将p所指的元素初始化
destroy(p) 销毁p所指向的元素
deallocate(p, num) 收回p所指的num个空间

Tagged ,

日志操作利器log4cxx

今天看了一场今年WCG的比赛,jaedong对阵stork,非常精彩。突然感觉星际里的微操和大局观就类同C和C++的开发,写C代码的时候就满脑子的字节、移位、共享内存、文件描述符之类的,C++就考虑类、模板、重载、IO流、标准库了。这只是个引子,在C开发一直用openlog(), syslog() 来记录日志,虽然方便,但不够强大。今天来看一下C++中的一些日志操作库。
流行的一些C++日志库有好些,比如 log4cplus, log4cpp, log4cxx, boost log 功能依次增强吧。
当前的状况是,log4cplus已然停止开发许久;log4cpp去年突然有了更新,升级到1.0稳定版;log4cxx今年有了更新,现在属于apache的一个项目;boost log功能最强,而且文档十分详尽,不过不清楚为何当年申请进入boost库被reject。前三个有着共同的前缀log4,意思是它们都是从apache优秀的log4j日志操作库port出来的。优秀的实现总是在多个语言和平台上都会被人借鉴。
文档状况是,除了boost log外文档都很匮乏,主要参照内容就是doxygen生成的API文档。
性能上,一些早期的资料表明log4cpp性能相当出众,它也是较早移植log4j的C++库,log4cxx是后来apache自己的一个移植,具体性能影响和你使用的配置有关系。log4cxx是个线程安全并且支持多种appender的日志库。
其他细节,log4cpp提供了一个对比表。

Tagged ,

STL小记

使用hash_map
这两天写段程序, 需要用到hash_map, 于是跑到 sgi 上学习了一下, 结果郁闷的发现给出的例子在Mac和Linux下都没法编译通过. 因为hash_map并没有进入C++的STL标准, 于是破费了点周折才发现hash_map位于/usr/include/c++/4.0.0/ext目录下, 并且在__gnu_gxx的名字空间中. 所以要在Mac或者Linux下使用hash_map, 需要加上该名字空间.
这里有个例子:

Tagged , ,

操作mysql数据库

Mysql数据库管理
强制指定mysql的字符集
修改my.cnf
collation_server=utf8_unicode_ci
character_set_server=utf8
skip-character-set-client-handshake
高负荷请求的一些设置
set-variable = max_connections=500
set-variable = max_connect_errors=10000
set-variable = wait_timeout=300
set-variable = interactive_timeout=30
set-variable = thread_cache=40
set-variable = back_log=500
skip-locking
skip-name-resolve

Tagged ,

用php书写命令行脚本

一般php都是用来写web服务器脚本, 不过最近一点小东西不凑巧写成了php, 后来才知道原来不是在web服务器上跑. 还好php就是个万能胶, 而脚本特点又是开发周期短, 于是又改了改, 把这些php代码都变成了CLI调用.
CLI就是纯粹在命令行下用的, 它不会有任何HTTP的head输出. 你敲入命令 php -v 应该就能看出你的php是CLI还是CGI模式的. 另外注意一下使用CLI的时候对应的是哪个php.ini, 可以用 php -i 看到.
把php写成命令行脚本有一些注意事项, 首先像写shell脚本一样, 第一行指定一下解释器位置, 其中 -q 表示安静执行, 可以省略.
Windows下是这样:
#!d:\WebEngine\php-5.2.1-Win32\php.exe -q
Linux下是这样:
#!/usr/local/bin/php -q
然后开始写代码, 接受参数使用数组 $_SERVER["argv"], 数组第一个元素是该脚本文件名. 该数组等价于变量 $argv.
php脚本同样支持标准输入输出和错误输出, 分别对应三个常量 STDIN, STDOUT 和 STDERR. 这三个常量是被包装过的, 其实分别对于三个文件句柄 php://stdin, php://stdout 和 php://stderr. 比如从标准输入读入一段字符, 然后打印出来:
if(!defined("STDIN")) {
    define("STDIN", fopen("php://stdin", "r"));
}
$strname = fread(STDIN, 100);
if(!defined("STDIN")) {
    define("STDOUT", fopen("php://stdout", "w"));
}
fwrite(STDOUT, [...]

Tagged

python学习笔记

一切皆对象
数据类型
基本类型

整型 integer
浮点数 float,转换字符串float(string)
None

列表
例如:
a = [0,1,2,3,4,5,6]
提取子串
包括起始位置元素,但不包括结束位置的元素!

>>> a[1:4]
[1,2,3]
>>> a[1:-1]
[1,2,3,4,5]

list comprehension
[ for k in L if ]
语义是这样的:
returnList=[]
for k in L:
if : returnList.append()
return returnList;
类似Perl中的grep用法, @new_array = grep { /pattern/ } @orig_array;
和map用法也有些类似,不过增加了filter语义
例子,取出数组a中的单词,并转化为大写
>>> [ k.upper() for k in a if k.isalpha() ]
字符串
可以把字符串看成包含很多字符的list
查找函数
S.index(substring, [ start [, end]]) [...]

Tagged

Perl学习手记

Perl's philosophy

There is more than one way to do it.
No unnecessary limits.

Tagged