1.urlencode
Python内置了urlencode函数:
urllib.urlencode()
不幸的是,这个函数只能接收key-value pair格式的数据。
例如:
m = {‘name’ : ’somebody’; ‘gender’ : ‘male’}
s = urllib.urlencode(m)
print s
gender=male&name=somebody
如果我们只希望urlencode单个的String对象,这时候,除了将它转化为mapping object之外,还有一种方法:
def my_urlencode(s) :
p = repr(s).replace(r’\x’, ‘%’)
return p[1:-1]
print my_urlencode(‘你好’)
%c4%e3%ba%c3
一点题外话:
Java中的urlencode需要指定编码:
java.net.URLEncoder.encode(String s, String enc)
因为JVM内部所有的字符都是UTF的,故而需要指定encode的编码;
但Python不需要,因为Python中“看起来一样”的字符,如果编码不同,repr的结果是不一样的——也就是说,GBK编码的“新浪”和UTF-8编码的“新浪”,repr的结果是不同的,换句话说,my_urlencode的结果,取决于传入的字符串本身的编码。
2. tempfile
开发中经常需要用到临时文件,Python内置了对tempfile的支持:
import tempfile
tf = tempfile.TemporaryFile()
tf.write(‘hello’)
tf.seek(0) #prepare for reading
tf.read()
……
需要注意的是:
使用tempfile不需要知道文件名,默认的打开参数是w+b,w表示可读可写,binary用来保证在不同的平台上具有同样的内容。
另外,tempfile一旦调用close()函数就会立刻删除,因此,写完文件之后,不必执行close()操作,否则下面的程序无法读取该文件的内容。
偶然看到这篇文章,很好,很喜欢,条理清晰,逻辑分明。
卡尔·波普曾这样解释理性:你有你的看法,我也有我的观点,二者不一致,这并不可怕,让我们坐下来讨论吧。
网络给了我们讨论的平台,然而是非似乎并没有就此更加分明。
问题出在哪里呢?我不能给出完整的解释,但讨论中逻辑的缺失,当是原因之一吧。
譬如此种言论:
中國有多少人沒這麼幹過?那做過的人就代表人格低下嗎?反過來說,美國大部份人不看盜版,他們就人格高尚了?
”用过盗版就代表人格低下“这个命题,纵使成立,也不意味着”没用过盗版就代表人格高尚“的成立。其中的道理很简单——”地震就会死人“并不意味着”不地震就不会死人“。
这样的诘问,最大的功效,就在于彰显自己思维混乱。
现实生活中,这样的例子还不少呢。
因为办公的需要,公司给配了一台笔记本,这算得上是我的第一台笔记本了。13寸的镜面宽屏,效果还不错,键盘的手感也不错,唯一的问题就是,风扇的声音似乎大了一点:)

