存档

‘程序员’ 分类的存档

用好你的vim

2010年1月20日 3 条评论

以前上学的时候,主要用java,Eclipse真是个好东东。上班后,开始用c,php,python等,越来越发现vim是一个好东东,如果不是写java的话,推荐大家投入vim的怀抱。
vim的根本性好处就是:写代码的时候,你的手腕不需要动。不需要动鼠标,不需要移动右手去按那个“上下左右”(当然是在你用hjkl的情况下)
基本的那些用vimtutor看看就好了,高级的应用里面,我接触到的一个是正则,另外一个是列编辑。建议大家写代码的时候,都列对齐,使用ctrl+v进行列编辑,简直太爽了。

关于vim的插件,都是放在在~/.vim文件夹中的,在这个文件夹下面有一些子文件夹

1.plugin。启动Vim时, 它自动载入一些全局的plugin,就是从这个目录里面读取的

2.ftplugin。这种插件是通过“:filetype plugin on”打开的,默认这个命令可以配置在~/.vimrc文件中,插件的作用比如是帮助控制缩进等,对python语言来说尤其重要

3.doc。这个可以放置一些plugin的帮助文件

上面的这些定义比较宽泛,是在vim手册里面描述的。另外,python推荐使用indent/python.vim,可以按照规范的控制python的缩进。

————问题的分割线————
问题:为啥不是写java就推荐vim呢?
回答:Eclipse可以根据java代码的编译情况,自动添加import选项,并且重构功能也很强大,是一个很好的选择。

---------------------------------------------------------------
本站作品根据创作共同协议进行授权, 转载时请务必以超链接形式标明文章原始出处
原文地址:http://www.mirecle.com/2010/01/20/make-good-use-of-your-vim.html
---------------------------------------------------------------

分类: 程序员, 软件 标签:

关于网页/javascript的中文乱码

2010年1月19日 2 条评论

关于网页乱码问题,网上貌似有不少的说法,但与此同时,也有很多人说解决方法不起作用,无论是在网页的head头中加上“”标识还是修改apache的AddDefaultCharset问题,都有不能解决问题的时候。其实大家把这个搞复杂了,影响正常显示的只有两个因素:

1.网页被浏览器解码的方式

2.网页文件中字符本身的编码方式

只要这两个是一致的,就可以解决乱码问题。JavaScript操作中文出现乱码的问题和这个也是同一个道理。

在网页的head头上制定charset是要求浏览器按照制定的方式对这个页面进行解码,而在apache配置AddDefaultCharset则是在response的一个header中加上了指定的解码方式。个人感觉还是在head头中指定更灵活一些,当然,这个是与应用相关的,孰优孰劣也说不定。

解决了浏览器解码的问题,就需要注意查看文件的编码是否与指定的解码方式是否一致,在vim里面可以通过”set encoding”来查看当前文件的编码方式,使用”set encoding=gbk”就可以指定文件的编码方式是gbk了。我目前用的文件编码方式多是latin1的,貌似反而到没有遇到乱码的问题,具体没有进行深究

编码方式,还是推荐大家使用gbk或者gb18030。gbk(gb13000)中包含:
1.gb2312的全部汉字,非汉字的符号
2.big5中的全部汉字
3.其它 CJK 汉字
4.其它汉字,部首,符号
gb18030是在2000年推出的标准,与gbk完全兼容

---------------------------------------------------------------
本站作品根据创作共同协议进行授权, 转载时请务必以超链接形式标明文章原始出处
原文地址:http://www.mirecle.com/2010/01/19/on-the-web-javascript-chinese-garbled.html
---------------------------------------------------------------

分类: 程序员 标签:

php反射效果:基类访问子类数据

2010年1月18日 2 条评论

php不用学习直接使用的特点,使它迅速风靡起来,并且被很多不注意的人用烂。当然,它在设计之初就没有考虑采用很规范化的方式也是原因之一。最近在写代码的偷懒之余,偶然发现,基类是可以访问子类的数据的(php 5.2.6):

