2006年4月的归档

  今天回北京了。
  虽然没有西安热,但北京的气温显然也升了不少。
  从公司打车回家,竟然发现这片社区有了少许变化。打开门,进了房,感觉有点陌生一样,挂在客厅与卧室之间的风铃还是会碰着我的头而发出悦耳的声响。
  整个四月,好像在家里停留不超过10个晚上,虽然躲过了沙尘暴,但其实还是很想见识一下下土是什么样。
  第一次五一长假留在北京... ...

| | Comments(0) | TrackBacks(0)

  夜深,回到酒店已经很晚了... ... 
  早上刚到西安的时候,这里下着小雨,很清凉。一过晌午,清新散尽,i hate big sun.
  小时候生在雨水较多的江边城市,气候与我一直向往的江南有七分相似。于是儿时的很多记忆都是在下雨的季节和那时的某些片断情节。但那时似乎并不珍惜这些雨水,而是在心里埋怨为什么在放假时老下雨,而不能出去玩。
  小学和初中离家比较近,下雨时,打伞就够了,不用雨衣。到了高中,学校很远了,我有了自己的车--自行车,如果早上下雨,我会有两个选择,要么打伞到三四公里外的车站等公交,要么穿上雨衣,依旧骑着我的爱骑在风雨中飘摇,那时很懵懂,不知读书是为了什么,只知道除了读书,我目前没有什么事可以做,好像就是这样。
  直到高二的时候,开始对自己的未来有了些模糊的概念,因为学校老是宣传前几届的学长学姐们又有几个考上了清华,进了北大,或是保送出了国,我在想,我总也要混个大学毕业吧。学生永远是最容易被煽动的一群集体,在这种氛围下,大家不可能不好好学习,更何况我当时是在省重点中学,要实现这个目标似乎并不难,事实上也确实不难,因为那一年,大学也扩招了... ...
  在大学里,如果下雨天,体育课就会改成是在体育馆里滑冰,也就是在滑冰馆,我第一次惊讶于我不知道姓名的女同学竟然能叫出我的名字,也不知这雨下的是好还是坏。
  于是开始了第一次约会,但那时也是被约,而不敢主动去约,结果可想而知了,那时自己最爱的只是图书馆和自习室。如果现在再让我选,我会在爱情和奖学金之间选择前者。直到去了重庆求学,在那帮甘肃同学的开导下,才真正的开了窍,由于开窍比较晚,导致了我在感情上发育不良,而影响至今。
  离开重庆的雨季,去了广州继续求学,广州冬天的雨非常的冷,我问当地的低年级的学弟们,广州冬天真这么冷吗,他们说不是,刚好今年比较冷... ...我在怀疑,这是不是“天将降大任与斯人也”。还好我是比较习惯这种长期低温多雨的冬季,而我的北京同学却一个劲的抱怨广州的冬天比北京还冷,这一点我一直很纳闷,直到后来到了北京,才亲身证实了这一点,这是后话了。
  那年暑假呆在广州,一场大雨,也带了一场台风。
  台风把学校外一排的电线杆全刮倒了,于是在学校,我在停电三天中,只靠蜡烛度过了三个晚上,无聊到都想啃蜡烛了。
  后来去了北京,北京的雨是可遇不可求,非常的难求。雨在我的记忆中开始模糊了,淋淋雨也开始变成了一种奢望,而北京的雨也常常下的是非常不适当。
  还好,去了四次上海,有两次是下雨,另两次是刚下完雨。
  去了两次杭州,一次是下雪,一次是下雨。
  杭州的雨,让我不可救药的爱上了江南,嗯,不可救药的那一种。那里的感觉,淋雨穿越龙井村到钱唐江边,打着伞在杭州城内... ...
  后来又冲动的去了一次青岛,也是下雨,知道我有多高兴吗,但好像当时只有我一个人高兴。
  雨中的城市,让我会觉得非常的清新和自然。
  看到msn,QQ中不少朋友都用“雨”做名字的后缀,有男有女,也让我有所想,在酒店的床上捧着本本留下这些话,就算是为自己的以前留个像征性的记忆吧,本还有些文字想写,但实在困了,草草收笔了,望谅:)
         

JAVA Puzzlers下载

| | Comments(2) | TrackBacks(0)

  今天收信,有朋友来询问我前几周介绍的《Java Puzzlers 》一书的下载地址,由于我的blog空间无法上传太大的文件,所以在这里为大家提供一个可下载的链接:
  《Java Puzzlers 》:http://www.itpub.net/attachment.php?s=&postid=3111977
  如果上面的链接失效,大家可以留下email,我会以附件的方式发送。
  目前还在西安出差,blog更新较慢,技术方面的文章也要在心静的时候才会有发表的欲望,见谅... ...
  五一估计在北京好好休息了

著名的Proust Questionnaire(普鲁斯特问卷)由一系列问题组成,问题包括被提问者的生活、思想、价值观及人生经验等。因著作《追忆逝水年华》而闻名的Marcel Proust并不是这份问卷的始作俑者,但这份问卷因为他特别的答案而出名,并且在当年时髦的巴黎人沙龙中也颇为流行。因此后人将这份问卷命名为“Proust Questionnaire”。

·你认为最理想的快乐是怎样的?
·你最害怕的是什么?
·还在世的人中你最钦佩的是谁?
·你自己的哪个特点让你觉得最痛恨?
·你最痛恨别人的什么特点?
·你最奢侈的是什么?
·你认为哪种美德是被过高评估的?
·你对自己外表的哪一点最不满意?
·还在世的人中你最轻视的是谁?
·你过多使用的单词或短语是什么?
·你最伤痛的事是什么?
·你这一生中最爱的人或东西是什么?
·何时是你生命中最快乐的时刻?
·你最希望拥有哪种才华?
·你目前的心境怎样?
·你认为你最伟大的成就是什么?
·如果你能选择的话,你希望让什么重现?
·你最珍惜的财产是什么?
·你认为程度最浅的痛苦是什么?
·你最喜欢的职业是什么?
·你本身最显著的特点是什么?
·你最喜欢男性身上的什么品质?
·你最喜欢女性身上的什么品质?
·你最看重朋友的什么特点?
·你希望以什么样的方式死去?
·你的座右铭是什么?

谁想做一把呢?

长沙.窗外.雷阵雨

| | Comments(0) | TrackBacks(0)

  这场雨终于下了。
  雷阵雨... ...
  上一次雷阵雨,还是在二年前的北京。和很多人一样,困在地铁的出口,等着雨停。
  此时,雷鸣,闪电,雨声。
  长沙,夜正深,未眠。

掌握 Ajax (1)(zt)