大早起来,躺在沙发上,用笔记本上网。
忽然想起,上半年软考的成绩应该出来了,去北京人事考试网看看,果然。
忐忑不安地输入自己的姓名和身份证号(这种时候我总是惶恐不安,考完托福的两个月里甚至刻意地躲避“托福”这两个字),等待最后的宣判:
上午:66;下午:53
是不那么让人满意的成绩,尤其是下午,发挥的很不好。四选一的选做题,我居然没看清试卷说明,做了两个,更要命的是,C语言的选做题答得很好,最后还是放弃了,填到答题纸上的是Java的选做题——而我居然填错了两空。这也是我考完至今都不敢看标准答案的原因。
好在,按照往年高程的分数线,这次应该是没有问题的,如果不出意外,剩下的就是等公布标准和拿证了。
不管怎么说,在周日的早晨得到这个消息,还是很让人欣慰的。
2006年的上半年,发生了太多的事情,除去那些辗转煎熬、痛不欲生的记忆,还有这点成绩可以告慰自己。
字符串内码的转换,是开发中经常遇到的问题。
在Java中,我们可以先对某个String调用getByte(),由结果生成新String的办法来转码,也可以用NIO包里面的Charset来实现。
在Python中,可以对String调用decode和encode方法来实现转码。
比如,若要将某个String对象s从gbk内码转换为UTF-8,可以如下操作
s.decode(‘gbk’).encode(‘utf-8′)
可是,在实际开发中,我发现,这种办法经常会出现异常:
UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 30664-30665: illegal multibyte sequence
这是因为遇到了非法字符——尤其是在某些用C/C++编写的程序中,全角空格往往有多种不同的实现方式,比如\xa3\xa0,或者\xa4\x57,这些字符,看起来都是全角空格,但它们并不是“合法”的全角空格(真正的全角空格是\xa1\xa1),因此在转码的过程中出现了异常。
这样的问题很让人头疼,因为只要字符串中出现了一个非法字符,整个字符串——有时候,就是整篇文章——就都无法转码。
幸运的是,tiny找到了完美的解决办法(我因此被批评看文档不仔细,汗啊……)
s.decode(‘gbk’, ‘ignore’).encode(‘utf-8′)
因为decode的函数原型是decode([encoding], [errors='strict']),可以用第二个参数控制错误处理的策略,默认的参数就是strict,代表遇到非法字符时抛出异常;
如果设置为ignore,则会忽略非法字符;
如果设置为replace,则会用?取代非法字符;
如果设置为xmlcharrefreplace,则使用XML的字符引用。
说起来很惭愧,SampleSort这个概念,还是在查阅Python文档的时候知道的,之前闻所未闻。传统的排序算法都是基于单处理器的,我们知道,这些算法的时间代价的上限都是nlog(n),在这种情况下,要想大幅度提高排序的效率,采用并行算法是一个不错的选择。Python中用到的SampleSort,就是一种并行排序算法。
SampleSort类似快速排序,其基本思路是:
- 用P-1个分隔值(splitter),将序列分散到P个bucket(桶)中。
- 每个Processor(处理器)按照这些分隔值,把元素送到合适的bucket中。
- 对每个桶排序,归并。
具体过程如下:
- 为每个processor分配n/p个元素
- 每个processor对自己分配的元素排序
- 每个processor从自己分配的元素中选出p-1个分隔元素,将已排序元素分隔为平等的p段
- 将每个processor选出的分隔元素(共有p(p-1)个)合并,再从中选出p-1个分隔元素,将这p(p-1)个元素平分为p段
- 以上一步选出的p-1个元素为界限,每个processor分配给自己的元素划分为p段
- 每个processor将位于自己第i段的元素送到编号为i的processor
- 使用radix sort(基数排序)对这些bucket进行排序,即先对每个bucket排序,再按顺序将各个bucket中的元素收集起来。

