类别归档:Web开发

RSS feed of Web开发

最后更新于 .

一.美化你的bash
每次在进入一个很长的目录的时候,光标都会变得很靠右,很丑陋:

1

今天同事给了一段配置:

export PS1="\[\e[36;1m\]\u\[\e[0m\]@\[\e[33;1m\]\h\[\e[0m\]:\[\e[31;1m\]\w\[\e[0m\]\n\$ "

写入.profile后,会变成如下的样子,效果不错,哈哈:

2

二.在python中使用soap -- suds
今天需要通过soap来给RTX的其他用户发消息,于是研究了一下python中的soap包。
先是发现了SOAPpy,包括Dive into Python都推荐了这个包,不过经过我的试用之后,发现打死都显示不了任何数据,于是我搜啊。。终于在某个不起眼的角落看到了这样一段话:

Unfortunately, at the moment, I don't think there is ...

最后更新于 .

因为下周要用php写项目,所以周末在家里重新看php的语法,看到三元描述符,突然想起来python是没有三元描述符的,印象中依稀记得有模拟的实现,于是上网上搜了一下。
(对应C语言的 X ? V1:V2)
找到一篇文章:http://blog.csdn.net/xiaoyin992/archive/2008/12/29/3635015.aspx
其中一种是:

(X and V1) or V2

正常情况下是不会有错误的,但是文章中也提到了,当V1=""时,就会有问题
比如

print (True and '') or 'V'
print (False and '') or 'V'

输出永远都是: V

完美的解决方案是在《python核心编程中提到的》:

V1 if X else V2

原文如下:

如果你来自 ...

最后更新于 .

出于种种原因,最近感觉还是在自己机器上装个linux写程序靠谱些,毕竟总是VPN到公司内网速度也太慢了。
本文最终实现了:

1.在windows下用virtualbox安装了ubuntu7.04命令行版
2.ubuntu能够与主机(即windows)共享网络
3.在windows下可以直接ssh到ubuntu上

遗留问题(详见文末):

1.ubuntu与主机共享文件夹失败
2.rz/sz命令安装失败

先截图如下(putty中的截图):

putty

OK,我们一步步来说:
一.VirtualBox安装
    1.到http://www.virtualbox.org/wiki/Downloads下载windows版本
    2.一路点击next,出现不兼容提示框,直接继续即可。
二.Ubuntu安装
    1.选择安装命令行的版本,安装即可
    2.设置root密码。ubuntu的root默认居然是不启用的,需要在启动的时候,按ESC进入recovery模式,会自动以root权限登录 ...

最后更新于 .

今天在进行CGI外网部署的时候,出现一个很奇怪的问题。
先说明一下背景:
在webserver上的一个CGI-A会通过libcurl来访问另一个webserver上的CGI-B,并将调用的结果返回给前台。
问题的表现:
前台看到是CGI-A超时,抓包发现在调用CGI-B的时候,http请求正常返回,但是时延达到1s左右。
但是当在浏览器直接输入CGI-B的链接的时候,就在40ms之内即可返回。

具体抓包如下:
命令:

sudo tcpdump -s 0 -nX host [ip] -i eth1 -w data

libcurl调用CGI-B:

http://www.vimer.cn/wp-content/uploads/2010/09/data_err

浏览器直接访问CGI-B:

http://www.vimer.cn/wp-content/uploads/2010/09/data_suc

在wireshark中仔细的对比了请求包,发现只有两个地方不同:

libcurl调用CGI-B:

1

浏览器直接访问CGI-B:

2

但是当时怎么也没有想到居然真的就出在了gzip的问题上。

后来总监过来看了一眼,注意,就一眼!(果然姜还是老的辣啊),就说 ...

最后更新于 .

最近因为python升级到了2.7导致mod_python不能用,所以自己电脑上的apache一直启动不起来,趁着周末有时间,抓紧搞一下。 在网上搜了一下,发现mod_python已经停止维护了,而替代他的是mod_wsgi,下载路径如下: http://code.google.com/p/modwsgi/downloads/list 挑选For 2.7的版本下载,改名成mod_wsgi.so,然后扔到apache的modules目录就可以了。 在apache的conf文件中加入:

