我的大学编年史[2.02]

2009年6月19日 424 views3 条评论

上次回忆我的大学生活,是在一年前了。那时写这些,是处于心情极度低潮的时期,在无法排遣的时候,就好好回忆下过去,来让自己更加抑郁。

人还是应该向前看,转眼间,物是人非,唯有记忆可以让人有少许安慰或者说,记忆让人不愿意向前。

总之,自从上次写了,心里一直有了缺憾:一直没有继续写下去的时间和勇气,不会这样的,不过,那时写和现在写的方式也许会不一样,心情不同了。

大二上学期,不知道大学班里的文艺委员是做什么用的,好像跟男生关系不大,而且,好像只有搞娱乐的时候才有的用到。不过,娱乐活动并不多。

因为昌杰的原因,我当上了我们班的文艺委员,这个原因,现在不是很具体了,大概就是昌杰要做什么班干部,但是要拉我一起,嘿嘿。

文艺委员当上了,其实并没有什么事情做,直到。。。迎新晚会,就是每个系每年都有迎接新生的一个晚会,惯例。而我们物理学系-电子信息工程系(名字太长)也照样要办,于是在某天被召集起来开会。系的文娱委员是个02级的女生,叫谢素芝,呵呵,我确实记得她的名字,她说我脸上有好多青春痘,她很漂亮,长的很甜美。当时确实是在想,要是我能有这样的女朋友。。。。呵呵,anyway,人家现在都结婚了。除去客观原因,我自己是非常的胆小,或者说不自信。。。,在大学的后几年,还有时会见到她,也有时候打招呼。唉——记得要自己争取,不成功也不会有遗憾!

总之,文艺委员要求每个班报个节目,我绞尽脑汁,还是想不出来,但是一看到她甜美的眼睛——哈哈,我决定弄个小小的小品,关于唐僧的东东,找了剧本,找人,就找我们宿舍几个人,哈哈,昌杰-猪,奎元-沙和尚,林健-猴子,张择-妖怪,我就是唐僧了。

然后开始了排练。那时好简单啊,把每个人自己的台词打印出来,就在一间空教室练了起来,虽然水平不怎么样,但是还是有被人围观过的~~哈哈

在排练中确实有问题,时间紧,我们几个人有时候时间或心情又不能统一,不过,不能放弃(现在好像很多事情太容易放弃了,要改,一定要改!!),努力去认真做好。

那时候舞台上的设备是很原始的,最明显的就是,没有那种微型的无线话筒,但是我们是小品哦,不可能每人拿一个话筒,而且还带着长长的电线吧。那我们就参照之前别人的经验——录音,然后表演时候对口型。在某天晚上,我们几个人召集到一块,用当时我们宿舍最先进的电脑——昌杰的17寸~用cooledit先把每人说的台词录一个文件,就形成了很多个单个的声音了,然后再按照剧本中的时间顺序把这些声音组合起来,加配乐,呵呵,就成了一个了声音~~有了这个,我们在排练的时候也方便多了。至今,这个声音文件,我都没有丢,有机会放上来,现在听来,确实很幼稚的。

通过了初选,我们顺利进入了演出。到了演出快开始了,谢素芝呢帮我们去定服装,确实好漂亮,不是说服装。。。而且,还自己在宿舍做了个唐僧的帽子~哈哈,以后对自己喜欢的,千万不要错过了,即使是有可能别人没有意思,也要为自己去尝试,这是我在大学里面学到的,现在想起来,确实很唏嘘。。

有个插曲,系的实践部拉到一个广告,王老吉的,要求在小品中展示出来这个品牌,嘿嘿,结果我们就让唐僧的斋饭是龟苓膏了。

开始演出,一上去面对那么多人,心里真的害怕,还好是对口型,不然不知道会不会出问题呢~不过,录音中有个地方有个脏话,竟然被删掉了,其实删掉也可以,但是竟然没有人和我们说,结果,演的时候,发现怎么少了一句啊!慌死了,还好当时糊弄过去了,哈哈。不过心里就有点不爽了。

结果,演出成功了,我是“我见过的最丑的唐僧”——后台一个小孩子跟我说的。而那个漂亮可爱的女生,就没有机会再接触了。这是个遗憾,真的。

Python Import机制备忘-模块搜索路径(sys.path)、嵌套Import、package Import