时间代价分析
第一步,每个processor本地排序的时间代价为:
O(n/p*log(n/p))
第二步,对每个processor选出的splitter进行排序的时间代价为:
O(p^2*log(p^2))
log(p^2) = 2*log(p)
所以这一步的时间代价为
O(p^2*log(p))
第三步,每个processor根据上一步整理的splitter将自己分配的元素发送出去:
O(p*log(n/p))
通信的成本为
O(n/p) + O(p*logP)
因此,总的时间代价为:
O(n/p*log(n/p)) + O(p^2*log(p)) + O(p*log(n/p)) + O(n/p) + O(p*logP)
据我的粗浅了解,并行算法一般有几种思路:
Centralize(由一个中心节点统一管理协调所有节点,拓扑结构为星型,易于理解,但要求子任务相对独立,对中心节点的依赖程度很高);
Network(节点之间互相通信协调,拓扑结构为完全图,好处是易于实现,各节点的算法相通,但通信效率低,成本高);
Ring(各节点处于同一个环上,拓扑结构为环形,通信效率高,但整体速度很慢)
这样看来,SampleSort应该是综合了Centralize和Network两种思路的算法。
Update:
tiny有篇不错的文章,讲到google使用的分布开发工具: map & reduce,推荐阅读。
什么是MapReduce? Google的分布运算开发工具!
聊天的时候,Tiny说起这篇文章,之前也关注过《金融时报》的专题,有些想法,写下来。
中国是否存在中产阶级,这样的争论,我认为是不可能有结果的。
但凡关乎判断(更何况是事实判断)的问题,要得出结论,前提条件是,必须有判断的标准——只有先给出一个大家都认可的“哲学”的标准(能够用这个标准来判断什么是哲学,什么不是哲学),才可能在“中国古代是否有哲学”的问题上得出一致看法。“中产阶级”的命题,也是如此。如果连判断“中产阶级”的标准都没有,所谓“有没有”之争,就转化为“什么是(中产阶级)”的概念之争——事实上我们看到,《金融时报》的争论,正是这种转化的体现。
再说说为什么会出现“中产阶级”之争。
我认为,“中产阶级”之争,更多的是语言之争。
人们使用的词语,并不是单纯的孤立的概念,结合到不同的语境,在不同的场合,有不同的意义。举例来说,我们说某人“来自东北”,要传达的意思,可能并不仅仅是“某人的家乡的地理位置位于中国东北部”,而是“他很爽快”,或者“他来在不景气的老工业基地”之类。
同样的道理,“中产阶级”并不单单指“收入处于中等的那一群人”,在日常使用时,大家往往会把一些其他的意向投射到这个词语上——例如,公共责任的承担者、社会的中坚力量,等等。因此,如果某人因为自己“收入处于中等”而声称自己是“中产阶级”,而其他人因为此人“没有社会责任感”而不认可这种判断,我们就知道,这种分歧的根源,在于双方对“中产阶级”这个概念没有共识——这又回到本文的第一个观点了。
所以,如果问我“中国是否存在中产阶级”,我的回答是“不存在”,因为我判断“中产阶级”的标准,不仅仅是收入。要改变我的观点,需要改变我判断“中产阶级”的标准,或者列举出某部分人符合我的判断标准的事实——当然,我认为,要做到这两点基本不可能。
很偶然地见到这本书:How To Sleep Less and Have More Energy Than You Ever Had Before。
有意思的名字,吸引我花时间通读了一遍。
薄薄的一本书,麻雀虽小,五脏俱全。
作者Kacper M. Postawski先是介绍基本知识:睡眠分为哪几个阶段,睡眠的周期,深度睡眠的重要性,以及睡眠的质量;然后分析了影响睡眠的主要因素,比如光照,活跃程度,生理节奏,引水,刺激性饮料,锻炼,等等;最后给出应付失眠及合理规划睡眠的办法。
身体力行了一个星期,效果还是比较明显的。
实际上,在上班以前,无论是自己,还是别人,都认为我不是一个精力很好的人——一定要保证足够的睡眠时间,才可能有正常的生活和学习。不过,我现在也可以做到,每天睡7个小时,并且在全天的大多数时候,保持清醒的头脑。
这是一个很令人兴奋的开始,因为它至少意味着,我们有可能省下更多的时间,去做有意义的事情。

一本并非仅面向DBA的好书:the Art of SQL。
全书分为多个小节,每个小节的篇幅都不长,用举例、比喻的办法,讲解实际的问题,也不避讳理论。
逻辑清晰,读起来非常舒服,如行云流水一般,不少地方更是令人拍案叫绝——既不是枯燥的理论教授,也不是单纯的技巧总结,在这里,理论和技巧是结合起来的,解决问题,才是真正的问题所在。

趴在床上看书,看的是O‘Reilly的Learning Python。
左边摆着傅雷译的《罗丹艺术论》,右边放着亚里士多德的《诗学》。
床头柜上摊着罗尔斯的《正义论》。
在书店定了周德伟的《周德伟论哈耶克》和《自由哲学与中国圣学》,还没送来。
正义,自由,哈耶克……这些词汇,让我接续割断的前生。