| | Comments(0) | TrackBacks(2)
Brett McLaughlin, 作家,编辑, O'Reilly and Associates Ajax 由 HTML、JavaScript™ 技术、DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序。本文的作者是一位 Ajax 专家,他演示了这些技术如何协同工作 —— 从总体概述到细节的讨论 —— 使高效的 Web 开发成为现实。他还揭开了 Ajax 核心概念的神秘面纱,包括 XMLHttpRequest 对象。 五年前,如果不知道 XML,您就是一只无人重视的丑小鸭。十八个月前,Ruby 成了关注的中心,不知道 Ruby 的程序员只能坐冷板凳了。今天,如果想跟上最新的技术时尚,那您的目标就是 Ajax。 但是,Ajax 不仅仅 是一种时尚,它是一种构建网站的强大方法,而且不像学习一种全新的语言那样困难。 但在详细探讨 Ajax 是什么之前,先让我们花几分钟了解 Ajax 做 什么。目前,编写应用程序时有两种基本的选择: ·桌面应用程序 ·Web 应用程序 两者是类似的,桌面应用程序通常以 CD 为介质(有时候可从网站下载)并完全安装到您的计算机上。桌面应用程序可能使用互联网下载更新,但运行这些应用程序的代码在桌面计算机上。Web 应用程序运行在某处的 Web 服务器上 —— 毫不奇怪,要通过 Web 浏览器访问这种应用程序。 不过,比这些应用程序的运行代码放在何处更重要的是,应用程序如何运转以及如何与其进行交互。桌面应用程序一般很快(就在您的计算机上运行,不用等待互联网连接),具有漂亮的用户界面(通常和操作系统有关)和非凡的动态性。可以单击、选择、输入、打开菜单和子菜单、到处巡游,基本上不需要等待。 另一方面,Web 应用程序是最新的潮流,它们提供了在桌面上不能实现的服务(比如 Amazon.com 和 eBay)。但是,伴随着 Web 的强大而出现的是等待,等待服务器响应,等待屏幕刷新,等待请求返回和生成新的页面。 显然这样说过于简略了,但基本的概念就是如此。您可能已经猜到,Ajax 尝试建立桌面应用程序的功能和交互性,与不断更新的 Web 应用程序之间的桥梁。可以使用像桌面应用程序中常见的动态用户界面和漂亮的控件,不过是在 Web 应用程序中。 还等什么呢?我们来看看 Ajax 如何将笨拙的 Web 界面转化成能迅速响应的 Ajax 应用程序吧。 老技术,新技巧 在谈到 Ajax 时,实际上涉及到多种技术,要灵活地运用它必须深入了解这些不同的技术(本系列的头几篇文章将分别讨论这些技术)。好消息是您可能已经非常熟悉其中的大部分技术,更好的是这些技术都很容易学习,并不像完整的编程语言(如 Java 或 Ruby)那样困难。 下面是 Ajax 应用程序所用到的基本技术: ·HTML 用于建立 Web 表单并确定应用程序其他部分使用的字段。 ·JavaScript 代码是运行 Ajax 应用程序的核心代码,帮助改进与服务器应用程序的通信。 ·DHTML 或 Dynamic HTML,用于动态更新表单。我们将使用 div、span 和其他动态 HTML 元素来标记 HTML。 ·文档对象模型 DOM 用于(通过 JavaScript 代码)处理 HTML 结构和(某些情况下)服务器返回的 XML。 Ajax 的定义 顺便说一下,Ajax 是 Asynchronous JavaScript and XML(以及 DHTML 等)的缩写。这个短语是 Adaptive Path 的 Jesse James Garrett 发明的(请参阅 参考资料),按照 Jesse 的解释,这不是 个首字母缩写词。 我们来进一步分析这些技术的职责。以后的文章中我将深入讨论这些技术,目前只要熟悉这些组件和技术就可以了。对这些代码越熟悉,就越容易从对这些技术的零散了解转变到真正把握这些技术(同时也真正打开了 Web 应用程序开发的大门)。 XMLHttpRequest 对象 要了解的一个对象可能对您来说也是最陌生的,即 XMLHttpRequest。这是一个 JavaScript 对象,创建该对象很简单,如清单 1 所示。 清单 1. 创建新的 XMLHttpRequest 对象 <script language="javascript" type="text/javascript"> var xmlHttp = new XMLHttpRequest(); </script> 下一期文章中将进一步讨论这个对象,现在要知道这是处理所有服务器通信的对象。继续阅读之前,先停下来想一想:通过 XMLHttpRequest 对象与服务器进行对话的是 JavaScript 技术。这不是一般的应用程序流,这恰恰是 Ajax 的强大功能的来源。 在一般的 Web 应用程序中,用户填写表单字段并单击 Submit 按钮。然后整个表单发送到服务器,服务器将它转发给处理表单的脚本(通常是 PHP 或 Java,也可能是 CGI 进程或者类似的东西),脚本执行完成后再发送回全新的页面。该页面可能是带有已经填充某些数据的新表单的 HTML,也可能是确认页面,或者是具有根据原来表单中输入数据选择的某些选项的页面。当然,在服务器上的脚本或程序处理和返回新表单时用户必须等待。屏幕变成一片空白,等到服务器返回数据后再重新绘制。这就是交互性差的原因,用户得不到立即反馈,因此感觉不同于桌面应用程序。 Ajax 基本上就是把 JavaScript 技术和 XMLHttpRequest 对象放在 Web 表单和服务器之间。当用户填写表单时,数据发送给一些 JavaScript 代码而不是 直接发送给服务器。相反,JavaScript 代码捕获表单数据并向服务器发送请求。同时用户屏幕上的表单也不会闪烁、消失或延迟。换句话说,JavaScript 代码在幕后发送请求,用户甚至不知道请求的发出。更好的是,请求是异步发送的,就是说 JavaScript 代码(和用户)不用等待服务器的响应。因此用户可以继续输入数据、滚动屏幕和使用应用程序。 然后,服务器将数据返回 JavaScript 代码(仍然在 Web 表单中),后者决定如何处理这些数据。它可以迅速更新表单数据,让人感觉应用程序是立即完成的,表单没有提交或刷新而用户得到了新数据。JavaScript 代码甚至可以对收到的数据执行某种计算,再发送另一个请求,完全不需要用户干预!这就是 XMLHttpRequest 的强大之处。它可以根据需要自行与服务器进行交互,用户甚至可以完全不知道幕后发生的一切。结果就是类似于桌面应用程序的动态、快速响应、高交互性的体验,但是背后又拥有互联网的全部强大力量。 加入一些 JavaScript 得到 XMLHttpRequest 的句柄后,其他的 JavaScript 代码就非常简单了。事实上,我们将使用 JavaScript 代码完成非常基本的任务: ·获取表单数据:JavaScript 代码很容易从 HTML 表单中抽取数据并发送到服务器。 ·修改表单上的数据:更新表单也很简单,从设置字段值到迅速替换图像。 ·解析 HTML 和 XML:使用 JavaScript 代码操纵 DOM(请参阅 下一节),处理 HTML 表单服务器返回的 XML 数据的结构。 对于前两点,需要非常熟悉 getElementById() 方法,如 清单 2 所示。 清单 2. 用 JavaScript 代码捕获和设置字段值 这里没有特别需要注意的地方,真是好极了!您应该认识到这里并没有非常复杂的东西。只要掌握了 XMLHttpRequest,Ajax 应用程序的其他部分就是如 清单 2 所示的简单 JavaScript 代码了,混合有少量的 HTML。同时,还要用一点儿 DOM,我们就来看看吧。 以 DOM 结束 最后还有 DOM,即文档对象模型。可能对有些读者来说 DOM 有点儿令人生畏,HTML 设计者很少使用它,即使 JavaScript 程序员也不大用到它,除非要完成某项高端编程任务。大量使用 DOM 的是 复杂的 Java 和 C/C++ 程序,这可能就是 DOM 被认为难以学习的原因。 幸运的是,在 JavaScript 技术中使用 DOM 很容易,也非常直观。现在,按照常规也许应该说明如何使用 DOM,或者至少要给出一些示例代码,但这样做也可能误导您。即使不理会 DOM,仍然能深入地探讨 Ajax,这也是我准备采用的方法。以后的文章将再次讨论 DOM,现在只要知道可能需要 DOM 就可以了。当需要在 JavaScript 代码和服务器之间传递 XML 和改变 HTML 表单的时候,我们再深入研究 DOM。没有它也能做一些有趣的工作,因此现在就把 DOM 放到一边吧。 获取 Request 对象 有了上面的基础知识后,我们来看看一些具体的例子。XMLHttpRequest 是 Ajax 应用程序的核心,而且对很多读者来说可能还比较陌生,我们就从这里开始吧。从 清单 1 可以看出,创建和使用这个对象非常简单,不是吗?等一等。 还记得几年前的那些讨厌的浏览器战争吗?没有一样东西在不同的浏览器上得到同样的结果。不管您是否相信,这些战争仍然在继续,虽然规模较小。但令人奇怪的是,XMLHttpRequest 成了这场战争的牺牲品之一。因此获得 XMLHttpRequest 对象可能需要采用不同的方法。下面我将详细地进行解释。 使用 Microsoft 浏览器 Microsoft 浏览器 Internet Explorer 使用 MSXML 解析器处理 XML(可以通过 参考资料 进一步了解 MSXML)。因此如果编写的 Ajax 应用程序要和 Internet Explorer 打交道,那么必须用一种特殊的方式创建对象。 但并不是这么简单。根据 Internet Explorer 中安装的 JavaScript 技术版本不同,MSXML 实际上有两种不同的版本,因此必须对这两种情况分别编写代码。请参阅 清单 3,其中的代码在 Microsoft 浏览器上创建了一个 XMLHttpRequest。 清单 3. 在 Microsoft 浏览器上创建 XMLHttpRequest 对象 var xmlHttp = false; try {   xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {   try {     xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");   } catch (e2) {     xmlHttp = false;   } } 您对这些代码可能还不完全理解,但没有关系。当本系列文章结束的时候,您将对 JavaScript 编程、错误处理、条件编译等有更深的了解。现在只要牢牢记住其中的两行代码: xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); 和 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");。 这两行代码基本上就是尝试使用一个版本的 MSXML 创建对象,如果失败则使用另一个版本创建该对象。不错吧?如果都不成功,则将 xmlHttp 变量设为 false,告诉您的代码出现了问题。如果出现这种情况,可能是因为安装了非 Microsoft 浏览器,需要使用不同的代码。 处理 Mozilla 和非 Microsoft 浏览器 如果选择的浏览器不是 Internet Explorer,或者为非 Microsoft 浏览器编写代码,就需要使用不同的代码。事实上就是 清单 1 所示的一行简单代码: var xmlHttp = new XMLHttpRequest object;。 这行简单得多的代码在 Mozilla、Firefox、Safari、Opera 以及基本上所有以任何形式或方式支持 Ajax 的非 Microsoft 浏览器中,创建了 XMLHttpRequest 对象。 结合起来 关键是要支持所有 浏览器。谁愿意编写一个只能用于 Internet Explorer 或者非 Microsoft 浏览器的应用程序呢?或者更糟,要编写一个应用程序两次?当然不!因此代码要同时支持 Internet Explorer 和非 Microsoft 浏览器。清单 4 显示了这样的代码。 清单 4. 以支持多种浏览器的方式创建 XMLHttpRequest 对象 现在先不管那些注释掉的奇怪符号,如 @cc_on,这是特殊的 JavaScript 编译器命令,将在下一期针对 XMLHttpRequest 的文章中详细讨论。这段代码的核心分为三步: 1、建立一个变量 xmlHttp 来引用即将创建的 XMLHttpRequest 对象。 2、尝试在 Microsoft 浏览器中创建该对象:       1)尝试使用 Msxml2.XMLHTTP 对象创建它。        2)如果失败,再尝试 Microsoft.XMLHTTP 对象。 2、如果仍然没有建立 xmlHttp,则以非 Microsoft 的方式创建该对象。 最后,xmlHttp 应该引用一个有效的 XMLHttpRequest 对象,无论运行什么样的浏览器。 关于安全性的一点说明 安全性如何呢?现在浏览器允许用户提高他们的安全等级,关闭 JavaScript 技术,禁用浏览器中的任何选项。在这种情况下,代码无论如何都不会工作。此时必须适当地处理问题,这需要单独的一篇文章来讨论,要放到以后了(这个系列够长了吧?不用担心,读完之前也许您就掌握了)。现在要编写一段健壮但不够完美的代码,对于掌握 Ajax 来说就很好了。以后我们还将讨论更多的细节。 Ajax 世界中的请求/响应 现在我们介绍了 Ajax,对 XMLHttpRequest 对象以及如何创建它也有了基本的了解。如果阅读得很仔细,您可能已经知道与服务器上的 Web 应用程序打交道的是 JavaScript 技术,而不是直接提交给那个应用程序的 HTML 表单。 还缺少什么呢?到底如何使用 XMLHttpRequest。因为这段代码非常重要,您编写的每个 Ajax 应用程序都要以某种形式使用它,先看看 Ajax 的基本请求/响应模型是什么样吧。 发出请求 您已经有了一个崭新的 XMLHttpRequest 对象,现在让它干点活儿吧。首先需要一个 Web 页面能够调用的 JavaScript 方法(比如当用户输入文本或者从菜单中选择一项时)。接下来就是在所有 Ajax 应用程序中基本都雷同的流程: 1、从 Web 表单中获取需要的数据。 2、建立要连接的 URL。 3、打开到服务器的连接。 4、设置服务器在完成后要运行的函数。 5、发送请求。 清单 5 中的示例 Ajax 方法就是按照这个顺序组织的: 清单 5. 发出 Ajax 请求 其中大部分代码意义都很明确。开始的代码使用基本 JavaScript 代码获取几个表单字段的值。然后设置一个 PHP 脚本作为链接的目标。要注意脚本 URL 的指定方式,city 和 state(来自表单)使用简单的 GET 参数附加在 URL 之后。 然后打开一个连接,这是您第一次看到使用 XMLHttpRequest。其中指定了连接方法(GET)和要连接的 URL。最后一个参数如果设为 true,那么将请求一个异步连接(这就是 Ajax 的由来)。如果使用 false,那么代码发出请求后将等待服务器返回的响应。如果设为 true,当服务器在后台处理请求的时候用户仍然可以使用表单(甚至调用其他 JavaScript 方法)。 xmlHttp(要记住,这是 XMLHttpRequest 对象实例)的 onreadystatechange 属性可以告诉服务器在运行完成 后(可能要用五分钟或者五个小时)做什么。因为代码没有等待服务器,必须让服务器知道怎么做以便您能作出响应。在这个示例中,如果服务器处理完了请求,一个特殊的名为 updatePage() 的方法将被触发。 最后,使用值 null 调用 send()。因为已经在请求 URL 中添加了要发送给服务器的数据(city 和 state),所以请求中不需要发送任何数据。这样就发出了请求,服务器按照您的要求工作。 如果没有发现任何新鲜的东西,您应该体会到这是多么简单明了!除了牢牢记住 Ajax 的异步特性外,这些内容都相当简单。应该感激 Ajax 使您能够专心编写漂亮的应用程序和界面,而不用担心复杂的 HTTP 请求/响应代码。 清单 5 中的代码说明了 Ajax 的易用性。数据是简单的文本,可以作为请求 URL 的一部分。用 GET 而不是更复杂的 POST 发送请求。没有 XML 和要添加的内容头部,请求体中没有要发送的数据;换句话说,这就是 Ajax 的乌托邦。 不用担心,随着本系列文章的展开,事情会变得越来越复杂。您将看到如何发送 POST 请求、如何设置请求头部和内容类型、如何在消息中编码 XML、如何增加请求的安全性,可以做的工作还有很多!暂时先不用管那些难点,掌握好基本的东西就行了,很快我们就会建立一整套的 Ajax 工具库。 处理响应 现在要面对服务器的响应了。现在只要知道两点: ·什么也不要做,直到 xmlHttp.readyState 属性的值等于 4。 ·服务器将把响应填充到 xmlHttp.responseText 属性中。 其中的第一点,即就绪状态,将在下一篇文章中详细讨论,您将进一步了解 HTTP 请求的阶段,可能比您设想的还多。现在只要检查一个特定的值(4)就可以了(下一期文章中还有更多的值要介绍)。第二点,使用 xmlHttp.responseText 属性获得服务器的响应,这很简单。清单 6 中的示例方法可供服务器根据 清单 5 中发送的数据调用。 清单 6. 处理服务器响应 function updatePage() {   if (xmlHttp.readyState == 4) {     var response = xmlHttp.responseText;     document.getElementById("zipCode").value = response;   } } 这些代码同样既不难也不复杂。它等待服务器调用,如果是就绪状态,则使用服务器返回的值(这里是用户输入的城市和州的 ZIP 编码)设置另一个表单字段的值。于是包含 ZIP 编码的 zipCode 字段突然出现了,而用户没有按任何按钮!这就是前面所说的桌面应用程序的感觉。快速响应、动态感受等等,这些都只因为有了小小的一段 Ajax 代码。 细心的读者可能注意到 zipCode 是一个普通的文本字段。一旦服务器返回 ZIP 编码,updatePage() 方法就用城市/州的 ZIP 编码设置那个字段的值,用户就可以改写该值。这样做有两个原因:保持例子简单,说明有时候可能希望 用户能够修改服务器返回的数据。要记住这两点,它们对于好的用户界面设计来说很重要。 连接 Web 表单 还有什么呢?实际上没有多少了。一个 JavaScript 方法捕捉用户输入表单的信息并将其发送到服务器,另一个 JavaScript 方法监听和处理响应,并在响应返回时设置字段的值。所有这些实际上都依赖于调用 第一个 JavaScript 方法,它启动了整个过程。最明显的办法是在 HTML 表单中增加一个按钮,但这是 2001 年的办法,您不这样认为吗?还是像 清单 7 这样利用 JavaScript 技术吧。 清单 7. 启动一个 Ajax 过程 <form>  <p>City: <input type="text" name="city" id="city" size="25"        onChange="callServer();" /></p>  <p>State: <input type="text" name="state" id="state" size="25"        onChange="callServer();" /></p>  <p>Zip Code: <input type="text" name="zipCode" id="city" size="5" /></p> </form> 如果感觉这像是一段相当普通的代码,那就对了,正是如此!当用户在 city 或 state 字段中输入新的值时,callServer() 方法就被触发,于是 Ajax 开始运行了。有点儿明白怎么回事了吧?好,就是如此! 结束语 现在您可能已经准备开始编写第一个 Ajax 应用程序了,至少也希望认真读一下 参考资料 中的那些文章了吧?但可以首先从这些应用程序如何工作的基本概念开始,对 XMLHttpRequest 对象有基本的了解。在下一期文章中,您将掌握这个对象,学会如何处理 JavaScript 和服务器的通信、如何使用 HTML 表单以及如何获得 DOM 句柄。 现在先花点儿时间考虑考虑 Ajax 应用程序有多么强大。设想一下,当单击按钮、输入一个字段、从组合框中选择一个选项或者用鼠标在屏幕上拖动时,Web 表单能够立刻作出响应会是什么情形。想一想异步 究竟意味着什么,想一想 JavaScript 代码运行而且不等待 服务器对它的请求作出响应。会遇到什么样的问题?会进入什么样的领域?考虑到这种新的方法,编程的时候应如何改变表单的设计? 如果在这些问题上花一点儿时间,与简单地剪切/粘贴某些代码到您根本不理解的应用程序中相比,收益会更多。在下一期文章中,我们将把这些概念付诸实践,详细介绍使应用程序按照这种方式工作所需要的代码。因此,现在先享受一下 Ajax 所带来的可能性吧。 function callServer() {   // Get the city and state from the web form   var city = document.getElementById("city").value;   var state = document.getElementById("state").value;   // Only go on if there are values for both fields   if ((city == null) || (city == "")) return;   if ((state == null) || (state == "")) return;   // Build the URL to connect to   var url = "/scripts/getZipCode.php?city=" + escape(city) + "&state=" + escape(state);   // Open a connection to the server   xmlHttp.open("GET", url, true);   // Setup a function for the server to run when it's done   xmlHttp.onreadystatechange = updatePage;   // Send the request   xmlHttp.send(null); } /* Create a new XMLHttpRequest object to talk to the Web server */ var xmlHttp = false; /*@cc_on @*/ /*@if (@_jscript_version >= 5) try {   xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {   try {     xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");   } catch (e2) {     xmlHttp = false;   } } @end @*/ if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {   xmlHttp = new XMLHttpRequest(); } // Get the value of the "phone" field and stuff it in a variable called phone var phone = document.getElementById("phone").value; // Set some values on a form using an array called response document.getElementById("order").value = response[0]; document.getElementById("address").value = response[1];

