2007年6月22日星期五

PHP下一代的五个framework介绍

Blogger Help : What is BlogThis! ?
随便编写php的日子将远去了。下面有5个下一代的php框架。每个框架都为php下一步发展做了高深设计,许多都应和Ruby on Rails,快速开发动态语言,更有甚者, php on trax 直指 Ruby on Rails。如下面所列的frameworks,我学习了 AGAVI 就像 Symfony 一样轻松。我诚实的说我不愿望编写php还像以前那么自由散漫。使用这些frameworks将使用你的工作变得容易。

  在Nation.com工作时,我曾经很开心的学习,可以说拥抱这个frameworks。Symfony的亮点是Ajax的实现,包括所有的 Script.aculo.us一系列的javascript效果。Symfony也可以产生propel CRUD与数据库的面对象编程。那就是说可以操作sql就像操作对象一样轻松。

  Symfony Homepage - AJAX Screencast

  cakePHP frameworks近期发布1.0稳定版。Cake的强烈的面向对象规则使有面向对象开发经验的人很容易使用。象其他frameworks一样, cake也保持了快速开发与AJAX的实现。如果你不知道frameworks,那么CakePHP是比较好的选择,自从1.0的发布,用户使用的增多,在下两个月里,将会在激活整个社区!

  CakePHP Homepage-15 Minute Blog Tutorial

  PHPArch.com最近推荐zend frameworks为最好的开发工具,而且有95,000的下载使它的成功不容置疑。同时它也是Ning.com的伙伴之一,在线平台与web服务。zend断言这将是下一代的框架,是一个分水岭。

  Zend Homepage

  Avagi是另一个framework,我个人很熟悉它,虽然它有些地方没有Symfony精彩,但是它强烈的MVC架构是大家所需要的。同时它的一个分支流行的MOJAVI项目在社区里激活率与IRC一样多。

  Agavi Homepage - QuickStart Movie

  php on Trax本质上是Ruby on Rails的php翻版,实际上大家通常叫他"PHP on Rails",大家都知道"Trax"与"Rails"是同一回事。象Ruby on Rails与其他框架一样,PHP on Trax也有强烈的MVC原则。如果你是一个Rails程序员,而且你想转到PHP开发环境上来,那么PHP on Trax是你最好的选择。

  PHP on Trax Homepage

  每个framework都适应某部分的需求,也许他们将重新定义web,使开发更有效来精彩,提供了MVC,面向对象,这些都很容易学习。不要试图改变一个适应另一个,精心选择一个,操作它,掌握它,然后创造下一代杀手级程序

2007年6月21日星期四

ASPN : Python Cookbook : Generic block iterator

ASPN : Python Cookbook : Generic block iterator: "_undefined = object() def iterblocks(iterable, start, end=_undefined, skip_delim=True): '''Create an iterator over consecutive items (I{blocks}) of the given iterable. @param start: The delimiter denoting the start of a block. It can be: 1. a predicate C{p(item)} that returns true if the item is a delimiter and false otherwise, or 2. a non-callable object C{obj}: equivalent to C{lambda item: item==start} @param end: If not None, the delimiter denoting the end of a block. Items after an end delimiter but before the next start delimiter are skipped. Takes the same values as C{start}. @param skip_delim: True if the delimiter(s) are to be skipped, false otherwise. @type skip_delim: C{bool} ''' def get_predicate(arg): return arg if callable(arg) else ( arg.__eq__ if hasattr(arg,'__eq__') else lambda item: item == arg) def stamped_items(items): count = 0 startsblock = get_predicate(start) if end is _undefined: for item in items: if startsblock(item): count += 1 if skip_delim: continue yield count,item else: endsblock = get_predicate(end) inblock = False for item in items: if inblock: if endsblock(item): inblock = False if skip_delim: continue elif startsblock(item): count += 1 inblock = True if skip_delim: continue else: continue yield count,item get2nd = itemgetter(1) for count, block in groupby(s"


_undefined = object()

def iterblocks(iterable, start, end=_undefined, skip_delim=True):
'''Create an iterator over consecutive items (I{blocks}) of the given iterable.

@param start: The delimiter denoting the start of a block. It can be:
1. a predicate C{p(item)} that returns true if the item is a
delimiter and false otherwise, or
2. a non-callable object C{obj}: equivalent to C{lambda item: item==start}
@param end: If not None, the delimiter denoting the end of a block. Items
after an end delimiter but before the next start delimiter are skipped.
Takes the same values as C{start}.

@param skip_delim: True if the delimiter(s) are to be skipped, false otherwise.
@type skip_delim: C{bool}
'''
def get_predicate(arg):
return arg if callable(arg) else (
arg.__eq__ if hasattr(arg,'__eq__') else
lambda item: item == arg)
def stamped_items(items):
count = 0
startsblock = get_predicate(start)
if end is _undefined:
for item in items:
if startsblock(item):
count += 1
if skip_delim: continue
yield count,item
else:
endsblock = get_predicate(end)
inblock = False
for item in items:
if inblock:
if endsblock(item):
inblock = False
if skip_delim: continue
elif startsblock(item):
count += 1
inblock = True
if skip_delim: continue
else: continue
yield count,item
get2nd = itemgetter(1)
for count, block in groupby(stamped_items(iterable), itemgetter(0)):
yield imap(get2nd, block)

if __name__ == '__main__':
import re
# a slow version of str.split
for chars in iterblocks('Hello World', re.compile(r'\s').match):
print ''.join(chars)
source = """\
> name1....

line_11
line_12
line_13
...
> name2 ...

line_21
line_22
...""".splitlines()
for lines in iterblocks(source, start=re.compile('>').match, end='...'):
print list(lines)

ASPN : Python Cookbook : xml reverse-engineering ElementTree code generator (*whew*)

import xml.etree.ElementTree as ET
import re

class ETGen(object):
TAGSUFFIX = 'XMLTag'
def __init__(self, xmlin, out, param={}):
self.counter = 0
self.constants = {}
self.lines = []

h = open(xmlin, 'r')
xml = h.read()
h.close()

builder = ET.XMLTreeBuilder()
builder.feed(xml)
tree = builder.close()

self.out = out

self.__walk(tree, None)
self.__write()

def __genName(self, name):
self.counter += 1
return re.search('(?:{.*?})?(.*)', name).group(1) + ETGen.TAGSUFFIX + str(self.counter)

def __write(self):
h = open(self.out, 'w')
h.write("import xml.etree.ElementTree as ET\n\n")

# prints namespace constants
h.writelines(["%s = '%s'\n" % (v, k) for k, v in self.constants.items()])
h.write("\n")

h.write("def build(**kwargs):\n\t")

h.write("\n\t".join(self.lines))
h.write("\n\treturn ET.tostring(%s)\n\n" % self.root)

h.write("if __name__ == '__main__': print build()")
h.close()

def __getNamespace(self, name):
ns = re.search('(?:{(.*?)})?(.*)', name).group(1)
if ns is None:
return '\'%s\'' % name
if ns not in self.constants:
nsName = "NS" + str(len(self.constants))
self.constants[ns] = nsName
else:
nsName = self.constants[ns]
tag = re.sub('{.*?}(.*)', '\'{%%s}\\1\' %% %s' % nsName, name)
return tag

def __walk(self, node, parent):
name = self.__genName(node.tag)
tag = self.__getNamespace(node.tag)

if parent is None:
self.root = name
self.lines.append("%s = ET.Element(%s)" % (name, tag))
else:
self.lines.append("%s = ET.SubElement(%s, %s)" % (name, parent, tag))

# handles text
try:
t = node.text.strip()
if t == '': t = None
except:
t = None

if t is not None:
self.lines.append("%s.text = kwargs.get('', '%s') # PARAMETERIZE" % (name, t))

# handles attributes
for key,val in node.items():
key = self.__getNamespace(key)
self.lines.append("%s.set(%s, kwargs.get('', '%s')) # PARAMETERIZE" % (name, key, val))
for i in node.getchildren():
self.__walk(i, name)

def main():
g = ETGen('/home/user/manifest.xml', '/home/user/manifest_generator.py')

if __name__ == '__main__': main()

真理也需要装饰

真理也需要装饰--hagerlay的网上家园


有一位国王,梦到自己的牙齿掉光了,他召来智者为其解梦。耿直的智者说:“陛下,这是个不吉祥的梦:每掉一颗牙齿,就意味着您将失去一个亲人。”国王大怒:“你竟然敢胡说八道,给我滚出去!”
  国王下令找来另一位智者,让其解梦。这位智者听完后,一脸喜气地说:“高贵的陛下,您真有福气!这意味着您会比所有的亲人都长寿。”国王听后大喜,奖赏第二位智者100个金币。
  年轻的礼宾官不解地问第二位智者:“您的解释同第一位智者在本质上是一样的,为什么他受到重罚,而您却得到重奖呢?”
  智者先讲了一个寓言故事:“有一位年轻美貌的姑娘,满身污垢地去见国王,国王将她赶了出来。后来,姑娘洗得干干净净,如出水芙蓉一般,穿上了漂亮的衣服又去见国王。国王高兴地接见了她,并将其留在身边,十分宠爱信赖。这位姑娘的名字就叫‘真理’。”
  智者又说:“任何时候都要坚持讲真话,但人们听了赤裸裸的真理往往会觉得刺耳,所以说出真相的时候也要选择适当的方式。真理就像一块宝石,如果不慎扔到了听者的脸上,就会造成伤害。但给真理加上精美的包装后再诚心诚意地奉上,听者必定会心悦诚服地接受。”

2007年6月19日星期二

丈夫们的幽默语录

 
1.昨天我说以前的你是那么拼搏,那么努力,现在的你怎么没有动力,我真倒霉,在你下坡的时候遇到你。(偷笑,其实老公还是很努力的。) 
然后就见他一脸无辜的样,哀怨地说:我下坡的时候速度很快,别人都躲开了,就是你,太胖跑不动,被我砸到了…… 

2.作为女人,我经常问老公心里有没有我、我占多少、有没有占满。老公回答既幽默又气人。他说:你生怕我心里没有你,就使劲长肉,使劲长,把我的心撑的满满的,都快涨破了。 

3.有一段时间老公身体不太好,经常晚上睡觉时脑袋出汗,又不知什么原因。 
一天,老公早上起来,一脸无辜,郁闷地说:"老婆,睡觉时脑袋总是出汗,头发也湿了,枕头也湿了,怎么回事呀,是不是脑袋进水了。" 

4.与老公结婚后,准备赚钱买房子,得想办法控制花钱大手大脚的习惯,于是采取记账的方式提醒自己,每天晚饭后,与老公一起把当天的花销记录下来。 
今天也是照样。拿出本子,问老公:"今天你都干什么了?"(言外之意,今天你都买什么了)老公说:"今天我上班了。"我晕,又说:"我是说今天你都花什么了。"老公说:"哦,今天我花人民币了。"晕死了。 

5.和老公结婚一年了,因为准备赚钱买房子,所以结婚事宜一切从简,连结婚戒指也没买,也一直以来是我的心愿,女人嘛,总想追求一些情趣。 
一天与老公一起看电视,正好是张曼玉演的广告,铂金钻戒。看着纤细嫩白的手指上,一个精美的钻戒晶莹剔透,女主角尽情的享受着做女人的快乐,我梦想着自己也拥有证明婚姻的戒指,于是把手伸到老公面前,说"老公,我手上好象少些东西。"老公看看我,说"知道了,明天就去给你买手套。" 

