Monthly Archives: 07月 2008

关于AMF与BlazeDS

AMF是Action Message Format的简称,它是flash专有的数据传输格式,简单的可以理解为类似XML这样的数据格式,不过XML是纯文本,任何一种语言都通用,而AMF是二进制数据,为flash专用. 为什么又有新的数据格式? 有XML不够么?跨语言,世界范围的标准.而且一直以来,我们都是使用XML作为Flash与服务器端通讯的,这个AMF好在哪里,而且还是专用的! AMF在作为一种数据结构,从通用性上来讲,肯定比不过XML,不过这种协议是专门服务于flash的客户端应用程序,它有两个大优点: 一,比XML等传输协议更优秀的传输性能.AMF能够缓解由基于文本导致的传输瓶颈问题.这可以有证据的哦. 二,更少的数据层抽象代码,甚至不需要反序列化的代码.使用XML类的协议编程时,避免不了有一个数据反序列化的过程,使无意义的数据片段变成有意义的Flash对象,数据模型多的时候可不是一件轻松的事情,想象一下,现在完全不用去管XML,只需要定义一个远程对象即可马上调用,这个过程节省多少成本?! 下图是XML与AMF传输过程的对照: 基于上面两个优点,AMF如今获得许多开发人员的认可,不少服务器端语言也提供了AMF的适配框架,如pythonAMF和下面要介绍的BlazeDS. BlazeDS BlazeDS是Adobe公司亲自开发并开源的AMF-Java适配框架.为flash提供java服务器端的简单远程调用能力和实现java对象与actionScript对象的转换. 使用BlazeDS很简单,其核心是一个服务器端的主配置文件:WEB-INF/flex下面的config.xml.示例片断如下: xml 代码   <destination id="HelloWorld">          <properties>            <source>HelloWorld</source>          </properties>    </destination>   这样在flash客户端可以通过声明一个远程对象"HelloWorld"来调用服务器端的方法获得返回值. 更详细的使用说明有兴趣的同学看文档吧. 另外不得不提的是BlazeDS在消息处理上面比较优秀,客户端可以发送消息到服务器端的同时,BlazeDS会在服务器端把消息主动push到客户端.具体实现暂时没有考究,不过用来做即时通讯的客户端支持还是挺有用的. 问题 被Spring和hibernate惯坏了的java程序员一定很关心: BlazeDS的配置文件里面可以使用Spring Bean吗?这是我最关心的事情,因为现在的java web程序大部分都采用spring作为基础架构了,许多第三方的工具和框架都提供了spring的兼容方法.这是BlazeDS不能避免的.不过,现在的blazeDS还不是成熟的版本,不知道以后会不会提供? 使用BlazeDS肯定享受不了hibernate的lazyload了!目前看来是不行的.  

Posted in 其他 | Leave a comment

Django1.0阿尔法发布

真是一个振奋人心的消息,Django终于要结束三年以上的版本长跑,出1.0版了.苦了社区里面的朋友,一直在苦苦等待. 这次发布的直接原因估计是前段时间Django易主,由新的基金会支持Django的发展. 本站是基于django开发D,当时的版本还是0.96,大概在去年9月份上的线,等到1.0正式版出来,马上就升级啦! 期待Django的正式版早日发布,期待更多的朋友加入django的行列.

Posted in 其他 | Leave a comment

青年维特们之烦恼

人未到中年,而少年也不再适合用在你们身上了.那么,青年的维特们,你们都在烦什么了? 枚举我身边的一些朋友的事: 1. 爱情对你来说已不如往日那样矇胧,你清楚地看到里面某些很现实很残酷的情节,甚至有时候你需要靠一些文字或音乐去麻痹自己去相信爱情. 2.你明显感觉到背上的压力了,你知道单靠你一个人,你近几年内供不起城市里的一间房.这意味着你无法给存在或还没存在的某某人"家的感觉". 3.你一直都告诉你以前的队友说,你不会放弃音乐呀,那么你现在一个星期弹琴的时间是多长?一个手指是指?一个下午?一个小时?一刻钟?哦..不,天哪,只有一分钟?! 4.好了,抛开你的音乐梦想不说,是谁在几年前雄心勃勃地说要闯一番事业?你现在在做什么?看老板脸色决定今晚几点吃饭. 5.你工作很积极,有不错的成绩,今天去费九牛二虎之力跟客户谈完事回来,价钱总算保底了,回到公司上司找你说,成本的预算可能得再减一减.你抓狂,不管在客户或是公司面前,你都得同样的争取某种利益. 6.妈妈催你嫁人了,你也知道,有钱的男人不难寻,但有心的男人不易找,但偏偏你好像遇上了一个有心的但没怎么有钱的男人. 7.你突然想起几年前你入行的时候,有好心的朋友告诉过你,别把公司当家了,顿时觉得这是金玉良言.恨自己当年很傻很天真. 8.你突然不确定自己想做女强人还是要做小女人,很烦. 9.你喜欢写代码,可现在只能在晚上回家的时候与代码温存,上班开始强逼自己做些很讨厌的事情,比如听一些表达不清的客户说话. 10.你通过google reader不断地从阅读有聊无聊的社论,博客,你渐斩发现,你门不喜欢出了,其他网站也不爱去了,脑袋快要爆炸了. 11.还有很多人在你耳边说,做技术的做不到老的,你很想理直气壮地教训他一番,但你却从来只会呵呵笑. 12.最惨的,你一天可能要花上三四个小时去坐公车上班,因为你住在城西,工作在城东,你不敢换转行,因为这意味着你要从头再来. 13.还要更烦的,你是个完美主义者,从来不轻易向现实低头,你大学毕业几年了?现在还没找到工作,一直在靠家人和朋友的借贷过日子. 14.还有很多说不完的事….. 尽管工作,生活还有感情上都有着大大小小的不愉快或不顺利(但请不要对号入座).但希望我的朋友们还有我自己都健健康康,保持乐观去享受生活中的每一次痛苦和喜悦.因为这就是生活呀.

Posted in 其他 | Leave a comment

另类的Jquery与Prototype混用法

jQuery和prototype都是现在比较流行的Javascript开发框架,两者都拥有数量相当的粉丝,当然不排除同时喜欢使用两种框架的。但问题来了,由于jQuery以及prototype都使用了美元符函数“$”作为选择器,在两者混合使用的时候$函数被重复定义了,结果导致其中一个框架不能使用。 流行的解法: 不过很快,有很多人给出了解决方案,如比较流行的方案是这样的: js 代码   <script src="http://jquery.com/src/latest/"></script>    <script type="text/javascript">       JQ = $;  //rename $ function    </script>    <script src="prototype.js"></script>   这样一来,你可以使用JQ来代替jQuery里的$函数名,而prototype的$函数照常使用,像这样: js 代码   <script type="text/javascript">     JQ(document).ready(function(){      JQ("#test_jquery").html("this is jquery");      $("test_prototype").innerHTML="this is prototype";     });    </script>   尽管这种办法在一定程度上解决了两者的冲突,但作为jQuery的死忠,我是万分不情愿改写$为JQ或其他替代的字符。反之Prototype的粉丝估计也会这样想。那么,是不是有另一种解决方案,让两种框架能和谐共处呢?现在流行和谐嘛! 另类解法: 先看一小段代码,猜一下会有什么效果?   js 代码   <script type="text/javascript"> (function(name){       alert(‘hello ’+ name);   })("world");   </script>    应该很简单吧?效果是弹出一个窗品说“hello world”。仔细看这一段Script,前后有两个括号组成,第一个括号里面是一个function对象,第二个括号是一个字符串。可以这样理解,第一个括号里面定义了一个函数,第二个括号里面给出的参数,两个加在一起实际上是完成了一次函数调用! 那现在来点真实的: js 代码   … Continue reading

Posted in 其他 | Leave a comment

在那遥远的小乡镇

下午准备找些音乐来听,无意识地点进一个很久没有到过的角落.里面有不少成品,半成品,甚至是Demo,那是我们以前的一部分作品. 我很少听自己的音乐,因为听着脸会红,不知道是因为没信心还是其他原因,所以我通常录好一首歌,给别人听了之后就收藏起来完事,极少会翻出来回味. 那都是很久很久以前的事咯,快十年了吧,在一个遥远的小镇,有两个小盆友喜欢音乐,在一起弹吉他,唱歌,创作.其中一个小盆友歌唱得不错,另外一个小盆友琴弹得不错,还经常往县城跑,是为了淘些摇滚CD和盒带.长大后,他们成了"吉瓜".曾经被广州电台罗丹力调侃为"一吉就瓜".第二位小盆友的创作高峰期在高中,第一位则是在大学毕业后.两位小盆友从高中同班到大学同校到工作同公司一起走了十年.现在还常常搞不清,是我们玩了音乐,还是音乐玩了我们. 下面这首是两位小盆友首次合作的小样,高中时代,在那遥远的小乡镇,那很傻很可爱的劲头,"蓝色理想",谢谢. 点击这里下载"蓝色理想.mp3"

Posted in 其他 | Leave a comment

乌兰巴托的夜

穿越旷野的风啊,慢些走 我用沉默告诉你,我醉了酒 飘向远方的云啊,慢些走 我用奔跑告诉你,我不回头 乌兰巴托的夜啊,那么静,那么静。。连风都不知道我 。。。不知道 每次我想要给别人介绍歌的时候,我都不会用理智的字眼去介绍,而是恨不得把整首歌词塞给他,把音乐放到他耳边,把音量开大。 乌兰巴托的夜,来自左小诅咒很多年前的专辑《美国》。曾经有朋友把一个同名的Flash动画给我看的时候,这首歌就征服了我。今天晚上在硬盘的一角找到这首歌的MP3,无数次往反听了一个晚上,在广州这个喧闹无比的炎热夏天的晚上从音乐里不止一次的感受那种空的感觉,渺小的感觉,寂寞的感觉。据说左小诅咒曾用这首歌把两名著名的乐评人唱哭了。 左小的风格就是这样,一流的配乐,粗糙无比的嗓音。其实,我认为他是故意这样的,因为只有这样,人们才会真的去关注歌里要表达的意思,而并非仅仅是唱功那么表面的东西。左小的新专辑出了好几个月了,还没来得及听。 我想起来了,公司的一位同事--前DeadRock.com的CEO经常发出的嗡鸣声原来是从这首歌里面学的。 乌兰巴托的夜啊,那么静,那么静。。连风都不知道我 。。。不知道。 乌兰巴托的夜啊,那么静,那么静。。连云都不知道我 。。。不知道。 附完整歌词: 乌兰巴托的夜 穿越旷野的风啊   慢些走   我用沉默告诉你   我醉了酒   飘向远方的云啊   慢些走   我用奔跑告诉你   我不回头   乌兰巴托的夜啊   那么静,那么静   连风都不知道我   不知道   乌兰巴托的夜啊   那么静,那么静   连云都不知道我   不知道   游荡异乡的人啊   在哪里   我的肚子开始痛   你可知道   穿越火焰的鸟儿啊   不要走   你知今夜疯掉的   不止一个人   … Continue reading

Posted in 其他 | Leave a comment

Nuxeo WebEngine -- java的plone?

今天看到一则新闻“Nuxeo WebEngine发布”,仔细看了一下,咦,这东西的概念怎么这么像python世界的plone? 说到plone,不得不提的就是它的开发框架Zope了。介绍Zope并不是本文的目的,有兴趣者可以Google之。 一、WebEngine依赖 Nuxeo内容管理框架提供基于组件的程序模型和web开发模型来创建以内容为中心的组件化应用,包括Wiki,博客,内容为主的web网站等。 注:Nuxeo内容管理框架(Nuxeo core?)应该是类似Zope 的CMF(Content Management Framework )东东了。plone也一样是作为一个应用框架,用来开发以内容为中心的组件化应用。Plone内置的内容类型有页面、文件、图片、文件夹以智能文件夹,而Webengine则提供了更多内容相关的类型,如Blog,Wiki等。 二、WebEngine主要依赖REST方式:URLs映射到分层的内容存储,内容通过GETs获取,用户行为通过GETs和POSTs请求等。这种方式方便通过WebEngine使用和架构RESTful应用。 注:如果你了解RESTFul风格的URL并知道Zope以模型为中心,URL以节点漫游的方式进行映射,你就会发现两者的目的都差不多,REST是以资源为中心的。我后来看了一下WebEngine的实现,它使用了内容仓库Jackrabbit(什么是内容仓库)作为数据存储的一部分,真正实现多层次结构数据的存储。表现出来的效果和ZODB有点类似了。 三、WebEngine完全是可扩展的,组件化的,通过OSGI方式和Nuxeo运行来扩展。 注:WebEngine的扩展可看作是OSGI 的插件。由于OSGI,WebEngine在部署组件方式同样可以达到热部署,在Zope里面,这样的组件被称为产品(product)。 四、WebEngine有自己独立的服务器,并且兼容JBoss,允许嵌入式运行等。现在暂时不清楚其独立服务器的用意(不过从下载回来的Standalone版本来看,服务器是基于Jetty6的),但看起来有点模仿zope的意思,zope是提供独立的服务器。 我下载了一份Standalone的发行版下来试验了一下。发现WebEngine这一次的发布真是摆了个大乌龙,在它的网站的任何地方都找不到登录系统的初始密码,启动了服务器的我在门外徘徊了好久,终于在Google到一个可能的帐号Administrator/Administrator,试一下真的能进去。 界面还很简陋,用户管理的创建用户看起来有点Bug,我创建的每一种类型的内容最终都显得像一个目录,并且点击编辑的时候都出现这样的错误提示: This is a placeholder page. Don’t know how to edit generic documents. Add an edit page for your document type please. … Continue reading

Posted in 其他 | Leave a comment

关于&quot;we are on grails&quot;的更正

今天发现有读者在我上一篇文章发表了评论说: 网站下面的508条怎么说网站是plone的?整个界面也很像plone,你不是在忽悠读者吧???? 我仔细看了一下文章后面那一段,原来我把产品的网站(使用Grails构建)与产品宣传网站(使用Plone构建)放在一起了,于是造成了误解。原文是这样的: 搭车宣传一下上文的产品中的其中一个作品:手机仿真、产品宣传站,该产品前台演示及后台管理、制作均使用Grails开发,目前已在生产环境(指客户的)连续运行较长时间,工作正常。 现在改为: 搭车宣传一下上文的产品中的其中一个作品:手机仿真。这里是产品宣传站(基于Plone的哦),该产品前台演示及后台管理、制作均使用Grails开发,目前已在生产环境(指客户的)连续运行较长时间,工作正常。 在此,对原文所带来的误解表示歉意 :),并感谢question朋友的及时提醒。 注:Plone是一款Python的开源CMS软件,功能强大,个人认为比Java的商业Wiki Confluence有更多的优势。我的产品宣传网站使用Plone进行发布,效率和页面定制的灵活性都是相当的强大。在此强烈推荐。

Posted in 其他 | Leave a comment

We are on Grails