2009年5月31日 786 views没有评论

模块的搜索路径

模块的搜索路径都放在了sys.path列表中,如果缺省的sys.path中没有含有自己的模块或包的路径,可以动态的加入(sys.path.apend)即可。下面是sys.path在Windows平台下的添加规则。

1、sys.path第一个路径往往是主模块所在的目录。在交互环境下添加一个空项,它对应当前目录。

2、如果PYTHONPATH环境变量存在,sys.path会加载此变量指定的目录。

3、我们尝试找到Python Home,如果设置了PYTHONHOME环境变量,我们认为这就是Python Home,否则,我们使用python.exe所在目录找到lib\os.py去推断Python Home。

如果我们确实找到了Python Home,则相关的子目录(Lib、plat-win、lib-tk等)将以Python Home为基础加入到sys.path,并导入(执行)lib/site.py,将site-specific目录及其下的包加入。

如果我们没有找到Python Home,则把注册表Software\Python\PythonCore\2.5\PythonPath的项加入sys.path(HKLM和 HKCU合并后加入),但相关的子目录不会自动添加的。

4、如果我们没有找到Python Home,并且没有PYTHONPATH环境变量,并且不能在注册表中找到PythonPath,那么缺省相对路径将加入(如:.\Lib;.\plat-win等)。

总结如下

当在安装好的主目录中运行Python.exe时,首先推断Python Home,如果找到了PythonHome,注册表中的PythonPath将被忽略;否则将注册表的PythonPath加入。

如果PYTHONPATH环境变量存在,sys.path肯定会加载此变量指定的目录。

如果Python.exe在另外的一个目录下(不同的目录,比如通过COM嵌入到其他程序),Python Home将不推断,此时注册表的PythonPath将被使用。

如果Python.exe不能发现他的主目录(PythonHome),并且注册表也没有PythonPath,则将加入缺省的相对目录。

标准Import

Python中所有加载到内存的模块都放在sys.modules。当import一个模块时首先会在这个列表中查找是否已经加载了此模块,如果加载了则只是将模块的名字加入到正在调用import的模块的Local名字空间中。如果没有加载则从sys.path目录中按照模块名称查找模块文件,模块文件可以是py、pyc、pyd,找到后将模块载入内存,并加入到sys.modules中,并将名称导入到当前的Local名字空间。

可以看出了,一个模块不会重复载入。多个不同的模块都可以用import引入同一个模块到自己的Local名字空间,其实背后的PyModuleObject对象只有一个。

说一个容易忽略的问题,import只能导入模块,不能导入模块中的对象(类、函数、变量等)。如一个模块A(A.py)中有个函数getName,另一个模块不能通过import A.getName将getName导入到本模块,只能用import A。如果想只导入特定的类、函数、变量则用from A import getName即可。

嵌套Import

嵌套import,我分两种情况,一种是:本模块导入A模块(import A),而A中又有import语句,会激活另一个import动作,如import B,而B模块又可以import其他模块,一直下去。

对这种嵌套比较容易理解,注意一点就是各个模块的Local名字空间是独立的,所以上面的例子,本模块import A完了后本模块只能访问模块A,不能访问B及其他模块。虽然模块B已经加载到内存了,如果要访问还要在明确的在本模块中import B。

另外一种嵌套指,在模块A中import B,而在模块B中import A。这时会怎么样呢?这个在Python列表中由RobertChen给出了详细解释,抄录如下:

[A.py] from B import D class C:pass [B.py] from A import C class D:pass

为什么执行A的时候不能加载D呢?

如果将A.py改为:import B就可以了。

这是怎么回事呢?

RobertChen:这跟Python内部import的机制是有关的,具体到from B import D,Python内部会分成几个步骤:

  1. 在sys.modules中查找符号"B"
  2. 果符号B存在,则获得符号B对应的module对象<module B>。

    从<module B>的__dict__中获得符号"D"对应的对象,如果"D"不存在,则抛出异常

  3. 如果符号B不存在,则创建一个新的module对象<module B>,注意,这时,module对象的__dict__为空。执行B.py中的表达式,填充<module B>的__dict__ 。

    从<module B>的__dict__中获得"D"对应的对象,如果"D"不存在,则抛出异常。

所以,这个例子的执行顺序如下:

1、执行A.py中的from B import D

由于是执行的python A.py,所以在sys.modules中并没有<module B>存在,首先为B.py创建一个module对象(<module B>),注意,这时创建的这个module对象是空的,里边啥也没有,在Python内部创建了这个module对象之后,就会解析执行B.py,其目的是填充<module B>这个dict。

2、执行B.py中的from A import C

在执行B.py的过程中,会碰到这一句,首先检查sys.modules这个module缓存中是否已经存在<module A>了,由于这时缓存还没有缓存<module A>,所以类似的,Python内部会为A.py创建一个module对象(<module A>),然后,同样地,执行A.py中的语句。

3、再次执行A.py中的from B import D

这时,由于在第1步时,创建的<module B>对象已经缓存在了sys.modules中,所以直接就得到了<module B>,但是,注意,从整个过程来看,我们知道,这时<module B>还是一个空的对象,里面啥也没有,所以从这个module中获得符号"D"的操作就会抛出异常。如果这里只是import B,由于"B"这个符号在sys.modules中已经存在,所以是不会抛出异常的。

上面的解释已经由Zoom.Quiet收录在啄木鸟了,里面有图,可以参考一下。

Package(包) Import

包(Package)可以看成模块的集合,只要一个文件夹下面有个__init__.py文件,那么这个文件夹就可以看做是一个包。包下面的文件夹还可以成为包(子包)。更进一步,多个较小的包可以聚合成一个较大的包,通过包这种结构,方便了类的管理和维护,也方便了用户的使用。比如SQLAlchemy等都是以包的形式发布给用户的。

包和模块其实是很类似的东西,如果查看包的类型import SQLAlchemy type(SQLAlchemy),可以看到其实也是<type ‘module’>。import包的时候查找的路径也是sys.path。

包导入的过程和模块的基本一致,只是导入包的时候会执行此包目录下的__init__.py而不是模块里面的语句了。另外,如果只是单纯的导入包,而包的__init__.py中又没有明确的其他初始化操作,那么此包下面的模块是不会自动导入的。如:

PA

–__init__.py

–wave.py

–PB1

  –__init__.py

  –pb1_m.py

–PB2

  –__init__.py

  –pb2_m.py

__init__.py都为空,如果有以下程序:

  1. import sys
  2. import PA.wave  #1
  3. import PA.PB1   #2
  4. import PA.PB1.pb1_m as m1  #3
  5. import PA.PB2.pb2_m #4
  6. PA.wave.getName() #5
  7. m1.getName() #6
  8. PA.PB2.pb2_m.getName() #7

当执行#1后,sys.modules会同时存在PA、PA.wave两个模块,此时可以调用PA.wave的任何类或函数了。但不能调用PA.PB1(2)下的任何模块。当前Local中有了PA名字。

当执行#2后,只是将PA.PB1载入内存,sys.modules中会有PA、PA.wave、PA.PB1三个模块,但是PA.PB1下的任何模块都没有自动载入内存,此时如果直接执行PA.PB1.pb1_m.getName()则会出错,因为PA.PB1中并没有pb1_m。当前Local中还是只有PA名字,并没有PA.PB1名字。

当执行#3后,会将PA.PB1下的pb1_m载入内存,sys.modules中会有PA、PA.wave、PA.PB1、PA.PB1.pb1_m四个模块,此时可以执行PA.PB1.pb1_m.getName()了。由于使用了as,当前Local中除了PA名字,另外添加了m1作为PA.PB1.pb1_m的别名。

当执行#4后,会将PA.PB2、PA.PB2.pb2_m载入内存,sys.modules中会有PA、PA.wave、PA.PB1、PA.PB1.pb1_m、PA.PB2、PA.PB2.pb2_m六个模块。当前Local中还是只有PA、m1。

下面的#5,#6,#7都是可以正确运行的。

注意的是:如果PA.PB2.pb2_m想导入PA.PB1.pb1_m、PA.wave是可以直接成功的。最好是采用明确的导入路径,对于./..相对导入路径还是不推荐用。

分类: 技术 标签:

在Windows上安装Python+MySQL 的常见问题及解决方法

2009年5月28日 374 views没有评论

验证是否已经安装了MySQLdb:

==========================================================
d:\usr\local\Python25>python
Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] onwin32
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import MySQLdb
Traceback (most recent call last):
  File “<stdin>”, line 1, in <module>
