Java&UML,又一些牢骚

这算一种言论而以,站在Java阵营,要能够接受各种忽悠。
这里有几个概念UML&MDA、建模工具&代码生成、软件过程&设计。
MDA是否会顺利,是否要真正自动不需要人的介入没有定论,也就是说出代码是不可能没有人的,难道程序员想要谋杀程序员?
代码生成,需要,但不是全部需要,是通过模型生成这种整体解决还是局部的自动化生成更好用现在也没有定论。这就好像XML与J2EE的关系,XML很好,但是多了你觉得写他们是不是非常的累?比如Struts、Hibernate、Spring这些,哪个的XML不是写到你头疼?
软件过程这个就更不好说了,没有人说一定要自上而下的设计,很多敏捷方法都是边写代码边设计。所以关于这个问题,还是邓爷爷说的:“不管黑猫白猫,逮到耗子就是好猫!”,方法学是为你服务的,你不要被它套牢。

还有,记得哪个大师说,什么设计都是瞎掰,你最终交付的只是你的代码!设计和软件过程是为了保证代码质量的方法,但这种方法从来不唯一,开发过程、OO产生以前,还是有很多高质量的代码,所以……。
当然,不是做起义的农民,只是在想:
UML表示静态很好,那就用它表示静态。
动态,你可以用那些蹩脚的图,当然也可以通过其它的各种定势来暗示实现时的动态关系,毕竟程序员不是傻子,都有一定的悟性。
再下面,关于建模技术真的不太了解了,期待郑浩给点好的例子,还有介绍你的经验,我们很期待。
BTW:我以为是动态语言,眼花了。ZH推荐了Ruby on rails,这东西真的够震撼,绝对提升效率,同样还有Python on Zope,然后又发现Google的大量代码使用了Python(Google主要用C++、Java、Python),而Python作为胶水代码具有超级高的效率,星战3也用了Python,靠,动态语言真厉害。看看而以,现在暂时坚持Java不动摇。

Java框架学习感想——版本差异害死人

版本差异害死人。
说实话,有时怀念用MS的编程环境,都是人家制定好的,不用东那么多脑子选择用什么编程环境、用什么语言、用什么技术等等。
而入了JAVA的伙,学习J2EE,那么多的开源框架,选择就要花费很大的工夫,因为选错了以后修改起来成本可就大了。关键是框架曾出不穷,都宣传自己多么先进,哎,绝对眼花缭乱。而即使选定了框架,如果遇到版本升级,那也有可能是天翻地覆的变化,设让人家是开源的,变化从来多讲究设计精良,并不考虑那么多升级成本问题。
经常面对要学习的新框架、新技术,对于程序员来说是个挑战,很累,但是保持了你的先进性,并且多动脑子还是有益的。而版本变化,只能说学习成本好高,但是选择了Java和开源你就要接受这种高学习成本,有什么办法呢。
我只是发发牢骚,书还是要看的,UML、Paterns、Hibernate、Spring这些都是要抽时间好好看看的,这里结绳记事。
今天好不容易把上次那个Spring step by step搞定了,一直调不通的JSTL的问题原来还是个版本问题。
报错如下:
org.apache.jasper.JasperException: /jsp/hello.jsp(9,34) According to TLD or attribute directive in tag file, attribute value does not accept any expressions
意思是找不到对应的属性,属性不接受表达式。
1.1的URI是<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
1.0的URI是<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
而1.0的版本不支持表达式,所以要用1.1的,而如果又正巧用了1.0的声明,那就会遇到与我一样的问题。
所以,记住修改URI为http://java.sun.com/jsp/jstl/core就好了。
版本差异,呵呵,J2SE1.4&J2SE1.5、Struts 1.1&1.2、Spring 1.1&1.2、Hibernate 2&3、Tapestry 3&4,太多了……
这是常见的对比的冤家:Linux v.s Windows 、 Java v.s .NET 、 OpenOffice.org v.s Microsoft Office System 、 PS2 v.s XBox 、 Palm v.s Windows CE 、 Symbian v.s Microsoft Smart Phone……

Something happen agin!

我的本命年……
围绕着你们……
令人发指的小偷……
我恨你们的一切……
你们有手,你们也有脑子……
但是却用它们偷窃别人……
你们偷走的不仅是财务……
是他们的努力……
是他们的美好回忆……
是他们的快乐……
但是,你们还留下……
痛苦、怀疑、失落……
我们怎么才能从中解脱?
我们怎么才能除掉你们?
我在诅咒,你们这些小偷……
生Baby没有手和脑子……
祝你们早日生Baby……
为什么再次发生?
在我的身上,在我爱的人的身上……
我恨你们……
但是我还热爱我的生命……
警察叔叔,你们应该管管这些小偷了,真的……
警察叔叔,你们应该让我们报案了,不要总是批评教育我们……
警察叔叔,我们不怕发案率高,我们怕它虚低……
警察叔叔,求你们保护我们,而不仅仅是……
警察叔叔,请不要生气,我恨小偷,我爱你们……
请不要问我小偷又对我干了什么,你们都知道小偷干了什么……
希望我的本命年不要总是因为小偷而难过……
我爱你,宝贝,没什么,我都挣钱给你卖,有我你什么都不会失去!

