归档 2010

最后更新于 .

最近博友在本博问了很多Vim相关的问题,我已经渐渐感觉到仅凭我一个人即使对vim再怎么精通都是无法回答这所有的问题的,所以在这里把问题列出来,希望知道的朋友能够帮忙解答。 对于这种博友互助,我也在考虑有没有更好的方式,如果大家有什么好的建议或意见都可以跟我提出来,我们一起想更好的方法。 1.By 七彩映像丶 在使用vimwiki的时候遇到一个问题,再次请教你一下. 在新建事项:

 * [3] 切换列表项开/关
   * [0] 简单的在 [ ] 和 [X] 之间切换.
   * [4] 所有的列表子项将被适当的切换为开/关.
   * [4] 仅当当前行是列表项时,切换子项. 
   * [4] 父列表项将受子列表项的切换影响.

生成HTML文件时会自动加上checkbox,却不会显示该事项的进度,虽然我设置了let g:vimwiki_listsyms="01234",问题依旧存在. 我想生成如org-mode效果:

[66%] 新事项
[X] 该事项已完成
[X] 同上
[] 同上
[ ] 未完成

应该怎么设置呢?还是vimwiki不支持该方式生成事项进度? A:作者自己找到了解决方案,并与大家分享(赞一个!) /vimfiles/autoload/vimwiki_html ...

最后更新于 .

对于python,这几天一直有两个问题在困扰我:


  • 1.python中没办法直接取得当前的行号和函数名。这是有人在论坛里提出的问题,底下一群人只是在猜测python为什么不像__file__一样提供__line__和__func__,但是却最终也没有找到解决方案。

  • 2.如果一个函数在不知道自己名字的情况下,怎么才能递归调用自己。这是我一个同事问我的,其实也是获取函数名,但是当时也是回答不出来。


但是今晚!所有的问题都有了答案。
一切还要从我用python的logging模块说起,logging中的format中是有如下选项的:

%(name)s Name of the logger (logging channel)
%(levelno)s Numeric logging level for the message (DEBUG, INFO,
WARNING, ERROR, CRITICAL)
%(levelname)s Text logging level for the message ("DEBUG", "INFO",
"WARNING", "ERROR", "CRITICAL")
%(pathname)s Full pathname ...

最后更新于 .

还是先说一下背景吧,之前有写过C,C++代码中调用python脚本,但也仅是停留在浅尝辄止的地步,这次由于在fuload中要实现调用python的脚本,所以继续深入了解了一下。
提前打好招呼,这篇文章有点长,但是信息量也比较大,如果感兴趣希望能耐心读下去。
另外,文章中的代码都可以直接到fuload项目下看到:
http://code.google.com/p/fuload/source/browse/#svn/trunk/src/slave/py_module
先来看一下so的cpp文件:


#include
#include
#include
#include
#include
#include
using namespace std;

#define PYMODULE_NAME "fl_module"
#define PYFUNC_INIT "fuload_handle_init"
#define PYFUNC_PROCESS "fuload_handle_process"
#define PYFUNC_FINI "fuload_handle_fini"

#define PYMODULE_PATH ...

最后更新于 .

最近有很多时间相关的一些技术积累,主要分为三块,
  • 1.gettimeofday时间差不准的bug
  • 2.时间的字符串形式和时间戳形式的转化(C语言)
  • 3.提供时间日期选择的控件
一.gettimeofday时间不准的bug 先从第一个说起吧,前几天在fuload项目通过如下代码统计调用消耗的时间:
struct timeval stBegin;
struct timeval stEnd;
gettimeofday(&stBegin, NULL);
ret = process(swi);
gettimeofday(&stEnd, NULL);
time_ms = ((stEnd.tv_sec-stBegin.tv_sec)*1000000+(stEnd.tv_usec-stBegin.tv_usec))/1000;
按理说是很平常的写法,但是在实际的曲线图中,却发现每隔20分钟就会出现一个很大的波动,在网上苦询答案未果,最后突然想起来,既然是规律性的出现问题,是不是crontab中有每隔20分钟的调用导致的问题呢?最终在crontab中发现了这个:
*/20 * * * * /usr/sbin/ntpdate 172.23.32.142 172.24 ...

最后更新于 .

由于python语法的简洁,所以在写c代码的时候,有时候也会想能不能把C代码写的更简练一点,这几天遇到一个,给大家分享一下。
比如我们要用C写一个判断语句,然后根据不同的值返回不同的内容。


if(1 == val)
{
return "this is one";
}
else if(2 == val)
{
return "this is two";
}
else if(3 == val)
{
return "this is three";
}

如果判断的逻辑很多,代码就会显得很臃肿(文中的例子用switch也可以,但是也还是很难看),如果用python,就会这样写(为了和C类比,这里没有用字典):


datas = [
(1,"this is one"),(2,"this is two"),(3,"this is three")
]
for v in datas ...

最后更新于 .

fuload的前端页面的展示之前总是不能让我满意,尤其在日期选择控件这里,或者就是和chrome不兼容,或者就是页面乱掉之类的其他问题。 再试用了多个控件未果之后,突然想起来django的后台就有一个很漂亮的时间控件呀。 所以在网上搜了一下,果然已经有朋友尝试过了,链接如下: http://cnmsdn.com/html/201004/1270535813ID3307.html 我们先按照文中的方法一步步做: 现在forms.py中修改:
from django import forms
from comm_def import rtype_original_keys,rtype2attr
from django.contrib.admin import widgets