有关于鱼的讨论

| | Comments(0) | TrackBacks(0)

  中午北京的同事听说我们去吃鱼了,问我们是不是去吃的武昌鱼。
  然后我觉得有必要好好的和他探讨一下这个问题了:

http://jerryinside.blogbus.com/files/1145598353.gif

  湖南长沙,并没有想像中的那么好,但与宜昌有几分神似。
  在新华楼吃的早餐,就去了酒店,洗个澡和准备下午的交流会。
  晚上被朋友带去吃口味牛蛙,嗯,味道真的不错。穿过步行街,不知不觉就到了浏阳河边。我几乎是在突然之间发现自己走到了浏阳河边,才发现浏阳河是如此之温柔,即使是在西湖边,我也没有这种感觉。
  走在河边,淋着小雨,也是一种不错的feeling。终于又见到雨了... ...

深夜,当朋友的短信说晚安时,我却要从宾馆返回公司去开会。

    艺术家们好像都喜欢在晚上干活。
    相比开会,我还是喜欢和大家一起在广场上喝酒吃饭。上海此时的气候很好,我也庆幸自己逃离了北京的沙尘暴... ...
  其实自己这次来上海,也有点艺术家的思维,希望能创造点什么惊喜之类。
  但艺术家不是一日炼成的。当出租车在兆丰世贸大厦停下,我也只能是在楼下安慰性的参观,没有了上去的欲望。
  我选择了去见一个三年没见的上海朋友,她很开心的为我做了两条红烧鱼,然后听她还有她和酥哥这三年的故事。
  她说,稣哥是爱大家的。
    深夜,当朋友的短信说晚安时,我却要从宾馆返回公司去开会。
    艺术家们好像都喜欢在晚上干活。
    相比开会,我还是喜欢和大家一起在广场上喝酒吃饭。上海此时的气候很好,我也庆幸自己逃离了北京的沙尘暴... ...
  其实自己这次来上海,也有点艺术家的思维,希望能创造点什么惊喜之类。
  但艺术家不是一日炼成的。当出租车在兆丰世贸大厦停下,我也只能是在楼下安慰性的参观,没有了上去的欲望。
  我选择了去见一个三年没见的上海朋友,她很开心的为我做了两条红烧鱼,然后听她还有她和酥哥这三年的故事。
  她说,稣哥是爱大家的。