Grails?你的产品使用Grails!?是的,我想告诉你,我们正在使用Grails,并且产品现在也健健康康的。 轻量级也会做恶梦 我之前的项目大部分使用java做开发。spring + hibernate + Struts or Spring + hibernate + webwork 固然好用,可是到一千个人手里有一千种做法,你这样封装,我如此扩展,虽然这些东西在手中玩得烂熟,但,噢。。天,还有没完没了的配置文件,传统Java web Server那极不可靠的热部署能力,我只能无止境地重启再重启Web server。用我同事的话说,走出去抽完一支烟回来,还没启动完成。做Web开发,真用得着这样折腾吗? 老板,我也要on rails 如果到现在你还没听说过ruby on rails 或 django,那说明你还不是一般的脱节了。正在大家热衷于讨论“贫血模型还是充血模型”、“EJB3还是Hibernate”的时候,Ruby on rails的到来有如一缕清风拂面,让人有焕然一新的感觉。其简约清爽的风格赢得不少开发者尤其是Java开发者的欢心,不少Java界的大牛声称转移到Ruby社区,国内著名的Javaeye社区也开始使用Ruby on rails(以下简称ror)来开发新版的网站,真是很身体力行。后来,pythoner站出来说,在python社区也有一种框架比美ror,她叫django。 我分别用上了ROR,Django,喜欢上她们,并用Django写成了现在你看到的这个网站。满心欢喜的我按捺不住喜悦要跟朋友和同事们分享这一切,只是由于种种原因,我的“八卦N种流行的快速开发框架”的分享讲座至今还没有开。 ROR,Django固然好,无奈产品的生产环境是跑Java,Jruby,Jython之辈不成熟,更不用说Jruby on rails或Django for java。车到山前必有路,Java的王储Groovy日渐成熟,其对应的Web开发框架Grails更新也很勤快,Java社区是不是很快就有像ROR和Django一样的快速开发框架了?一时间,社区议论纷纷,有褒有贬,众说纷芸,JavaEye站长robbin更认为Grails不会有大作为。OK,1.0之前,我继续持观望状态。 Grails?嗯,很高效! 说真的我一直在等Grails1.0。1.0的释出,我跟团队说,今天开始,我们要用Grails了。 两个月下来,产品释出第一个版本,同事们认可了Grails的高效,并且表示往事不堪回首,再也不愿回到从前的开发模式当中去。 简单总结一下Groovy和Grails的好处,但本文重点并不在于此,更多的可以参考Grails官方网站或Google。 一、天然的充血模型,省略你曾经很头疼的DAO。 二、现在用Hibernate,一个配置文件也没有,讨厌的注解也不需要,实现ORM,实在是易过借火。 … Continue reading

Posted in 其他 | Leave a comment

开始启动Scrum

我的产品团队成员并不多,开发人员三个,产品负责人我兼了技术经理,不过技术在经理一职我将站在更高的层次上去指导团队,并计划在开发团队中培养技术接班人。这一次,我的角色为产品负责人,在开发人员当中挑选一位质优者当ScrumMaster,而这个Master其实也是新手,不过我会帮助他组织日会议,为他过程方面的疑惑等。 产品Backlog我称之为产品总目标,Sprint backlob我称之为短跑目标,Sprint还是如实叫短跑。第一次Sprint启动会议在本周星期四,持续时间的确如想像中一样,相当长。从分析产品目标,确定Sprint 1实现目标,到细化目标到故事,再到任务,估算各任务工作量等,上午到中午休息再继续。共计耗时四个小时左右,比起八小时的Sprint启动会议要短了。另外,每日的会议安排在上午九点半召开,开发团队成员每次的会议要解决的问题有: 一、从上次会议到现在,我做了什么。 二、从现在开会到下次会议,我会做什么。 三、上次会议到现在,我遇到了什么问题需要大家帮助解决。 日会议我并不参与,会议记录和主持交给准Master负责。 当我决定引进Scrum,并给队员讲述该过程的时候,他们都挺欢迎这种做法,他们全部参与到需求细化与工作量评估上面来,对他们来讲是一项挑战,也是一项提升。总的来讲,对产品有好处,对团队成员也有利。 当然,过程才刚刚启动,团队可能在工作量评估和故事细化等方面能力有所欠缺,但不要紧,燃尽图会老老实实地反映出来,到Sprint验收会议的时候,初次尝试Scrun的问题会凸现出来,第二次短跑的时候会有更多的经验。 接下来看一个Timebox(我定了是三周)之后效果如何。 最后,上一张白板。看,多么草根。没办法,我们这里的办公室还是很原始的那种格子式的。。白板的内容也相对简单,一张燃尽图,三个状态的任务队列,和未计划区,其他如Sprint目标并没有写上去。。更多的信息是保存在Wiki上了。日会议要做的一件事就是把任务卡从一个地方挪到另一个地方。

Posted in 其他 | Leave a comment