回复Dadou:关于.NET和java性能问题

一个很好的讨论,可以参见通告的连接……
信里面很多高手进行了分析,感觉很有意思,我也写了一点,搅一搅局,哈哈:
看了大家的讨论,我很感兴趣。下面的成绩如果是相邻的,那说明测试了两次,就是两个毫秒的差值。
讨论Java和.Net感觉比较奇怪的。一直都是J2EE和.Net的对比,这个才是门当户对,他们都是面向应用的。况且需要解决的企业程序算法的量比较小,用到这么多ArrayList其实并不常见。
废话一句,J2EE和.Net经常出现的Web应用中,这里的响应速度才决定很多,Yujie引用的那段话说得很公平,因为社区里的人都会维护自己社区的利益,没有自己人会说真话,对于他们并不需要那么多性能测试,只需要你用好,因为一个好的J2EE应用和一个差的J2EE应用型能何止相差100倍??!!我坚持认为平台并不能决定一切,而应用的设计和实现质量才会比较强的影响性能。
然后,关于虚拟机,.Net Framwork 1.1 2.0的差距好像比较大,这个需要考虑一下,不过看Yujie的对比MS实现的虚拟机看样子不容乐观。
Balder真是让我崇拜,钻研的很深,而且解释的非常到位,我觉得没法更加深入剖析了。但是利用Native方法的东西用来和受控的代码对比,性能差距就是会很大,尤其是这个数字被放到到那么大的时候。
再提,测试中使用了256MB内存的机器,而WinXP SP1跑JVM绝对会使用大量虚拟内存,WinXP会占用18x内存(乐观情况,一般2xx),因为javaw.exe绝对会变得庞大,调用虚拟内存造成的性能损失就更加非线性了,所以,我下面的测试用了1G内存,基本上保证物理内存。然后,CPU也是个问题,尤其适用P4的时候,我不知道Mobile的里面是否支持HT,如果支持HT的JVM和.Net虚拟机的效率会受到它们被编译的时候的编译器的优化的影响,并且影响很大,所以我测试使用了AMD Athlon XP(@2083Mhz)的机器,减少一些影响。
废话说了一大堆,我下面的测试主要针对程序在JVM里面运行的一些影响因素的评估,并且从这些因素里面我们能够发现这个测试的一些不妥当之处。
Balder原始程序:
首先验证一下程序在JRE 1.5(5.0)和1.4.2里面的差别。
JRE 5.0
36657ms
36953ms
JRE 1.4.2
32531ms
34140ms
发现性能居然是1.4.2更好,个人认为也许是5.0 JVM里面对资源利用的一些优化造成的吧,5.0利用资源比较小气,嘿嘿。同时这里提出一个问题,这个测试没有考虑内存占用的问题,因为JVM和.Net虚拟机(CLR?)对物理内存的利用不一定一样的,JVM吃内存是非常有名的,所以更多物理内存带来的效率提升需要考虑进去,还有就是CPU资源的利用,他们在运行的时候到底用了多少时间片?需要用CPU占有率衡量一下,这个也是没有考虑进来的地方,都是潜在的不公平的地方。
去除掉CMovieInfo里面的Math.random()方法。
33593ms
这里random被执行了20000*4次,是最主要的调用random的地方,看来这个的影响并不大。也许是static方法放在虚拟机里面所以对性能影响不大吧。
我把Demo的removeArrayList()里面的删除的random去掉,直接每次删除第1个节点。
75609ms
74859ms
哈哈,这样其实才像个测试,这是一种最坏的情况,每次删除前面的节点,后面的节点就需要蠕动过来,程序彻底没有了random的干扰,并且测试最差情况。这样可以减少随机数产生的测试偏差,而且同时发现Yujie的程序里面random的种子是固定的,这样生成序列应该是固定的(如果是在C语言里面),这对测试不公平。
然后,再修改一下,每次删掉ArrayList的尾巴(mylist.remove(mylist.size()-1)),结果让我瞠目结舌!运行几次都是0ms!
0ms
瓦赛,我终于发现看齐来公平的测试后面隐藏的危险,因为移除的位置太重要了,我怀疑只是
移除尾巴的时候编译器和JVM都有特别的优化。
然后,继续测试一下去除尾巴前面那个(mylist.remove(mylist.size()-2))。
16ms
也就是说不会全部优化掉,但是差距绝对是戏剧性的!如果把他们花成曲线那会是什么样子??我觉得有时间我们可以写个用JFreeChart画一个变化的曲线图,估计很有价值。还没有完,我们可以量化一下random()和new对象CMovieInfo所花费的时间,我们保持删除尾巴的操作(mylist.remove(mylist.size()-1)),只是恢复CMovieInfo的代码到最原来的状态,也就是包含那些random()。
16ms
16ms
很稳定,原来random()即使执行了那么多次对性能造成的损失也可以忽略了。
这里插一句,我在画Wave图的时候发现毫秒不够用,想找个更小的时间单位的实现,但是发现没有,请问哪位知道除了对时间点求平均值的方法外有没有更好的表示时间的小单位?
最后BTW:如果把这个东西整理一下,发个帖子,估计会火得不得了,哈哈:D