第二站:走路去上海

| | Comments(0) | TrackBacks(0)
  周一早上到的上海。
  风和日丽,还有熟悉的空气味道。
  这应该是自己第五次在上海停留了,让我开心的是每一次都能认识很好的上海朋友。
  其实这次来上海的设计分公司并无太多与自己相关的事宜,只是自己想处理一些private thing。
  上海的设计分公司,我之前并没有来过。这是一个在上海大学内的公司,其主创人员都是上海大学美院的老师和学生。公司的创始者是上大美院的老师,也是我的湖北老乡,一个精干的武汉姑娘邓老师,公司里一帮大一至大四的学生,其中不乏帅哥美女。这些雕塑专业,绘画专业,摄影专业也有影视专业的学生让这刚启用的两层楼的复式办公室显的很有活力,到处都能感受到这里的艺术气息和激情。
  从11楼的办公室平台往外去望,能看到很漂亮的上大周边建筑群,春风吹的人很舒服。
  早上八点多,是校外这条商业街最安静的时候。这条街就衔接着学生公寓和上大的南门,此时走在这条街上,就感觉像是四周前,走在青岛周末的居民巷里一般的宁静,而一到中午下课,这里立刻会变成学生们聚会吃饭购物的集散地。
  正巧周一是我在北京共事过几日,现在成立了自己的工作室的朋友在上大美术馆进行四人联展的日子。穿过美丽的上大校园,我的老乡邓老师不时的给我们介绍上大的美丽景点,甚至在较内的无名湖里还有天鹅,杨柳招展,小桥绿树。嗯,在这里非常适合读读书,谈谈情。
  展览,是艺术展,有平面设计,成功的商业设计案例,摄影,雕塑,模型设计,服装设计。在离开北京之前,我就在msn上告诉他,我会来上海看他的展览的。但他真的看见我们的时候,还是显得很激动开心。
  学艺术的人,在发型服装上,似乎也很stytle,和他们还有他们的作品在一起时,再加上他们那种天真无虑热忱,甚至让我自己都觉得自己也像个艺术家了,也想自已是不是该发挥一下艺术的潜能:)

