归档 2010年7月

最后更新于 .

最近遇到一个需求,即一个配置文件,由于这个文件的访问量非常大(8000次/秒),并且配置文件本身也比较大,所以需要
1.发布之后在5分钟之内生效
2.要能够cache,并尽量减少请求量和流量

对于以上的需求进行分析,首先否定掉放到CDN上,因为虽然第二点满足,但是第一点没法满足。

那么只能通过cgi读取配置文件返回内容来实现,具体方法如下:
1.发布之后5分钟生效
使用Etag,在这里即为配置文件的md5值,当来的请求的Etag值和服务器上的版本不一致时,才返回数据,并设置新的Etag;否则,返回304
2.能够cache
使用Cache-Control,来设定cache的时间

从而,使用Etag减少了流量,使用cache减少了请求量,并且同时兼顾了数据的更新时间可控。

示例代码如下:
返回304:

void CAppBaseConf::PrintHttp304()
{
std::string v = "HTTP/1.1 304 Not Modified\r\nServer: qzhttp\r\n";
printf ...

最后更新于 .

最近在做系统的时候,遇到了一个瓶颈,即在列出所有素材的列表列表的时候,由于素材都是swf或者jpg,结果几百个文件的时候,就会导致页面加载极慢,老大说让做成异步加载,于是就改了一下。注:本人js很差,献丑了……
其实这种异步加载元素的方式无非就是在原有的HTML上置一个标记,然后等最新的数据到来的时候替换掉它。
在网上搜了一下,很多人推荐一个叫做jquery.lazyload.js的插件,能够支持图片的异步加载,使用方法也比较简单,在header里面写:

<script type="text/javascript" src="jquery.lazyload.js"></script>
$(document).ready(function(){
    $("img").lazyload({
        placeholder : "grey.gif",
        effect : "fadeIn"
    });
});

这样图片异步加载确实解决了,但是swf的渲染看来只能自己来写了。这里用span来存储swf的url,等到需要渲染的时候,再将span内部渲染出flash来,代码如下(其实就是仿照jquery.lazyload.js写的,甚至直接copy了函数):

<script type="text/javascript" charset ...

最后更新于 .

公司最近的网络限制越来越严格了,除了公司自己业务的任何网站,软件,都必须通过代理访问。
于是我华丽的发现google code更新不了代码了,等了两天,实在受不了找企业IT部,发现svn是可以配置代理的,如图:

1

试了一下svn up,可以用啦,不错不错,大快~,结果再试了一下svn ci,于是又杯具了……

唉,估计是代理对https的协议支持不好,罢了罢了,翻过一墙还是一墙,那我就只更新吧。

但是事情并没有结束,我有时候需要写程序去抓取外网的网页数据:

import urllib
url = 'https://www.vimer.cn'
data = urllib.urlopen(url).read()

简洁的python,但是用不了……

换urllib2,加代理:

import urllib,urllib2
url   = 'http://www.vimer.cn/'
proxy = 'xxx.xxxx.com:8080'
opener ...

最后更新于 .

前一段时间在博客中和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 ...

每日归档

上个月

2010年6月

下个月

2010年8月

归档