EverET.org

好记性不如烂笔头

我的Emacs配置

| Comments

原来一直想用Vim来写东西,不过Vim的出生就被定义为做一个编辑器。他的职责就是做好一个编辑器,Vim也不愧为编辑器之神,他确实是非常棒的编辑器。在Unix中,几乎每个工具都是设计为只做一件事,所以我也不想勉为其难将Vim变成一个好用的IDE。

俺曾经尝试使用vim-gdb把gdb嵌入vim,不过用户体验是在让人无法接受,于是就放弃了。

于是只能投身神的编辑器、伪装成编辑器的操作系统——Emacs。

不过俺还是喜欢vim的按键风格,所以俺装了evil,把Emacs变成了超强版的Vim。

代码提示就不说了,Emacs下很轻易就可以做到转到定义处,重构等等。

好的工具是敏捷开发的必要前提啊~又想起了一句古诗:君子性非异也,善假于物也。

俺的最新的Emacs配置请见:https://github.com/cedricporter/vim-emacs-setting

配置效果如下:

我的FTP Server——ftp.py

| Comments

在上文中,我们简要地学习了下FTP协议,链接 http://everet.org/2012/03/ftp-protocol.html

有兴趣的同学们可以去围观下。

因为最近偶看了下FTP协议,所以决定写个FTP Server玩玩。毕竟一直写的都是应用程序,于是乎想写下服务器端的程序。

结果就有了ftp.py,名字灵感来源于web.py。

ftp.py

ftp.py由Python 2.x实现。目前有部署到我的服务器上。支持Windows、Unix和类Unix系统。支持多线程模式和多进程模式,不过在Windows上仅支持多线程模式。支持虚拟用户。

其中多进程模式支持以其他用户身份运行,加强了安全性。

bash
1
2
3
4
5
6
usage: ftp.py [-d] [-h] [-p port] [-o] [-t]
    -d become a daemon
    -h help
    -p listen port
    -o output log to stdout, by default, it outputs to a log file.
    -t thread mode, fork model by default

其中用户设置写在ftp.py.config中,如果文件不存在则默认使用anonymous账户。

用户设置文件ftp.py.config格式如下:

account_info = { ‘et’:{‘pass’:‘123456789’, ‘home_dir’:‘/root/’}, ‘lst’:{‘pass’:‘987654321’, ‘home_dir’:‘/tmp/’} }

也就是账户名+密码+家目录路径。

ftp.py.config

我们还可以在ftp.py的同级目录中通过ftp.py.config设置我们的FTP Server。

最大用户连接数 limit_connection_number 

“超时时间(单位:秒)timeout

“默认家目录:default_home_dir

日志文件:logfile

运行的用户身份:runas_user

默认值为:

python
1
2
3
4
5
limit_connection_number = 5     # max client number
timeout = 60 * 3                # timeout in second
default_home_dir = os.path.normpath(os.path.abspath(os.curdir)).replace('\\', '/')
logfile = '/var/log/ftp.py.log' if os.name == 'posix' else default_home_dir + 'ftp.py.log'
runas_user = 'www-data'

源码如下:

Python端口转发及重定向实现Eclipse的TCP/IP Monitor

| Comments

记得在上个学期的时候选了徐扬老师的《Web服务与面向服务的体系结构》,讲了SOA之类的一堆东西。然后实验就是要4个下午做完IBM一个星期的培训课程……

于是偶们便开始无脑地照着下面这本手册来狂做实验。记得要做10多个实验,算一下一个下午要做2-3个实验,所以当场做的话只能无脑操作鸟。不能不说是教育的悲哀啊。

QQ截图20120323140703

记得在做“Exercise 7. Creating Web service clients”,有一小节是使用TCP/IP Monitor来检查SOAP消息。

也就是在Eclipse的TCP/IP Monitor中,设置监听一个端口如9081,然后设置你的SOA服务器的端口9080。然后你和9081端口的通信就会重定向到了9080.然后你就可以看到他们的数据传输。

进程间通信:管道pipe一个简单的例子

| Comments

管道是进程间通信的有力的武器.记得初中时在写Windows的后门的时候,也是开了一个匿名的管道和cmd进行交互.今天终于在Linux上写了下管道.

在Linux下,两个程序之间传递数据的最简单的方法就是使用popen和pclose两个函数了。但它们都是需要启动一个shell。这个成本略高啊。

于是我们可以使用底层的pipe函数。通过这个函数,我们在两个程序之间传递数据而不需要启动一个shell来解释请求的命令。

原型是:

1
2
3
#include <unistd.h>

int pipe(int file_descriptor[2]);

参数是一个由两个整型的文件描述符组成的数组的指针。成功返回0,失败返回-1,并设置errno来表面失败的原因。

两个文件描述符以特殊的方式连接起来。写到file_descriptor[1]的所有数据都可以从file_descriptor[0]中读回来。数据基于先进先出FIFO的原则。

我们使用read和write来访问数据。

管道有一些内置的缓冲区,它在write和read调用之间保存数据。

十二生肖

| Comments

今天突然发现,我在中国生存了二十多年,竟然连十二生肖的循序都不知道,于是乎就上网找了下记录一下。

生肖也称属相,是中国和东亚地区的一些民族用来代表年份和人的出生年的十二种动物。生肖的周期为12年。每一人在其出生年都有一种动物作为生肖。十二生肖即鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪,依次分配于十二地支,是中国民间计算年龄的方法,也是一种古老的纪年法,亦称十二生肖。十二生肖(兽历)广泛流行于亚洲诸民族及东欧和北非的某些国家之中。

来自百度百科。

0d729944c616137e500ffe05

Python进行图像处理——生成交替颜色的格子图

| Comments

今天小孟师兄要一张贴图做测试,屠文翔同学用Fireworks花了两分钟做了下面的一张图片。但是师兄说要一张颜色相隔的图片,于是Fireworks此时就显得有点力不从心了。于是此时Python就要上场啦。

Fireworks生成的图:

rects

好,下面,我们来用Python的PIL库来敏捷地生成一个颜色相隔的格子图。只需要10行代码。

一款期待已久的Chrome插件——Evernote Clearly

| Comments

Evernote Clearly是Chrome的一款插件。Evernote的各种产品我的超喜欢,确实很贴心啊~特别是Evernote的笔记,比有道笔记,Microsoft OneNote都强多了。

它的介绍如下:

Clearly makes blog posts, articles and webpages clean and easy to read. Save them to Evernote to read them anywhere.

image

它可以将网页以另外的风格显示出来,而且还可以自定义风格。

举个例子,下图是 http://www.w3.org/Protocols/rfc959/4_FileTransfer.html 在Evernote Clearly下的观看模式,很明显就舒服很多了,原页面是白刷刷的一片左对齐的文字,真让人蛋疼。

Mission: FTP Protocol

| Comments

FTP协议以前我用得挺少的,网络课上刘孜文老师曰FTP协议过时也就跳过了。不过现在FTP用得还是挺多的,所以决定围观下FTP。

刘孜文老师的经典名言是:我所学到的东西都不是从课堂上得来的。这点我挺赞同的。

刘孜文老师超强悍,中科院的博士,2个月看完了Linux内核的代码。

记得第一节课他说可以不用去上课,只要自己学就好了,于是偶深入贯彻刘老师的话,所以就一学期也没去上网络课了。

课下的时间都花在Scar上,网络也没仔细研究过,悲剧了,现在开始要好好补下才行了。

以下的内容是关于FTP协议的。

HTTP和FTP都是文件传输协议,他们都运行在TCP之上.

最显著的区别在于FTP使用两个并行的TCP连接,一个是控制连接(control connection),一个是数据连接(data connection).通常控制连接使用21端口.

因为FTP协议使用一个分离的控制连接,所以我们也称FTP的控制信息是带外(out-of-band)传送的。而HTTP协议在TCP连接中发送请求和响应首部行来控制,所以HTTP也可以说是带内(in-band)发送控制信息。

FTP服务器必须在整个会话中保存用户的状态信息,也就是说要保存用户的权限信息,远程目录树的当前位置。而HTTP协议则是无状态的,要通过cookie来保存用户状态。