最后更新于 .

注:本文是公司同事的一个分享,由于很有代表性,特分享在此,希望对大家有用。 上次welkin在处理一个豆瓣的cgi时遇到1个奇怪的问题,就是对一个string对象的修改引起了另一个string对象的同步修改。后来定位到原有,是因为有函数对string对象的buf内容直接进行了操作,破坏了“写时拷贝”的规则。下面这个例子说明了问题是如何产生的,已经如何避免:

int main()   
{   
    string str1 = "abcd";   
    string str2 = str1;   
    char *p1 = const_cast<char*>(str1.c_str());   
    p1[0] = 'o';   
    //这里str1和str2同时被修改了   
    printf("%s %s\n", str1.c_str(), str2.c_str());   
    string str3 = "abcd";   
    string str4 = str3;   
    char *p2 = &(str3[0]);   
    p2[0] = 'o';   
    //这里只有str3被修改,str4不变   
    printf ...

最后更新于 .

首先庆祝一下QQ餐厅正式不删档公测,本以为终于可以不用那么晚发版本了,结果昨晚入口CGI出现问题,折腾到凌成4点多,杯具……

先截个餐厅的图给大家看一下:

canting

先来介绍下背景,公司是使用自己写的webserver,然后用fastcgi的方式运行CGI,结果前端返回502错误。和运维的同学确认后,了解到当CGI在执行完却没有返回给webserver任何数据,就会报502错误。
检查了一下代码,任何出错都会有错误返回。
于是strace了一下进程,发现在出现一次如下的错误之后,以后的请求就全部都会出错。

修改

其实这个CGI和平常的CGI没有什么区别,只是由于用到了模板类,所以使用cout来进行输出而不是printf,结果问题就出在了cout上。

与printf不同,cout在出错之后,会保存出错的状态,而由于fastcgi是一直在内存里的,所以在cout第一次出错之后,后面的就全部都会出错。
解决的方法是:
在每次开始cout数据之前,调用一下cout.clear()

之后,问题得到解决,在出现上图中的错误之后,以后的数据也一样可以正常输出。

但是这样毕竟不是办法,因为当访问量非常高的时候,用户遇到错误的概率也是非常高的。

以为是cout的数据不全,于是尝试在CGI输出的最后,我加了一行:cout<<flush;,结果发现出错的概率反而变高了许多,于是就去掉了。

目前猜测的问题还是底层库可能有头文件和.a不一致的问题,之前碰到一个应为这个问题写越界的,还有一个也是这个原因结果编译成可执行时,cout会core,看来底层库的统一也是件大事啊

参考文章:
endl cout 缓冲区执行时立即刷新

最后更新于 .

最近在使用django开发的时候,遇到了很多问题,特此记录在此,希望对以后的同学有所帮助。 一.django的ManyToManyField,当关联自身时,实现单向关联。 比如代码如下:

class MManConfType(models.Model): 
    linkconftype = models.ManyToManyField(‘self’,null=True,blank=True)

在这种情况下,当类型1关联了类型2的时候,那么类型2也一定关联了类型1,所以linkconftype就会始终是大于两条记录 解决的方法就是,增加symmetrical=False的定义,即:

linkconftype = models.ManyToManyField(‘self’,symmetrical=False,null=True,blank=True)

官网上的解释如下:

ManyToManyField.symmetrical Only used in the definition of ManyToManyFields on self. Consider the following model ...

最后更新于 .

最近工作忙的要死,明明积压了一大堆博文要写,结果却始终没有时间,也沉静不下心情来写。不过知识这种东西,如果不及时沉淀下来,恐怕很容易就会忘记了,所以还是赶紧写一下。
前几天在开小组例会,同事提到了一种makefile的写法,编译过大型工程的朋友应该都知道,当多个模块要协作编译的时候,通常要进入一个个目录去编译,所以,makefile可能如下所示:

all:
    cd dir1;make all;
    cd dir3;make all;
    cd dir2;make all;
clean:
    cd dir1;make clean;
    cd dir3;make clean;
    cd dir2;make clean;

当然,我们也可以用makefile自身的特性,即 make all/clean -C dir1来进行编译,但是实际上两种写法都避免不了3个问题:
1.当新加入一个模块的时候,要写入两句代码,一句是all,一句是clean ...

最后更新于 .

最近一直在思考,如果又那么多需求需要在vim里面调试gdb,执行python文件,链接数据库,与其每一个都去用vim脚本实现,为什么不直接把终端所有操作接管呢?

然后我去了www.vim.org的首页,然后,我居然真的看到了这个插件:
Conque Shell
下载链接:http://www.vim.org/scripts/script.php?script_id=2771
这个插件目前的评分是 Rating 447/122, Downloaded by 1280 ,也就是差不多每个评分的人都是4分(Life Changing!),而我也是毫不犹豫的选择了这个选项。

废话不多说,先来上图,对,你没有看错,这真的是vim.
在vim中打开bash:

  bash  
在vim中连接mysql:

mysql
在vim中打开python解释器:

python

哈哈,怎么样~~,是不是真的很酷!,OK,还有两张图,我们在最后再贴出来。来看一下这个插件的详细信息吧

一.简介 ...

最后更新于 .

今天在把django开发的系统从开发环境搬到外网的时候,发现凡是中文写入Mysql的时候,都会报错:

Data truncation: Data truncated for column xxx

网上搜了一下,排除了字段本身长度不够,剩下只能是因为mysql的默认编码不是utf-8导致,于是请教了数据组的同事,有两个命令可以修改Mysql 库或者表的编码:

修改库的编码:

alter database dbname CHARACTER SET = utf8;

修改表的编码:

alter table tablename CONVERT TO CHARACTER SET utf8;

之后一切OK。

在次仅作记录。

最后更新于 .

在vs中使用vim的映射已经不是什么新鲜事了,不过ViEmu $99的价格实在让人望而却步,但是现在好了,我们多了一个选择:

vsvim
主页:
http://visualstudiogallery.msdn.microsoft.com/zh-CN/59ca71b3-a4a3-46ca-8fe1-0e90e3f79329

这个是以vs2010的标准插件形式存在的,所以也只支持vs2010.
废话不多说,先来看几张图:

 1

注意画红圈的地方(我好不容易才抓拍到的光标呀),用起来比较舒服的原因之一就是保持了和vim一样的块状光标(ViEmu就给改了),所以第一感觉还不错。

打开上面的config按钮,界面如下:

2

上图就是默认的样子。

我大体试了一下其模拟的按键,hjkl是没有问题的,G、gg、u也没有问题,但是zc、zo、C-R、之类的就都不能用了,命令行方面,试了一下:new、:e 之类貌似都不能用。

不过我觉得这样的确已经不错了,本身只是想要vim的按键方式而已,而且除了需要实时预览html的情况,我基本也不会用到vs……

最后更新于 .

在开始这篇文章之前,还是先说点不相干的,最近博客多了不少emacs的文章,并不是我(dante)从Vim转向emacs了,而是由于本博目前是有三个作者的(dante、ian、lr),而ian是用emacs的,所以本着linux本是一家的原则,会把我们的心得都放在这个博客里和大家共享。
 
呵呵,好啦,闲话不多说,进入正题。
最近在做流程系统的时候,发现用showModalDialog来限制用户焦点及流程的确是不错的方法,不过在使用中也发现了两个问题:
1.showModalDialog打开的窗口中,如果是调用form表单或者其他需要重新生成页面的操作,一定会打开新窗口
2.showModalDialog打开的窗口中是无法刷新的
 
感谢google大神的协助,总算让我找到了答案
 
1.通过frame页来装载页面
例如,需要原来的调用是
window.showModalDialog("a.html")

 

我们只需要新建一个页面b.html:
<frameset rows="0,*"> 
<frame src="about:blank"> 
<frame src="a.htm ...

最后更新于 .

最近在用django做网站,惯例,我肯定还是用vim做编辑器……
不过让我有点小惊喜的是,在django的官网上,居然有一片用vim写django的文章。
原文链接如下:

Using Vim with Djangohttp://code.djangoproject.com/wiki/UsingVimWithDjango

文章中包括了自动补全,模板着色,snipmate等众多内容,这里我主要演示一下snipmate的效果。

http://github.com/robhudson/snipmate_for_django下载两个snippets文件,放到你的snippets目录,然后在vimrc中加入如下两行:

au FileType python set ft=python.django
au FileType html set ft=htmldjango.html

打开一个.py文件,输入r2r后,截图如下:

1
还有其他一些vim支持,我就不列举啦,大家有兴趣可以自己看一下。

最后更新于 .

好吧,用pickle的过程真是不顺利……,在mod_python中使用pickle调用dumps向server发包的时候,server那端解包loads时,会报如下错误:

ImportError: No module named _mp_6dce10900009df6fcff2918ac677e596

网上一堆资料,还全是英文,结果最后居然在一个留言里找到了答案……
方法就是,指定class的__module__属性:

#自定义类名为MManRsp,所属模块为mmanpro
MManReq.__module__ = "mmanpro"

答案链接页面:
http://www.modpython.org/pipermail/mod_python/2008-July/025442.html

之后在实例化类对象,调用dumps方法即可。

最近python相关的文章比较多,呵呵,希望博友不要介意~