最后更新于 .

前一段时间在博客中和fuadam讨论过python中调用print的时候,是否可以直接打印decode之后的字符的问题。(原文:python-django的中文编码总结)
一开始我的结论是,print只能打印encode的字符,不能进行decode,但是后来在直接执行python test.py(在vim中是!python %)后,发现确实能够正常打印,那我之前究竟是怎么看到错误的结果的呢?

首先,我们需要在vimrc中做如下配置来实现python的一键执行:

function CheckPythonSyntax()
    let mp = &makeprg
    let ef = &errorformat
    let exeFile = expand("%:t")
    setlocal makeprg=python\ -u
    set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
    silent make %
    copen
    let &makeprg     = mp
    let &errorformat = ef
endfunction

打开一个python文件,代码如下 ...

最后更新于 .

最近有点背,在64位suse上搭建django环境出了一堆问题,最后服务器还不稳定不能用...
由于做不了webserver,所以只能用来做备份服务器了,需求比较简单,就是将源服务器的一个目录每天copy过来做备份。其实就是用rsync或者scp即可,最后的问题就变成了怎么让rsync自动输入服务器密码,结果在网上搜了一下方法,有rsyncserver,公秘钥,之类,杯具的是我配置了一下午也没搞定……

然后想起公司有同事之前做过一个自动登录服务器的脚本,是不是只要改一下执行的命令即可呢?修改后的代码如下:


#!/usr/bin/expect -f
#auto ssh login
proc wait {} {
expect {
"*asswor*" {
send not!@#rated\n
expect {
"*asswor*" {
puts stderr "Unknown password."
exit 1
}
"$*" { }
">*" { }
"#*" { }
}
}
"$*" { }
">*" { }
"#*" { }
}
}
if {[llength $argv] < 1} {
puts "Usage: [exec basename $argv0] Host."
exit 1
}
set timeout 30
set ...

最后更新于 .

怎么说呢,python可以算是救了我一命的一门语言,若不是他,恐怕公司的这个项目还遥遥无期,我会始终保有对他最崇高的敬意。 这里,我仅列出自己最近使用的几个库,并简单演示一下其高超的使用效率。 1.jinja2 简介:一个模板替换类,衍生于django的Template,在很多地方做了加强。 中文支持:模板文件的内容以及render传入的数据,如果含有多字节编码,则必须要先进行decode,渲染之后的结果也是经过decode的。 备注:jinja2在renderXML等格式的文件的时候,不会自动替换html标签,这点有时候是好事~~,因为我并不用jinjia直接来往前台吐页面。 使用: 使用方法很简单:

from jinja2 import Template
template = Template('Hello {{ name }}!')
print template.render(name='World')

也支持不定函数变量的传递:

from jinja2 import Template
template = Template('''
    {{ name }}!
    {%if test0 > 8%}{{test1}} is larger ! {%endif ...

最后更新于 .

1.创建列


alter table tablename add colname type not null default '0';
例:
alter table mmanapp_mmanmedia add appid_id integer not null default 372;

2.删除列


alter table tablename drop column colname;
例:
alter table mmanapp_mmanmedia drop column appid_id;

3.在已经存在的列上创建外键关联


ALTER TABLE yourtablename    ADD [CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)    REFERENCES tbl_name (index_col_name, ...)    [ON DELETE ...

最后更新于 .

最近对django真是大爱呀,哈哈。公司有个需求是为一些素材动态生成属性字段,所以需要django来动态生成表单。

一开始的写法如下:

class AddObjForm(forms.Form):
    id = forms.CharField()
    def __init__(self, *args, **kwargs):
        mdfields = copy.deepcopy(kwargs['mdfields'])
        del kwargs['mdfields']
        super(AddObjForm, self).__init__(*args, **kwargs)
        if mdfields is not None:
            for f in mdfields:
                exestr = ""
                if f.showtype == 0:
                    exestr = 'self.'+f.name+"=forms.CharField()"
                else:
                    exestr = 'self.'+f ...

最后更新于 .

最近在使用django的过程中,发现之前对中文编码的理解并不怎么正确,在此记录一下。

1.在所有需要显式使用中文的地方加上#-*- coding: UTF-8 -*-标识,(包括注释中的中文和代码中字符串的中文)
2.django在db中存储的数据是经过encode的,但是通过模型取出的数据,是经过decode的。
3.python中在进行字符串连接的时候,必须保证所有的子字符串编码或者未编码一致

OK,先从最简单的赋值开始。如下代码:

#!/usr/bin/python
#-*- coding: UTF-8 -*-
import logging
logging.basicConfig(level=logging.DEBUG,
        format='%(asctime)s %(levelname)s %(message)s',
        filename='log.txt',
        filemode='a+')
x = '我爱你'
logging.info(x)
print x

输出是:

我爱你

log.txt中的结果是:

2010-06-25 ...

最后更新于 .

之前有朋友在博客里希望我能列出自己使用的所有Vim插件,一直没有时间,趁周末的最后的几个小时,就给大家列一下,大家可以实行拿来主义,取自己需要的,呵呵~ OK,一个个来说吧~~

plugin:

  • 编程相关:
    • 公共:
      • taglist 相信无人不知其大名,用来提供单个源代码文件的函数列表之类的功能。最近在使用一个针对面向对象语言的类似插件-tagbar.vim,也很不错。
      • NERD_commenter 提供快速注释/反注释代码块的功能
      • DoxygenToolkit.vim 添加doxygen注释
      • UltiSnips 提供超强的快速生成代码段的功能(超越snipmate)
      • mark.vim 给不同的单词高亮,表明不同的变量时很有用。(特别说明一下,vim.org上有两个Mark.vim,请使用链接中指向的那个,另外一个是有bug的)
      • authorinfo 自动生成/更新文件的作者信息(本博编写)
      • checksyntax  一个通用的语法检查插件,支持c,js,等等
      • Indent Guides 用来帮助缩进对齐的插件,需要的时候会很好用
    • c/c++:

最后更新于 .

其实我想只要能看到这篇博客的朋友,又是学过C/C++的都应该知道,如果一个对象需要作为函数调用的一个参数,同时对象分配的内存又非常大的时候,应该使用const T&来作为参数。

虽然知道这一点,但是我还是经常会在传递string参数的时候,直接不使用引用,今天仔细看了一下string的写时copy,突然想到,大家看到string就要求传递引用会不会只是一种惯性驱使呢,string的copy真的会把分配的内存全部copy一遍?

我们其实做一个简单的实验就知道了,代码如下:

#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
void test1(string c)
{
    printf("c[%u]\n",c.c_str());
}
void test2(const string& d)
{
    printf("d[%u]\n",d.c_str());
}
void test3(const string e)
{
    printf ...

最后更新于 .

注:本文是公司同事的一个分享,由于很有代表性,特分享在此,希望对大家有用。 上次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 缓冲区执行时立即刷新