Wednesday, 8 October 2008
Eclim: 在Vim中使用Eclipse的功能
Eclipse和Vim的强大谁都知道。我一直在用Vim进行代码编辑,在VJDE的帮助下,很多Java的东西已经变得非常方便。不过最近因工作原因,又必须使用Eclipse。不得不承认,Eclipse作为一个IDE的确是非常强大的,项目管理、自动导入、代码补全、代码格式调整等等都已经非常成熟,而这些是Vim(作为一个文本编辑器)所无法比拟的。
在网上搜索一阵后,找到了Sourceforge上的一个开源项目:Eclim。相见恨晚啊~~Eclim的基本原理是用Eclipse作为服务器后端,用Vim作为图形界面前端,这样既不会因为Eclipse浮肿的图形界面而导致变慢,又能拥有Vim强大的编辑功能,还可以使用Eclipse的许多有用的特性。
目前Eclim已经支持到最新的Eclipse版本Ganymede。Eclim最强大的是Java项目管理,包括创建项目、打开项目、显示项目目录结构、删除项目。它支持多种Java工具,其中包括Maven和Ant。在Maven的支持上,它可以直接读取Maven的pom.xml然后生成相应的Eclipse Classpath文件,并用这个Classpath作为当前项目的Classpath。它同时还整合了JUnit,可以运行某个JUnit测试并显示结果。其中我认为最有用的,而且也是最像IDE的一个特性是能够随时显示Java代码中的错误,它能够随时编译当前的Java代码,然后解析错误文件,并根据文件中的信息知道是在哪一行出现了什么错误~~
其他的特性当然还包括自动格式化代码、自动导入、代码补全等等。除了帮助Java编辑外,它在其他语言编辑上也提供了帮助,例如XML(随时验证+格式化)、Python(验证)。
如果想知道更多关于Eclim: http://eclim.sourceforge.net
Tuesday, 7 October 2008
新的Python项目
最近喜欢上了命令行的工具,而本身我又喜欢GOOGLE的服务,所以想到了做一个Google服务的命令行工具,当然使用Python。幸运的是Google提供了一系列的Python API来访问他们的数据,其名为Google Data API。
Tuesday, 30 September 2008
Python常用函数和库
介绍了Python的特性,该介绍一下我常用的Python的函数和库了~~
1. Python内建函数和库
1.1 函数:
map(func, list): 将某个函数func作用于list中的每个元素
1.2 库:
re : 正则表达式库
正则表达式本身就非常的强大,尤其是Perl 5的正则表达式。Python中的正则表达式库当然也非常不错~~例如,我要找出某文本中所有带括号的字符串:
如此一来,我们就可以得到(cool)和(Python)这两个字符串了,关于正则表达式,网上有太多的文章可以参考了,而且书也一大堆,我就不介绍了~~
urllib: 网络库
这是Python中提供的一个最简单的网络访问库,但非常实用,而且也非常方便~~如果要获取某个网站中的内容(HTML),如下:
f = urllib.urlopen("http://www.google.com")
html = f.read()
print html
以上是用GET方式获取内容,如果要用POST方式的话,可以如下:
data = {"some_data" : "some_info"}
f = urllib.urlopen("http://www.google.com", data)
html = f.read()
print html
该库中还有许多其他的网络相关实用函数哦~~
os, sys: 操作系统、文件、系统相关库
os库中包括许多操作系统相关函数,例如获取当前目录以上就是一个简短的命令行解析程序块,当我在命令行上敲入:
2.2 yapgvb (http://yapgvb.sourceforge.net)
全称叫做:Yet another Python graphviz binding。知道Graphviz的人都知道其强大,它是用来生成有向和无向图的,对于我来说很有用,因为我可以用它来生成状态机、文字关系图、Ontology树等等。其最大的好处是能够自动排版,使得图中每个节点互不相碰~~用yapgvb的话,我可以非常方便的根据我的内容生成相应的图片。例如:
可以生成以下图片:
2.3 docutils (http://docutils.sourceforge.net): 文档工具
这是我的最爱,除了Latex之外,一般的小型文档我就用它了~~Docutils自己定义了一种文档语言叫做RestructuredText,用它写成一个文档后,可以用Docutils生成HTML、Latex和S5。HTML和Latex就不介绍了,不过S5是我比较喜欢的东西,当时做幻灯片的时候就是用的RestructuredText生成的S5格式的幻灯片。S5其实是一种专门用来制作幻灯片的HTML格式,最终生成的幻灯片也非常漂亮,而且因为是HTML,所以可以直接用CSS和Javascript来调整版面、格式、颜色等等。
这个是我极力推荐的库,一定要看看~~
恩,其实Python好的库还有许多,我这里就不一一介绍了。我准备在之后一个一个详细解说,例如:Django(快速原型Web框架), SQLObject(Object-Relational Mapping框架),Epydoc(Python API文档生成),Docutils(文档生成工具),Mako(模板语言工具)等等~~
#!/usr/bin/env python
import re
regex = re.compile(r"\([^)]*\)")
s = "Python is (cool)! So is everthing that uses (Python)!"
matches = regex.findall(s)
for match in matches:
print match
os.getcwd()
,执行一个命令行os.popen
等等。sys库中包含系统相关的函数和变量,例如最有用的莫过于sys.argv
,这个可以得到命令行上的所有参数。比如我如果敲入:python todocmd.py add I have to do this
,那么sys.argv就是一个数组:['python', 'todocmd.py', 'add', 'I', 'have', 'to', 'do']
。
optparse: 命令行解析库
很多时候,我们需要写一个命令行的程序,而这个程序在命令行上又有许多的参数,例如我常用的pal
日历程序:
pal -r 4
可以告诉我我在4天内的所有事件~~当然,命令行参数远远不止这一个……那么,如果我要写这么一个程序,我就可以用到optparse
这个库来解析这些命令行的参数。
#!/usr/bin/env python
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-f", "--file", dest="filename",
help="write report to FILE", metavar="FILE")
parse.add_option("-q", "--quiet",
actoin="store_false", dest="verbose", default=True,
help="don't print status messages to stdout")
(options, args) = parser.parse_args()
my_script -f outfile -q
时,该程序块就会帮我读取到这些参数,并以数组的方式传给我~~另外,如果我敲入my_script -h
,它还会自动输出参数帮助~~
2. 外部库
2.1 cElementTree (去Google搜索ElementTree)
XML在目前的应用非常广泛,而如果要操作XML的话,我们需要相应的解析器~~各种语言都提供了自己的解析器,Python也不例外。在Python中,我比较喜欢的XML解析器是cElementTree。它是ElementTree的C Python版本,所以拥有ElementTree的所有功能,但比ElementTree的性能更好~~以下是一个简短的解析程序:
#!/usr/bin/env python
import xml.etree.cElementTree as ct
f = open("example.xml")
tree = ct.parse(f)
nodes = tree.getiterator()
for node in nodes:
for child in node:
print child.attrib["name"]
#!/usr/bin/env python
import yapgvb
nodes = ["jack", "shen", "eden", "xu"]
graph = yapgvb.Graph("Example Graph")
root = graph.add_node(label="Root")
for node in nodes:
n = graph.add_node(label=node)
edge = root >> n
graph.layout(yapgvb.engines.neato)
format = yapgvb.formats.png
graph.render("example.png")
Monday, 29 September 2008
Commandline Tools
今天找到了几个常用程序的命令行替代品,分别是IRC、GTALK、MSN、电子邮件客户端和GOOGLE CALENDAR的。这些工具能够在一定程度上提高我开发的效率,因为曾经需要用鼠标的(离开键盘)现在均可以用键盘操作~~
1. GTalk: Freetalk (http://www.gnu.org/software/freetalk/)
Freetalk真的很不错,界面简洁,类似于IRC聊天工具,所有操作都是通过命令来完成,例如要知道有哪些人在线的话,敲入
/who
便可以得到了。
2. MSN: Python MSN lib (http://blitiri.com.ar/p/msnlib/)
其实这本是一个Python写的MSN库,不过作者提供了一个演示程序,但功能比较全面(至少我需要的都有),而且操作也非常方便~~
3. IRC: irssi (http://www.irssi.org/)
这个客户端已经非常有名了,很多人都在用,和一般的IRC都一样,自己去看看吧。
4. Mail Client: mutt (http://www.mutt.org/)
这个我刚开始用,不过真的很不错,速度很快,而且界面清晰~~最主要的是它的键盘映射和VIM一样,所以非常符合我的口味~~
5. Google Calendar: gcalcli
这貌似是GOOGLE自己开发的,调用了Google Data API,它没有像前面几个程序那样的界面,只有命令行的操作。例如,如果我要知道这段时间有些什么事件的记录的话:gcalcli agenda
就会帮我输出所有的事件,而且是彩色~~
6. Todoist: 我自己写了一个程序……
目前还在开发中,今天晚上刚开始写。现在已经支持项目查询和TODO查询,并用不同的颜色代表不同的重要级别,还要实现的是添加TODO项和修改已有的TODO项。
Sunday, 28 September 2008
Python入门详细介绍
作为最爱的语言之一,首先来详细介绍一下我对Python的认识吧~~当然,Python的特性远远不止我在次介绍的这些,这就需要读者自己去研究了。此文章中所有的代码高亮也是有一个Python的程序所完成的,叫做pygmentize。它可以解析多种编程语言并生成相应的HTML、LATEX等等来对代码进行高亮显示。
和Perl、Ruby一样,Python是一种动态类型语言(Dynamically Typed),也是一种脚本语言(Scripting Language),解释型语言(Interpreted)。这种类型语言的特性在于它们语法简洁,无须编译,拥有非常方便但又强大的数据结构操作,很利于创建初始程序原型或者完成某些小型脚本处理。例如,我如果想要用Python对某个文件中的每一行进行同一个操作的话:
以上就不一一解释了,但是example.file文件内容如下:
#!/usr/bin/env python
f = open("example.file")
lines = f.readlines()
lines = map(lambda x : x.strip() + " str", lines)
print lines
first line second line third line输出结果如下:
['first line str', 'second line str', 'third line str']Python中我喜欢的特性 Python的特性主要来自动态类型和脚本语言,所以很多我喜欢的特性其实也就是动态类型语言的特性:
- 简洁干净的语法结构。和许多语言不同,Python的某个程序块的开始和结束并不是由某个符号或者语句所包围,而是采用冒号和缩进来进行区别,例如:
以上的简短程序中,函数体和函数声明、for语句和语句块都是由冒号和缩进进行分隔,看上去非常清楚,增加可读性。然而,这种方式有利也有弊。在使语法干净的同时,它使得程序的书写非常严格,而且在自动生成代码上也会增加不必要的处理。
#!/usr/bin/env python def println(line): print line f = open("example.file") lines = f.readlines() for line in lines: println(line)
- 多值赋值和返回。这是脚本语言一个非常有用的特性。Python中有一个数据结构叫做tuple,他只可读不可写,然而却为多值赋值和返回提供了可能。例如,我如果要对多个变量同时赋值,我无须在每一行写一个,可以如下:
这样,一方面减少了我的代码量,另一方面,如果我将同一类的变量放在一起赋值,可以增加可读性。多值返回就更有用了,在很多时候,我们需要返回的不只是某一个变量,而是想返回多个变量。例如:很多时候我们想得到数组中最大元素和最大元素的索引,那么用Python就可以如下:
var1, var2, var3 = 3, 4, 5
#!/usr/bin/env python # assume the list is "l", and all the values are positive def max_in_list(l): mvalue = -1 mindex = -1 for i in range(len(l)): value = l[i] if value > mvalue: mvalue = value mindex = i return (mvalue, mindex) value, index = max_in_list(l)
- List comprehension。这是我最喜欢的一个特性,在数组/列表处理上非常实用。其作用是对某个已有列表的每个元素进行操作,并返回新的列表。例如,我要对某个列表中的所有大于2的数字加上另一个数,可以如下:
#!/usr/bin/env python l = [4, 3, 5, 87, 4, 6, 4, 2] new_l = [x + 2 for x in l if x > 2] print new_l
- 高阶函数。这其实是各种动态语言都拥有的一个特性,而且非常有用。所谓高阶函数,从简单说来就是指函数可以作为另一个函数的参数。注意这是不是说将函数的返回结果作为参数,而是将函数本身作为参数。例如:
Python中还有一个特殊的
#!/usr/bin/env python def add_one(n): return n + 1 def add_two(n): return n + 2 def process_list(func, list): for n in list: print func(n) l = [3, 4, 5, 6, 7] print "Function = add_one ", "-"*30 process_list(add_one, l) print "Function = add_two ", "-"*30 process_list(add_two, l)
lambda
关键字来代表某个匿名函数例如以上的例子我可以改成如下:#!/usr/bin/env python def process_list(func, list): for n in list: print func(n) l = [3, 4, 5, 6, 7] print "Function = add_one ", "-"*30 process_list(lambda x : x + 1, l) print "Function = add_two ", "-"*30 process_list(lambda x : x + 2, l)
Friday, 26 September 2008
我常用的工具
在此介绍一些我常用的工具,只是简单介绍,某些工具的具体介绍我会在之后写新的博客,其他的自己看吧,哈哈~~
实用的工具
1. Google Calendar
按照字面意思,他的主要功能就是一个日历。我平时主要用它记录所有的事件,例如开会、预约等等。其比较好的一个特性是能够通过邮件提前通知(当然是GMAIL啦),而且可以用不同的颜色对不同的事件进行分类,这样我就可以更好的管理我的时间。例如我可以用一种不同的颜色代表不同的项目事件~~
2. Google Reader
这个很多人应该都知道,是用来订阅RSS的浏览器。订阅RSS是一种浏览各种信息的好方法,我可以在同一时间阅读来自多个网站的不同信息。我常看的有:
- The ServerSide:这是Java服务器端技术的大型门户网站,包括各种Java服务器端技术的文章,牛人们的博客和各种库升级的信息和使用方法。有时有些新的东西出来时我会去看看,如果有什么比较好的文章我也会过目一下
- Java.net communit:这是Java技术最大的社区网站之一,包括Java各种技术,常常会有一些技巧方面的文章,所以我也会看
- JavaWorld:名字就告诉我们这是Java的世界,包括各种技巧性的文章和一些类库的使用方法
- Python News:包含Python方面的许多新闻,例如Python3000开发的进展等等
- Bruce Eckel的博客:牛人,主要写关于Java和Python,所以我经常看看
- 朋友的博客。。。
Subscribe to:
Posts (Atom)