Monthly Archives: 07月 2007

介绍ExtremeTable的下一代Jmesa

说到ExtremeTable(以下简称ET,呃,,,ET…..),可以说不知道的人甚少.不过估计用的也未必多罢了.今天,给大家介绍一个由ET的作者重新实现的一套关于Table的API.JMesa. 我是一个偶然的机会知道Jmesa,我在做一个数据展现系统的时候想寻找ET的帮忙,但发现ET己不再更新,作者把精力转移到了新的项目中,也就是这个 JMesa.这个项目的目的是为开发者提供更有效的表格展现的API,而不是简单的TagLib.无论从灵活性,易扩展性,易用性,均比ET上了一个层 次.最近Release的版本里面,并不包括TagLib.而在下一个版本(2.1.0)将会加入TagLib,目前TagLib己经可用,在SVN里已 有.只是等待下一个版本的发布,其间会有一些更新,不过会兼容目前的TagLib的. 假如我从API开始介绍JMesa,恐怕并不是个好的办法,像我以前的文章里面有介绍,结果反响不大.这次决定从TagLib入手,来给大家介绍一下Jmesa. 大家可以从附件里拿到一个Demo.注意Demo依赖JMesa以及其他Lib.在Lib文件夹下有详细说明. 现在来看看JMesa的使用: <jm:table id=”product” items=”products” caption=”product listing”> <jm:column property=”name” sortable=”true” filterable=”true”/> <jm:column property=”price” /> <jm:column property=”createdTime” /> <jm:column property=”id” title=”edit”> <a href=”viewProduct.action?id=<jm:property/>”><jm:property name=”name”/></a> </jm:column> </jm:table> 估计比较容易看得懂的代码吧. Jmesa 的检签规范当中只有三个Tag:Table,Row,Column.而当前的TagLib实现中只实现了Table和Column两个(Row是可选 的).另加一个Property的Tag.此阶段,Property的Tag是很有用的,其起到的作用与Webwork的PropertyTag相差无几, 用来获得对象的某个属性.之所以使用Property Tag是因为当前的TagLib有个限制就是暂时不支持如JSTL的${}这种写法.将来会支持,届时Property Tag也会继续获得兼容.Jeff比较倾向于使用迭代的方式实现Tag,那样可以支持${}这样的写法.不过作为TagLib的开始,问题不大.有时间再 重构一下TagLib,支持JSTL的写法. 好了,来说一说这些Tag的使用方法: Table: Attribute Description id 表格的ID(必须) items 对象或者Map的集合 (必须) caption 表格的标题 theme 表格的主题,自定义样式 exportTypes 使用逗号分割导出的类型,目前支持导出类型有CSV,Excel width … Continue reading

Posted in 技术 | Tagged , , | Leave a comment

正式加入Jmesa项目

昨天早上起床收到了Email.Jeff很喜欢我写的Tag,并且把源码加入了SubVersion,作为Jmesa的Tag的一个开始版本. 这段时间我提交了两个功能的代码(ExcelView和Tag).Jeff显得比较喜欢俺的代码,直夸简单清析.狂喜ing!固然自知自己对代码要求比较高,不过有牛人一赞,感觉是不一样..嘿嘿.他邀请我加入Jmesa的项目进行开发工作.我当即答应了,因为开时除了上班,回到家里大部分时间是在学习和写代码,一直找到地方使力气.如今能参与做开源项目也算是做一回正经事.记得在国内也曾短暂加入过Springside,仅贡献了几根牛毛.惭愧.惭愧. 接下来的工作要继续宣传Jmesa,作为ExtremeTable的下一代,的确是值得一试的.陆续会写些介绍性,入门性的文章 继续完善Jmesa Tag Lib.

Posted in 技术 | Tagged , | Leave a comment

Jmesa开始Taglib计划

