• 多维度思考

    日期:2009-12-09 | 分类:Life Stuff

    昨天稍微动了一下脑筋,就把一个困扰了两代程序员的问题搞定了。

    问题是这样的:有大量的要发给不同目的的请求,相同目的的请求当然是放在一起的。每发一遍的时间是严格限定的。如果按顺序来发,由于对端的处理能力十分底下,而同时发到同一目的太频繁导致大量超时。原来的做法,也是最直接的做法,就是为不同的目的地开不同的线程来定时,尽量在两个请求间sleep较长一段时间,缺点就在于线程就有好几百个,调度效率低下,定时也就不准确了。后来想能不能先把请求打乱再重新加到vector里面用一个线程发送呢?纠结了很久,觉得这样写本来很整洁的接口就不干净了。最后想到了跳跃地遍历这个vector,就像1, 11, ...1+10*N, 2, 12, ...2+10*N ...这样。问题一下子简单了,干净地用一个线程替代了原来n个线程的实现。看着数据流水一般返回,超时日志一条都没有,真的很高兴,虽然公司也不会因此加工资,解决一个老问题也足够满足一下虚荣心了。

    起来ds9某一集中,自治同盟入侵前夕,Quark的酒吧里人们都在忧心忡忡。Quark正在抱怨如果dominion来了,他的收入就肯定会大不如前(对佛郎吉人来说没有再坏的事情了),因为无论是Jem'Hadar还是the Founder, 他们都是一律 don't eat, don't drink, don't gamble, don't have ***. 然而善良的Ziyal微笑着说,"It might not be so bad. For all we know the Vorta could be gluttonous, alcoholic ...[后面太邪恶了:D屏蔽] Quark听罢,大喜。可见换一个角度思考,悲观主义者也可以乐观起来的。

    最近加了不少班,提测近了,就要看到解放的日子了!!!

  • perl: alias a function

    日期:2009-10-20 | 分类:Coding

    sub foo {
    #do something
    }
    sub bar {
    goto &foo;
    }

    这样调用bar的话就会和调用foo完全一样,就连调用堆栈里面也没有调过bar的痕迹

    perl真是太神奇了,只要你想得出的都做得到

  • js字符转义备忘

    日期:2009-10-19 | 分类:Coding

    好吧,又是令人痛恨的js。现在用perl写个Tenjin模板库的wrapper,变量付进去,会需要到不同格式间的转换。

    sub txt2htmljs {
        my ($content) = @_;
        $content =~ s/"/"/gs;
        $content =~ s/\\/\\\\/gs;
        $content =~ s/'/\\'/gs;
        $content =~ s/(\r?\n)/\\n/gs;
        return $content;
    }


    sub txt2js {
        my ($content) = @_;
        $content =~ s/\\/\\\\/gs;
        $content =~ s/"/\\"/gs;
        $content =~ s/'/\\'/gs;
        $content =~ s/(\r?\n)/\\n/gs;
        return $content;
    }

    以上两个函数的区别在于,前一个是给模板里的html元素的js回调用的,比如onClick="foo('[== $STR =]')",这种。后一个是给模板里的纯的js用的,就比如<script>里面写的var bar='[== $STR =]'。

    我不是专业web开发者,以上还没充分测试过的,用不了请反馈给我

  • I hate js

    日期:2009-03-10 | 分类:Coding

    一个备忘, always use parseInt (str, radix), in case we meet something like '08'

    http://www.kenegozi.com/Blog/2008/07/12/int-dot-parse-parseint.aspx

  • awk中,man不能给予的一些东西

    日期:2008-01-29 | 分类:Linux

    字符串的index从1开始的,而数组的index从0开始,字符串不是数组

    关于command | getline var这种操作,man里面讲了等于没讲,因为man里面没有例子。后来看了info才恍然大悟,如果要读command的多行结果,应该是

    while ((command|getline ) > 0) {do something}

    while中的command不能被字符串和变量连接所替代,比如while (("ls "var ... 这样是不行的,只能先把"ls" var付给变量再执行while循环。后面>0是判断如果读到EOF就跳出循环。最后,一定要用close函数关闭管道。另外因为打开的pipe是通过command来标识,只能够close(comand)来关闭pipe, 如果在一个读pipe的循环里面进行递归操作的话程序是很可能要挂掉的,所以写递归的时候要避免。

    还要注意使用pipe的操作必须要在function内部完成。

    另外关于递归函数中的使用的所有局部变量都一定要声明在参数表中(局部变量声明方式可以看man),否则会有异常结果。

    关于数组的注意的问题 (摘自info):
    The order in which elements of the array are accessed by this statement
    is determined by the internal arrangement of the array elements within
    `awk' and cannot be controlled or changed.  This can lead to problems
    if new elements are added to ARRAY by statements in the loop body; it
    is not predictable whether the `for' loop will reach them.  Similarly,
    changing VAR inside the loop may produce strange results.  It is best
    to avoid such things.

    ----------

    ps: info真是个比man更好的东西,因为man实在太简短了,一页纸的东西只能充当忘掉语法时的提示,而且man没有索引,没有目录,不能全局搜索。要看man你除了猜测只能预知到手册页的名字是什么了。

    可惜的是info只有GNU才用,可惜的是我不用emacs