北京下土啦

| | Comments(0) | TrackBacks(0)

北京降今春最严重浮尘 上风地带仍有沙尘暴(图)


北京降今春最严重浮尘上风地带仍有沙尘暴(图)

四月十七日晨,北京降下今春最严重的一次浮尘。图片来源:中国新闻网 记者:史利
点击此处查看全部新闻图片


北京降今春最严重浮尘上风地带仍有沙尘暴(图)

4月17日,市民正在擦掉爱车上的尘土。当日北京出现浮尘天气。图片来源:新华网


北京降今春最严重浮尘上风地带仍有沙尘暴(图)

4月17日清晨,北京出现扬尘黄土盖地,小区停车场的车辆被黄土覆盖。图片来源:China Foto Press 记者:李象凯



北京降今春最严重浮尘上风地带仍有沙尘暴(图)

国家卫星气象中心的气象云图显示,北京的上风地带仍有扬尘和沙尘暴


  中新网4月17日电 今早出门的不少北京市民发现,马路和露天停放了一夜的汽车都被蒙上了一层黄沙。空气亦如昨日被浮尘弄得甚为朦胧。今天白天,由于京城的上风地带仍有扬尘和沙尘暴,因此浮尘不会散去。

  《京华时报》说,北京的春天总是和沙尘以及大风联系在一起的。今天多云以及浮尘的天气不大适合外出。同时,北京上空今日依然被云带占据,因此天气仍以多云为主,预计昼夜温度在6℃到21℃左右。这样的天气虽然不算冷,但空气质量比较差。

  《北京晨报》说,京城明后两天还将迎来一次弱冷空气,四五级北风可能再次造成轻微的扬沙、浮尘天气。

  媒体亦建议市民最好减少外出,尤其是有慢性呼吸道疾病的民众要注意保护健康,外出最好戴上口罩。

  北京市气象台预计,受一股弱冷空气的影响,周五北京将有一次弱降雨过程。

有点意思

| | Comments(0) | TrackBacks(0)
       "有一个富人,每日忙着赚钱。一日去到海边度假,渔夫问他,你为什么如此忙碌?富人说为了赚更多的钱来海边晒太阳。渔夫说,我每天都可以在海边晒太阳呀"
    想起我在前年的一篇blog了,“如果拉三轮车也来钱,我将砸掉这台破电脑,从此金盆洗手,做一个快乐而幸福的文盲。”