Jmesa社区最近有个提交了一套TagLib的实现。使用方法是这样: <ensco:table id=”exampleTable” exportable=”true” numRows=”5″> <ensco:column displayName=”Property 1″ propertyName=”prop1″ cellEditor=”someEditor”/> <ensco:column displayName=”Property 2″ propertyName=”prop2″  filterable=”false” /> <ensco:column displayName=”Property 3″ propertyName=”prop3″ sortable=”false” filterable=”false” /> </ensco:table> Taglib作者说是Display Tag风格。不过个人很不爽的是,居然还需要开发者去实现cellEditor?并且不支持Column Tag里面嵌套内容的用法。很不实用。我跟Jeff沟通后,他也很赞成我的观点。于是我昨天花了几个小时写了一套新的Taglib。归功能Jmesa API的优雅及易用,TagLib很快就可以工作了。我实现有TagLib用法这样: <jm:table id=”product” items=”products” caption=”product listing” export=”csv,pdf” style=”jmesa” width=”100%”> <jm:column name=”id” title=”edit”> <a href=”viewProduct.action?id=<jm:property>”</jm:property>><jm:property name=”name”/>a> jm:column> <jm:column name=”price” sortable=”true” filterable=”true”/> <jm:column name=”createdTime” width=”20%”/> jm:table> 开发者只需要提供一个Collection,写JSPTag,不需要实现其他任何接口。 我给Jeff发了封Email: another jmesa taglibJeff相当感兴趣,马上制订了Jmesa Taglib的规范,让社区去实现TagLib。呵,Jeff的相法与我制订的Tag的出发点是相当的一致啊。是不是因为我也叫Jeff的原因?偶是(Jeff jie)。可以到这里看看偶的TLD文件与Jeff的说法 :) 这两天会继续抽时间,按照规范把原来的Tag作一下小的修改。再发给Jeff看看。争取成为官方实现版本 :P。 Jmesa相关文章: jmesa系列之一:什么是Jmesa jmesa系列(二)Jmesa源码的包结构解读 Jmesa系列(三)开始使用JMesa

Posted in 技术 | Tagged , | Leave a comment

代码被Jmesa使用了!

使用Jmesa有一段时间了。中文资料基本上为0。经过一段时间的摸索及使用。渐渐爱上这套API。 前一段时间因为项目需要,自己基于Jmesa实现了Excel文件的导出功能。并在前天将代码交给了Jeff。Jeff很高兴,马上将我的代码加入项目中,将会在下一个发布的版本中看到,不过现在在Subversion上已经可以看到。 偷偷的高兴一下。

Posted in 技术 | Tagged , | Leave a comment

python 练习 : 帮我把硬盘里的图片都找出来

要点:使用系统模块,遍历磁盘,遍历文件,找到符合条件的文件记录下来到一个Log文件中(XML格式). import win32api import os #constants and configs IGNORE_PATH = [ "C:\\WINDOWS", "C:\\Program Files", "C:\\Documents and Settings", "C:\\System Volume Information" ] #TODO use re replace IMAGE_TYPE = [ "jpg","gif","png","jpeg","bmp" ] #find out the logic disks disks = win32api.GetLogicalDriveStrings().split(“\x00″) for disk in disks: if disk in ['','A:\\']: disks.remove(disk) #TODO store to xml file def store(filePath,fileName): print ’about to store %s\\%s’ % (filePath,fileName) def scan(path): print ’scanding path : ’ + path if not path.endswith(‘\\’): path = path + ’\\’ for _file in os.listdir(path): if os.path.isdir(path + _file) and path + _file not in IGNORE_PATH: scan(path + _file) else: for image_type in IMAGE_TYPE: if _file.endswith(“.%s” % image_type): store(path,_file) break # now iterat the disks for disk in disks: print ’now scan disk : %s ’ % disk scan(disk) 到此为止,Python把硬盘里的图片都找出来了,还差把图片信息存储到XML文件里面去. TODOs: … Continue reading

Posted in 技术 | Tagged | Leave a comment

从dir学到的

dir函数可以接受任何类型参数,如类型,对象,模块等. 下面一段程序将说明dir一个模块,类,对象时的情况: 先写一个模块: class Person: def __init__(self,name): self.name = name def getName(self): return self.name heyhey = Person(“jeff”) 另存为一个文件testdir.py 然后在控制台输入: import testdir >>> dir(testdir) ['Person', '__builtins__', '__doc__', '__file__', '__name__', 'heyhey'] # 这里,列出整个模块里面包含的对象,不管是内置函数还是类,还是变量.Person是一个类,Heyhey是一个变量. >>> dir(testdir.Person) ['__doc__', '__init__', '__module__', 'getName'] #这里列出Person类的所有方法和显示定义的属性,在构造函数里面出现有属性是没有出现,注意dir一个类实例的情况: >>> dir(testdir.heyhey) ['__doc__', '__init__', '__module__', 'getName', 'name'] #实际上是dir一个Person对象.这个对象因为通过构造函数生成.而在执行构造函数的时候有了一个name的属性.这就是dir类与类实例有区别的原因,推而广之,dir不同的实例也有可能得到不一样的结果. 而这个,就是动态语言的”动态”之处鸟.卡卡.

Posted in 技术 | Tagged | Leave a comment

麻雀虽小,五脏俱全--一个简单python程序剖析