class base{

    protected $data_test1 = false;

    //FIXME 这个搞法太山寨了
    function set_data($name, $data){
        $this->$name = $data;
    }
}

class extend extends base{
    protected $data_test2 = false;

    function do_output(){
        var_dump($this->data_test2);
    }
}

$test_class = new extend();
$test_class->set_data("data_test1", "hello1");
$test_class->set_data("data_test2", "hello2");
var_dump($test_class);
$test_class->do_output();

看看结果就能知道,php没有将方法的作用范围与类严格的绑定在一起。不过这个对依赖注入的框架来说,这个算是好事了,只需要以数组的形式提供自己所需要的数据,框架用个foreach就给注入进去了。

---------------------------------------------------------------
本站作品根据创作共同协议进行授权, 转载时请务必以超链接形式标明文章原始出处
原文地址:http://www.mirecle.com/2010/01/18/php-reflection-effect-the-base-class-to-access-sub-categories-of-data.html
---------------------------------------------------------------

分类: 程序员 标签:

Opentest测试框架

2009年12月2日 2 条评论

 

1. Opentest的用途

Opentest是一个开放式的测试框架,目的是用于具备规范接口模块自动化回归测试(不太适用于网页展示上的测试)。测试框架遵从简单可依赖的原则,实现不同功能的子模块功能简单,扩展方便。框架使用依赖注入的方式,将实现不同功能的子模块组织起来,完成测试所需的工作。

opentest框架中,使用测试数据与逻辑相分离的方式进行组织。测试数据在不同的逻辑之间具有一定程度的通用性。

2. Opentest的使用

现阶段opentest部署了一个较简单的逻辑,用于支持支付组各server测试中的绝大多数用例,用例的逻辑比较简单,做下面几件事情:

logic

对于测试来说,需要做的就是在配置中提供测试用例执行所需要的数据,不必在做其它的开发性工作。下面就以这个流程为例,说明一下做测试需要进行的工作。

2.1. 目录结构与建立个人配置

|– cases #放置测试用例

| `– sample #测试用例的例子

|– framework #测试框架代码

| |– bin

| |– checker

| |– confmanager

| |– confs #用户配置

| | `– yanp #用户目录

| |– ctrl

| |– dbop

| |– def

| |– faketools

| |– lib

| `– testmods #被测模块

| |– bin #被测模块的可执行程序

| `– conf

`– outputs #输出,日志等内容

`– yanp

目录结构如上图所示。测试用例放置于cases目录中,其中sample文件夹下的是opentest测试用例的示例。在testmods目录中,部署各被测模块,以<程序名>.<版本号>形式部署。

用户配置位于confs文件夹中的用户目录(yanp)中,在这个目录中,存在一个framework_defaults.conf.php文件,这个文件是opentest框架中提供的各工具服务的配置信息,描述了mcpack接口的client与server,数据库与log的配置信息,作为用户自己的配置。在用户目录(yanp)中,还包含了被测模块的配置文件,opentest在执行用例时,将会以指定用户的配置文件启动被测模块。

即使是同一模块,不同用户的端口号与数据库配置也可以不同,例如用户可以配置opentest发送pack的client 向11003端口发送,同时使用固定的端口11003启动所有的server,可以免去每次回归测试环境配置的烦恼。

2.2. 编写并部署测试用例

在opentest中,测试用例只包含测试逻辑所需要的数据。测试用例以类的形式部署,支持继承。这样就可以在基类中部署初始化操作与通用的逻辑,避免在具体的用例数据中编写编写重复的内容。

用例文件sample_case_init.php

class sample_case_init{

    static $TESTMOD_NAME = ‘fake_listener’;
    static $TESTMOD_VER  = ’1.0.0.0′;

