转载几篇自己觉得有趣的文章

2013-07-21

《魔兽世界》掉进“大数据陷阱”

大数据不具有社会性

我们常常把对人的感觉和他们的行为搞混,而事实上,人类的判断力远比二进制数字更加复杂。

民主不是多數暴力

我們不能投票表決判一個人死刑,剝奪他的生命權,也不能投票要求一個人把錢包裡的錢拿出來,剝奪他的財產權。

這些政客,又憑什麼認為「只要多數民意要求依法拆除,這些人就應該搬離他們的房屋」?更何況,房屋是他們的,要賣多少才願意是他們的權利,為何可以以公權力強迫他們接受他們不願意的價格?難道台灣人可以用投票的方式來逼Apple的iphone5只賣一萬元嗎?

继续阅读

如何为 Git 设置代理?

2013-05-24

如何为 Git 设置代理?

假设代理是本地的,协议是 socks5,端口是 1080 。根据 git 使用的协议:http 、 ssh、 git,代理配置的方法各有不同。

HTTP 协议

使用 git 的配置 http.config

git config http.config socks5://127.0.0.1:1080

也可以使用环境变量

export HTTPS_PROXY=socks5://127.0.0.1:1080

git 的配置可以是全局的,也可以根据不同的仓库进行配置,环境变量只能全局使用,否则就需要在每次使用 git 的时候用 env :

env HTTPS_PROXY=socks5://127.0.0.1:1080 git pull

如果需要根据不同的 remote 使用不同的代理,可以使用 remote.<name>.proxy

继续阅读

哇靠!西游记原来是这个样子的!

2013-04-01

语文老师神一样地推理西游记(一),孙悟空原来也有爹妈

继续阅读

安装某个指定日期的 debian 发布包

2013-02-10

事情是这样的,我的电脑是 ATI 的显卡,lspci 信息如下:

Advanced Micro Devices [AMD] nee ATI Caicos [Radeon HD 6400M/7400M Series]

用的驱动程序是 fglrx-driver,本来是可以用 wine 玩《魔兽世界》和《星际2》的,后来发生了一些事情,可以参考 这里这里 ,大概的情况就是,debian 升级了 xserver-xorg-core ,将 xorg-video-abi 由协议 11 升级到了 12 ,而 AMD 的官方驱动不支持 xorg-video-abi-12 ,这个问题一度导致了 fglrx-driver 被移除出 debian 的 testing 版本,后来 AMD 升级了驱动,终于解决了这个冲突。

继续阅读

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 里也有不少中文资料,我也是两头看看,自己再折腾折腾,没几天就能用了。

所有文章