Python代码如下: def buildConnectionString(params): “””Build a connection string from a dictionary of parameters. Returns string.””” return ”;”.join(["%s=%s" % (k, v) for k, v in params.items()]) if __name__ == ”__main__”: myParams = {“server”:”mpilgrim”,”database”:”master”, “uid”:”sa”, “pwd”:”secret”              } print buildConnectionString(myParams) 这是来自Dive into python一书上开头的程序,简单的一段程序里却包括了python的多个内置类及格式化输出、遍历、方法、注释等。 一、“”“ ”“”所包括部分为文档化注释,有如Java的/***/ 二、方法的声明语法:def functionName(params):方法体需要缩进,这是python的特性 三、字典类型,{}表示字典,字典的形式是key:value的。 四、数组类型,[]表示此为一数组,元素可以是任何类型。 五、元组类型,()表示元组,元组即不可变数组。 六、格式化输出:print “name=%s,age=%d” % (“jeff”,24),跟C的格式化输出差不多,后面总是跟着一个元组。 七、数组的映射,由一个数组开始,对数组的每一个元素进行同样的操作,然后变成另一个数组。 >>> li = [1, 9, 8, 4] >>> [elem*2 for elem in li] [2, 18, … Continue reading

Posted in 技术 | Tagged | Leave a comment

python的内置类型(1)

1、真假值类型 与Javascript一样地,或者说这是脚本语言的相同特性,python的任何对象都可以出现在真假表达式中,即if obj,或while obj。下面是一些被认为是False的值: None,False,数值类型的0值,空队列()、[],空字典 {},而对于用户自定义的类型,如果实现了方法__nonzero__()返回False值或__len__()方法返回0值的。 2、布尔值的操作符: and 与 or 或 not 非 3、比较操作符: <、<=、>、>=、!=、<>、is、is not。浅而易明。明显地。 4、数据类型: int,long,float,complex即整数,长整型,浮点型,复数。 python 的int 相当于c的long 2的32次方的范围 python的long型无限制地使用的。 python的float相当于c的double类型,实际上可以用尽你的计算机的资源。 复数有实部及虚部,如c = 1+2j,如实部可通过c.real获得,虚部即镜像,可能过c.imag获得。 long型的数值常在后面加上L或l,复数的虚部加上j或J 5、整数的位操作: x|y 位或操作 x^y x&y 位与操作 x<<n 位左移操作=””> x>>n 位右移操作 ~x 非 … Continue reading

Posted in 技术 | Tagged | Leave a comment

python的动态参数

动态参数是样很神奇的东西。我写了下面一段代码: class Person: def __init__(self,*pros,**attrs): self.name = ”jeff” self.pros = pros for (key,value) in attrs.items(): stm = ”self.%s = \”%s\””% (key,value) exec(stm) if __name__ == ”__main__”: jeff = Person(1,2,3,sex=”boy”) print jeff.pros print jeff.sex print dir(jeff) 打印出来的内容是 (1, 2, 3) boy ['__doc__', '__init__', '__module__', 'name', 'pros', 'sex'] 简单解释一下: 参数以一个*号开头的代表着一个任意长度的数组,可以接收连续一串参数,如上面代码里传的是1,2,3,你可以更多。 参数以两个*号开头的代表着一个字典,参数的形式是“key=value”,接受连续任意多个参数。 在函数内,我们就可以把前者当作一个元组来处理,打印结果看得出来是一个元组。注意,调用方法是参数不定长,而在方法执行的时候,长度已定了,所以是元组。同时,我们可以把后者当作一个字典来处理。 示 例代码里使用可变长参数实现了一个类属性的个性化定制,对于一个Person类,你可以通过传入字典类型的参数使这个类有更多原来不存在的属性,实现方法 是用了exec方法,目前只能通过字符串的参数。这里只是展示了可变参数的使用及exec的神奇力量。真正的函数不应该允许任意用户自定义属性的,可变参 数的目的是为定义函数方便及调用函数时,参数传入形式更自由而已。

Posted in 技术 | Tagged | Leave a comment

python猜数小游戏

用Python写了一个猜数的小游戏。很简单,电脑抽一个0到100的随机数,玩家猜电脑里的数字是什么,并视玩家所猜的数而给出太大或太小的提示,一直玩到猜中为止,程序将记录玩家所猜的次数。 程序涉及了控制台输入输出,数据类型转换,随机数,异常捕捉等。 #!/usr/bin/python ”’ this is a number guessing game.the computer make a random number and store into the memory.the player guess what the number is.the computer will give the tips. ”’ from random import Random import sys class GuessNumberGame: … Continue reading

Posted in 技术 | Tagged , | Leave a comment