    static $DB_INIT = array(
        //写上数据库表中的具体内容,将会truncate对应的表
        //如果不写上表中的具体内容,将会truncate所有的分表(根据数据将数据分到不同表中的情况)
        ‘truncate’ => array(
            ‘table’                 => ‘t_accounts’,
            ‘F_user_id’             => ’100000′,
            ‘F_sub_account_type’    => ’1′,
            ‘F_currency’            => ’1′,
        ), 
    ); 
}

用例文件sample_case1_case.php

require_once(dirname(__FILE__).’/sample_case_init.php’);

class sample_case1_case extends sample_case_init{
    static $CLIENT_PACK = array(
        //发送到被测模块的pack
        ‘send’  => array(
            ‘cmd’       => ‘hello’,
        ), 
        //期望从被测模块接收的pack
        ‘recv’  => array(
            ‘result’    => ’0′,
        ), 
    ); 
//…还有另外一些内容,为节省空间,在此省略…
}

sample_case1_case是opentest需要执行的测试用例,在类中使用静态数组的方式提供进行具体操作的数据。在sample_case类中的一部分数据,可以通过它的基类sample_case_init.php提供。opentest通过反射的方式解析各测试用例。如果测试用例中没有提供对应的数据,根据逻辑的定义,可能认为case失败或者跳过对应的流程。

Opentest支持提供文件名字或者目录的方式指定测试用例,提供目录后,将会执行目录中的所有用例(以_case.php结尾的文件被认为是需要执行的)。

执行用于演示的测试用例:

账户:testframe@jx-testing-eb18.jx.baidu.com

cd test_framework/framework/

./bin/run_sample.sh

3. Opentest的模块结构与开发新功能

Opentest使用一种松散耦合的方式进行组织,case执行逻辑所使用的数据与工具都由组装模块进行依赖注入。比如checker就可以在使用时候注入松散检查或者严格检查不同类型的工作类。目前已经支持数据库操作与mcpack接口,如果需要不同的case执行逻辑,可以通过继承原有的类或者添加一个新的类。

目前opentest
模块结构如下图,各模块都比较简单,主要功能如下:

1. ctrl

a) 解析用户请求,将各功能组件进行组装

b) case执行逻辑,各种不同的case执行逻辑部署在这里,用于组装

c) caseloader,用于解析case配置文件,被组装模块调用,提供所需的数据

d) checker,用于检查测试结果数据域case中预定义的是否相符

2. client:各种发送请求的client,目前有mcpack的与http的

3. server:各种接收请求的server,目前只有mcpack的

4. dbop:用于操作数据库,case文件中指定表名即可,分库分表逻辑在dbop中内置

5. conf:管理用户的配置信息与被测模块的配置信息,附赠一个启动被测模块的能力

clip_image004

4. 附录:

得益于simpletest,目前支持html格式或者text格式的输出,其它功能正在扩展中,目前opentest支持的启动参数

Usage:

-c case_full_name like "/home/test/test.php" or "/home/test". if a dir is given, framework will try all the file in the dir as a case

-o html|text output result as html or text, default is text

-n conf name which you want to use

---------------------------------------------------------------
本站作品根据创作共同协议进行授权, 转载时请务必以超链接形式标明文章原始出处
原文地址:http://www.mirecle.com/2009/12/02/opentest-testing-framework.html
---------------------------------------------------------------

分类: 程序员 标签:

mysql学习笔记-1

2009年10月13日 没有评论

clip_image001

mysql最不同也是最重要的特性,就是它的存储引擎架构。如图,存储引擎只处理mysql server发送的请求,不处理sql语句的解析与缓存等内容。但innodb是一个例外,因为innodb有外键定义,而mysql server目前还没有实现相关内容。

在mysql内部,每个连接都有一个线程来处理这个连接上面的请求(所以事务是不能跨越在两个连接上的,一个连接在同一时间也只能启动一个事务)。

在sql语句的parser,将sql解析成树状结构,这里可能会重写sql决定使用哪个索引等。在query cache存储sql语句与result,如果命中,就不再到存储引擎进行查询了。Query cache只存储select语句。