乔布斯在斯坦福毕业典礼上的讲话

一直就很崇拜Jobs,这篇稿子讲的非常好。本来看的是英文版,这里找到了中文版,谢谢CCF的朋友,共享出来。推荐朋友们看完!
我今天很荣幸能和你们一起参加毕业典礼,斯坦福大学是世界上最好的大学之一。我从来没有从大学中毕业。说实话,今天也许是在我的生命中离大学毕业最近的一天了。今天我想向你们讲述我生活中的三个故事。不是什么大不了的事情,只是三个故事而已。
第一个故事是关于如何把生命中的点点滴滴串连起来。
我在Reed大学读了六个月之后就退学了,但是在十八个月以后——我真正的作出退学决定之前,我还经常去学校。我为什么要退学呢?
故事从我出生的时候讲起。我的亲生母亲(biological mother)是一个年轻的,没有结婚的大学毕业生。她决定让别人收养我, 她十分想让我被大学毕业生收养。所以在我出生的时候,她已经做好了一切的准备工作,能使得我被一个律师和他的妻子所收养。但是她没有料到,当我出生之后,律师夫妇突然决定他们想要一个女孩。 所以我的生养父母(他们还在我亲生父母的观察名单上)突然在半夜接到了一个电话:“我们现在这儿有一个不小心生出来的男婴,你们想要他吗?”他们回答道:“当然!”但是我亲生母亲随后发现,我的养母从来没有上过大学,我的父亲甚至从没有读过高中。她拒绝签 这个收养合同。只是在几个月以后,我的父母答应她一定要让我上大学,那个时候她才同意。
在十七岁那年,我真的上了大学。但是我很愚蠢的选择了一个几乎和你们斯坦福大学一样贵的学校, 我父母还处于蓝领阶层,他们几乎把所有积蓄都花在了我的学费上面。在六个月后, 我已经看不到其中的价值所在。我不知道我想要在生命中做什么,我也不知道大学能帮助我找到怎样的答案。 但是在这里,我几乎花光了我父母这一辈子的所有积蓄。所以我决定要退学,我觉得这是个正确的决定。不能否认,我当时确实非常的害怕, 但是现在回头看看,那的确是我这一生中最棒的一个决定。在我做出退学决定的那一刻, 我终于可以不必去读那些令我提不起丝毫兴趣的课程了。然后我还可以去修那些看起来有点意思的课程。
但是这并不是那么罗曼蒂克。我失去了我的宿舍,所以我只能在朋友房间的地板上面睡觉,我去捡5美分的可乐瓶子,仅仅为了填饱肚子, 在星期天的晚上,我需要走七英里的路程,穿过这个城市到Hare Krishna寺庙(注:位于纽约Brooklyn下城),只是为了能吃上饭——这个星期唯一一顿好一点的饭。但是我喜欢这样。我跟着我的直觉和好奇心走, 遇到的很多东西,此后被证明是无价之宝。让我给你们举一个例子吧:
Reed大学在那时提供也许是全美最好的美术字课程。在这个大学里面的每个海报, 每个抽屉的标签上面全都是漂亮的美术字。因为我退学了, 没有受到正规的训练, 所以我决定去参加这个课程,去学学怎样写出漂亮的美术字。我学到了san serif 和serif字体, 我学会了怎么样在不同的字母组合之中改变空格的长度, 还有怎么样才能作出最棒的印刷式样。那是一种科学永远不能捕捉到的、美丽的、真实的艺术精妙, 我发现那实在是太美妙了。
当时看起来这些东西在我的生命中,好像都没有什么实际应用的可能。但是十年之后,当我们在设计第一台Macintosh电脑的时候,就不是那样了。我把当时我学的那些家伙全都设计进了Mac。那是第一台使用了漂亮的印刷字体的电脑。如果我当时没有退学, 就不会有机会去参加这个我感兴趣的美术字课程, Mac就不会有这么多丰富的字体,以及赏心悦目的字体间距。那么现在个人电脑就不会有现在这么美妙的字型了。当然我在大学的时候,还不可能把从前的点点滴滴串连起来,但是当我十年后回顾这一切的时候,真的豁然开朗了。
再次说明的是,你在向前展望的时候不可能将这些片断串连起来;你只能在回顾的时候将点点滴滴串连起来。所以你必须相信这些片断会在你未来的某一天串连起来。你必须要相信某些东西:你的勇气、目的、生命、因缘。这个过程从来没有令我失望(let me down),只是让我的生命更加地与众不同而已。
我的第二个故事是关于爱和损失的.
我非常幸运, 因为我在很早的时候就找到了我钟爱的东西。Woz和我在二十岁的时候就在父母的车库里面开创了苹果公司。我们工作得很努力, 十年之后, 这个公司从那两个车库中的穷光蛋发展到了超过四千名的雇员、价值超过二十亿的大公司。在公司成立的第九年,我们刚刚发布了最好的产品,那就是Macintosh。我也快要到三十岁了。在那一年, 我被炒了鱿鱼。你怎么可能被你自己创立的公司炒了鱿鱼呢? 嗯,在苹果快速成长的时候,我们雇用了一个很有天分的家伙和我一起管理这个公司, 在最初的几年,公司运转的很好。但是后来我们对未来的看法发生了分歧, 最终我们吵了起来。当争吵不可开交的时候, 董事会站在了他的那一边。所以在三十岁的时候, 我被炒了。在这么多人的眼皮下我被炒了。在而立之年,我生命的全部支柱离自己远去, 这真是毁灭性的打击。
在最初的几个月里,我真是不知道该做些什么。我把从前的创业激情给丢了, 我觉得自己让与我一同创业的人都很沮丧。我和David Pack和Bob Boyce见面,并试图向他们道歉。我把事情弄得糟糕透顶了。但是我渐渐发现了曙光, 我仍然喜爱我从事的这些东西。苹果公司发生的这些事情丝毫的没有改变这些, 一点也没有(did not changed one bit)。我被驱逐了,但是我仍然钟爱它。所以我决定从头再来。
我当时没有觉察, 但是事后证明, 从苹果公司被炒是我这辈子发生的最棒的事情。因为,作为一个成功者的极乐感觉被作为一个创业者的轻松感觉所重新代替: 对任何事情都不那么特别看重。这让我觉得如此自由, 进入了我生命中最有创造力的一个阶段。
在接下来的五年里, 我创立了一个名叫NeXT的公司, 还有一个叫Pixar的公司, 然后和一个后来成为我妻子的优雅女人相识。Pixar 制作了世界上第一个用电脑制作的动画电影——“玩具总动员”,Pixar现在也是世界上最成功的电脑制作工作室。在后来的一系列运转中,Apple收购了NeXT, 然后我又回到了Apple公司。我们在NeXT发展的技术在Apple的复兴之中发挥了关键的作用。我还和Laurence 一起建立了一个幸福的家庭。
我可以非常肯定,如果我不被Apple开除的话, 这其中一件事情也不会发生的。这个良药的味道实在是太苦了,但是我想病人需要这个药。有些时候, 生活会拿起一块砖头向你的脑袋上猛拍一下。不要失去信心。我很清楚唯一使我一直走下去的,就是我做的事情令我无比钟爱。你需要去找到你所爱的东西。对于工作是如此, 对于你的爱人也是如此。你的工作将会占据生活中很大的一部分。你只有相信自己所做的是伟大的工作, 你才能怡然自得。如果你现在还没有找到, 那么继续找、不要停下来、全心全意的去找, 当你找到的时候你就会知道的。就像任何真诚的关系, 随着岁月的流逝只会越来越紧密。所以继续找,直到你找到它,不要停下来!
我的第三个故事是关于死亡的.
当我十七岁的时候, 我读到了一句话:“如果你把每一天都当作生命中最后一天去生活的话,那么有一天你会发现自己是正确的。”这句话给我留下了深刻的印象。从那时开始,过了33年,我在每天早晨都会对着镜子问自己:“如果今天是我生命中的最后一天, 你会不会完成你今天想做的事情呢?”当答案连续很多次被给予“不是”的时候, 我知道自己需要改变某些事情了。
“记住你即将死去”是我一生中遇到的最重要箴言。它帮我指明了生命中重要的选择。因为几乎所有的事情, 包括所有的荣誉、所有的骄傲、所有对难堪和失败的恐惧,这些在死亡面前都会消失。我看到的是留下的真正重要的东西。
你有时候会思考你将会失去某些东西,“记住你即将死去”是我知道的避免这些想法的最好办法。你已经赤身裸体了, 你没有理由不去跟随自己的心一起跳动。
大概一年以前, 我被诊断出癌症。我在早晨七点半做了一个检查, 检查清楚的显示在我的胰腺有一个肿瘤。我当时都不知道胰腺是什么东西。医生告诉我那很可能是一种无法治愈的癌症, 我还有三到六个月的时间活在这个世界上。我的医生叫我回家, 然后整理好我的一切, 那就是医生准备死亡的程序。那意味着你将要把未来十年对你小孩说的话在几个月里面说完.;那意味着把每件事情都搞定, 让你的家人会尽可能轻松的生活;那意味着你要说“再见了”。
我整天和那个诊断书一起生活。后来有一天早上我作了一个活切片检查,医生将一个内窥镜从我的喉咙伸进去,通过我的胃, 然后进入我的肠子, 用一根针在我的胰腺上的肿瘤上取了几个细胞。我当时很镇静,因为我被注射了镇定剂。但是我的妻子在那里, 后来告诉我,当医生在显微镜地下观察这些细胞的时候他们开始尖叫, 因为这些细胞最后竟然是一种非常罕见的、可以用手术治愈的胰腺癌细胞。我做了这个手术, 现在我痊愈了。
那是我最接近死亡的时候, 我还希望这也是以后的几十年最接近的一次。从死亡线上又活了过来, 死亡对我来说,只是一个有用但是纯粹是知识上的概念的时候,我可以更肯定一点地对你们说:
没有人愿意死, 即使人们想上天堂, 人们也不会为了去那里而死。但是死亡是我们每个人共同的终点。从来没有人能够逃脱它,也应该如此。 因为死亡就是生命中最好的一个发明。它将旧的清除以便给新的让路。你们现在是新的, 但是从现在开始不久以后, 你们将会逐渐的变成旧的然后被清除。我很抱歉这很具有戏剧性, 但是这十分的真实。
你们的时间很有限, 所以不要将他们浪费在重复其他人的生活上。不要被教条束缚,那意味着你和其他人思考的结果一起生活。不要被其他人喧嚣的观点掩盖你真正的内心的声音。还有最重要的是, 你要有勇气去听从你直觉和心灵的指示——它们在某种程度上知道你想要成为什么样子,所有其他的事情都是次要的。
当我年轻的时候, 有一本叫做“整个地球的目录”振聋发聩的杂志,它是我们那一代人的圣经之一。它是一个叫Stewart Brand的家伙在离这里不远的Menlo Park书写的, 他象诗一般神奇地将这本书带到了这个世界。那是六十年代后期, 在个人电脑出现之前, 所以这本书全部是用打字机,、剪刀还有偏光镜制作的。有点像用软皮包装的google, 在google出现三十五年之前:这是理想主义的,其中有许多灵巧的工具和伟大的想法。
Stewart和他的伙伴出版了几期的“整个地球的目录”,当它完成了自己使命的时候, 他们做出了最后一期的目录。那是在七十年代的中期, 你们的时代。在最后一期的封底上是清晨乡村公路的照片(如果你有冒险精神的话,你可以自己找到这条路的),在照片之下有这样一段话:“保持饥饿,保持愚蠢。”这是他们停止了发刊的告别语。“保持饥饿,保持愚蠢。”我总是希望自己能够那样,现在, 在你们即将毕业,开始新的旅程的时候, 我也希望你们能做到这样:
保持饥饿,保持愚蠢。(Stay Hungry. Stay Foolish.)
非常感谢你们。