ImportError: No module named MySQLdb
==========================================================
如果有类似于上面的”No module named MySQLdb”,表明MySQLdb尚未安装或安装的不成功!

MySQL 版本:5.0.67
下载地址:http://dev.mysql.com/downloads/mysql/5.0.html#downloads
下载exe文件并安装

==========================================================

Python 版本:2.5
下载地址:http://www.python.org/download/releases/2.5.4/
下载msi文件并安装

MySQLdb版本: MySQLdb Windows binary for Python 2.5
下载地址:http://biohackers.net/wikiattach/Python2(2e)5/attachments/MySQL-python.exe-1.2.1_p2.win32-py2.5.exe
参见:http://forums.mysql.com/read.php?50,129618,140611#msg-140611

常见问题:
1.无法定位程序输入点 mysql_server_init 于动态链接库 LIBMYSQL.dll 上。
—————————————————————————————————-
D:\usr\local\Python25>python
Python 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on win32
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import MySQLdb
Traceback (most recent call last):
  File “<stdin>”, line 1, in <module>
  File “D:\usr\local\Python25\Lib\site-packages\MySQLdb\__init__.py”, line 19, in <module>
    import _mysql
ImportError: DLL load failed: 找不到指定的程序。
—————————————————————————————————-
解决方法:把mysql安装目录的bin\libmySQL.dll文件复制到python安装目录的Lib\site-packages下

==========================================================

Python 版本:2.6
下载地址:http://www.python.org/download/releases/2.6.1/
下载msi文件并安装

MySQLdb版本: MySQL-python-1.2.2.win32-py2.6.exe
下载地址:http://home.netimperia.com/files/misc/MySQL-python-1.2.2.win32-py2.6.exe
参见:http://sourceforge.net/forum/forum.php?thread_id=2316047&forum_id=70460

常见问题:
1.ImportError: DLL load failed: 找不到指定的模块。
—————————————————————————————————-
D:\usr\local\Python26>python
Python 2.6 (r26:66721, Oct  2 2008, 11:35:03) [MSC v.1500 32 bit (Intel)] on win32
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import MySQLdb
Traceback (most recent call last):
  File “<stdin>”, line 1, in <module>
  File “D:\usr\local\Python26\Lib\site-packages\MySQLdb\__init__.py”, line 19, in <module>

    import _mysql
ImportError: DLL load failed: 找不到指定的模块。
—————————————————————————————————-
解决方法:下载libmmd.dll(附件)和libguide40.dll(附件)两个dll文件并复制到python安装目录的Lib\site-packages下。
参见:http://sourceforge.net/forum/message.php?msg_id=5613887

2.ImportError: DLL load failed: 找不到指定的模块。
—————————————————————————————————-
D:\usr\local\Python26>python
Python 2.6 (r26:66721, Oct  2 2008, 11:35:03) [MSC v.1500 32 bit (Intel)] on win32
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import MySQLdb
D:\usr\local\Python26\lib\site-packages\MySQLdb\__init__.py:34: DeprecationWarning: the sets module is deprecated
  from sets import ImmutableSet
—————————————————————————————————-
解决方法:
1) file “__init__”, replace: 
 
from sets import ImmutableSet  
class DBAPISet(ImmutableSet):  
 
with  
 
class DBAPISet(frozenset) 
 
2) file “converters.py”, remove: 
 
from sets import BaseSet, Set 
 
3) file “converters.py”, change “Set” by “set” (IMPORTANT: only two places): 
 
line 48: return set([ i for i in s.split(',') if i ]) 
line 128: set: Set2Str, 
参见:http://sourceforge.net/forum/message.php?msg_id=5808948

相关附件

分类: 技术 标签:

安装Diango出现的小问题

2009年5月24日 315 views没有评论

我的是vista,在按照网上的教程安装django后,使用django-admin.py startproject newtest命令运行一直不成功:会直接把django-admin.py文件的内容显示出来。

在前面加个 python, 会提示找不到文件django-admin.py。于是,我在命令行下进入C:\Python26\Scripts, 再运行python django-admin.py startproject newtest,就会看到一个新的文件夹newtest出现,应该是这样了。

我的工作目录想设施为d:\django,于是,我将django-admin.py复制到d:\django,命令行下进入d:\django,运行python django-admin.py startproject newtest,这时候就成功了。