mysql server本身使用表级锁,如ALTER TABLE使用的就是mysql server提供的。行级锁是在存储引擎实现的,各存储引擎都有自己实现行级锁的方式,mysql server对此不需要了解。

大多数存储引擎的隔离级别是read committed,但Mysql的默认隔离级别却是repeatable read。innodb是通过多版本的方式解决repeatable read带来的幻读问题的。附:

l read uncommited即脏读,一个事务修改了一行,另一个事务也可以读到该行。如果第一个事务执行了回滚,那么第二个事务读取的就是从来没有正式出现过的值。

l read commited即一致读,试图通过只读取提交的值的方式来解决脏读的问题,但是这又引起了不可重复读取的问题。一个事务执行一个查询,读取了大量的数据行。在它结束读取之前,另一个事务可能完成了对数据行的更改。当第一个事务试图再次执行同一个查询,服务器就会返回不同的结果。

l repeatable read即可重复读,在一个事务对数据行执行读取或写入操作时锁定了这些数据行。但是这种方式又引发了幻想读的问题。因为只能锁定读取或写入的行,不能阻止另一个事务插入数据,后期执行同样的查询会产生更多的结果。

l sieralizable完全串行,用的太少,就不写了。

默认情况下,mysql开启autocommit,只有调用start transaction,它一直认为每个sql都是一个单独的事务。如果关闭了autocommit,除非你调用了commit或者rollback,你会一直在一个事务里面。当调用commit或者rollback后,它会自动的帮你在启动一个事务。

因为存储引擎自己实现事务,所以一个事务无法跨越多重存储引擎类型的表。

在一个事务中任何时候都可以获取锁,但只有事务结束时才会释放锁。lock in share mode是允许其他session读但不能写,读取的数据行如果被其他事物锁着,就会等待直到那个事务提交。for update则是排他锁,不允许读或者写。

Innodb实现Mutiversion concurrency control(MVCC),通过为每行数据记录两个隐藏的值,这两个值分别为数据创建点与过期点(binlog中的那些版本号)。增删查的处理就不用多说了,改的时候,innodb通过增加一个数据行的拷贝来完成,拷贝的创建号与原数据行的删除号就是当前系统号。

遗留问题:

在repeatable read下,innodb是怎么处理这个lock in share mode的呢?

---------------------------------------------------------------
本站作品根据创作共同协议进行授权, 转载时请务必以超链接形式标明文章原始出处
原文地址:http://www.mirecle.com/2009/10/13/mysql-study-notes-1.html
---------------------------------------------------------------

分类: 程序员 标签:

我对自动化测试框架的愿景

2009年7月15日 没有评论

理想自动化测试框架,应该满足下面的条件:

1.可文本描述:包括各子系统之间,子系统之中各模块之间的接口,以及个模块及子系统所需要的数据定义。

2.可检查:模块的产出能够进行精确检查,子系统内部各模块之间的通信(在一定程度上,属于产出的一部分)能够进行精确检查,模块产生的日志能够进行检查。

3.能够适应不同类型的被测模块:服务型,批处理型等

4.用户接口友好,测试可能涉及多种功能实体的配置,如一次测试可能需要模拟多个下游桩模块,配置数据等。所有的命令与数据都可以在同一个配置文档中进行配置说明

5.提供一定的附加能力用于模拟异常情况:如kill进程,切断数据库连接,构造磁盘不足等

 

按照目前的情况看来,1,2,3每一点都已经能够提供约50%的能力,4还需要等待1,2逐渐完善才能开始着手。5不是迫切需求。

永远不要一开始就尝试做一个大且完善的系统,着手在小的地方逐渐增强,有一天你会突然发现,原来各个部分组合协作起来,已经是一个不错的系统了

---------------------------------------------------------------
本站作品根据创作共同协议进行授权, 转载时请务必以超链接形式标明文章原始出处
原文地址:http://www.mirecle.com/2009/07/15/i-have-the-vision-of-automated-testing-framework.html
---------------------------------------------------------------

分类: 程序员 标签: