TCP 状态图

2012-12-24

昨天去参加 shlug 15周年技术交流分享活动,shell 提到了 TCP 的状态图,回来搜了一下:

图片来源: 维基百科 原图为英文的,做了一些修改,客户端和服务器端的路径只是参考,实际情况更为复杂

在本地部署 webpy.org

2012-12-11

web.py 是一个轻量级的 Python Web 框架(类似与 django ,只不过 django 是重量级的),webpy.org 整个网站都在 github 上。我想把它下下来,在本地部署一下,遇到一些问题,可能有人觉得这些问题很简单,不过我还是搞了半天才搞定的,记录一下吧。

首先下载:

git clone git://github.com/webpy/webpy.github.com.git

然后:

cd webpy.github.com
jekyll --server 8080
继续阅读

对 CGI WSGI 的一点理解

2012-12-09

CGI 是 Web 服务器和应用程序之间的一种通信协议,服务器使用环境变量和输入输出与 CGI 脚本之间进行通信。它是一个很简单的协议,但是它有一个很大的问题,每一次执行脚本的时候,都会新建一个进程,完成之后,销毁该进程,这就导致了在请求量增加时,效率会很成问题。

为了解决效率问题,各式各样的人想出了各式各样的办法,不过大方向只有两个,一个是内联,一个是外延。内联的方式就是由服务器的服务进程(线程)来执行应用程序,比如 mod_php mod_python ,外延就是弄一个池(不管是进程池、线程池还是混合池,以下简称池)来执行应用程序,约定 池 和 服务器 之间的通信方式,比如 FastCGISCGI

WSGI 是服务器与 Python 应用程序之间的通信协议,这里的服务器可能是真正的服务器比如:Apache 也可能是一个中间件比如:flup 。来看个图吧。

        -------------------------                              ----------
        |          |            |                              |        |
        |          |            |             WSGI             |        |
        |          |  mod_wsgi  |----------------------------->|        |
  HTTP  |          |            |                              |        |
------->|          |            |                              |        |
        |          |------------|           -----------        |        |
        |          |            |           |         |        |        |
        |          |            |  FastCGI  |         |        | Python |
------->|  Apache  |  mod_fcgid |---------->|         |        |   App  |
        |          |            |           |         |        |        |
        |          |            |           |         |  WSGI  |        |
        |          |------------|           |  flup   |------->|        |
------->|          |            |           |         |        |        |
        |          |            |   SCGI    |         |        |        |
        |          |  mod_scgi  |---------->|         |        |        |
        |          |            |           |         |        |        |
        |          |            |           |         |        |        |
        -------------------------           -----------        ----------

其中 mod_scgi 使用的是外延的方式,它不提供池的功能,只提供和中间件之间以 SCGI 协议使用 Socket 通信的功能,池的功能是由中间件,这里是 flup 提供的。mod_fcgid 也是使用外延的方式,它本身提供了池的功能,App 在 mod_fcgid 提供的进程池中运行,至于池和 Apache 服务进程(线程)间的通信是由它自己来完成的。mod_wsgi 即提供了内联的功能,可以由 Apache 的服务进程(线程)来运行 App ,也提供了外延的功能,自己弄一个池,和 Apache 之间交互,对外提供 WSGI 的接口。

进程、线程和协程的理解

2012-12-02

进程线程协程之间的关系和区别也困扰我一阵子了,最近有一些心得,写一下。

进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。

线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。

协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。

进程和其他两个的区别还是很明显的。

协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。

打个比方吧,假设有一个操作系统,是单核的,系统上没有其他的程序需要运行,有两个线程 A 和 B ,A 和 B 在单独运行时都需要 10 秒来完成自己的任务,而且任务都是运算操作,A B 之间也没有竞争和共享数据的问题。现在 A B 两个线程并行,操作系统会不停的在 A B 两个线程之间切换,达到一种伪并行的效果,假设切换的频率是每秒一次,切换的成本是 0.1 秒(主要是栈切换),总共需要 20 + 19 * 0.1 = 21.9 秒。如果使用协程的方式,可以先运行协程 A ,A 结束的时候让位给协程 B ,只发生一次切换,总时间是 20 + 1 * 0.1 = 20.1 秒。如果系统是双核的,而且线程是标准线程,那么 A B 两个线程就可以真并行,总时间只需要 10 秒,而协程的方案仍然需要 20.1 秒。