突然之间不想飞

| | Comments(0) | TrackBacks(0)

  早上拉开窗帘,今天是一个阴天。
  手机里还留着昨晚的短讯,在手间似乎那还是热的。拉开冰箱,翻出昨晚剩下的面包,再烧点开水吧。
  我一直觉得自己是个冷静的人,但唯一能让人变傻的,只有感情了。很可惜,我在这方面似乎没有什么天分,比较适合做情场炮灰。知道赤壁大战吧,就是瞬时灰飞烟灭的那一种。
  但,突然之间不想飞... ...
  

JavaScript的发展

| | Comments(0) | TrackBacks(0)
Versions of JavaScript

Version

Description

JavaScript 1.0

这是最早的版本,其中充斥着大量的bug,现在已经遗弃了。 实现在 Netscape 2上

JavaScript 1.1

引入了真正的数组对象; 修复了大多数的重要bug, 实现在 Netscape 3上

JavaScript 1.2

引入了 switch 语法, 正则表达示等一系列的改进. 已经非常接近ECMA v1版本了, 但还有少许的不兼容. 实现在Netscape 4上.

JavaScript 1.3

解决了JavaScript 1.2的兼容问题. 实现在Netscape 4.5上.

JavaScript 1.4

仅实现在Netscape的服务器端

JavaScript 1.5

引入了异常机制,已经接近ECMA v3. 现实在Mozilla 和Netscape 6上.

JScript 1.0

大致与 JavaScript 1.0相当. 实现于 IE 3的早期发行版中.

JScript 2.0

大致与JavaScript 1.1相当. 实现于IE 3的后期版本中.

JScript 3.0

大致与JavaScript 1.3相当. 相当于ECMA v1了. 实现于IE 4中.

JScript 4.0

流产了

JScript 5.0

支持异常处理. 部分的兼容了ECMA v3. 实现于IE 5中.

JScript 5.5

大致相当于JavaScript 1.5.已经完全符合 ECMA v3. 实现于IE 5.5 和IE 6上. (IE 6实际上已经实现了 JScript 5.6, 但是 5.6与 5.5只是在服务器端不同 )

ECMA v1

这是第一个js的标准版本。它规范了JavaScript 1.1的基本特性还增加了一些新的功能。但没有对switch语法和正式表达示进行规范化,与之相应的是 JavaScript 1.3 和 JScript 3.0.

ECMA v2

这只是前一个版本的完善,并无太多特性.

ECMA v3

switch 语法, 正则表达示,和 异常处理规范化. 与这相应的是JavaScript 1.5 和JScript 5.5.

bloging二年

| | Comments(0) | TrackBacks(0)

  如果顺着右边的日历不断往前月翻,会停留在2004年4月9日的第一篇"第一次"。
  刚刚把2004年到2005月1月的日志从旧备份的blog系统中恢复到现在的blog系统中了,有一种刚刚找到失去很久的珍贵东西一样,至少我的blog历史是完整的了:)
  两年了,季节交替,人云浮游;忽然回头看一看两年前留下的文字,呵,更多的是一种开怀喜悦,春种秋实。
  困了,要安静的睡去了... ...

JAVA Puzzlers(2)

| | Comments(0) | TrackBacks(0)
Puzzle 2: Time for a Change(零钱问题)

我们来思考下面一个问题:
  Tom 到一家零件商店购买一个火花塞(应该是用于汽车上的那种),这个东西是$1.10, Tom翻遍了钱包,终于找出了2美元,那么请问,他将被找回多少零钱?

public class Change {
    public static void main(String args[]) {
        System.out.println(2.00 - 1.10);
    }
}

  这还用问吗,当然应该是答案0.90了,这个我在小学时老师就教过我了。听起来好像是这么回事,但是,那时老师似乎并没有教过我们JAVA,可事实上上面的程序是无法得到0.90这个答案的,而是 0.8999999999999999
  如果你知道一些关于把double类型转换成字符串的规则(这些在JAVA的api文档里有说明),你就会知道这个程序是打印出的东西不会是我们想要的。
  问题在于数1.1在double类型里是无法被精确表示,在double类型里,只能是最接近这个小数的一个double值。因为不是所有的十进制数都能精确的用二元浮点型(binary floating-point)来表示。如果你使用的是JAVA5.0或其以上版本,你可以用规范输出来解决这个问题:

// Poor solution - still uses binary floating-point!
System.out.printf("%.2f%n", 2.00 - 1.10);

  虽然上面的方法可以得到正确结果,但并不一个通用的解决方案,它仍然是double运算,还是二元浮点型。浮点运算只是提供一个最接近值而不是精确的结果。所以二元浮点型是不适宜进行货币运算。
  解决这个问题的一个方法是使用整型数据,如int或者long,当然了,你得确保整型是否能够满足你数值运算的需要,因为整型也有其最大和最小的极限。下面就是我们解决方法:
System.out.println((200 - 110) + " cents");//把美元换成美分,使用整型数据

  另一种方法就是使用BigDecimal(大+小数??),它可以精确的表示小数.但一条大家一定要记住了:一定要用BigDecimal(String)的构造器,而绝不要用BigDecimal(double)。因为BigDecimal(double)会创建一个过分精确的小数给你,如new BigDecimal(0.1),你得到的将是:0.1000000000000000055511151231257827021181583404541015625
  

import java.math.BigDecimal;
public class Change {
    public static void main(String args[]) {
        System.out.println(new BigDecimal("2.00").
                           subtract(new BigDecimal("1.10")));
    }
}

  总的来说,要避免在精确运算中使用float和double型的数据;在货币运算中,用int,long或者BigDecimal

开通AJAX栏目

| | Comments(0) | TrackBacks(0)
  其实还在重庆念本科的时候,就对javascript+DHtml很感兴趣,以至于经常在沙平坝的大书店里逗留。
  那时大家对js还并不是很重视,直到一年前,google带动了Ajax的开发热潮,不过,那时,我正在为flash的Ria而充满希望,我记得我在2004年的圣诞节夜,从北京理工大学出来,钻进出租车就打开笔记本演示我刚刚下载的flex demo,而车窗外则是那年冬天留下的积雪。
  从长远的看,flash的ria可能会是将来的王者,但基于网络环境和flash ria本身的一些不完善,至少在五年内,Ajax应该还是ria领域的leader。
  从去年开始,国内的IT评论家又开始鼓吹web2.0了,让我有些生厌,又一帮文人在吵概念了... ...
   所以这次新开的栏目是叫Ajax,主要是关注技术,而不叫web2.0。我讨厌概念。技术的衍生远丰富于概念... ...
  

JAVA Puzzlers(1)