做完作业,看看新技术

昨天做完了作业,所以今天是一个相对自由的日子。
GF说她喜欢看Friends,我就把十季都给她下来了,结果带动我也一块儿看,主要是想联系一下听力。很幽默,而且经常围绕Sex,呵呵,看起来挺新鲜的……
而今天的最重要的工作其实是研究一下MyEclipse等一堆新技术。
先看了一下MyEclipse 4.0 M2的一些新的支持,然后以此为起点开始学习它支持的一些新的框架。Hibernate、Struts、JSTL这些用过,只是修改了版本,所以没有更着重于发现。

不过发现对Hibernate3的支持中,MyEclipse可以自动生成SessionFactory,挺好,如果没有写服务的话用这个统一的Session管理也是很好的。
从简单到复杂吧:
1、首先看了JSF:这个东西经常听说,是Sun主推的,把界面完全面向对象化,组件化,是Web里面比较有潜力的一个框架。但是这个东西似乎发展的很慢。我发现Sun推的东西总是

比较难以迅速普及,真可怜。大家都在抱怨这个框架没有好的例子,用的人似乎不多,总是处于开发阶段,什么都不太成熟。但是看程序员介绍Java Web Creator可以直接集成开

发JSF应用,看起来不错,因为好的IDE是效率的保证。研究了一下发展趋势我就没有进一步的研究技术细节,不过了解到JSF偏向程序员的观点,面向对象特性非常好,不过我本人

倒是对这个无所谓,因为界面本来就不应该是程序员写的,界面也根本不必要面向对象。我这么说肯定很多人不同意,也许都是程序员吧:D
2、看了看Tapestry:说实话,这个东西真的是让我非常兴奋。Apache jakarta项目下面的一个框架,东西比较轻量,是一个简单清晰的MVC实现。它的Controler层比较多的依赖后

面的商业逻辑,这样的设计个人感觉会提高效率,并且队分层的清晰没有影响。如果前面用个Struts那样的重一些的框架,分层的时候经常会过度设计,后果嘛,嘿嘿,就是运行

慢维护繁琐。
我最欣赏Tapestry的地方在于它很好的解决了分工问题,它明确的将显示叫给html,而将业务代码巧妙的隐藏在html tag的属性里面,对页面代码的侵入非常的小,所以它的模版

页面都可以用Dreamweaver这样的WYSIWYG设计工具来开发。考!这可是绝对的好消息,这样美工就是美工,程序员就是程序员,不会让程序员拿着美工的页面胡乱修改造成显示效

果差强人意了(呵呵,有点偏袒美工)。程序员的逻辑方在于html绑定的配置里面,Tapestry有两种常用组件,一个是Page一个是Component,一个渲染页面一个是抽象的页面组件