不知道为什么会这样,网上的文章都是说直接用“django-admin.py startproject newtest”就可以运行,而且好像是说任意目录都可以运行,也许只有我自己的电脑是这样?我的系统是vista home版本。

分类: 技术 标签: ,

python程序练习–简单电话薄

2009年5月18日 434 views没有评论

python程序练习–简单电话薄代码

#python程序练习–简单电话薄 
#樊海军 
#fanhaijun.com 
#Python 2.6.2 
 
import cPickle as p 
import string 
class phonebook: 
        def __init__(self): 
                pblist=[] 
 
def pb_add(): 
        #print "This is the ADD function" 
        while 1: 
                print ‘\nPlease input a NEW name["Q" to back to main menu]:\n’ 
                add_name=raw_input("Name:") 
 
                if add_name=="Q": 
                        main() 
                else: 
                        add_sex=raw_input("Sex:") 
                        add_tel=raw_input("Tel:")                       
                pbdict={"Name":add_name,"Sex":add_sex,"Tel":add_tel}            
                print "You just input:" 
                for i in pbdict.items(): 
                        print ("%s:%-5s  ") % (i[0],i[1]), 
 
                pb.pblist.append(pbdict) 
                del pbdict 
             print ("\nRecord added sucessfully! Continue?(Y/N)\n")              
        while 1: 
                       con=raw_input() 
            if con=="Y": 
                            pb_add() 
                    elif  con=="N": 
                            pb_save() 
                            main() 
            else: 
                print ("\nError! Continue?(Y/N)\n") 
 
def pb_browser(): 
        #print "This is the BROWSER function" 
        #print pb.pblist 
 
        print "\nThere are %s records:\n"% len(pb.pblist) 
        print "*******************************************" 
        print "  ID     NAME     SEX      TEL" 
        print "*******************************************" 
    for i in pb.pblist: 
               #print "===========================================" 
                print "%3s     " % (pb.pblist.index(i)+1), 
                print "%-8s" % i["Name"], 
                print "%-8s" % i["Sex"], 
                print "%-8s" % i["Tel"] 
            print "===========================================" 
        main()  
 
def pb_del(): 
        #print "This is the DEL function" 
 
        while 1: 
                print "\nPlease input the ID of the record you want to delete:[Input 0 to main menu]\n" 
                del_id=raw_input() 
                if int(del_id)==0: 
                        main() 
                elif del_id=="" or int(del_id)<0 or int(del_id)>len(pb.pblist): 
                        #print "\nPlease input a RIGHT ID :\n"   
                        continue 
 
                elif int(del_id)<=len(pb.pblist) and int(del_id)>0: 
                        del pb.pblist[int(del_id)-1] 
            pb_save() 
 
def pb_search(): 
        #print "This is the SEARCH function" 
 
    while 1: 
        print "Please input what ever you want to search:" 
        s=str(raw_input()).lower() 
        k=0 
        id_list=[] 
        for i in pb.pblist: 
            if s in i["Name"].lower() or s in i["Sex"].lower()  or s in i["Tel"].lower(): 
                k+=1 
                id_list.append(pb.pblist.index(i)) 
        print "\nThere are %s results:\n"% k 
        #print id_list 
 
            print "*******************************************" 
        print "  ID     NAME     SEX      TEL" 
        print "*******************************************" 
        for j in id_list: 
            print "%3s     " % str(j+1), 
            print "%-8s" % pb.pblist[j]["Name"], 
                    print "%-8s" % pb.pblist[j]["Sex"], 
            print "%-8s" % pb.pblist[j]["Tel"] 
                print "==========================================="        
 
                print ("\nContinue?(Y/N)\n") 
        while 1: 
                       con=raw_input() 
            if con=="Y": 
                            pb_search() 
                    elif  con=="N": 
                            main() 
            else: 
                print ("\nError! Continue?(Y/N)\n")
 
def pb_file(): 
        #print "This is the file function" 
        try: 
                f=file(pbfile) 
                pb.pblist=p.load(f) 
        except: 
                pb.list=[] 
        finally: 
                f.close() 
 
def pb_save(): 
        #print "This is the SAVE function" 
        try: 
                f=file(pbfile,"w") 
                p.dump(pb.pblist,f) 
                print "\nRecords saved successfully!\n" 
        finally: 
                f.close() 
 