| | Comments(0) | TrackBacks(0)

  《JAVA Puzzlers》是Joshua Bloch和他的老搭档Neal Gafter的新书。
  可能很多学习JAVA的朋友对于Joshua Bloch这个名字一定不会陌生。从1996年加入Java开发组以来,他已经成为了Java平台的核心架构设计师,他设计了获奖的Java Collection,还设计了java.math,他还是那本经典的java名著《effective Java》的作者。如果可以把James Gosling称作Java之父的话,那么把Joshua Bloch称作Java的教父一点都不过分。目前这位杰出的Java设计师于05年7月离开了sun,来到了google与他同时跳槽来到google还有他的死党Neal Gafter,看来google现在真的是人才济济了。
  我手上的是英文的电子版,初看了目录和前几章,但现在已经喜欢上这本书了,虽然现在书店里已经有中文版的上架了,但我还是在这里摘要翻译一些给大家,就当是自己重新学习与大家分享joy of java。
  这本书是按表达示,字符,循环,异常,类,库等出现的为大家所容易出错的一些问题进行分析和提出解决方案。ok,那我就开始了。


Puzzle 1: Oddity(奇数问题)
  下面提供的方法是判断一个数是否是一个奇数。嗯,但它会正常工作吗?

public static boolean isOdd(int i) {
    return i % 2 == 1;
}


  奇数,就是被2除不尽的数,也就是说被2除完之后会有个余数1。表达示 i % 2 计算 i被2除后的余数, 这样看起来好像上面的isOdd(int)方法没有什么错. Unfortunately, 并不是这样,实际上会有1/4的机会得到的是错误值。
  四分之一,为什么?因为在整数里,有一半是负数,而负数里的奇数是这一半的一半,就是四分之一了。但上面提供的判断奇数的方法,当参数是负数时,其返回值都是false。(问题出现了)
  其实这问题是出在java对%运算符的处理过程上。在Java中,当i是一个负数时 i % 2 是等于 -1 而不是 1
    既然是这样,这问题就比较好解决了:

public static boolean isOdd(int i) {
    return i % 2 != 0;
}


  如果是出于对程序效率有较高的要求,我们有个更的解决方法,就是用关系表达示:

public static boolean isOdd(int i) {
    return (i & 1) != 0;
}


  后一个方法,会比上一个方法快很多。在一般来说,除法运算和取余运算会比其它算术运算和逻辑运算慢一些。当了,It's a bad idea to optimize prematurely(这句话颇有哲理)...

为vsftpd建立虚拟用户

| | Comments(0) | TrackBacks(0)

  在RedHat AS里,是自带了vsftpd为系统提供了一个ftp服务,但在实际应用中根据自己的需要还是要做不少的配置。
  as we know,在建立vsftpd用户时,我们一般是在linux下建立用户useradd的方式来访问ftp,但有时我们只想提供ftp服务,而避免用户用ftp的帐号去登录linux,采用一般的方式只能是限制该用户的访问权限,但还是避免不了用户登录进linux系统,所以比较好的方法是用vsftpd的虚拟用户(virtual users)。
  下面我就给大家介绍一下具体的操作方法,由于讲的时间比较长,大家自备板凳了... ...
  大家通过ssh登录到linux系统上,在/usr/share/doc/vsftpd/EXAMPLE/VIRTUAL_USERS/目录上,看找到四个文件:README,logins.txt,vsftpd.conf,vsftpd.pam。
  其中README是说明文件,但我在实际操作中,发现这个文档有些地方讲的很模糊,而且是E文的,所以大家参考一下就行了,我正面的操作过程是这个文档的一个扩充。
  1) Create the virtual users database.(建立虚拟用户数据库)
  大家看一下logins.txt文件的格式,它的内容是:
  tom
  foo
  fred
  bar
  意思是说用户tom的密码是foo,用户fred的密码是bar,这就是虚拟用户的信息,大家可以按
  <用户名>
  <密 码>
  的格式来建立自己的虚拟用户群。
  然后以root用户登录系统,建立用户数据库:
  db_load -T -t hash -f logins.txt /etc/vsftpd_login.db
  该命令会建立一个文件 /etc/vsftpd_login.db ,同时改变它的文件属性:
  chmod 600 /etc/vsftpd_login.db
  2) Create a PAM file which uses your new database.(建立PAM文件,告诉系统你要使用自己的数据库了)
  看看另一个文件vsftpd.pam,它有两行内容:
  auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login
  account required /lib/security/pam_userdb.so db=/etc/vsftpd_login
  这是告诉系统,我将用新的用户授权库了。ok,把这个文件copy到/etc/pam.d/ftp:
  cp vsftpd.pam /etc/pam.d/ftp
  3) Set up the location of the files for the virtual users(为虚拟用户建立文件夹)
  useradd -d /home/ftpsite virtual
  ls -ld /home/ftpsite
  (会得到以下输出):
  drwx------ 3 virtual virtual 4096 Jul 30 00:39 /home/ftpsite
然后:
  cp /etc/hosts /home/ftpsite
  chown virtual.virtual /home/ftpsite/hosts
  4)修改vsftpd.conf文件
  文件在/etc/vsftpd/vsftpd.conf,在后面加上:
  anonymous_enable=NO
  local_enable=YES
  write_enable=NO (注:这里可按需求设置)
  anon_upload_enable=NO
  anon_mkdir_write_enable=NO
  anon_other_write_enable=NO
  chroot_local_user=YES
  guest_enable=YES
  guest_username=virtual
  user_config_dir=/etc/vsftpd_user_conf

  5)建立用户的权限
  先mkdir /etc/vsftpd_user_conf
  //开放tom和fred的读权限
  #echo "anon_world_readable_only=NO">/etc/vsftpd_user_conf/tom
  #echo "anon_world_readable_only=NO">/etc/vsftpd_user_conf/fred 
       这样就可以用读权限了,能看到目录和文件。
  6)重启vsftpd
  service vsftpd restart
  ok,用tom用户登录ftp看看,是不是已经可以了:)

赛百味

| | Comments(0) | TrackBacks(0)
  中午在赛百味里啃着金枪鱼的三明治。
  刚吃到一半,店里就塞满了一群韩国人,而欧美的学生则习惯打包带走。
  据说五道口这地方以前很破旧,自从来了这群韩国人,周围的房价也就被炒起来了,餐馆也多了,各种商店也冒出来了。
  窗外的树枝也开始发绿芽了,但最近的天气好像是在恋爱一般,忽冷忽热,很有点让人无法适应。
  听说明天有雨加雪,不知是不是真的... ...

第25届香港电影金像奖

| | Comments(0) | TrackBacks(0)

http://image2.sina.com.cn/ent/pc/2006-03-30/55/U105P28T55D6583F927DT20060330150431.jpg