LoadModule wsgi_module modules/mod_wsgi.so

OK,但是我们真正的安装才刚刚开始。 刚才说过由于python升级到2.7,之前所有的库都删掉了,所以不得不重新安装,需要准备好如下库。

最后更新于 .

最近在修改一个代理机server,增加url rewrite的功能,由于其单机的访问量很高,20000/s左右,对性能要求很高,所以在做url映射的时候,纠结在用map还是hashmap存储映射的问题上。

于是做了一个简单的测试,对与map和hashmap(我们用unordered_map),循环10000*24次,map大小是12(因为目前预估会配置的url个数是12左右)。
部分代码如下:

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include "markupstl.h"
#include <tr1/unordered_map>
#include <sys/time.h>
using namespace std;
#define hashmap std::tr1::unordered_map
#define CONFIG_FILE_PATH "./urlconfig.xml"
map<string,string> g_mapUrl;
hashmap<string,string> g_hashmapUrl;
struct timeval ...

最后更新于 .

记得刚入职的时候,那时候什么都不懂,组长让我跑个迁移程序,还没跑完就关终端走人了,结果可想而知,那是第一次知道守护进程的概念。
当时后来是加了nohup参数解决的,

nohup ./program &


但是总是强迫别人用nohup来启动自己的程序毕竟不是办法,所以还是要把自己的进程变成守护进程才行。

C/C++的版本就不说了,这里有篇文章写的很清楚。
http://colding.bokee.com/5277082.html

这里主要介绍一下在网上无意发现的一个国外哥们的写的python版本:
http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
顺便吐个槽,这哥们用的Vim配色明显是Wombat~~
代码如下(对私有函数名加了_前缀,便于理解,并加了一定的注释):

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys, os, time, atexit
from signal import SIGTERM
class Daemon:
    """
    A generic ...

最后更新于 .

经常在linux下工作的朋友一定经常需要用tcpdump抓包分析,不过有时候肉眼看起来实在是太累,不经意居然发现了这样一个好工具:
wireshark,下载页:http://www.wireshark.org/download.html

简单用他来演示一下tcp协议的整个过程:
先在开发机上开始抓包:

tcpdump -ieth1 host 172.27.193.234 -w tcpbao

调用一个发送tcp请求的小程序,可以抓到包---tcpbao.

用wireshark载入之后,会看到如下界面:

1

可见,整个过程完整的展现了TCP协议中,建立链接->发送数据->断掉链接的过程。
读者可以对照本博的:
TCP协议状态详解

http://bigwhite.blogbus.com/logs/11582229.html
来看。

简单说一下:

1~3个报文是tcp三次握手建立链接的过程
4~7个报文是客户端发送实体数据的过程
8~10个报文是客户端主动断掉链接的过程(这里和标准的关闭链接貌似有点出入,标准TCP协议貌似还要多返回一个ACK报文)

其实这个软件还支持直接抓包来查看报文的,详细可以看一下如下的在线文档,在此不再赘述。
http://man ...

最后更新于 .

最近被公司的事情搞的很纠结,博客也有段时间没写了,不过最近还是忙里偷闲做了点其他事情,在这里记录下来,和大家分享一下。

需求也比较简单,老婆是做社区运营的,所以需要每天把几个帖子定时的顶上来,手工做很累,所以就想让我用程序实现。

分析一下,其实无非是先用户名和密码登录,获取到cookie后,再带着cookie去访问要顶贴的页面即可,至于剖析页面来获取url就是BeautifulSoup要做的事情了。(论坛是discuz做的,这里只为演示方法)

登录代码实现如下:

def Login(user,pwd): 
    loginpage = urllib.urlopen('http://bbs.xxx.com/logging.php?action=login').read() 
    login_soup = BeautifulSoup(loginpage) 
    formhash_tag = login_soup.find('input',attrs={'name':'formhash'}) 
    formhash = formhash_tag['value'] 
     
    params = { 
            "answer":"", 
            "formhash":formhash, 
            "loginfield":"username", 
            "loginsubmit" ...

最后更新于 .

最近遇到一个需求,即一个配置文件,由于这个文件的访问量非常大(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 ...