关于作者

笔名:johnsonqu
地区:
作者相册

日历 

快速登录

+ 用户名:
+ 密 码:

在线留言

友情Blog

软件工程

技术前沿

朋友的BLOG

敏捷软件开发

访问统计:11045


EAD: Bandit Johnson

 

Technology and skills (Team/Process/Technology) on Enterprise Application Development, especially those on Agile Software Development, XP, J2EE and Patterns.

日志

搬家酝酿中...
在BlogDriver呆了已经有3年了,自己在工作和生活中的点滴都记录在这里。但是,最近一、两年感觉稳定性很差,经常上不来,速度也很慢。想来想去,得给自己再寻觅一个窝了...

在BlogBus那里搭了一个新家:http://johnsonqu.blogbus.com,把大部分的Blog都搬过去了,并行一段时间看看吧。

- 作者: johnsonqu 2007年02月27日, 星期二 17:48  回复(0) |  引用(0)

后悠长假期的第一小时
终于还是要上班了,今天早晨在床上还是赖了半个小时以后才起床,赶到地铁站的时候,不出意料的人满为患,:(后悠长假期的第一天,心情实在不是很好......

看到地铁车厢里的广告牌换了,ZHAOPIN的广告牌换成了黄 健翔的照片,黄已经成了智联的签约形象代言人,广告语大意是:我们向往始终如一的工作,但是我们更赞叹奔放自由的灵魂。一看就知道是受黄解说词的启发。从 一个猎头公司的角度来说,把黄作为形象代言人也算是一个不错的主意。只是,黄现在到底跨了几个圈了呢?

到了公司,信箱里有100封左右的信件,花了半个小时去仔细地阅读,发现大部分都是ITNOICE这样的垃圾。有用的东西实在不多...

还有两个月,就是5/1的悠长假期了,憧憬一下,嘿嘿。

- 作者: johnsonqu 2007年02月26日, 星期一 10:03  回复(5) |  引用(0)

快乐假期!

假期基本上也就剩下3天了,春节的味道虽然不是很浓,但是,可以一连休息10天左右的机会一年委实没有几次。

昨天还是禁不起心中的想法,买了一个KONKA的32寸的LCD,价格还是蛮可以。从昨晚开始就享受了好处,我和LP各自看自己喜欢的节目,我也可以自己打回儿游戏,哈哈。

初五的一天很有意思。 其一是:喜欢的火箭队赢球了,而且是赢了卫冕冠军热火。看到了威尔斯的超远三分,看到了格雷迪的三不沾传球,看到了奥尼尔在穆大叔眼前晃动手指,最主要的是看到了火箭的各个角色球员都有不错的表现,自开场就一直领先对手。不知道姚明回来后的火箭是否还能打得如此赏心悦目?

其二是:恶灵骑士(Ghost Rider)通关了。春节前买的美系ACT,算做GOD2前的开胃小菜了。游戏做的很爽快,竞速和打斗的结合也算不错,手感、画面都算上乘,嘿嘿。Forgiving模式下5小时通关。至此,PS2上通关游戏数量升值8个(战神、Black、波斯王子系列、KILLZONE、Project SnowBlind、Ghost Rider)。

后面几天应该再整理一下PIM的代码,试试看动态调整页面的Sizer等等,再整理一下项目的思路了。

- 作者: johnsonqu 2007年02月23日, 星期五 12:54  回复(0) |  引用(0)

人生不是铅笔写的作业,不好可以擦掉再来

江南,初二,阴。上海的天气,在初二终于露出了久违的阳光,在下午休息过之后,我和LP看了新年的第一部碟片--爱情呼叫转移。主演是徐峥和另外10余个美女。

这部应该算是07年的贺岁大片,从这个角度讲,它算是比较成功的,因为,我和LP笑了很多次。里面有很多台词确实不赖,徐的表演也衬得上那几个美女,而刘仪伟的戏份则是纯属凑分了...

自己是看了CCTV6的首映晚会才知道这部片子的,而LP之前就听了陈奕迅的主题曲《爱情转移》,林夕的词和Eason的演绎都称得上上佳,而沙宝亮和范冰冰的插曲《追爱》也是不错。

如果说看完了片子,除了两首曲子之外,给我留下印象最深的就是标题的这句话。现实生活中肯定是没有片中的艳遇电话了,但是,每个人都要正视自己用钢笔书写的人生,因为,现实的涂改液也是没有的。

- 作者: johnsonqu 2007年02月19日, 星期一 20:07  回复(1) |  引用(0)

以人为本的科技真好!

金猪年,我也来凑热闹整个第一贴。

今年的除夕夜,就是我和LP两个人在上海的家里过年,自己感觉没有啥过年的气氛,不过,窗外从下午6点开始就不断的爆竹声声却提醒我,中国的春节切切实实地来了。

用我老爸的话说,他不敢想象,现在的科技可以让生活这么方便。在弟弟家过年的爸妈,可以通过网络视频清楚的看到我和LP在做什么,也可以看到我新家的样子;而我,则可以看到我那又长漂亮的侄女蹦蹦跳跳的一刻不停。

这个春节,虽然只有我和LP在一处,但是,通过网络,我能够感受到一大家人一起过年。科技有些时候真好!!!

- 作者: johnsonqu 2007年02月18日, 星期日 11:57  回复(0) |  引用(0)

Spring Python Framework
今早看PythonDaily,发现有个新的框架,叫做SpringPython,我心里在猜想,是否是Java里的那个Spring Framework,查询下来,果真如此,哈哈。

下面是它的项目描述以及主要Features:

Spring Python is an offshoot of the Java-based SpringFramework and AcegiSecurityFramework, targeted for Python. Spring provides many useful features, and I wanted those same features available when working with Python.

Key Features

The following features have been implemented.

  • DatabaseTemplate - Reading from the database requires a monotonous cycle of opening cursors, reading rows, and closing cursors, along with exception handlers. With this template class, all you need is the SQL query and row-handling function. Spring Python does the rest.
  • InversionOfControl - The idea is to decouple two classes at the interface level. This lets you build many reusable parts in your software, and your whole application becomes more pluggable.
  • AspectOrientedProgramming - Spring Python provides great ways to wrap advice around objects. It is utilized for remoting. Another use is for debug tracers and performance tracing.
  • DistributedRemoting - It is easy to convert your local application into a distributed one. If you have already built your client and server pieces using the IoC container, then going from local to distributed is just a configuration change.
  • PetClinic - Everybody's favorite Spring sample application has been rebuilt from the ground up using utilizing CherryPy as the web container. Go check it out for an example of how to use this framework.
  • ApplicationSecurity - Plugin security interceptors to lock down access to your methods, utilizing both authentication and domain authorization.
  • SpringWiki? - Wikis are powerful ways to store and manage content, so we created a simple one as a demo!

For a more complete listing, see SpringPythonFeatures.

我个人比较感兴趣的是IOC, AOP, DistributedRemoting以及ApplicationSecurity,如何结合PIM来整合这些内容,是后期工作的重点了。

- 作者: johnsonqu 2007年02月5日, 星期一 09:24  回复(0) |  引用(0)

[zt]给那些不熟悉山东方言的人
早晨正好看到一篇博客转贴了关于‘复杂的山东口音’ 。我是在南方呆了将近10年,平常说话是不带半点胶东口音的,而平常说起来,很多朋友就说咋不像山东口音呢,其实,他们印象里的只是济宁一带的口音,而非胶东,嘿嘿。

*****

《山东快书》的口音,用正宗的高元均先生表演出来,应是济宁一带的方音。他徒弟孙镇业先生,也是继承这种表演。

    山东人的地方戏种,吕剧,正宗产地则是博兴一带。这博兴口音,就比较特别。有趣的是,胶东的口音,与博兴话相差那么大,但特别喜爱吕剧。有时候与胶东人在一起,听着那戏匣子里播出吕剧的唱腔,胶东人就不禁来一句:真好听!

    侯宝林先生表演的《关公战秦琼》,模仿韩复渠他老子的山东话,那口音,则是鲁北、鲁西北一带,乐陵、商河、禹城、平原等。“别唱了,你这是唱的嘛戏呵!”这一带人说什么,就是嘛呀嘛的。

    山东人说话最土、舍头最难转悠的,则是淄博、潍坊一带。如,一对潍坊青年男女在夜色中谈恋爱。女的说:白浪河水白滔滔。男的接下句:月亮就象一个大火烧。用潍坊话,说出来是:北浪河谁谁特特,业亮就象是个大河猞。

    淄博说日本人是二本人;胶东说是一波人,差距就这么大。给客店打电话,说来日本人了。大堂接胶东人电话,是来了一百人;接淄博人电话,是来了二百人。店家都乐的找不到北,最后闹明白,原来是狗咬尿泡空欢喜。

    从全省来看,山东可以分为胶东、济南、济宁,淄博,潍坊,临沂六大语系。每一个语系下面,覆盖一定地区。如济南语系包含的环境有:济南,德州,滨州,东营等。济宁语系包含的环境有济宁,枣庄,荷泽,聊城等。胶东语系则包含有威海,烟台,青岛等。

    每一个语系,向内有交叉点;向外则有延接点。济南语系向北延伸,就与河北相接。济宁与河南相接。临沂与江苏相接。胶东则与东北口音相接。没有见山东口音这么复杂的。当然,也有更复杂的。浙江温州据说隔一个村,说话就相互听不懂。不同的口音,显示着人种族群来源的不同。说胶东人是从云南来的,应该只是很少一部分,不可能数量太多。因为,胶东人个头相对较为高大。不可能是云南过来的。

***
我们村的村址那里说我们这个姓氏是明朝的时候从云南搬过来的,应该不假。今天看到这个里面最后的部分,想来又加深了这点意思。过了这么多代,个头已经越来越山东了吧?

- 作者: johnsonqu 2007年02月5日, 星期一 08:48  回复(1) |  引用(0)

MySql+SQLAlchemy+wxPython的Unicode解决方案

我自己做的C/S架构的PIM是给予wxPython技术的,持久层用了MySQL5.0+MySQLdb+SQLAlchemy, 对于数据库的操作,单表的CRUD都是使用SQLAlchemy的Table来进行操作:

def insert(self, row_dict, table_name):
        '''Insert row to table with all necessary data
        '''
        conn = ConnManager().get_conn()
        trans = create_session().create_transaction()
        try:
            trans.add(conn)
            tables = Table(table_name, ConnManager().get_meta(), autoload=True)
            stmt = tables.insert()
            rs = stmt.execute(row_dict)
            trans.commit()
        except Exception, ex:
            trans.rollback()
            loghelper.error(ex)
            raise SQLError(ex)

而对于多表的CD,则是分解成单表的CD来进行处理,对于U,则是根据具体更新的数据来拼接SQL进行UPDATE的操作,对于查询,尤其是对于报表或者比较复杂的逻辑,都是根据拼接SQL来进行的。这样,使用的就是SQLAlchemy的text来进行操作。

def _do_query_result(self, sql_stmt, init_datas):
        '''Execute query according to statema
        '''
        try:
            stat = ConnManager().get_engine().text(sql_stmt)
            return stat.execute(init_datas)
        except Exception, ex:
            raise SQLError(ex)

整个PIM系统的初始化方法中,已经将系统的encode设置成为utf-8,代码如下:

reload(sys)
sys.setdefaultencoding('utf-8')

这样,wxPython的每个widget的GetValue方法,返回的值也是utf-8编码的了。

在MySQL那里,pim使用的数据库,以及其中的表的定义中使用的charset也是utf-8。使用SQLAlchemy中table的CU方法的时候,基本上没有什么问题。如果是没有过滤条件的单/多表findall方法,因为在封装SQLAlchemy的方法中,将获取的字段做了decode的操作,所以,也可以保证返回到wxPython那里的数据也是utf-8编码的。剩下的问题就是,当调用SQLAlchemy的text方法传入的参数有非拉丁文字的时候,会报如下的错误:

(UnicodeEncodeError) 'latin-1' codec can't encode character u'\u4fa7' in position 0: ordinal not in range(256) 'select * from task_type where ( tasktype >= %s) order by tasktype' [u'\u4fa7']

原本不希望修改SQLAlchemy和MySQLdb的文件,通过调用它们的api来解决,但是,始终没有办法。后来,我将SQLAlchemy封装调用MySQLdb部分的代码中异常处理的部分去掉,从而跟踪到确实是MySQLdb的connections.py的255行中的set_character_set方法,无论调用了'set names utf8'等等方法,获得的charset始终是latin-1。晕了,我也没有耐心去仔细琢磨到底是怎么回事情了,就把charset设置为utf-8,于是,查询就Ok了。

测试CRUD操作的时候,中文、英文和韩文一起显示和混合录入都没有问题,至此,应该可以说PIM的Unicode问题已经基本解决。

- 作者: johnsonqu 2007年02月4日, 星期日 11:18  回复(2) |  引用(0)

Try to be a good listener
海底电缆事件之后,基本上有一个月没有看到Esther Derby的博客了,今天早晨不知道咋地,竟然可以访问了,而且,基本上我订阅的博客都好了。呵呵。

看到Esther的一篇关于Listening的文章中有个链接到了另外一篇讲述妨碍你成为一个好的听众的障碍以及相应的对策。

文章中谈到的8个主要的障碍如下:

#1 - Knowing the answer
#2 - Trying to be helpful
#3 - Treating discussion as competition
#4 - Trying to influence or impress
#5 - Reacting to red flag words
#6 - Believing in language
#7 - Mixing up the forest and the trees
#8 - Over-splitting or over-lumping

对于沟通,在当今社会的重要性毋庸多说。实际的情况却是,我们在学校里或者培训机构里面学到的更多的的是如何更好地表述(说或者写),而非如何更好地倾听。

When the question of how to improve communication comes up, most attention is paid to making people better speakers or writers (the "supply side" of the communication chain) rather than on making them better listeners or readers (the "demand side").

激烈竞争的社会,让很多人,包括我自己都变得非常自我保护,对于#5的表述正式跟此相关;而作为一个PM,或者TL,在进行讨论的时候,对于团队成员的意见和想法,诱导他们讲述的比自己想去施加影响很多时候都是太少,而非太多。这些,都是我自己需要注意的;而作为国际化的团队,日常的电话会议沟通是非常多的,对于English作为非母语的我们,#6的问题就比较突出。不要想当然的认为自己很明确对方的表述,会议中间的确认以及最后对于Action Item的表述,会后Meeting Minutes的邮件确认,这些都是保障更好的沟通的有效方式。很多时候,就算是都是用母语沟通的会议,这些措施也是有必要的。

跟公司或者事业上的情况类似,在家庭生活中,过分的想要去对对方施加影响,以及试图提供帮助,认为这样是为了她好等等想法也是错误的。

也许,跟那个每月少开一天车的公益广告类似,可以在公司和家里尝试每周的一天只做倾听者,是不是感受会更深刻一些?

- 作者: johnsonqu 2007年01月26日, 星期五 09:27  回复(4) |  引用(0)

海底电缆害死我了

上次的海底电缆事件,包括前一段时间台湾的地震,使得至今网络还没有恢复畅通。在公司,最近都上不去MSN,去Google也是慢的很(很痛恨Baidu对于英文资料的搜索质量,因为,我平常对于中文的搜索需求不大,而且,就算是中文,百度的排名系统总是把一堆垃圾和广告推荐给我,浪费时间)。

上周忙着把POP3给通关,PIM的开发暂时搁浅了,中间也碰到了一些Grid的问题,因为国内用Python的人实在是不多,遇到很多问题的时候,只能求助于Google了,偏偏碰到网络不行,在公司也搜索不到解决方案,还好回到家里找到了想要的资料了。

事情是这样的,做了一个查询的界面,需要使用wxGrid。增加Row没有问题,但是,再次查询的时候,需要清空原来的数据,再次导入新的记录就碰到问题了。尝试了Clear,ClearGrid,DeleteRows都不行,晕死了很久。后来才在这里查到,需要用wxGRIDTABLE_NOTIFY_ROWS_APPENDED输入的行数为负数就可以了。

因为我是使用的DataTable,所以需要继承PyGridTableBase,在增加/删除Row之后,要通知Grid。

msg = gridlib.GridTableMessage(self,
                gridlib.GRIDTABLE_NOTIFY_ROWS_APPENDED, row_number * -1)
self.GetView().ProcessTableMessage(msg)

- 作者: johnsonqu 2007年01月23日, 星期二 20:44  回复(1) |  引用(0)