,反正都是面对显示的界面,非常适合做Web方式的J2EE表现层。
另一个令人感觉舒服的地方是分散的配置,看一看典型的Tapestry配置都很简单,一个.application里面只需要配置一些程序级别的设置。而所有的页面和动作都可以分散部

署,.html和.page或者.jwc关联确定一个动作或者页面设置,同时可以调用后面的Java Bean,相互比较独立,不用集中描述部署符,可能比较适合我的思维方式吧。同时Tapestry

也支持多语言,每个页面或者组件都可以对应多种语言,可以通过.html的命名方式或者关联的properties命名来支持多语言,分开的描述还是很舒服。
还有个地方,发现Tapestry的所有后面的Action都是Abstract的,看了说明,它服务的时候会动态派生具体类运行,这样的并发多线程挺好玩,具体优略就不得而知了,但是估计

不错,要不为什么特别亮出来Show。
然后,事实上,我跑了一个Tepestry的HellowWorld,然后修改了些动态的东西,体验了一把新技术就放弃了,放弃的原因主要如下:
因为正在开发的项目用Struts,用了titles来管理布局。以前用惯了JSP:include,而Tepestry里面没有直接的布局类,现在的东西移植不过去,找了一下真的没有特别好的实现。

用了一个特别的html兼容模版结构就没法用jsp里面那些第三方插件库了,这个是个损失,有得必有失。发现Tepestry的程序做简单的项目的比较多,大一点的估计就Appfuse有了

,没有经历仔细研究,放弃了。不过看到Sitemesh这种开放的布局框架可以与Tepestry结合,弥补这方面的缺陷,Appfuse就是这么实现的。
Tepestry对我的另一个打击是刚刚出了Tepestry 4.0Beta2,而且似乎很快就可以正式版了。而现在的仅有的书Tepestry in action是对应3.0的,其他的文章和例子也都是3.0的。

去官方网站发现Tepestry 3.0和4.0的区别是很大的,开源框架从来都是这样,整数版本号一变化就别想平滑升级了,头疼头疼。我仔细看着Tepestry的官方的上手指南开发,不过

我的Myeclipse是只支持3.0的,麻烦,搞了半天,到后来的复杂的例子总是调试不好,发现都是版本冲突造成,变化太大,我又不熟悉,所以干脆就放弃了。干脆等版本稳定一些

再仔细学习吧。同时提一下Tepestry现在年轻气盛,本身很优秀,但是文档很少,中文文档更少,官方网站也提出目前Document还不完善,所以还是要等社区建立好一点,我再入

手吧。
顺便抱怨一下,Struts 1.1 to 1.2,Hibernate 2 to 3,Spring 1.1 to 1.2变化都特别大,学习资料互相冲突,原来的代码都需要比较多的修改才能部署,让新入手的人碰壁再

碰壁,没办法呀……,开源的进化就是跳跃性的。
4、看了看Appfuse。不想多说了,造就下载了,当时没有搞定。但是当初为了这个才装了Ant,才有了后来的学习……这次再挑战,我又是走了无数的弯路,一直ant install-xxx

、ant new、ant这样的运行修改,怎么都搞不定。其中引出修改Tomcat配置符,修改Mysql密码等一系列问题,不多说了。我把Tomcat自动部署从Build.xml中注释掉了,最后发现

用ant setup就可以安装了,靠,他们说明文档怎么不写清楚,我编译的是Struts+Spring+Hibernate的版本,准备对比不同版本研究一下这个程序。说实话能把它部署上真的是太

好了,本来很简单我却走了那么多弯路,可惜,不过有了这样的Demo,估计对以后的开发有帮助。其实在这之前我还花了大量时间调试Spring+Struts+Hibernate组合,在

Myeclipse里面,不过没有搞定,主要是嫌麻烦,写了一半又删掉了,然后又想写……反正耽误了不少时间,以后应该减少这样的事。
5、下载了马达加斯加、史密斯夫妇、马拉松、世界大战这几个电影,都是比价期待的,发现品质还都可以接受,呵呵,周末和她一块儿看。
6、前两天把和平之月一个系列的Mp3全部下载了,真的是很棒的世界音乐。可以去Verycd搜索和平之月,我下了2x张专辑,这是一个唱片公司的厂牌,所以专辑众多,都是亚洲风

情的。
7、升级了下我的ant,忘记说了,否则无法运行appfuse,它需要1.6.2以上的ant,最新好像是1.6.5。我发现ant.apache.org访问不了,很久以前就不行,下载真的挺麻烦的。奥