def pb_quit(): 
        print "Thanks for your using!" 
        exit() 
 
def main(): 
        print """\ 
____________________________________________________  
|       Please select your choice:                 | 
|__________________________________________________| 
|       [A]: Add a record.                         | 
|       [B]: Browser the records.                  | 
|       [D]: Delete a record.                      | 
|       [S]: Search.                               | 
|       [Q]: Quit.                                 | 
|__________________________________________________| 
        \ 
        """ 
        while 1: 
                opp=raw_input() 
                if opp=="A": 
                        pb_add() 
                if opp=="B": 
                        pb_browser() 
                if opp=="D": 
                        pb_del() 
                if opp=="S": 
                        pb_search() 
                if opp=="Q": 
                        pb_quit() 
 
pb=phonebook() 
pbfile=("pb.dat") 
pb_file() 
 
main()
分类: 技术 标签: ,

python, Zope,Plone之间的关系和安装

2009年5月13日 390 views没有评论

Plone
Plone是什么?
Plone是免费的、开放源代码的内容管理系统(Content Management System,CMF)。Plone着重于适合各种组织使用。它带有一个工作流引擎、预先配置的安全和角色系统、一组内容类型和多语言支持。有来自全世界的众多开发者、作者和测试者每天为Plone做各种贡献。Plone是基于内容管理框架的。(Content Management Framework)。
主页:http://www.plone.org  中文主页:http://www.czug.org 中文商业支持:http://www.zopen.cn

什么是内容管理系统?

要给内容管理系统(CMS)下个定义很困难,比找个要卖给你CMS的人还难。简单来说,CMS用来管理内容,通常是为了web site管理内容。CMS的主要目的是用来方便的进行内容的创建、发布和修复,以适应商业应用。

内容管理的麻烦在于它的琐碎或不可能实现

不同CMS可以是否集成web分成两类:基于web的系统和非基于web的系统。Plone是免费的、开放源代码的基于web的内容管理系统。

为什么使用基于web的内容管理系统?

理解Plone这样的内容管理系统最简单的方法就是将它与标准web站点设计工具(如Macromedia Dreamweaver)进行比较。他们都可以在远程计算机上制作页面,并提交用来确认或发布。但有以下四个方面的区别:

任何具有所需权限的用户可在任何位置制作网页,使用标准浏览器,无需任何特殊软件。CMS的使用比Dreamweaver和FTP容易,只需很少的培训,许多制作任务可分配给不熟练的人员。因此,CMS使得更多的用户可在WEB上创建和编辑内容。同时,较少的培训和较低的技巧使得制作和维护的成本降低。

通过输入文本、上载文件到站点预先制作的模板中来制作页面,保证页面的统一风格。即使直接制作发布web页面的人员非常多,也可保证风格的统一,更重要的是内容结构的一致性也可保证。

CMS中的工作流控制可充分使用,web管理员的工作可有效的分配给工作在不同地点人员,并不会降低安全性,并保证质量标准。

不同版本的文档自动保存,需要时可进行自然的审核跟踪。

内容管理系统的这些优点对大型组织或大型合作项目更为重要。

什么是内容管理框架?

内容管理框架是一个应用,包括一系列Zope工具。这些工具构成的框架提供了许多内容管理系统需要的关键服务。内容管理框架可作为单独产品使用,或者如 Plone一样建立在它的基础之上。内容管理框架提供了核心的工具如Workflow(工作流)、个性化和目录化。内容管理框架的开发由Zope公司领导,是一个开发源代码的产品,受益于世界上众多的开发者的辛勤劳动。

主页:http://cmf.zope.org

什么是Zope?

Zope是一种开发源代码的web应用服务器,用python语言编写。它是可升级、稳固、功能强大的系统,包括一个对象数据库、web服务器和多种模板语言。Zope主要由Zope公司开发和提供支持,也可从来自世界各地的开发者得到帮助。

主页:http://www.zope.org 中文主页:http://www.czug.org 中文商业支持:http://www.zopen.cn

为什么使用Zope和Plone?

Zope和Plone是开放源代码软件(OSS),也就是说任何人可自由取得源代码。制作Zope和Plone的人的商业模型是从咨询服务中获取利益,主要在于定制或企业化应用。其他开放源代码CMS系统还有Midgard,Bitflux,OpenCMS和Wyona。