class SearchReportShowForm(forms.Form):
    reportid = forms.IntegerField(required=True,label='上报ID')
    begintime = forms.DateTimeField(required=True,label='时间',widget=widgets ...

最后更新于 .

一直以来,我都在考虑一个问题,怎么能保证在一个单机访问量上万的服务在上线之后一定是稳定的呢?测试,我们有单元测试,功能测试,但这是否够了呢?不够!一定尽量模拟正式环境的测试,否则一切都是没有办法保证的。 所以我写了fuload这个压力测试框架,并且把它开源,原因有几个:
  • 1.让所有人的做压力测试变得简单
  • 2.让尽量多的人,参与到开源项目里来
这个项目目前虽然已经能够正常的提供服务,但还需要尽量多的优化,所以很希望有朋友能够参加进来。另外,本博以后也会负责一些开源项目的开发和维护。一群素未蒙面的人一起完成一件有意义的事情,酷! 项目网址如下:http://code.google.com/p/fuload/ 详细的说明文档如下: 一.这个框架能做什么? 简单来说,fuload是为了给大型服务做压力测试或性能测试诞生的,你可以通过fuload来对你待上线或者已经上线的服务进行压力测试,并能通过详细的报表得出对你的服务的客观评价。 二.架构说明 整个框架实际包括两个部分:master和slave,master上运行用来统计的网站,slave上会调用用户自写的so并实现向master的上报. 上报的结果可以直接在master端查看,链接如下:http://{youhost}/report/show/(如图所示):

1

1

三 ...

最后更新于 .

这篇文章还是关于fuload项目的问题,由于压力测试的结果最后是要给出可视化统计曲线及饼图的,所以这里就涉及到数据上报时间,格式,以及绘制算法的问题。
饼图比较简单,我们这里主要看调用时间的曲线图。
我们采用自顶向下的方法来分析,先分别来看输入和输出。
前提


  • 有多台机器(称为从机),同时想远程机器上报,由远程机器(称为主机)统一绘制。


输入

  • 一段时间内(如5分钟):起始时间,结束时间,总的调用时间,调用次数,平均调用时间。


输出

  • 根据平均响应时间,绘制时间为横轴,调用时间为纵轴的走势曲线图。

这里主要有几个难点


  • 1.对于这“一段时间”来说,每台从机是不一样的,即可能A机器报了7点5分~7点10分的数据,而B机器报了7点7分到7点12分的数据,也可以理解为主机端接收到每台从机上报数据时间点是不统一的。要解决这个问题,我们可以通过对上报数据做分片的处理,简单来说,既然我们选择了5分钟上报一次,那么统计图的X轴一定是5分钟一个统计点,比如拿7点5分~7点10分这段时间来说,7点7分~7点12分的数据有3/5落在了这个时间段(具体计算可以更精确),另外有2/5落在了7点10分~7点15分,这样统计曲线就可以绘制出来了 ...

最后更新于 .

今天发文比较多,哈,实在是觉得知识就该及时沉淀下来,时间长了难免记忆会模糊。
OK,直接切入正题,之前http://t.vimer.cn上提过正在开发的fuload压力测试框架,由于是想拿python做胶水语言,所以不可避免的涉及到了进程间通信的问题。
简单来说就是,一个python写的主进程与多个c写的处理进程通信的问题。主进程启动之后,会启动多个c的处理进程,主进程会对处理进程发送数据,并控制处理进程。
这种情况在server的编写中比较常见,为了解耦一般会将接受数据的进程与处理进程分开,在c中的实现一般是主进程先fork出子进程,然后在子进程中调用exec将自身替换为处理进程,进程id不变。这样主进程即可拿到所有的子进程id进行统一管理。
python当然也可以通过这种方式来实现,fork+execv即可完美重现,但是这可是无所不能的python呀,是否有更好的方式呢?
有的!python2.4之后引入了subprocess模块,通过它,我们将不再需要繁琐的调用fork,execv等,其主要函数如下:


class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn ...

最后更新于 .

最近部门在推行单元测试框架的时候,对C++有指定使用gtest,但对php并没有规定使用的框架,在试用了几个php单元测试框架后,认为simpletest这个框架最简单易用,而phpunit实在过于庞大与繁琐了。
这里简单说一下simpletest的使用。一个简单的unittest文件如下:


define('BASE_PATH','/home/dantezhu/appbase/php/');

require_once BASE_PATH . '/simpletest/autorun.php';

class TestOfSite extends UnitTestCase
{
function __construct()
{
parent::__construct();
}
function setUp() {}
function tearDown() {}

function test_case1()
{
$this->assertTrue(true);
}
}
$test = &new TestOfSite();
//$test->run(new HtmlReporter());
$test->run(new TextReporter());

其中以test开头的函数即为每个testcase,而setUp和tearDown函数分别为每个testcase运行开始前和结束后会自动调用的函数,可以做一些初始化或者清理工作。


$test = &new TestOfSite();
//$test->run(new ...

每月存档

去年

2009

明年

2011