,对了,还有andromdaMDA,这个东西是个开源的MDA,对于Hibernate开发可以把数据库设计->映射->Pojo这样的过程反过来,建模->生成POJO和映射->数据库设计,也就是模型驱

动开发,有时间研究一下。
Ant可以去这里:http://mirrors.isc.org/pub/apache/ant/binaries/apache-ant-1.6.5-bin.zip
或者这里:http://www.javaresearch.org/members/jross/ant/apache-ant-1.6.2-bin.zip
8、张楚推荐了这个Video:
http://www.nytimes.com/video/src/2005/06/29/technology/highbandwidth/windowsmedia/20050629_GUEST_VIDEO_HI.asx
号称iPod flea,iPod跳蚤,很搞笑的讽刺了Apple:D
9、周日看了Jobs在斯坦福的毕业典礼上的讲话,很受感动,推荐大家Google一下看看。Jobs是Apple的传奇CEO。

今年是本命年~

最近很多事不顺利,原来是本命年。
造就听说本名年不好过的,我不迷信,但是尊重传统,我又红腰带但是没有拴,我只是戴上了ZZ送的桃木珠子避邪,希望能够走运一点……
今天去换我买的E5 Mp3 Player,这个是我支持国货的结果,被召回了,换了个新的,明天再写具体经过,不过今天的温度是38度,我家室内温度31度,我骑车去中关村的路上戴着墨镜还是感觉晃眼……
而后去学校办我的灵通卡挂失,要在开户行。结果我16:50到了储蓄所门口,不开门,敲开门他们说下班了,我在外面看明明是17:00才下班。结合上次我去工商银行挂失他们连通知我电话挂失都不懂,真是感觉失望。而这次的提前下班也令人气愤,一个服务性的行业,9:00-5:00营业,你给谁服务呀??
我们不欠银行的,你们银行卡收费就要提供相应的服务,你们的收费已经是国际水平了,而服务我估计也就是个东南亚落后国家水平,你们凭什么那么牛气??
又想起上次去青岛,只有市中心才有工商银行,哎,真为工商银行失望,我这么信任你,你却多次让我失望,我欠你什么??
答案是我什么都不欠你的,等我开始挣钱了,我绝对不在工商银行理财,你们的服务还是需要提高水平的,起码对得起你们收我的血汗钱!!

微软的鼠标质保真是个问题!

又是让人头疼得事情:
1、我的光学银光鲨4.0也就是IE4.0坏掉了,左键失灵经常单击失败、双击失败、单击变双击,这些毛病交替出现电脑都没法用了。暂时用了IE3.0。
2、托我爸爸给我送修IE4.0,我这个是盒装的。我本来打北纬(原微软硬件代理)没有人接,然后让我爸直接送以前去过的理想大厦地下一层了。结果被告知北纬不负责IE4.0的保修,说已经转给讯宜了,这个代理我们都熟就是做精英ECS起家的那个。我爸爸 给讯宜打电话,他们要求先给他们序列号,不告诉他们的地址,结果告知我的IE4.0没有在他们的产品序列号库里面!靠,我中文盒装,保修卡注册卡所有都是齐全的,怎么可能不是行货。北纬都说这是他们的货!结果讯宜说不在他们的库里面。我不愿让我爸为难,让 他赶快回来。
3、我继续电话找讯宜,问了他们我的所有疑问,反正他们说北纬给了他们所有他们卖出来的正品IE4.0的序列号,而我的不在里面,他们要我去找北纬确认。我找北纬继续没人接电话。然后我气急败坏的给微软打电话,他们态度非常好,但是提供的答案非常让人失望 ,他们说讯宜说没有我的序列号就说明我这个不是水货或者是假冒产品,说不用找北纬了,北纬已经没有代理资格了。我真是非常的生气,北纬的保修的人看了我的IE4.0的盒子都信誓旦旦的说这个肯定是他们的行货,而且说只要是这种完整的中文包装肯定是行货!我 仔细看了,我这个盒子和鼠标没有伪造的嫌疑。而且咨询了卖给我鼠标的momoko,他也说是他朋友找微软进的货,肯定行货。我,我是没地方评理了。
4、我怀疑应该还是北纬当时有地下操作的可能,不过这种操作的受害者不应该是以行货价格购入IE4.0的最终用户!而应该由北纬负责。况且讯宜完全应该保证数据库的完整,并且通过包装盒的确认来辨别行货!因为他们的数据库很有可能有纰漏的,作为一个懂得程 序的人这个都能理解。可是做售后服务的人肯定是拿鸡毛当令箭,而我作为一个弱小的消费者哪里有精力跟他们较真,认栽好了。
5、然后干脆自己动手……没有买到一样质量的微动,找到的替换品5毛钱一个,个人感觉手感太差。所以干脆把侧键的前进键和我的左键交换了。IE4.0的纵横滚轮那一块的结构真实够复杂的,拆起来修真的挺费时,老是怕把塑料件给搞坏了,还好,最终没有搞坏什 么东西。用吸锡烙铁拆了两个微动,交换焊接,5分钟搞定。装起来试验,没有问题了。但是,我确定IE4的微动的寿命绝对有问题,我用的非常爱护还是出现这样的问题,哎,我发誓,我下次绝对不买微软的鼠标了,除非他实际加强品控和渠道建设!