专有的和开放源代码的内容管理系统从技术上讲并没有什么不同。在两个阵营中,都有好的、中等的和较差的产品。文档和支持的质量也有很大不同。主要的不同是开放源代码的CMS相比专有系统而言,开放源代码的CMS由较小的公司制作。这就增加了对这些小公司能够持续多长时间,能够提供怎样的支持的怀疑。以我来看,不同之处更多的是表面的,而不是实际的东西。开放源代码的产品更小,对一个客户或一个关键人物的离去更加敏感,而专有系统产品较大,受收购(如 Allaire被Macromedia收购)和IT股票市场的反复无常(如Broadvision)的影响。不同在于,对开放源代码产品,用户可以取得源代码,可以进行维护、定制和开发。没有制作者的积极介入,这些工作对专有系统是无法完成的。这才是采用开放源代码产品的关键原因。

为什么采用Zope和Plone而不是其他开放源代码的CMS?Plone基于Zope,Zope是为建设内容管理软件的一个框架。在某种意义上, Zope是web应用的操作系统。CMF就是一个web应用,用来方便建设CMS。Plone就是一个基于CMF,运行在Zope上的内容管理系统,带有自己的一组模板和文件类型。以我们的观点(我们指的是由Web和Internet指导组WISG设立的CMS工作组的观点)Zope比其他竞争性产品更胜一筹在于以下原因:

Zope是面向对象的,在某种意义上,在Zope中出现的所有内容(网页、图像、链接、文件等)都是对象,包含在一个对象数据库中。数据库是层次化的,而不是关系型的,特别适合于层次化的文件结构。技术人员会认为数据库是行列结构的表格的集合,与主键值相关。Zope的数据库是不同的,与普通的文件系统结构很类似,对象包含在对象中。

Zope对象数据库中包含对象的所有老版本,这对撤销修改,对协作文档的版本控制和需要审核轨迹的元素非常有用。

Zope中包括大量特别适合大型组织和协同工作的工具,后面的手册中会介绍。例如:预定义的数据库搜索,基于灵活的搜索标准,自动显示符合特定用户定义条件的所有对象。

Zope可在所有平台上使用,包括:Unix,Linux,Mac OS和广受欢迎的Windows(98,2000,XP,NT),而其他开放源代码CMS或专有系统并非如此。

Zope是一个非常友好的开发环境。可通过点击按钮完成脚本的定制拷贝,而将原始版本保留在原来的位置,这是我遇到过的具有最好安全性的系统。

Zope中可方便的设计结构化XML文档,带有链接到文档结构的工作流。这是大型组织管理系统的基本特性,促进了文档结构和风格的一致性和流水线工作流。

最后,Zope为大型组织使用而设计,具有以下特性:大量贡献者致力于合作项目,他们位于不同地点,使用不同的平台。强大的组织需要灵活性和安全性,需要定义具有不同浏览、书写、编辑、批准大型项目不同部分权限的本地角色,可伸缩到大量对象和服务器。

第七,Zope team与竞争者的文化的不同对大型组织至关重要。Zope的一个客户US Navy,使用Zope管理RDproject,这是一个大型,公共部门组织,关注灵活性和安全性,对大部分公司都一样,无论公共的还是私有的。

就Plone(区别于Zope)而言,我认为超越基于Zope的通用的CMS的概念。Plone至少给Zope增加了两个有用的特性,对工程科学web站点非常重要:

整洁、雅致的导航框架,依赖于文件夹和内容视图,而不是html文档链接(需要更新)。受益于导航快捷方式(如公告栏,显示最近几天创建和修改的对象,避免了要浏览整个站点才能找到这些对象)的帮助

创建复杂结构文档的简单工具,如PIQ和UPC表单,每个文档的不同部分对不同的观众可见,可定制的确认路径

第一个特性使基于Plone的站点可以简单,快速的开始使用。第二个特性使它易于管理,不像其他CMS更多的构思发布而不是内容的处理。

什么是Python?

Python是功能强大的、解释性、交互式、面向对象的编程语言。Python是开放源代码的,可运行在几乎所有系统平台之上。Zope主要由Python编写,部分用C语言进行了优化。google的核心语言就是python,大名鼎鼎的BT下载软件