第25届香港电影金像奖完全获奖名单
 第25届香港电影金像奖完全获奖名单 最佳影片
 《龙城岁月》
 第25届香港电影金像奖完全获奖名单 最佳导演
 杜琪峰(《龙城岁月》)
 第25届香港电影金像奖完全获奖名单 最佳编剧
 游乃海、叶天成(《龙城岁月》
 第25届香港电影金像奖完全获奖名单 最佳男主角
 梁家辉(《龙城岁月》)
 第25届香港电影金像奖完全获奖名单 最佳女主角
 周迅(《如果·爱》)
 第25届香港电影金像奖完全获奖名单 最佳男配角
 黄秋生(《头文字D》)
 第25届香港电影金像奖完全获奖名单 最佳女配角
 毛舜筠《早熟》
 第25届香港电影金像奖完全获奖名单 最佳新演员
 周杰伦《头文字D》
 第25届香港电影金像奖完全获奖名单 最佳摄影
 鲍德熹(《如果·爱》)
 第25届香港电影金像奖完全获奖名单 最佳剪接
 邱志伟(《三岔口》
 第25届香港电影金像奖完全获奖名单 最佳美术指导
 奚仲文、黄炳耀(《如果·爱》
 第25届香港电影金像奖完全获奖名单 最佳服装造型设计
 奚仲文、吴里璐(《如果·爱》)
 第25届香港电影金像奖完全获奖名单 最佳动作设计
 甄子丹(《杀破狼》)
 第25届香港电影金像奖完全获奖名单 最佳原创电影音乐
 金培达、高世章(《如果·爱》)
 第25届香港电影金像奖完全获奖名单 最佳原创电影歌曲
 《如果·爱》(《如果·爱》)
 作曲:金培达 填词:姚谦 主唱:张学友
 第25届香港电影金像奖完全获奖名单 最佳音响效果
 曾景祥(《头文字D》)
 第25届香港电影金像奖完全获奖名单 最佳视觉效果
 黄宏显、黄宏达、张仲华(《头文字D》)
 第25届香港电影金像奖完全获奖名单 新晋导演
 毕国智(《海南鸡饭》
 第25届香港电影金像奖完全获奖名单 最佳亚洲电影
 《可可西里》(中国)
 第25届香港电影金像奖完全获奖名单 专业精神奖
 汪长智

回来了

| | Comments(0) | TrackBacks(0)
  看着凉台上晾着的一堆衣服,心里颇有些成就感。
  这是我这两个星期所压积的衣服的一部分...
  从西安出发的火车在早上六点半就停在北京西站了。北京比西安凉多了,出租车司机都惊讶我们的一身夏装。
  原来我以为我已经吃遍了西安的小吃,直到昨天下午小欢给我介绍回民街的小吃时,我才知道,好的东西都在后面,现在仍然十二分挂念,还是省去流口水的描述吧。
  在西安的影音店里淘到了一个版本不错的"肖恩克的营救"DVD,但还是没有导演评论等花絮,下次再继续淘吧;不过花50个大洋,买了一个还不错的磨砂茶杯,以后在办公室泡茶,也算有了个不错茶具。
  听听“雅鲁藏布江”的mp3,喝喝茶,心静如一... ...

咸阳

| | Comments(0) | TrackBacks(0)
  昨日从西安去咸阳电信。
  没想到西安到咸阳会这么近。出了西安城,就见头上的大指示牌写着:“咸阳6公里”。
  咸阳电信的大楼当然不能和在西高新的陕西电信大楼相比了,但这里,聚积着咸阳最富裕的一群人。咸阳电信楼下竟然围了一圈的中国移动,联通的贩卡小商贩...
  昨日的演示,还比较顺利,只是在中午决定和咸阳电信的人去哪吃饭时,确实犯了一会难,因为周围的饭馆似乎生意很异常的好。打了两辆车,终于在印有四个大字的饭馆前停下了,上书:“北京烤鸭”... ...

第一站:西安

| | Comments(0) | TrackBacks(0)
  这好像是第四次到西安了,经历了冬去春来。
  这个城市有很浓的春天味道了,街道旁的绿色很清醒。中午有洒水车飞驰而过,飞溅的水粒给人细雨的感觉。
  中午吃完饭回来,在宾馆就开始在网上开会,在外出差的作息和北京那边会有些差别。西安的天气嘛,今天有点阴沉,据出租车司机说,昨天刚下过雨。唉,怎么就北京不肯下雨。
  在网上,和一个很多年没见的济南朋友聊了几句,他很诧异我还记得他,记得一起在山东电信的旁边一起吃过铁狮子头,并开心地约好有空大家在济南再聚聚。这位朋友好像当过兵,是一个很高大的山东人,他说他不再做技术了,已经转向销售了。
  今天还听同事深有感触的说,人和人之间,就像是一个个按轨道运行的恒星,一点点角度的差异,就能让大家相遇或离别或相隔很近却永不会相遇。所以,可能大家认识了很久,但从未见面;好不容易见面了,却又分开;相邻的登机牌,却不是同一架飞机... ...
  西安的大街上,吃的馆子非常的多。来了四次,每次都能吃上不同的西安小吃,今晚的羊肉加馍吃的真饱。
  
    
  在青岛的两天两夜,给我的记忆好像很多,也好像什么都没有。
  从海边到办公室,从机场到北京的居所,当地理的距离化为时间的长短时,更多的阻碍是在我们自己的心里。
  中午饿了很久,才下楼。周围又是熟悉的一切,餐厅里竟然放着陈昇的"北京一夜",我讨厌这种情绪。
  今天办公室里的气氛有点特别,可能大家都有不少心事。我才离开北京两天,就好像已经发生了很多事情。看来下次我应该准备好了再远行,别再这么任意随行。
  12点的时候,一位深圳的淘宝店家给我打电话,询问我对商品哪里不满意,会给她一个中评,我很客观的告诉了她我的不满意。对于她的主动承认错误和愿意退一部分款让我很赞同,所以我答应她我可以把评价改回来,其实批评如果换成鼓励,结果会更有效:)   有时我都恨我自己怎么对人太好了,其实要变坏也很简单,但不知怎样的坏才适合我... ...

最近的留言

John发表于JAVA Puzzlers下载: Java Puzzl
justified发表于JAVA Puzzlers下载: 你能给我传一下电子版
John发表于Google公司十大彩色幽默(ZT): 呵,对,就是叫“幸福
燕子翔发表于Google公司十大彩色幽默(ZT): 那部电影的名字叫做《
John发表于读史记5:   讙兜推荐共工,尧
John发表于读史记4:   尧说:“哪一位能
John发表于读史记3:   帝喾娶陈锋氏的女
John发表于很美,很美,昨晚奥运开幕式带妆彩排的炫目烟火: 现场更美了
bannoorse发表于很美,很美,昨晚奥运开幕式带妆彩排的炫目烟火: 真是太美了!
bannoorse发表于很美,很美,昨晚奥运开幕式带妆彩排的炫目烟火: 真是太美,太壮观了!
John发表于读史记2:   黄帝共有二十五个
John发表于读史记1: 译:   黄帝是少典
John发表于谁的Bug ?: 嗯,对。一直觉得JA
huang发表于谁的Bug ?: Calendar中的
John发表于Kernel的编译过程(freebsd): 终于等到骆驼了,期待