解读Wave文件头结构

解读Wave,文件头解释,可以用16位编辑器UltraEdit打开,然后可以观察文件的结构。
我发现对应C语言里面的字WORD(32位),16进制文件对应2个字节(Byte),而DWORD(64位),对应4个字节。
然后顺便普及一下16进制文件的存储规律,对于WORD,先存储低位字节,然后存储高位字节,而DWORD,则先存储低两位的低位,然后是低两位的高位,然后是高两位的低位,然后是高两位的高位。
介绍一下WAVE文件的结构:
标志符(RIFF)
数据大小
格式类型("WAVE")
"fmt"
Sizeof(PCMWAVEFORMAT)
PCMWAVEFORMAT
"data"
声音数据大小
声音数据
查到C语言中对应的WAV的文件头结构如下:
Typedef struct
{
WAVEFORMAT wf;//波形格式;
WORD wBitsPerSample;//WAVE文件的采样大小;
}PCMWAVEFORMAT;
WAVEFORMAT结构定义如下:
typedef struct
{
WORD wFormatag;//编码格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等
WORD nChannls;//声道数,单声道为1,双声道为2;
DWORD nSamplesPerSec;//采样频率;
DWORD nAvgBytesperSec;//每秒的数据量;
WORD nBlockAlign;//块对齐;
}WAVEFORMAT;
然后我们根据实际的一个文件的文件头进行对比分析,然后大家就应该明白了:
首先是一串“52 49 46 46”这个是Ascii字符“RIFF”,这部分是固定格式,表明这是一个WAVE文件头。
然后是“E4 3C 00 00”,这个是我这个WAV文件的数据大小,记住这个大小是包括头文件的一部分的,包括除了前面8个字节的所有字节,也就等于文件总字节数减去8。这是一个DWORD,我这个文件对应是15588。
然后是“57 41 56 45 66 6D 74 20”,也是Ascii字符“WAVEfmt”,这部分是固定格式。
然后是PCMWAVEFORMAT部分,可以对照一下上面的struct定义,首先就是一个WAVEFORMAT的struct。
随后是“10 00 00 00”,这是一个DWORD,对应数字16,这个对应定义中的Sizeof(PCMWAVEFORMAT),后面我们可以看到这个段内容正好是16个字节。
随后的字节是“01 00”,这是一个WORD,对应定义为编码格式“WAVE_FORMAT_PCM”,我们一般用的是这个。
随后的是“01 00”,这是一个WORD,对应数字1,表示声道数为1,这是个单声道Wav。
随后的是“22 56 00 00”,这是一个DWORD,对应数字22050,代表的是采样频率22050。
随后的是“44 AC 00 00”,这是一个DWORD,对应数字44100,代表的是每秒的数据量。
然后是“02 00”,这是一个WORD,对应数字是2,表示块对齐的内容,含义不太清楚。
然后是“10 00”,这是一个WORD,对应WAVE文件的采样大小,数值为16,采样大小为16Bits。
然后是一串“64 61 74 61”,这个是Ascii字符“data”,标示头结束,开始数据区域。
而后是数据区的开头,有一个DWORD,我这里的字符是“C0 3C 00 00”,对应的十进制数为15552,看一下前面正好可以看到,文件大小是15596,其中到“data”标志出现为止的头是40个字节,再减去这个标志的4个字节正好是15552,再往后面就是真正的Wave文件的数据体了,头文件的解析就到这里。
下面从别人的文章转述文件体的数据格式:
16位单声道:
采样一(低字节、高字节),采样二(低字节、高字节),……
16位双声道:
采样一[左声道(低字节、高字节)、右声道(低字节、高字节)],……
这样,我就明白了WAVE的文件结构了,希望大家能够从中得到帮助。

Sin City是个不错的电影

只能说非常非常的酷……
明显是漫画改编的电影,画面给人的感觉很震撼,黑白的处理令人印象深刻。
这种类似动作电影的东西,一般比较弱智,不过这个片子的处理还不错,很多细节,所以逻辑上还是需要你参与其中的。缺点是叙事上讲了三个故事,本以为能够像《低俗小说》的处理一样最后汇成一个完整而精巧的故事,但是失望了,只不过是三个不相关的故事发生在了同一个场景里面而已,从情节上感觉还是缺了点精妙。
但是,还是推荐大家去看一看,因为画面很酷、演员都很酷、化妆和颜色应用很酷、情节很酷、对白很酷、似乎一切都很酷,绝对不像那个《Be Cool》一样只是名字酷而已!
BTW:测试了一下,Space里面还是没有自-由!