6.我唱歌奇难听,所以在外面从来不敢哼哼。早上起床实在是件痛苦的事情,为了让自己清醒一下,一边洗脸一边唱上几句。 
老公当时在上厕所,我刚唱了几句,老公伸出头问"谁惹你了?"我:"没有啊?"老公:"那你大早上就骂街?" 

7.和老公骑摩托车玩去,老公骑得太快,我害怕,就说,慢点吧,眼睛都睁不开看不到路了。老公说,没事,我也看不见。

学生哄堂大笑---各科老师尴尬事件

地理老师 

某日上理化课,老师宣布下节课要小考。小明紧张地举起手问老师会不会考得很难,老师只说了一句:"十分简单。"乐得大家拍手叫好,可是考完后每个人都考得惨不忍睹,怎么会简单呢?于是小明又问老师,只听老师说:"我可没说错哦,'十分'简单,剩下'九十分'很难!" 

某班平时上地理课,地理老师常不用地球仪。有一天,校长要去听课!老师为了好好表现,就买了个地球仪。课堂上,老师问:"今天我们这里多了什么东西?"同学们异口同声地说:"校长!"地理老师说:"错,校长不是个东西!" 

英语老师 

有一个班级,班上有三个男生忽然都一起剃了光头来上课,三个并排而坐的"灯泡儿"立即成了全班注目的焦点。一位英文老师步入教室,看了他们三个一眼,便若无其事的开始授课。下课前五分钟,他要学生做英汉互译练习,指着坐在中间的"灯泡"说:"'一点五十八分'的英文该怎么说?"这位同学未料到问题会这么简单,充满信心的站起来回答:"秃!秃!秃!(two to two)" 

我的英语很差,有一天上课,老师竟然发给全班每人一张印着我英语作文的讲义,我真是受宠若惊。谁知老师发完讲义后,兴奋地说道:"同学们,发给你们的这一篇作文很不简单,几乎所有想像得到的错误在这里面都可以找到。现在我们就以这篇作文作范文,开始改错!" 

美术老师 

一位年轻女教师初次执教小学生美术课。她在黑板上画一个苹果问学生说:"这是什么呀?"学生异口同声回答:"是屁股。"女教师哭着去找校长,校长一听大怒,跟着老师来到教室训斥学生说:"你们越来越不像话了,为什么又把老师气哭了?"回头看了一看"啊!还在黑板上画了个屁股!" 

语文老师 

国文老师在台上讲解对联,举例说:"从前某报社曾公开征求'南通州北通州南北通州通南北'的下联,结果投稿信件很多,有句对得很好,就是'东当铺西当铺东西当铺当东西'。"此时一位调皮的学生突然叫道:"男学生女学生男女学生生男女。" 

生物老师 

生物老师正兴致勃勃在台上描述非洲野猪的长相,偶尔眼光一扫台下,竟发现多数学生在打瞌睡。于是大为恼火,喝道:"你们要看着我啊!不看我,你们怎么知道非洲野猪长的是什么样子?" 

哲学老师 

一个智者指导他的一个学生说:"下雨的时候,你冲进雨中,高举你的双手,你会发现真理"。过了几天,学生回来说:"我照您的建议去做了,雨水流进了我的脖子,我感到自己就是一个彻底的傻瓜。""正是这样的,"智者说道,"这就是真理"。 

有一天某教授突然停止授课,语重心长地对大家说:如果坐在中间谈天的同学,能像坐在后面玩牌的同学那样安静的话,那么在前面睡觉的同学就不会受到干扰了。 

物理老师 

肥胖的物理老师为使学生明白光线折射现象,做了个实验。她将玻璃杯装满水,问道:"假设我是一道阳光,插入水中,结果怎样?"一个学生回答:"水溢出来了!"全班哄堂大笑。