• 23 十一 2009 /  互联网技术

    脑子不好使,只能记录下来以后备用

    首先python有几个版本,我现在选择的是2.5版,版本越低,可选择的第三方支持包就越多,当然也要平衡,低版本也会有性能问题,或者小bug。2.6是3.0的过度版本,有很多新的特性但又兼容老的版本(3.0有些老版本的语法、特性就不支持了),所以权衡选择了2.5版。

    python自身的安装比较简单,在linux下就是通过源码编译就可以了,需要注意的是,python在linux系统下作为很底层的语言支持,通常系统会有一个版本默认已经安装了,如果你觉得那个版本够用就直接用,如果安装新的版本,最好不要改动或者覆盖那个版本。我一般都在/usr/local/python2.5目录下安装一个新的,然后ln -s /usr/local/python2.5/bin/python2.5 /usr/bin/python2.5,这样原有的版本和新的版本互不干扰。

    python的扩展包很多,一般分成两类,两种方法来安装
    1、扩展包是直接的源码包
    通常这种包解开后会有一个setup.py的文件,使用你希望安装这个扩展包的python版本来运行python setup.py install就可以完成安装,当然你也可以先python setup.py make再install,意思和linux下编译源代码的流程是类似的。

    2、.egg文件
    这种类似jar的代码包是一个叫easy_install的项目产生的,首先你可以下载并安装easy_install;如果你的easy_install是.egg结尾的,可以使用sh easy_install.egg来安装。如果是普通源码包就参考上面第一种方法安装。
    安装后会在 /bin/目录下多出来一个叫easy_install的脚本。你下载的.egg包就可以运行./easy_install xxx.egg来安装了。
    当然还有一个更简单的方法,就是./easy_install module_name,这样它就会在网上找到适当的模块进行自动安装并且保持模块之间的关联。
    easy_install除了网上查询包自动下载,后续的工作就是在 /lib/python2.5/site-packages/目录下的easy_install.pth文件中加入了.egg文件的关联而已,并且将.egg文件拷入上述这个目录,这样python在寻找软件包的时候就能找到并自动装载。

    BTW:有关Python MySQLdb模块
    上述安装方法很自然就可以将这个模块安装好,但是我的习惯不喜欢将mysql客户端的库放在默认的位置,导致实际python导入模块的时候会报错,这时候只需要将你的库文件路径加入/etc/ld.so.conf中,并且执行ldconfg -v就可以了。

    Tags:

  • 10 十 2009 /  互联网技术

    写在前面:

    总觉得学习英语要实践点什么,计划作为毕业印证我要翻译一本技术书籍。现在我还没有毕业,所以接下来的日子里,尝试翻译一些短文,热热身先。

    ———————华丽的分割线———————————-

    Python内建异常清单

    by Al Lukaszewski for About.com

    翻译:Yorgo Sun

    原文:http://python.about.com/od/pythonstandardlibrary/a/lib_exceptions.htm

    下面是一个完整的Python运行时会抛出的错误列表。大部分错误都可以一目了然,我添加了一些注释来使得它们更加清晰。这参考并扩展了Python 2.5文档中“内建异常”的章节。

    • BaseException: 所有内建异常的基础类。
    • Exception: 所有的内建的、非系统预置的异常均继承这个类,所有用户定义的异常也应该继承这个类。
    • StandardError: 所有内建异常的基础类,除了StopIteration,GeneratorExitKeyboardInterruptSystemExit StandardError 是继承Exception而来的。
    • ArithmeticError: 一些内建算术错误异常的基类,如: OverflowErrorZeroDivisionError,FloatingPointError.
    • LookupError: 当一个键值或索引在数组或序列中无效时所触发的所有异常的基类: IndexError,KeyError. 它也会由sys.setdefaultencoding()直接触发。
    • EnvironmentError: 所有能发生在Python系统之外的异常的基类:IOErrorOSError.
    • AssertionError: 当判定条件失败时,触发此异常。
    • AttributeError: 当一个属性被引用或赋值时出现错误会引发此异常(当一个对象不支持属性被引用或赋值时,会触发TypeError异常)
    • EOFError: 当内建函数(input() 或 raw_input())达到文件尾时触发此异常。(注意:文件对象的read() 和 readline()方法处理方法不同,当遇到到达文件尾部的情况时会返回空字符串)
    • FloatingPointError: 浮点操作失败时触发此异常。
    • GeneratorExit: 当调用生成器的close() 方法时,触发此异常。它直接继承了Exception 用于替代 StandardError ,毕竟这是一个技术手段并不是一个错误异常。 2.5版本新加特性。
    • IOError: 当I/O操作(如一个 print 语句、内建 open()函数或调用文件对象的某个方法)因为I/O相关的问题而失败时触发此异常,例如:“无此文件”或“没有足够的磁盘空间”。这个类继承于EnvironmentError
    • ImportError: 当 import 语句无法找到对应的模块定义或 from…import 无法找到对应名字的内容时触发此异常。
    • IndexError: 当一个序列子集超出范围时触发此异常。(索引会被截取以保证在合理的范围内; 如果索引x不是一个整数, TypeError 异常会被触发)
    • KeyError: 当键值并不存在于图(字典)中,会触发此异常。
    • KeyboardInterrupt: 当用户按下终止键时触发此异常(通常是Ctrl+C或者Delete键)。
    • MemoryError: 当某些操作导致内存耗尽但应能恢复的情况下(通过删除一些对象来释放内存),触发此异常。
    • NameError: 当无法找到对应名字的本地变量或全局变量时,触发此异常。这只针对无效的名字。 附带参数是包含了无法找到的名字的错误信息。
    • NotImplementedError: 这个异常继承于 RuntimeError. 用户定义基类后,抽象方法可以触发这个异常来要求派生类必须实现该抽象方法。
    • OSError: 这个类继承于 EnvironmentError ,主要用于os模块的os.error异常。
    • OverflowError: 当一个算术运算太大导致数值溢出时触发此异常。
    • ReferenceError: weakref.proxy()函数产生一个弱引用代理时,此异常被触发。弱引用代理通常访问一个被引用对象的属性,但这个对象已经被垃圾回收。更多的弱引用信息,请参考weakref模块。
    • RuntimeError: 当一个无法分类的错误发生时,触发该异常。
    • StopIteration: 当一个迭代器的 next() 方法无法获得更多的值时,触发该异常。
    • SyntaxError: 当语法解析器遇到语法错误时触发此异常。
    • SystemError: 当解释程序遇到一个内部错误,但是情况看来可以纠正,不需要放弃退出。辅助参数是一个字符串,标明在更顶层什么出错了。
    • SystemExit: 这个异常被 sys.exit() 函数触发。当这个异常没有被有效处理,Python终止程序并退出;没有堆栈信息打印。如果辅助参数是整数,它表示系统退出状态(和C语言的exit()函数类似);如果它是空则退出状态为0;如果它是其它类型(例如字符串),这个对象会被打印输出,并且退出状态为1。
    • TypeError: 当一个操作或函数调用一个不恰当的对象类型时,触发此异常。附带参数是一个字符串,表明具体的不匹配的类型。
    • UnboundLocalError: 当在一个函数或方法内引用本地变量但变量并没有赋值时,触发此异常。
    • UnicodeDecodeError: 当一个Unicode相关的编码、解码错误发生时,触发此异常。它是ValueError的子类。
    • UnicodeEncodeError: 在文字编码时发生一个Unicode相关的错误则触发此异常。它是UnicodeError的子类。
    • UnicodeError: 在文字解码时发生一个Unicode相关的错误则触发此异常。它是UnicodeError的子类。
    • UnicodeTranslateError: 在转换文字编码时,当一个Unicode相关的错误发生,触发此异常。它是UnicodeError的子类。
    • ValueError: 当一个内建操作或函数接收了参数,参数的类型是对的但值并不符合并且无法匹配一个更加精准的异常(例如:IndexError),触发此异常。
    • WindowsError: 当Windows系统下特定的错误发生或当错误编号无法映射 errno值时,触发此异常。
    • ZeroDivisionError: 当除法或取余操作分母为0时,触发此异常。附带的参数是一个文字信息,标明了运算类型和具体运算数据。

    Tags: ,

  • 06 六 2009 /  互联网技术

    首先,探索新鲜事物是有风险的;一个下午时间,工作用的SVN库内容被我搞乱了一点,我本机的代码被误删,这些血的代价换回的是一个整合的开发体验。我将我在开发中用到的几乎所有的内容都整合到Eclipse中了,有点爽。

    先介绍我开发时会用什么,php、python、actionscript、javascript是最近常用的几种语言,用SVN做代码库,Trac进行文档编写和bug管理以及任务分配。因为主要是Web应用,所以nginx做为web server通过fastcgi连接php和python,基本上调试是在开发服务器上完成的,本机也可,但是我的确比较烦windows下这些环境的配置。所以时不时要通过ssh来传送文件到远程的开发服务器上。

    再来讲讲Eclipse,这厮也不是什么新鲜东西了,n年前就听说几大巨头共同投资开发了这样的一个开源的集成开发环境(IDE),当年初次体验时没有什么感觉,那时候还主要用于java或者C/C++的开发,附带的插件还很少。也许Java的fans追捧的比较多。我长时间开始使用Eclipse是因为做一些Flex的项目,Flex Builder本身就是一个Eclipse的变种,被Adobe公司优化后,在那个时候相比直接下载的Eclipse来讲,好用很多,毕竟这个东西是卖钱的,不好用能行嘛。Flex项目完成后对Eclipse的感觉也加深了,总想将php开发的环境也迁移过来,我印象中触动我的新闻消息是Zend Studio也做了Eclipse的版本。但是直到今天前,我还觉得整合不是很完善,也许是没有踏实下来用,也许是插件发展还没有跟上我的要求。

    于是今天,我再次弄了一下这个东西,发现最近一段时间它的插件跟进速度很快,基本上可以满足我上述所有的要求,当然也许是我终于踏实下来研究了一下。下面是配置的一些流程以及一些配置注意项,正常情况下,如果没有什么异常,Eclipse配置好后就可以在windows、linux、mac下完成主流语言的开发、调试工作,并且可以将项目代码通过SVN来共享,并且可以管理自己的Todo list以及Trac上的ticket。怎么样,听起来是不是很爽?ok,如果你不想在试验体验时有血的代价,听好我的流程和注意项,Let’s go!

    访问http://www.eclipse.org/downloads/下载Java Developers版本,这个版本相对比较小一点,预装的东西少一点,后续按需自己安装插件嘛。一开始我选择了Classic版本,也没有什么问题,但是因为增加了所有功能的源代码以及Eclipse开发文档、插件开发库等东西,导致这个软件包比较大,大的坏处是下载很慢并且程序启动的时候因为加载很多无谓的东西导致很慢。所以一切你自己需要来选择初始版本。

    下载后解压到你希望它存在的目录就可以了,然后进入目录,运行eclipse.exe,如果你是其它操作系统的,就照着类似的方法安装启动就可以了。第一次启动会让你选择默认的项目工作目录(workspace),你可以每次都选择来切换不同的工作目录,也可以默认死一个,一个工作目录可以包含多个项目。这里要注意的是未来工作目录下的项目目录是会在建立或者导入项目时清空目录中的内容的,所以未来设置项目路径或者选择工作目录都要小心,我的文件就是这么被误删的,呜呜~~~~

    启动界面如图,默认是一个欢迎界面

    eclipse welcome windows

    可以关闭这个欢迎界面,以后要再想看的话,在目录help->welcome中激活,先不要研究这个,直接切入主题。我们先安装php的开发插件。

    访问这个地址http://www.phpeclipse.com/wiki/Installation,选择你所需要的update源,复制地址,例如我选择的是http://update.phpeclipse.net/update/stable/1.2.x,然后回到Eclipse中,选择目录help->Software Updates,如下图所示将update源地址添加进入更新列表中,然后就可以在列表中选择新安装或者更新的软件包了。

    eclipse add update site

    点击列表左侧每一项前面的加号,就可以展开看到可以安装的软件包,勾选你需要的,对于php来讲,选择全部,然后选择右面的install按钮,等待一会儿会再跟你确认是新装还是update,再次确认后就开始实际的下载安装了。这里我没有考虑网络太慢的原因,如果你实在受不了的话,可以找个地方先下载好软件包,然后还是在这个add site的地方加入,只是选择右面的local按钮选择本地文件罢了。

    好,在建议下重启eclipse以后,你会发现多了一些小东西,首先可以new php的project了,如果你在菜单file->new下无法看到默认的php project不要紧张,直接选择new project也可以,这时候创建项目的向导程序可以允许你选PHP目录下的php project,接下来的事情跟着向导程序一步步走就可以了,你就可以轻松建立一个php的项目了。

    php项目会进入php视图,如果没有的话,可以在菜单windows->open perspective->other里面选到,选好以后应该能发现菜单下多了一排小图标。这里用到的是一个开发环境简化安装的项目XAMPP。phpeclipse可以和xampp联动,做到在开发界面中重启例如apache、mysql等相关的服务,十分方便。不过,我不用XAMPP所以暂时没有研究它怎么调用我自己配置的开发环境。

    同样道理,我们参考上面的流程来安装python的开发插件。我选择的是PyDev,访问http://pydev.sourceforge.net/download.html页面来选择合适的update节点地址,拷贝下来还是到添加站点的地方添加,并且选择安装软件包,稍等片刻后就会安装好。重启后需要做一个配置来映射系统的python解析器,访问菜单Windows->Perferences->Pydev->Interpreter下,如图所示:

    eclipse config pydev

    选择右上角new一个新的python interpreter,起一个名字并且指定python.exe所在的路径,确认后就和上面的截图效果一样,会配置好所有的python库的路径,如果你要添加额外的库,也可以在下面这个框里面添加。至此pydev的设置也都ok了,创建项目和php的那个流程一样。我想其它语言你只要能找到它的插件,按照这个流程安装都应该可以支持。下面我们来说一些辅助的功能,eclipse与svn结合。

    Eclipse默认只有CVS的支持,svn毕竟是一个新东西,但是它的确比cvs好用,所以一直期待这个插件,这次我能完美的安装并使用这个插件了,安装流程和上述的流程都是一样的,非常简单,只是有一个概念要搞清楚。eclipse网站展示的只是svn插件的部分,让它顺利运行还需要安装一个第三方的svn connector接口以及选择一个connector实现。下面两个连接分别是插件和connector的update地址。

    http://download.eclipse.org/technology/subversive/0.7/update-site/

    http://community.polarion.com/projects/subversive/download/eclipse/2.0/update-site/

    安装好重启后可以在新建项目的时候选择Project from svn,这样就可以从svn直接checkout出来一个项目来开发程序了。需要特别注意的是,如果你不选择默认项目work space,你一定要自己制定项目的子目录,如果你选择了一个workspace但并没有选择子目录的话,它会在建立项目时将选择的目录内的所有内容都删除了!我就被删了我所有的开发代码。

    还有要注意的是,如果你直接将你现在的项目import到svn,它会将你当前项目当做目录import进去,所以不要而外再起一个svn的子目录名字了,不然就会多了一层,很乱。

    Eclipse默认还安装了 Mylyn的模块,它基本上是一个开发时的任务管理器,它可以和代码相关,比如你在代码注释里填写TODO:xxxx,它就会自动提取这个把它变成一个todolist。更加增强的是,如果你选择安装mylyn的trac插件,你还可以随时调用trac里面的ticket来做bug或者任务管理。因为目前跟trac 0.11.3的配合还不是太好,需要下载一些patch才能work,所以这部分我打算日后单独写一篇文档来描述,下面只是列出Mylyn的trac插件update地址。

    http://download.eclipse.org/tools/mylyn/update/extras

    总结:Eclipse是名副其实的综合IDE工具,因为它开源的特性导致会有更多的人提供基于它的开发工具特性,它也就会支持更多的开发语言或者开发领域。熟悉这个工具非常值得,因此希望大家玩得开心,happy coding!

    Tags: , , , ,

  • 06 五 2009 /  互联网技术

    最近这两天一直在测试自己用python+twisted写的一个http服务器的效率,几度从心理崩溃的边缘闯了过来,残喘留下点墨迹,警醒后来者。

    这个服务程序没有什么业务逻辑,就是负责保持一大堆连接,等待服务器状态被更改了以后就通知所有的保持连接,返回一个信号值。如何维持这么多连接是这个应用的关键。之前选择了几种方案,感觉太消耗服务器资源,动不动就内存吃光了,又懒得用C从头写一个服务程序(太耗时间没有必要),所以选择了python的一个socket框架twisted。

    这个程序一开始用ab(Apache Benchmark)简单的压,没有发现什么问题,服务器内存和cpu占用率都不高,所以没在意就直接上线运行了,实际运行时好在流量不是太大,所以没有出什么问题,但实际监控到的数据是400左右的保持连接就要占用40%的cpu,这个数值有点高。如果这样计算的话,一台机器没有办法承载多少连接数。于是在测试环境开始第一次压力测试,希望能重现实际运营时的那个种状态。

    还是ab,并发500请求我的服务程序,发现有很多连接并不是预期时间返回的(每个连接最少保持25秒),很多连接是超出了很长时间才返回。调试程序,在子线程的部分输出一些调试信息,发现同时只有少数线程可以被执行,而大部分的线程都挂起了,印象中twisted有线程池的概念,找到了一个这样的参数 reactor.suggestThreadPoolSize(),默认值是10,也就是同时只有10个线程可以被处理,将这个值改大到我希望的并发数值以上,问题消失了。这个修改有用!

    继续ab,并发到1000,作为代理服务器的nginx报错,它停止响应请求了,这是为什么呢?nginx默认配置下是和系统下ulimit nofile数值相关的,突破的方法可以在nginx.conf配置文件中加一句话

    worker_rlimit_nofile 51200;

    生效了,为此我犯懒没有修改系统默认的ulimit -n的值,现在还是默认1024。

    还是ab,并发到2000,总是感觉ab并没有达到这样的并发数量,而是一点点增加连接数,另外服务器端cpu占用率也没有实测的那次那种很高的占用率,为了更真实的模拟,我用python写了一个模拟并发的程序代替ab

    同时通过查询资料确认twisted默认的reactor是selec()方法,该方法目前限定只能同时处理1024个请求,突破这种方法需要切换到epoll模式,在程序开头写如下的代码,激活epoll的reactor

    from twisted.internet import epollreactor
    epollreactor.install()

    自己写的压力测试脚本继续测,1000貌似没有问题,2000出现了问题,因为我的测试脚本是1千1千的往上加,加到2000的时候,服务基本停止响应了,有大量的连接在等待,服务器出现很多请求超时。什么原因呢?是不是ulimit的问题呢?很有可能,因为启动服务程序的用户ulimit -n才1024,只允许打开1024个文件句柄,nginx也许有其它的招数来绕过这个限制,毕竟它用root用户启动的,想干什么不行呀,但我这个程序是普通用户,我的程序包括twisted也不会像nginx这么优秀,自己什么都搞定了,所以要修改我这个用户默认的nofile值,加大!修改/etc/security/limits.conf文件,增加对应用户nofile的值,我设定的是65535,六万多的并发足够了。重新登陆用户重启服务程序后,缓慢的问题消失了,但新的问题又出现了!

    超过1000多并发后我写的程序主动停止响应,查询对应进程的/proc/xxx/fd目录下的句柄数,锁定在1000出头的一个数字,直接telnet服务端口,输入任何内容就主动断开连接了。怀疑twisted框架是不是有那个参数没有设置好,类似SuggestThreadPoolSize的问题呢?寻找,一直在寻找,都找到twisted源代码里面去了,无果。貌似大家都没有这个问题。

    给twisted社区的邮件列表发信,询问是否有限制或其它问题,等待之余怀疑的心态重新编译了一个新的python版本。原来的是2.4.3,更新到2.5.4后居然问题消失了!不禁问自己,这是为什么呢?

    很快得到了社区大侠的回复,说这是python的bug,不巧就是2.4.3这个版本有bug,2.4.2没有,2.4.4也没有,我真应该去买彩票了。

    一切都过去了,目前测试已经超过了4000保持连接,服务器状态良好,内存、cpu占用率都不高,之前实测cpu占用率高也许是thread pool设定问题以及select()模式的综合体现,目前都消失了,基本上维持20%的cpu占用率,python也是脚本语言,你也不能太苛刻的要求它嘛。

    总结:

    • 性能是压出来的,怀疑一切,尽情的压,总能找到瓶颈点,总能解决并提高
    • 社区力量很好,但不能什么事情都不走脑子就往上面问,详细描述问题会带来非常准确的回答
    • 崩溃边缘可以喘喘气,换换心情,换个角度也许问题就能解决了,切忌钻牛角尖

    Tags: , ,

  • 17 一 2009 /  互联网技术

    Linux下安装Trac的流水帐,按照什么软件都没有的情况来逐步安装

    从零开始除了系统基础软件以及gcc编译环境外,还需要下面的软件包

    Python, SQLite, APR(Apache Portable Runtime), APR-UTIL, BerkeleyDB, Subversion,  Genshi, Trac

    下载安装SQLite http://www.sqlite.org/download.html

    tar -xzvf sqlite-3.6.10.tar.gz

    进入解压目录后

    ./configure

    make

    sudo make install

    sudo ldconfig

    下载Python 2.6.1版 http://www.python.org/download/

    解压文件

    tar -xjvf Python2.6.1.tar.bz2

    进入解压后的目录后

    ./configure –prefix=/usr/local/python26

    make

    sudo make install

    将/usr/local/python26/bin目录加入到path环境变量中

    下载easy_install http://pypi.python.org/pypi/setuptools#downloads

    sudo sh setuptools-0.6c9-py2.6.egg

    使用python安装工具自动安装Genshi

    sudo easy_install Genshi

    下载安装BerkeleyDB, 我下载使用的是4.7.25版

    http://www.oracle.com/technology/products/berkeley-db/index.html

    tar -xzvf db-4.7.25.tar.gz

    进入解压后目录, build_unix子目录

    ../dist/configure –prefix=/usr/local/berkeleydb

    make

    sudo make install

    sudo echo “/usr/local/berkeleydb/lib” >> /etc/ld.so.conf

    sudo ldconfig

    下载APR, APR-Util http://apr.apache.org/download.cgi

    tar -xjvf apr-1.3.3.tar.bz2

    进入解压目录后

    ./configure –prefix=/usr/local/apr

    make

    sudo make install

    sudo echo “/usr/local/apr/lib” >> /etc/ld.so.conf

    sudo ldconfig

    tar -xjvf apr-util-1.3.4.tar.bz2

    进入解压目录后

    ./configure –prefix=/usr/local/apr-util –with-apr=/usr/local/apr –with-berkeley-db=/usr/local/berkeleydb/

    make

    sudo make install

    sudo echo “/usr/local/apr-util/lib” >> /etc/ld.so.conf

    sudo ldconfig

    下载swig http://www.swig.org/download.html

    tar -xzvf swig-1.3.37.tar.gz

    解压后进入目录

    ./configure –prefix=/usr/local/swig –with-python=/usr/local/python26/bin

    make

    sudo make install

    下载subversion http://subversion.tigris.org/

    tar -xjvf subversion-1.5.5.tar.bz2

    解压后进入目录

    ./configure –prefix=/usr/local/subversion –with-apr=/usr/local/apr/ –with-apr-util=/usr/local/apr-util/ –with-berkeley-db=/usr/local/berkeleydb/ –with-swig=/usr/local/swig

    make

    make swig-py

    sudo make install

    sudo make install-swig-py

    在登陆用户目录~/下编辑文件

    vi .bash_profile

    填入如下内容

    PATH=”/usr/local/subversion/bin:/usr/local/python26/bin:$PATH”

    export PATH

    PYTHONPATH=”/usr/local/subversion/lib/svn-python”

    export PYTHONPATH

    sudo easy_install Trac

    trac-admin /home/to/project initenv

    tracd -d –port 8080 /home/to/project

    Tags: , , ,

  • 20 十一 2008 /  互联网技术

     

    前言

        在日常运营的基础上,不免需要关注一些能改善效率,提高生产力的技术或解决方案,本文列举一些技术点并加以描述,在适当的时候可以做相关的测试并且实际应用到开发中去。

        下面列出的众多内容每个展开都包含了很多内容,因此目前的版本只包含条目不做过多的解释说明,简单的介绍可以通过搜索引擎查询获得。下一步的目标就是将这些内容细化了解,总结优缺点,方便在实际项目设计规划时使用。

    操作系统 & 文件系统

    l         Solaris – 由于它与java都是同一家厂商,所以如果使用j2se,j2ee解决方案的话,需要验证在其系统上是否效率最高(原本的经验来看,的确会在效率上与其它操作系统内核有区别)。测试评估OpenSolarisSolaris企业版的性能差异。

    l         SUSE – Novell提供的比较稳定的Linux系统,相比RedHat近年更加广泛的使用在服务器解决方案上。

    l         FreeBSD – 比较鼻祖的类UNIX系统,应花时间测试它与其它系统之间的性能差异

    l         LFS – 从文档构建自己定制的Linux发行版,此项目可以帮助我们了解Linux系统软件包之间的关系,并且按照我们自身业务的需求定制系统或简化当前使用的Linux发行版,提高系统运行效率和减少安全隐患。

    l         ReiserFS & Reiser4 – 对小文件处理效率比较高的文件系统,适合网站应用,但是现在面临后续开发终止的问题,所以适当的测试和比较,谨慎使用。

    l         Ext4 – 新的Linux默认文件系统,对其效率应该有相应的测试

    l         MogileFS –- 分布式文件系统,用以研究分布式文件系统架构以及系统设计难点。

    l         GoogleFS – 非开放的分布式文件系统,但是网上有人在讨论,通过研究可以学习其精华思路。

    l         Amazon Simple Storage Service (Amazon S3) – 这个应用预示了未来Web Service的发展趋势。研究它的API和使用方法有助于规划我们自己的系统。

    数据库 & 缓存

    l         Memcached – 缓存技术的常用工具,延伸要研究纯内存存储机制。

    l         O/R Mapping –- 对象/关系型数据转换,现在很多应用程序开发都是面向对象的,怎么将程序中的对象和数据库的关系数据表进行快速简单的映射,是这个思想的关键,有很多解决方案,需要逐个分析测试效率,并吸取其思路。

    l         面向对象数据库 –- 解决面向对象开发一条龙问题,需要测试相关产品积累经验。

    l         BigTable –- 分布式数据存储系统,非开放,通过学习可以了解其精华思路

    l         MySQL – 测试研究新版本的效率。被SUN收购后社区内的发展并不乐观,所以保持观望态度。

    l         PostgreSQL – 作为MySQL替代的产品,测试跟进其效率

    l         SQLite – 轻型文件型数据库系统,适合一些特殊应用,目前Google将其应用于Gears离线应用解决方案中。

    热门编程语言

    l         Ruby – 面向对象语言热中之热,很多思想和编程风格,都可以在任何语言借鉴。另外体会纯面向对象的设计思路,也是不错的选择。目前Ruby开发的商用系统还不多,有待观察,可以作为一个学习工具使用。

    l         Python – 另外一个很热的面向对象脚本语言,Google核心支持的一种应用开发语言,可以用于多种用途,在后台可以作为增强的Bash Shell脚本语言来使用。值得推荐的工具。

    l         JavaScript & ActionScript 两个语言语法类似但是用途不同,前者在web 2.0炒得沸沸扬扬的时候算是主角,并且Google还使用它开发了重型产品GmailGoogleMap,一切证明它是一个浏览器级前端脚本语言的趋势;后者在Flash世界中举足轻重,可以理解成任何的面向视觉的flash开发,最终通过Flash CS工具都会转成ActionScript来运行,所以如果直接使用ActionScript来开发的话,效率会比原来的方法高,并且更适合程序员的习惯。

    l         Lua – 轻型嵌入式脚本语言,用于需要自定义脚本的时候,因为魔兽世界而让更多的人有所关注。

    程序框架

    l         Struts – Java世界有关MVC结构的重要项目

    l         Spring MVC – 另外一个Java世界中的框架

    l         RubyOnRails – Ruby用于网页开发的经典框架

    l         CakePHP – RubyOnRailsPHP语言环境下的实现

    l         其它Web MVC – 研究对比MVC框架是会提高应用开发的效率,根据业务要求选择适合的框架事半功倍,但是需要注意的是传统的MVC结构和WebMVC结构是不一样的,需要区分。

    Ajax辅助开发工具包

    l         Dojo Toolkit – 最火的Ajax开发工具包

    l         Google Web Toolkit – Google提供的Ajax开发工具包

    l         jQuery – 另外一个轻量化的开发工具包

    l         AjaxTag – Java世界使用的Ajax开发工具包

    l         MochiKit – 轻量级JS工具包

    思想 & 方法论

    l         Mashup – 可以理解为聚合,如何使用几种数据、各方面的信息组合产生新的应用价值。例如早年电子商务网站的价格比价工具。

    l         RESTfulRepresentational State Transfer – Web Service的一种理论,规范如何制作面向应用程序优化的Web应用。

    l         自动测试 极限编程的讨论引发了对这个东西的关注,如何适当的利用自动测试方法,可以提高开发效率。重点关注JUnitPHPUnit等项目。

    l         Comet – 基于 HTTP 长连接的“服务器推”技术思想,其实在dojo项目里有体现,但是如果能分离此思想,可用于很多需要频繁获取数据的应用上,例如Web版本的IM应用,聊天室等。

    l         Linking Open DataLOD – 将内容资源用链接标记成唯一的对象方便引用或使用的思想。

    杂项

    l         JavaScript Object NotationJSON- JS内部的数据对象格式,参照其格式就可以很快的将数据进行处理,因为JSONJS内部是优化的,相比一些字符串操作、XML操作会有一定优势。

    l         ECMAscript – 遵循标准化的JS的代名词

    l         Resource Description FrameworkRDF- 是万维网联盟(W3C)提出的一组标记语言的技术标准, 以便对网络资源的内容与结构作更为丰富的描述和表达。

    l         检索结果分析给用户提供检索建议 这方面看似是一个小功能,但背后隐藏着整个数据分析体系的思想,希望通过小项目来介入数据挖掘领域的研究。

    l         Google Gears – Google提出的离线应用的支持平台,通过研究Gears的原理可以了解一些新的开发思路。

    总结

    列举了很多东西算是内容丰富了,个人建议有机会的话都要深入研究一下,但是涉及面比较广,不可能个人力量完成,所以有待团队协作把这些东西弄熟悉。

     

    孙绍轩 2008/10/17

    Tags: , ,

  • 14 十 2008 /  互联网技术

    点击此处查看本书的介绍文章

    最近刚读完这本书的中文翻译版。首先这是我无意中在书店找到的一本书,吸引我的不是他的标题而是他这么特别的封面,像圣经或者一本古老的书,蕴含着无限的精髓。于是直接买下当作小说来读。

    这本书讨论的是软件话题,但是是不同的作者的博客文章,编者将他们集合在一起,很好的反应了软件行业的很多事情。让我感触很深的是,有些文章的确能触动内心。比如Ken Arnold的《Style Is Substance 编程风格是主旨》,不只是提醒大家代码规范是多么的重要,并且引申更严格的编译器限制会让大家更好的统一代码风格,并且简化IDE工具的开发时间,将更精力可以放在更注重效率的功能开发上,为开发者服务。Python就是这方面的典范,看来最近要找时间看看这个语言了,卖点Python使用空格作为风格控制,很是有特色呀。

    一个匿名的EA员工的妻子写的一篇抱怨无限制加班的文章,编者的评论用数字证明了长时间加班的效果是浪费资源的,很经典的一句话是“如果员工一周要强迫干90个小时,那么他的日常小事该怎么办,答案当然是在工作时间内完成”。

    Danah Boyd写的一篇文章《Autistic Social Software 自闭的社会关系软件》主导思想是批判了我们这样的不善于社会交往的技术人员居然开始设计做社会关系软件,不懂得交往的人怎么能完全理解社会关系的真谛呢?所以Danah和编者都觉得好笑,所以目前的社会关系网络应用也许不能代表真正的用户需求,也许它生命周期不会太长,所以我觉得与其效仿,不如按照作者总结的来做可能会更好:

    1、制造出一种技术,将其抛向大众,看它是否会流行起来;观察那些使用技术的用户,了解他们为何使用、如何使用,以及该技术是怎样适应他们的生活的;然后,进一步完善该技术,使其可以更好地满足那些喜爱它的用户的需求和愿望。

    2、首先去了解一个群体,了解他们的需求;然后再开发出一种技术,使其可以与这群人的生活实践有机地结合在一起;接下来再进一步推广该技术。

    总之,用户是核心,是技术适应用户,并不是用户来为技术买账。

    这本书还有更多有趣的文章,我这里就不一一列举了,下面列出本书所有文章作者的博客地址,大家可以去转转,找感兴趣的作者订阅他们的RSS,这样在你的Reader里面就可以跟踪他们的更新了,也算我在这里废话,大家看我的废话的一种回报吧。

    Ken Arnold http://www.artima.com/weblogs/index.jsp?blogger=arnold

    Leon Bambrick http://www.secretgeek.net

    Michael Bean http://www.forio.com

    Rory Blyth http://www.neopoleon.com

    Adam Bosworth http://www.adambosworth.net

    Danah Boyd http://www.danaha.org

    Raymond Chen http://blogs.msd.com/oldnewthing

    Kevin Cheng & Tom Chi http://www.ok-cancel.com

    Cory Doctorow http://www.boingboing.net

    Ea_spouse http://www.livejournal.com/users/ea_spouse

    Bruce Eckel http://mindview.net

    Paul Ford http://www.ftrain.com

    Paul Graham http://paulgraham.com

    John Gruber http://daringfireball.net

    Gregor Hohpe http://www.eaipatterns.com

    Ron Jeffries http://www.xprogramming.com

    Eric Lippert http://blogs.msdn.com/ericlippert

    Michael “Rands” Loop http://www.randsinrepose.com

    Larry Osterman http://blogs.msdn.com/larryosterman

    Rick Schaut http://blogs.msdn.com/rick_schaut

    Clay Shirky http://www.shirky.com

    Eric Sink http://shotware.ericsink.com

    Aaron Swartz http://www.aaronsw.com

    BTW:您如果对这本书感兴趣,可以在此购买

    Tags: ,