主页:http://www.python.org http://www.python.cn

BitTorrent也是python写的。

上述文章引用自: http://blog.sina.com.cn/s/blog_4bc5a0960100073x.html
===============================
以下文章转自:http://ddhjwxy.spaces.live.com/blog/cns!8A016BC37DDEF613!237.entry
CMS内容管理网站zope+plone的建立(安装篇)
这两天突然有个做个内容网站的想法,于是先把网站假设好了。现在先把安装部分先贴出来,以免年后正式开始建立网站的时候出现疏漏。
下面就开始我的安装过程:
我市全新安装一台Linux FC4(rhel 4和 rhel 3也可以),安装时只要选中Develop Tools就可以了,其他的软体都是用不到的。
一、安装python2.3.5(43MB)
1.从www.python.org下载到python2.3.5解压到临时目录下。
2.进入python的解压目录。
3.运行 ./configure –with-threads
4.运行 make && make install
5.在python2.3.5安裝后將/usr/local/bin/目錄下的python2.3和python拷貝到/usr/bin/目錄下(这一步仅在rhel3中需要,原因是/usr/bin/目錄下有python2.3和python這兩個文件,但是据我的觀察,這兩個文件的實質還是我原來的python2.2的,所以一定要有上面的那個步驟,这也可能是巧合)
二、安装PIL(Python Imaging Library 1.1.5 or higher)
1.从http://effbot.org/downloads/#Imaging下载PIL软件tar包,并解压到临时目录。
2.进入解压的目录。
3.运行$cd Imaging-1.1.5
4.运行$python setup.py build_ext -i
5.运行$python selftest.py
6.运行$python setup.py install
PS.为保证PIL安装的正确性,编译前请先确定TKINTER(需要tix的rpm包和devel包、fontconfig的rpm和devel包以及xorg-X11-devel),TCL(包括devel包),libjpeg(包括devel包),freetype2(包括devel包),zlib(包括devel包)这些包必须安装,否则无法正常安装完毕。
三、安装zope
1.从http://www.zope.org 下载并解压安装包
2.运行./configure –prefix=/usr/local/zope
3.运行make && make install
4.建立一个用户zope密码zope
5.运行/usr/local/zope/bin/mkzopeinstance.py
home 设定为 /home/zope
user 设定为 zope
密码 设定为 zope

四、安装Plone 2.1.1
1.从www.plone.org上下载与zope相应版本plone的tarball
2.解压到临时目录。
3.将解压出的内容都拷贝到/home/zope/Products下,并注意文件权限。group和owner都设定成zope用户和zope组。
4.将/home/zope/etc/zope.conf中的effectiv-user 设定为zope
五、运行/home/zope/bin/runzope &
六、打开浏览器输入http://ip:8080测试网站的正确性。点击Zope Management Interface 进入设定界面,需要输入的用户名密码就是三-5中设定的用户。
这样CMS(zope with plone)就搭建成功了。

分类: 技术 标签: , ,

半梦半醒 谭咏麟

2009年5月8日 299 views没有评论

分类: 音乐 标签: ,

难舍难分 & 今夜情为证

2009年5月8日 261 views没有评论

难舍难分

今夜情为证

谭咏麟_也曾相识

2009年4月26日 330 views1 条评论
分类: 音乐 标签: ,

关闭QQ空间

2009年4月22日 381 views2 条评论

当你为情所困,不能自已

当你厌倦了虚无,精神萎靡

当你感到浪费生命,不愿继续

当你陷入莫名的纠葛,烦躁难忍

当你慢慢发掘自己变老,毫无魅力

当你……

你也许想到关闭

关闭如今令你痛苦的QQ空间

一个曾经的小小房间

当你想的时候

却找不到关闭的路

始终

徘徊在空间的门口

任它荒芜

来来往往

渐渐冷落

其实,它就在那里,就在那里,

就在帮助里,

只是你没有发现,

只是你没有用心去找……

其实

你不用烦恼,不用郁闷

问题会解决

一切都会过去

……

今天,

只要点击下面的地址

只要点进去

http://imgcache.qq.com/qzone/web/load_login_2.htm

你会释然……

曾经的空间,如同石子抛入大海

不会在你面前出现

就如同

曾经的我一样

分类: 技术 标签: