类别归档:Web开发

RSS feed of Web开发

最后更新于 .

最近在做系统的时候,遇到了一个瓶颈,即在列出所有素材的列表列表的时候,由于素材都是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 ...

最后更新于 .

最近有点背,在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 ...

最后更新于 .

其实我想只要能看到这篇博客的朋友,又是学过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 缓冲区执行时立即刷新