分类
随笔

Michael Jackson, from now on, is a HISTORY

Mr. Michael Jackson, was 50. 悼念他的歌曲,悼念他的舞步,悼念King Of Pop。

说句玩笑话,JJ林俊杰在上周六北京的演唱会上刚刚翻唱了《You Are Not Alone》和《Beat It》,MJ大师就圆寂了。说来也正是JJ惟妙惟肖的唱腔和舞蹈,先一步勾起我对MJ的回忆。

我的90年代、高中时代,磁带势头正盛、MP3刚刚起步的年代,Michael Jackson,是我的响当当的偶像来着。磁带,D版的、正版的,MP3合集,买过多少呢,只记得重复的歌曲太多了,当然,其中每一盘或每一张都是为了那几首不重复的而买下的。砖头一样的随身听,还有早期版本的Winamp,整天都是MJ。在电脑上看漫画时也把MJ的歌曲当做背景音乐。直到现在我对《History》和《浪客剑心》还有联觉效应,当然,这其实是条件反射。

MJ的歌曲对于我,只能说每首都是经典。《Heal the World》、《2 Bad》、《Dangerous》、《Money》风格各不相同,我都喜欢,也无意将其一一放在天平上去对比。我对《Blood on the Dance Floor》这首歌一直情有独钟,很意外的觉得这首歌很适合作为当时《极品飞车2》某条赛道的背景音乐。当时是跟弟弟分屏对战,我基本无视游戏的音效,而无厘头的哼唱这首,游戏的速度感和这首歌的节奏感,令我觉得爽快淋漓。好的歌曲,我认为,就应该像《黑客帝国》导演评价自己的电影一样,400个听众也许会听出400种不同的东西。

当初从VCD上看到MJ的不少MV,《Thriller》、《Billie Jean》、《Remember the Time》、《BAD》、《Black or White》到现在都记忆犹新。对MJ的太空步印象是很深刻的,但后来反复看到,最初是在哪里看到的却反而记不清了。大学后有幸买到了做的比正版还好的MJ DVD BOX,却一直没有机会看完。这些MV里那些天马行空的创意,是不是至今还在影响我呢?

大学里迎来了MJ的最后一张创作专辑《Invincible》。是觉得有些遗憾的,前三首歌总觉得像特地把一首歌拆开了放,只有提前发布的主打歌《You Rock My World》真正让我感动了。

所谓MJ的丑闻之类的,我发现我自己从未真的在意过。我想对我而言,作为偶像的Michael永远就是King Of Pop就行了。但他在歌曲、MV和慈善活动中的所表现的种种善良的特质,在我心目中一定一直在为这一地位加分。这样的公众人物在后期有很多都会投身于慈善事业,这仅仅是伪善的利己行为吗?我渐渐不这么想了。作为人上人,人生走到这里,会经历比凡人更多的人和事,想法一定是不一样的;同时手里又握有各种资源,那做的事肯定也是不一样的。凡人真要理解不了也无所谓吧。倘若忽略历史的话,便只有那一时刻的结果留在世上。“世界稍微美好一些”这样的结果,难道凡人真会那么不爽么?

有成就,有辉煌,有争议,从今天开始再加上,有历史。这就是我眼中的Michael Jackson。Please live in peace, from now on, MJ.

分类
随笔

签名档20090520

十年前热衷的事物,
十年后未必还热衷。

十年前被教导,忍一忍,以后要多少有多少,
十年后管它有多少都无所谓,因为不需要了。

如此往复,这一辈子能不单调吗?

2009-5-20

分类
English 技术

Some comments on my first GAE (Java) trial

Java版Google App Engine试用感想
Some comments on my first GAE (Java) trial

上一篇,发表一些自己的试用感想。

例子应用的架构及实现
Architecture & Implementation of the Previous Example

先看一下自己开发了一个什么样的例子。用图说明。

me.evis.gae.guestbook_architecture

看源代码,me.evis.gae.guestbook、me.evis.gae.guestbook.client和me.evis.gae.guestbook.sever三个包就是为了形成GWT的表现层和逻辑层。而me.evis.gae.guestbook.bo及其子包是为了包装GAE的数据存储服务形成数据层。

就开发过程而言,在装有Google插件的Eclipse上添加新GAE项目时,插件会代为准备好GAE相关的配置和jar包,同时也有GWT的。而创建新模块时,就纯粹是与GWT有关的事情了。在我看来Google为GWT提供的最佳实践是:

  • 在前端弱化HTML的作用,而由后端位于client包里的入口类(Entry Point Class)编写用户界面及相关交互,在运行时Java的入口类会生成Javascript返回给客户端浏览器;
  • 由入口类来调用同一包内的各种服务接口,并处理返回值;
  • 对于client包中服务接口的实现,都放在server包中。

我之所以加入了bo包及其子包,主要还是是为了能更清楚地了解GWT与GAE之间的关系。由Comment DTO/DAO去以JDO方式去调用GAE的数据存储服务,然后再让上边的Comment服务的实现去调用Comment DTO/DAO而不是直接去调GAE的东西。

同时,这样的分离也给了我做单元测试的机会。我为bo包加入了test的子包。JUnit 3的测试用例直接写会出App ID之类的错误,原因是GAE的服务都是云计算,本地调用需要构建一个相应的测试环境,详见Google的官方文档或者是例子应用的源代码。

关于GWT
Comments about GWT

用Java来代替Javascript,有点像写CS的感觉,不过调用服务器端的方法或者使用服务器端的变量都很方便。这种做法确实掩盖了BS和Javascript的复杂性,也有效利用了Java编译所需的严谨性。但是我认为其缺点也是显而易见的:

  • 开发调试用户界面及交互要改Java类,就意味着重新编译,一般也会要求重启服务器,相对来说调试成本较高;
  • 用户界面开发变得不太直观,难以分工。如果所有界面都是Java写出来的,那页面设计师和交互工程师只能轮流给Java程序员端咖啡了。个人觉得如果用GWT,各种页面元素应该还是在HTML上布局好,然后用Java去捕捉那些元素,比如按钮或者区域之类的。

GAE最核心的东西肯定还是数据存储、邮件等这些云计算服务,我想如果有更适合的选择的话,还是没有必要在GWT上投入太多的关注。

关于GAE
Comments about GAE

截止到发文时也只有尝试过数据存储服务而已。关于数据存储服务,Google公布了JDO和JPA两种基于标准的接口。这些现代的数据操作方式大大简化了数据相关的开发,至少不用去数据库里建表了。但GAE是按API调用次数、数据容量、传输大小等因素综合计费的,所以开发时也必须要注意多方面的调优,个人预测Appspot上也许会有不少程序会因为API调用次数和CPU占用时间两项而额外付费。

关于Google的Eclipse插件
Comments about Google Plug-in for Eclipse

  • 装完插件就不要挪动Eclipse了,不然要改好几个配置文件;
  • GWT的Java Editor有时会有些bug导致无法进行语法加亮;
  • GAE的插件方面有些薄弱。除了新工程和调试用的Jetty服务器外好像没看到针对Google各种云计算服务的更细节的功能。

结语
Conclusion

很兴奋,很有用。有机会也要试试其他的服务,有时间可以给自己写个实用些的程序。

缩写
Abbreviations

  • GAE: Google App Engine
  • GWT: Google Web Toolkit
  • JDO: Java Data Objects
  • DTO: Data Transfer Object
  • DAO: Data Access Object
  • CS: Client-server
  • BS: Browser-server