歸檔 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 <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <python2.7/Python.h>
using namespace std;

#define PYMODULE_NAME   "fl_module"
#define PYFUNC_INIT ...

最后更新于 .

最近有很多時間相關的一些技術積累,主要分為三塊,

  • 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 ...

最后更新于 .

由于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這個壓力測試框架,并且把它開源,原因有幾個:

  • 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分,這樣統計曲線就可以繪制出來了。
  • 2.相信從機時間還是主機時間 ...

最后更新于 .

今天發文比較多,哈,實在是覺得知識就該及時沉淀下來,時間長了難免記憶會模糊。 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 ...

最后更新于 .

《vim(gvim)正則表達式查找替換》是個比較久的系列了,這次因為博友niejieqiang的一個問題,所以決定繼續在寫一篇,而主題就是將正則表達式查找替換與vim腳本結合。 其實這種方法在之前的文章中也出現過如: vim(gvim)正則表達式查找替換(4)-生成連續數字或行號

let i=1|g/1/s//\=i/|let i=i+1

就是一種方式。 OK,回到正題,我們來看一下博友niejieqiang的問題:

A格式如下:
nrk 你
nrk 侚
….
sobb 論壇
sobb 交款
sobb 文壇
…
ejj 茴
ejj 莒

需要轉換成B格式:
nrk 你 侚
sobb 論壇 交款 文壇
ejj ...

每月存檔

去年

2009

明年

2011