Nov
21
2008
PHP易用是大家的共识,体现在了很多方面,尤其是其丰富而好用的内置函数库,最近一次见识是因为strtotime函数。
为了获取一个三个月前的时间的字符串表达式,在其他语言中可能要耗费点代码,而在php中,使用这样一个表达式就可以了:date('Y-m-d', strtotime("-3 month")) ,date是为了将时间格式化,'Y-m-d'就是可以得到诸如2008-11-19这样的表达式了,而strtotime就是用来得到一个三个月前这样的时间了。
PHP的strtotime遵循GNU Data input format,看了文档才发现这个非常强大,可以支持时区、相对时间、绝对时间、星期、秒计时等多种方法来表达一个时间。
很遗憾,在Python中我没有找到能和strtotime一样好用的库函数。
no comments | tags: php, python, strtotime | posted in code|编程
Mar
29
2008
Gcalcli是一个python编写的Google calendar的命令行客户端,重度的Google日历使用者可能会比较喜欢,因为命令行的好处是用起来比较快,且可以批处理,多快好省,下面记述在Ubuntu下的安装及使用步骤。
下载Gcalcli
因为有一些依赖的库,所以下载涉及好几个部分:
后面两个模块是可以apt-get的,不过我发现Ubuntu 7.10下apt-get的这些模块不够新,会导致运行出错,还是直接从上面的网址下载比较好。
修改Gcalcli源码
如果你在google 日历中也使用中文信息的话,需要注释掉gcalcli代码中前面的两行,否则中文会乱码:
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
sys.stdin = codecs.getreader(locale.getpreferredencoding())(sys.stdin)
如果不想每次都敲google帐号名和密码,可以修改代码中的__username__和__password__,这样以后就不用输入这些信息了(虽然有点不安全,但方便要紧)。如果不改的话,则每次在使用gcalcli时都要加入 --user --pw 这样的参数。
命令行使用
- 使用 gcalcli calm就可以在命令行下显示按月方式的日历内容了。
- 使用 gcalcli agenda就可以显示逐条的日历信息。
- 使用 gcalcli quick "9:00pm 看电视" 就可以快速加入一条事项,还挺方便的。
- gcalcli search 目前还不能支持中文,遗憾。
no comments | tags: calendar, cmdline, google, python | posted in tech|软件、开源、业界
Mar
20
2008
这是我比较敬仰的一个牛人,Adrian Holovaty,善用Python,是Django Web框架创始人之一及主要开发者(Lead developer),文档写的一级棒,Django book的作者,每一个Django的开发者必读的文档,现已成书有售。
同时也使用Python创建了一些网站,其中一个小网站chicagocrime.org最为有名(之所以有名是一是因为创意,另一个重要原因是它是较早使用Google Map的Web应用),最初这个小网站是记载芝加哥最近30天的犯罪信息(地点,类型,地图等),如今已经扩展到很多其它的信息(失物招领,最新电影等),比较强调时效性。
除了Django之外,Adrian Holovaty也用Python开发了其它一些开源的项目,比如一些Python的库,甚至还有一个Greasemonkey脚本的编译器(这种脚本通常在Firefox里面用的较多),还有的成果自然是一些Firefox的插件,也蛮多的。
最后, Adrian Holovaty擅作曲和吉他,有不少的音频和吉他视频在网页上,或许会出专辑,呵呵。Django应该就是取自一个爵士音乐人的名字(传说此人也很有名:Django Reinhardt,我不了解,不作介绍了)。
总结:牛人 (想看照片的话找google,前几张都是)。
3 comments | tags: python | posted in code|编程
Jan
2
2008
这两个东东pygments和python-markdown是很多python web程序需要的模块,前者是格式化高亮代码的,后者是提供类似wiki格式的格式化功能(mark text转html),很多blog用这两个东东做文本的格式化。
安装依然简单:
sudo apt-get install python-pygments
sudo apt-get install python-markdown
markdown的帮助文档:
http://www.unix-center.net/moodle/help.php?file=markdown.html
http://daringfireball.net/projects/markdown/basics
no comments | tags: python | posted in code|编程
Dec
31
2007
python有几个内置的函数很有意思:map/filter/reduce,都是对一个集合进行处理,filter很容易理解用于过滤,map用于映射,reduce用于归并,这几个词还是太抽象了,下面的代码精确的说明了这几个函数的用途:
def map_imp(function, sequence) :
if function is None: return list(sequence)
retvals = []
for element in sequence:
if (function(element))
retvals.append(element)
return retvals
def reduce_imp(function, sequence) :
arg1 = function(sequence[0])
for arg2 in sequence[1:] :
arg1 = function(arg1, arg2)
return arg1
def filter_imp(function, sequence) :
retvals = []
for element in sequence:
if (function is None and element) or function(element) :
retvals.append(element)
return retvals
对于这种逻辑性强的东西,用语言来描述是无助的,代码则要清晰的多。
no comments | tags: python | posted in code|编程
Dec
30
2007
在早期的python版本(2.2之后)中就有了这两个东东,staticmethod就对应于C++的静态成员函数,而classmetho在C++中是找不到对等体的(它的第一个参数是类对象,而不是类实例)。
def smethodimp(arg):
do somthing
smethod = staticmethod(smethodimp)
def cmethodimp(cls, arg):
do something
cmethog = classmethod(cmethodimp)
一般情况下,smethod和smethodimp可以用同一个名字(比如都叫smethod),同样cmethod和cemthodimp也可以同名。
这样的定义总是怪怪的,在2.4版本之后,我们可以用decorator来重写这难看的代码,不过decorator的功能远超出这么简单,我暂时还不能理解其精髓啊(等用时再看吧)。
no comments | tags: python | posted in code|编程
Dec
28
2007
用__file__ 来获得脚本所在的路径是比较方便的,但这可能得到的是一个相对路径,比如在脚本test.py中写入:
#!/usr/bin/env python
print __file__
按相对路径./test.py来执行,则打印得到的是相对路径,
按绝对路径执行则得到的是绝对路径。
而按用户目录来执行(~/practice/test.py),则得到的也是绝对路径(~被展开)
所以为了得到绝对路径,我们需要 os.path.realpath(__file__)。
no comments | tags: python | posted in code|编程
Dec
21
2007
python的缩进识别给很多编辑器带来了困难,但VIM还是灵活的,通常我用下面的设置(在~/.vimrc中写入):
autocmd FileType python set tabstop=4|set shiftwidth=4|set expandtab|set softtabstop=4
这是用于控制python文件类型的一些设置,这样在编辑其它文件时不会受这个影响,注解如下:
set expandtab 只是在输入tab时转tab到空格,如果是已经有的tab,可以用:retab命令来强制转换到4个空格。
set softtabstop=4是为了让vim可以在backspace时将4个空格当成一个tab删除用的,这样省却每次按4次。
no comments | tags: python | posted in code|编程
Nov
11
2007
Baidu词典(http://dict.baidu.com/)是我比较喜欢的一个网络词典,但不喜欢每次都用Web去查,写了下面一段代码可以实现Baidu词典的脚本查询:
#!/usr/bin/env python
import os,sys
import urllib2
import re
class BaiduDict:
def __init__(self):
pass
def query(self, word):
url = "http://www.baidu.com/baidu?ie=utf-8&ct=1048576&word="
try:
data = urllib2.urlopen(url+urllib2.quote(word)).read()
except:
print "ERROR: can not connect to http://www.baidu.com/"
return None
p = re.compile("<ol>.+$", re.M)
data = data.decode('gb2312').encode('UTF-8')
match = p.search(data)
if match:
result = data[match.start():match.end()]
result = re.sub("</div>","\n",result)
result = re.sub("<[^>]+>", " ",result)
else:
result = ""
return result
if __name__ == '__main__':
if len(sys.argv) > 1 :
qword = sys.argv[1]
print "================BaiduDict========================"
baidu=BaiduDict()
print baidu.query(qword)
如果要查多于一个单词的短语的话,需要在短语外加引号就可以了。
no comments | tags: python | posted in code|编程
Nov
7
2007
一直对这个蛮有兴趣的,其实只要去看一下源码就可以了,而实际上不用看源码,源码中的注释就已经解释了核心的实现细节:
* 这个hash表的hash算法是看不到的(起码在上面链接的这个文件中看不到),这涉及Python对象的hash处理,但对于int和string,Python居然使用了最最简单的hash算法,这确实让我跌碎眼睛啊。
* 发生冲突时的解决方法很有意思,冲突时不是使用链表,而是使用Open Address方法,即按照一个给定的计算方法计算下一个存储位置,这样的好处应该是可以省去链表带来的内存申请和释放。而这个计算方法也很奇怪,不是+1(这个最简单啊),而是
j = (5*j) + 1 + perturb;
perturb >>= PERTURB_SHIFT;
这个看起来确实是有些复杂,Python的注释解释了, 5*j+1是保证了2**N元素表中可以遍历所有元素(这个怎么证明?),但如果只有5*j+1则生成的遍历顺序总是相同的,意味着冲突可能会累积,所以加上perturb来达到一定的随机效果,当然每次perturb要右移以保证一定次数后,perturb会成为0,这样才能保证遍历性,而perturb的初值就是hashcode。
这叫一个绕啊,今天算是发现我数据结构与算法的知识已经基本上还给亲爱的大学老师了,怎么这些东西好像从未学过的样子啊。。。
no comments | tags: python | posted in code|编程