继续阅读

关于同步和异步的理解

2012-12-01

最近看到 CPyUG 上关于同步和异步的讨论,也在网上看了一些文章,记录一下自己的想法。

首先,相对于内核来说,内核提供两种类型的读取操作:同步和异步,其中同步的读操作又分为阻塞和非阻塞的。

同步阻塞的读取操作是我们最经常用的,我们调用读取方法,内核进行实际的读取,此时的应用程序是被阻塞在读取方法上的,读取完成后,方法返回,我们获得数据,进行数据处理。

继续阅读

将博客引擎从 vimwiki 换回 jekyll

2012-11-27

不久前有一段时间在玩 vimwiki ,觉的蛮好玩的,而且它可以用来写博客,所以就用了,还是挺不错的,不过现在有了一些新的需求,比如输出 rss ,比如代码高亮,vimwiki 默认没有提供这些功能,要自己实现的话,还是挺麻烦的,想来想去,还是用现成的吧 …

jekyllgithub 的 Pages 功能所用的引擎,我的博客也在 github 上,jekyll 主页上的介绍很详细,google 里也有不少中文资料,我也是两头看看,自己再折腾折腾,没几天就能用了。

ibus 中删除拼错的词

2012-10-19

我在 linux 中一直使用的是 ibus 输入法,它已经满足我的需求了,这里说一个 ibus 的功能,有时候会拼错词,而 ibus 会把拼错的词也记录下来,要删除这个词只需要 Ctrl + <数字> 就行了。

对于输入法,我的需要也很简单,现在的 ibus 就已经满足我的需要了,可以简拼,可以记录我拼过的词,可以把拼错的词删掉,界面也简单明了,说实话,现在的我对于输入法的换肤和云一点兴趣也没有。

使用 exim 发邮件

2012-08-18

我本来使用的是 mutt + fetchmail + msmtp 在本地收发邮件,后来发现 debian 已经安装了 exim 来处理本地邮件,于是就想是不是可以用 exim 来代替 msmtp ,经过一番折腾后,已经 OK 了,其实很简单,真的很简单。

首先:

sudo dpkg-reconfigure exim4-config

会出现如下选项:

互联网站;直接通过 SMTP 发送或接收信件                                                     │  
用 smarthost 发信;通过 SMTP 或 fetchmail 接收信件
用 smarthost 发信;无本地信件
仅在本地投递信件;无网络连接
现在不进行配置  
继续阅读

使用 vimwiki 写博客

2012-04-22

vimwikiVim 的一个插件,它可以在 Vim 里写 wiki,它还有日记的功能,还可以直接在 Vim 里生成 html。

普通模式下 \ww 可以进入 wiki 的主页, \w\w 可以写当天的日记,它会在 wiki 的目录下生成一个 diary/yyyy-MM-dd.wiki 的文件,\wi 可以跳转到日记的索引,不过这个索引没什么用,不用管它。我只需要在写博客的时候用\w\w 写当天的日记,然后通过一个脚本根据日记文件的内容生成 wiki 的主页面,也就是 \ww 所在的页面,再生成 html ,把它发布到主机上,或者提交到 github 上就万事大吉。

继续阅读

从源码安装 wine

2012-04-21

最近想玩一下 wine,在 linux 里运行一些 windows 的软件,最初的需求是为了解决 windows 下的 zip 包 中文文件名乱码的问题,感觉为了这么一点小事就开个虚拟机太蛋疼了,也没有找到 linux 下的原生解决方案,开个新终端,生成 zh_CN.GB18030locale ,然后设置 LANG=zh_CN.GB18030LC_ALL=zh_CN.GB18030 用 unzip 命令解压,结果是… 该是乱码的还是乱码。

wine 在 debian sid 源中的版本太低,只有 1.0 ,而 wine-unstable 的版本只有 1.1 ,而实际上 wine 的稳定版已经到了 1.4 ,而开发版已经到了 1.5 ,我决定从源码安装 wine

继续阅读
所有文章