Plone4

Plone 4.0 在几天前终于正式发布了。
这个应该是个重要的版本,然而已经没有多少人(国内)关注了。

Planet Plone 上有篇文章 Jon Stahl: 5 Things That Rock About Plone 4 看上去比较有意思。

Plone 及其底层开发框架 Zope 终于作出了很多重大的改变。虽然外表还是那么的丑,外表功能也似乎还是那些。

kupu

kupu 这个符合 Zope 复杂风格的奇怪的在线编辑器终于可以退位让贤了。

chameleon

计划中的 chameleon 模板技术即将替代落后的 ZPT 了。

Zope 的强大的面向对象机制是其优点,也是其“缺点”。 为什么这么说呢? 比如 Zope 发布机制,URL dispatch ,ZPT 等均以此为基础, 看上去很“自然”,看上去很“强大”,看上去很“完美”。 然而,她也为此付出了代价。
Zope 发布机制及 URL dispatch 导致定位最终对象的过程经过了一个漫长的对象容器搜索过程, ZODB 由此也可能被判定为性能的瓶颈。
而 ZPT 的强大的上下文对象也使得渲染模板的时候可能导致多次的回调其视图view 。

如今使用正则表达式来解决 URL dispatch 已完全占据了主流地位, 无论是 Java web容器的 url-mapping 还是 Ruby on Rails 的 Routes mapping , 或者各个 Python 的大大小小的框架,除了 Quxiote 等类 PHP 的文件目录结构方式等等, 几乎都使用了正则表达式了。 总结上越是抽象越是脱离计算机机器原理的东西,越是会产生性能问题,虽然看上去真的很“美”。

而现在大部分的 web 框架都把上下文定义为一个类字典的对象,或者干脆就是个字典, 直接传递给模板进行渲染使用,这样简单明了的做法,看上去虽然很原始,但却很高效简洁。 更避免了多次回调视图的问题。

ZODB 中的 BLOB 支持

这个或许真如文章所说的那样,可能将使得很多基于 Zope/Plone 的文件存储管理系统抛弃原来那种依靠操作系统的文件系统来组织和管理文件及文件目录的方式。
汗,说得好绕。。。

--

最后,Zope3 已死,留下一堆的 Zope 组件。Zope2 依靠 Plone 苟延残存,Zope3 的大部分组件重归 Zope2 并继续被改进。。。

而 repoze.bfg 已经越来越远离 zope 了,然后 grok 差不多真的成了一个笑话了。。。

Sinatra

2010,09,05 zhangkaizhao

--

Sinatra 是基于 Ruby 的一个小巧的web框架, 感觉比较像 Python 中最近比较受关注的 bottle web框架。

Sinatra 入门可以看 Sinatra Book 一书。
我刚看的是 2010,08,30 时候的,发现其中有个小错误, 在 Handlers -> Cookies 一段, 因为 Sinatra 完全使用 rack ,故

set_cookie("thing", cookie)

应该是

response.set_cookie("thing", cookie)

才对。

Sinatra 完全不顾及命名空间的问题,所有 Sinatra 内置的变量函数等等均不需导入。 这个问题 Rails 中也应该存在?
有位老兄在其一篇批判 web2py 的文章, 说说 web2py 中指出的 web2py 的十宗“罪”的最后一宗也大概就是指这个问题。 该点中作者最后一句话“光凭这一点,web2py就可以去下地狱了。”我觉得说得比较狠了。 照其说法,创造和使用 Rails/Sinatra 等作品的开发人员都统统可以去下地狱了。。。:-(

不过,说真的,Java/Python 在命名空间这个问题上做得都非常好, 采用 import 方式并指明每个导入的变量命名的来源, 这确实能避免命名空间混乱的问题。
而像 PHP/Perl/Ruby 等这种导入了一个模块后就相当于把那个模块中的所有变量命名导入到当前上下文的做法实在欠妥。 也给调试和查看源代码带来了很多麻烦。
当然 Java 中可以使用

import foo.*;

而 Python 中可以使用

from foo import *

来实现这种劣质的模块导入使用机制。

在 Python 中的代码块缩进语法或是其令人称赞的 import 模块导入机制等等, 看上去都是为开发人员所考虑, 所以,我想之所以很多开发人员喜欢 Python ,这些大概也都是令人喜欢的原因。

低效乏味的华为一面

2010,08,08 张凯朝

--

今天本来不想去的,想想虽然差得太远,还是可以去看看人家到底是怎么样的。

前天就使用谷歌地图查好公交线路,没想到公交线路已经更改了,最后只好打的。

提前十几分钟到场,拿了登记表和试题就在等候区开始填写了。

登记表好多的个人资料填写,耗费了大部分的时间。

最后是一个试题,要求使用 C/C++/Java 做题。

我很懒,这题也简单,直接用 Python 几分钟搞定了。

也不想用 C/C++/Java 写了,一个字:烦。

交上去等了好久,不见有人叫我去面试区面试,

看到前面有个牌子写着“洗手请下一楼”,以为去洗手的话就到12楼(那里是13楼),

走到12楼找了半天没有,想起那个意思应该是指到下面的1楼去。

洗完手回来,又等了许久。

数了数今天面试的人员,等候区大概

11 * 4 * 3 = 132

加上面试区里的人,应该是150人传统面试。

终于有人叫我了,面试官看上去挺和善,笑着和我握了握手。

在面试区中找了半天没位置,只好乱七八糟搬了两张椅子坐下。

开始面对面的面试。

面试官问了一些问题,过了一回又重新问了这些问题。

我看他将我填写的登记表翻了又翻,就跟他说,是不是因为没有什么内容?

他笑着默认。然后指着试题上的 C/C++/Java ,对我说他们需要使用“主流语言”的,

我说 Google 内部很多产品使用 Python 语言。

然后他让我介绍一下 Python 语言。

最后面试官强调他们不想招聘不使用“主流技术”的人。

我说像华为这样的大企业,应该是把部分时间花了培养人才,而不是招聘牛人中。

面试官只是点头说是。

问我掌握多少种语言,

我回答对 Python 语言熟悉,C 只是在学校修读过,Java 最近才开始使用。

我本来可以很像高手一样指出,语言只是一种工具,编程不在于到底使用何种语言。

类似这样的话语云云。然而我没有。

面试官说华为主要是做通讯设备,有些地方需要电子学方面,

我回答上学的时候也修读过电子学的课程,不过学得不好,如果需要可能得重新学习。

面试官表示软件和硬件两个方面的东西很难同时顾及,

说最好是在已有的方向互联网开发方面深入下去。

最后面试结束,大家握握手,再见。

--

华为这个一面,给我感觉就是低效,等了好久,

然后是乏味,既然不招聘非“主流技术”的人,干吗把我叫过来面试?

唯一让我有点感叹的是,

我的登记表中写着的兴趣爱好一栏,

可能让面试官觉得有和我聊一聊的可能。哈哈,那里写着“诗歌”。。。

附上了的试题解答(更正了些手写错别字):

#!/usr/bin/env python
import bisect

def getElementNumberGreaterThanAverage(src_list):
    len_list = len(src_list)
    if not len_list: return 0
    average = sum(src_list) / len_list
    average_index = bisect.bisect_left(sorted(src_list), average)
    return len_list - average_index

当然试题上是先写思路再写代码的。。。

这个解法比一般的解法效率上应该还要差一些,

不过我很懒,不想写太多。。。

莫名其妙的回复

""" 汗! """

几天前无意之中向一家公司投了一份简历, 接下来居然收到这样一份回复:

由于本公司还处于刚起步阶段,处于成本和长期发展考虑,暂时是需要Python的初级程序员,
很感谢您的简历与对本公司的关注与支持。

看上去,我好像被高估了,或者是我的简历水份严重超标。。。 哈哈 :-)

问题很多

""" 问题其实也不是问题。 """

虽然我修读过C语言, 但是在静态语言方面还是几乎一片空白。 Java 让我感到很多苦恼, 不过估计是我个人不熟悉所致, 也可能是某人所说的“开发方式”的问题。 我应该是没有权利来抱怨, 然而我正在使用,并感到烦恼。 我使用轻量的 Tomcat 来部署我的 webapp , 我写最基本的最简单的 jsp 来实现我需要的逻辑和页面, 单纯使用 jsp 来做这些事情的话, 我感觉就像在使用动态语言,虽然首次运行访问比较慢。 但是我需要使用到一些库,于是问题来了。 我同时部署了几个 webapp , 他们各自会有一些库放在其 WEB-INF/lib 中, 于是他们之间在 Tomcat 的运行环境中产生了某些相互反应, 导致 webapp 运行异常。

也许这只是我配置不够正确。 然而提示配置,我简直要疯掉了。 我测试一个项目的时候, 这个项目使用到了几个相当有名的项目, 如 Spring 框架、Hibernate 等。 我对这些一窍不通,他们各自有很多不同的配置问题, 繁多复杂。 这些有名的项目其文档都很丰富和成熟, 然而也是又长又复杂, 我没有那么多时间耗费在这上面。 我按照这个项目的仅有的一点说明文档, 将其打包成 war 包, 放到 Tomcat 运行环境中, 重启 Tomcat , 神奇的 Tomcat 会给你部署这个项目, 生成一个跟 war 包相同名字的文件夹, 于是仿佛可以在这个文件夹中修改那些配置文件来重新配置这个项目的运行选项, 我只是想更改一些数据库连接的选择而已, 这花了了将近大概一天的时间, 包括其中大量的进行 Google 搜索解决问题的时间, 后来才发现这些配置其实不能全部在已使用 war 部署的 webapp 中更改, 好大一个杯具! 我配置好了再打包,再部署就没问题了。。。

我想试试看 Tomcat 文档中所说的使用 JSTL 来操作 MySQL 数据库的方法, 我对 JSTL 一窍不通。 我照着教程做了, 结果那些 jsp 中的 JSTL 的标签像是在嘲笑我, 他们直接显示在输出的 HTML 中了, 丝毫没有任何处理了的痕迹。 我再回头看看文档, 文档说:

That JSP page makes use of JSTL's SQL and Core taglibs. You can get it from Sun's Java Web Services Developer Pack or Jakarta Taglib Standard 1.1 project - just make sure you get a 1.1.x release. Once you have JSTL, copy jstl.jar and standard.jar to your web app's WEB-INF/lib directory.

我认为我已经按照这个说明将 JSTL 1.1 弄好了, 不过,它死活没有起效果。 真的是杯具。

我需要使用一个已经编译打包好的 jar 包来提供其库的功能, 我在自己的 servlet 中使用这个库, 我发现我的程序中需要动态调试, 我想知道某个特定的时候, 某些对象的状态,属性,等等的东西。 如果只是在我自己的 servlet 中的话, 我想我可以直接使用 log 来获取信息。 但是对于流经库中的东西, 我难道要重新修改那个库的源代码, 写进去调试的代码, 重新编译那个库, 再把那个库放置到我的运行环境中? 这个过程实在繁琐。 也许我习惯了动态语言, 如 Python 之类的“开发方式”, “人生苦短,我用Python.”应该是很多行者(Python程序员的自称)的告白。

根据辩证法,世界是一个矛盾统一体。 就像《架构师》2010年七月(infoq中文的一本期刊)中 《解读NoSQL技术代表作Dynamo》一文提到的 CAP原则 那样, 很多东西都是辩证统一的, 不可能存在所有条件都完美满足的情况存在, 我们应该进行取舍。

Java 作为一种成熟的强大的静态语言,她自有其明显优点也有其某些不足。 Python 等优雅简朴的动态语言,她们也自有其明显优点也有其某些不足。 其他工具也都一样。

我以同一种“开发方式”去尝试另一种似乎不合适的环境, 结果是要碰钉子, 感到不舒服的。

人们因为自己的喜好而追求其钟意的目标, 并为其钟爱的目标奉献自己的才能, 他们为此而骄傲,为此而欣慰。

糟糕的面试

2010,07,23

今天去一家香港公司面试,很出乎意外,结果当然很糟糕。 这个记录就更加糟糕了。。。

这家公司很奇怪,我在5月份,也就是两个多月前投的简历, 居然现在才叫我过去面试,匪夷所思。 这家公司我投简历的时候投的是web前端工程师, 当时其职位描述中,只有寥寥的几个web前端开发相关的基础知识要求, 有些地方还写得令人啼笑皆非,比如“熟悉HTML、DIV+CSS、XML”。 然而,今天过去真的很出乎意外。为什么呢? 我想大概的原因在于目前国内大部分的从业人员对 Python 语言的认识上的问题, 像不久前有一家做 PHP 的小公司,仅有一名开发人员的小公司哪, 叫我过去聊聊,从其谈话中可以了解到 Python 语言在目前国内的认识上可能是: 可能比较适合于做后台架构,性能尚且过得去。 所以今天我去到那家公司面试的时候,这个出乎意外其实也挺好理解的, 后台开发可能会涉及到一些比较底层的东西。 然而,Python 几乎封装了所有的底层东西,基于 Python 语言的 Zope 更加如此。 于是,另这位面试官也可能出乎意外。我对底层的东西几乎不懂。 因为在网络传输层上, 我到目前为止学习和使用最多的是应用层的东西, 他们想要的可能是网络层的东西。

这位面试官一开始就抛出一个问题,居然问我都了解哪些“互联网架构”, 看我一脸茫然,他也不知道说什么了, 我说我做的比较多的是前台开发,在和 HTTP 相关方面比较熟悉一些。 结果,他马上提问是否了解 HTTP 协议细节, 我回答说不了解协议细节,但是基本的 HTTP 请求和 HTTP 应答还是知道的。 然后他就把问题锁定在 HTTP 协议上了,特别是长连接是怎么实现的。 我很想就 keep-alive 或者 200/304 之类的所知的仅有的相关知识来试着解释这些问题, 但是结果是我没有这么做,因为我不真正清楚这些东西,更不知道到底是不是有关系。

虽然其一再强调不在乎新人是否已有需要的技术, 然而其围绕 HTTP 协议这样的技术规范来作为讨论题目让我心生厌恶。

然而这位面试官更加离谱的是,当我顺着他提出的对 C/C++ 的学习如何时候, 开始聊下 Python 的时候, 我刚想说面向对象之类的解决问题思想的时候, 他居然自以为是地说,“那就是不懂面向对象”云云,并把这个话题当即灭了。 我只能在心里暗自说,这人应该是完全不懂 Python 的。

但是这位面试官,却小结了一下, 说如果是到他们公司工作的话,我的开发方式必须做出改变。 我很纳闷我自己有什么样的开发方式,而在他们这里的开发方式又是怎么样。 结果这位面试官就扯到了 Linux 下的 C/C++ 开发, 扯到了基于 GTK/QT 等的开发了。 然而这些和所谓的开发方式又有什么联系呢? 还提到了 VIM 的使用,Cygwin 的使用, 然而这些就更加不知道有什么联系了。

不急,更加奇怪的东西还在后头呢。

接下来,这位面试官提出“如果让你自己设计一个通讯协议”这样的问题。 在明知道我对网络层不懂的情况下提出这样的问题,很显然就是刁难人。 当然他表明说,这是想知道新人如何快速去学习和使用工作需要的技能。 我想我的回答还是挺到位的, 我说模仿是最有效的方式, 我会先学习基本网络传输知识, 在这个基础上借鉴其他已有的协议, 在实践中设计和开发。 然而这个回答并不能使其满意, 因为这只是很宽泛地给出了一个从学习到应用的途径, 而不是这些不愿培养人才的私营企业需要的解决具体问题的“方案”。

这位面试官在两个问题上非常激动, 我想他可能在这些问题上有过不好的经历。 一个是有关上司的问题,另一个是大型IT企业中员工发展的问题。 对于第一个问题,我想我并没有说我对以前上司的看法,无论好的还是差的, 然而这位面试情绪激动地一再强调让我好好想清楚为啥人家是上司,而。。。 还大谈在公司企业里为什么某些人就能做某个层次的领导等奇怪的问题。 让人感觉就是好像我对以前的上司很不满的样子,其实恰恰相反。 对于第二个问题, 这位面试官明显地以一种非常领导的架势, 来特别强调员工的发展问题全部归结员工本身造成。 让我对这个面试官仅有的一点点好感顿然完全消失。

好吧,我承认我基础很不牢靠,这也是我离开以前公司的一个主要原因。 我觉得我自己一向很努力,我相信只要努力没有学不会的东西。

这位面试官最后的结论是我和他们的要求相差太远, 我就此询问他们的要求具体是怎么样, 他说的大概就是如何快速进入一种新的开发环境中。 我觉得很可笑,我自诩自己是一个努力中的天才, 几乎什么都感兴趣,都很着迷,都爱花时间去学习研究, 这样的具体要求对我来说根本不是要求, 然而他却说我相差太远。。。 我想这位面试官估计在中间我回答“如果让你自己设计一个通讯协议”这个问题上, 因为我的回答让他一下子就把我列入不合格名单中。 我的回答过于谨慎,说“可能会有压力”。 也许这被当成是信心不足的表现,面试中可能最忌这样了。 然而我不在乎,因为突然询问我我暂时不熟悉的东西, 我当然不能随随便便就说没问题,哪怕是再简单不过的东西了。 比如以前有人叫我一起去做架构方面的工作, 我实在是没有那个信心,确实是不够熟悉,也没有过多少经验。

不过,这次的面试还是让我得到一点提示, 掌握好基础知识,这是提升自己技术水平的最好途径。 不过这也是我一直坚持的,只是层次不同而已,今后要学习更加基础的东西了。

最后的想法,偶尔面面试,接触接触别人,也可以了解社会,增进某些认识的。


2010,07,27 原来 HTTP 协议也只是应用层网络协议哪。。。
维基百科_分类:应用层网络协议

什么时候能重新回到Python开发

最近终于换了一份工作,不过新公司的大部分项目都是 Java 程序和 C++ 程序。 开始真正学 Java ,没想到越写越吐血。。。 有点像 robbin 在很久以前说的 我眼中的Python 中那样: “做为一种严谨的,编译式的,面向对象语言,Java总是给我一种须正襟危坐,须一板一眼的按照OOAD的原则编程,才敢在键盘上敲下字符的感觉。” 写 Java 程序的时候我感觉真的很压抑,而写 Python 程序的时候感觉很自然。。。

从天堂到地狱和从地狱到天堂的落差估计是非常巨大的! 真是怀念使用 Python 开发。

稍微更改了一下外观

最近太忙了。昨晚花了点时间,稍微更改了一下这个小应用的外观。
现在看起来应该舒服了一些了。呵呵 :-)

外观部分学习了 bottle 的设计。

准备更换这个app的外观

现在这个app的外观基本上是个草稿,难看。。。死了。。。

近日发现一个很小巧的 Python Web Framework: Bottle , 她的官方网站: Bottle: Python Web Framework 做得简单朴素大方,感觉良好, 等有空了,山寨一下她,哈哈 :-)

先把她下载回家哦。。。

$ wget -r -p -k -np http://bottle.paws.de/

EasyVMX - 让 VMware Player 更自由

还在使用漏洞百出的 VirtualBox 么?
还在为 VMware Player 无法自由创建虚拟机而发愁么?
还经常跑去 Virtual Appliances 苦苦寻觅那些庞大的虚拟机么?

现在,已经无须烦恼啦!
EasyVMX 实在是太好用了, 免费为 VMware Player 创建虚拟机! 几乎所有的设置都可以定制,真实让人开心哪! 加上 VMware Player 3 的许多配置都可以添加、修改和删除, 而且运行神速,简直是居家必备良药。。。

今天偶然从 UbuntuHelp:VMware/zh 发现这个好东东,高兴ing ...


updated on 2010,06,28

其实有了 VMware Player 3 ,也不需要使用什么 easyvmx 了, 创建和修改虚拟机配置已经变得非常容易, 而且还可以同时运行几个虚拟机,真是太好了。 同时运行几个虚拟机还可以用来模拟局域网环境,实在是强悍啊! 哈哈


Older