<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>外刊IT评论</title>
	<atom:link href="http://www.aqee.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.aqee.net</link>
	<description>国外IT评论,编程技巧,网站开发趋势</description>
	<lastBuildDate>Thu, 02 Sep 2010 15:42:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>【外刊IT评论】HTML5 &#8211; 一个访问本地文件的例子</title>
		<link>http://www.aqee.net/2010/09/02/html5-code-example-of-file-api-drag-drop-hard-drive-files-to-a-webpage/</link>
		<comments>http://www.aqee.net/2010/09/02/html5-code-example-of-file-api-drag-drop-hard-drive-files-to-a-webpage/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 15:42:07 +0000</pubDate>
		<dc:creator>花非花</dc:creator>
				<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://www.aqee.net/?p=714</guid>
		<description><![CDATA[在前面的几篇文章里，我向大家共享了几个HTML5的例子，分别是拖拽功能演示，页面内容可编辑化演示 和 本地存储功能演示。&#160; 今天，我将向大家分享一个简单的应用，用来演示使用FileReader的方法, FileReader是HTML5里提供的一个文件操作API。&#160; 
  

    当你在看我前面所写的HTML 5例子时，我正在思考创建一个简单但又适用的例子、以一种更新奇的方式来演练这些HTML5新特性。我的目标并不是想单纯的展示这些HTML 5 API，而是想用例子来告诉开发人员如何真正的以一种实用的和创新的方式实现这些API。
    
  

    在HTML5里，从Web网页上访问本地文件系统变的十分的简单，那就是使用File API。这个File规范说明里提供了一个API来表现Web应用里的文件对象，你可以通过编程来选择它们，访问它们的信息。这个File API包括：
    
  
  

    
一个FileList序列，代表着由本地系统里选中的单个的文件组成的数组。用来选择文件的用户接口可以通过&#60;input type=&#8221;file&#8221;&#62;调用实现。
    
  
  

    
一个Blob接口，它代表原始二进制数据，通过Blob对象你可以访问里面的字节数据。
    [...]]]></description>
			<content:encoded><![CDATA[<p>在前面的几篇文章里，我向大家共享了几个HTML5的例子，分别是<a href="http://www.aqee.net/2010/08/19/html5-an-example-of-drag-and-drop/"><wbr>拖拽功能演示</a><wbr>，<a href="http://www.aqee.net/2010/08/26/html5-code-example-of-contenteditable-and-localstorage/"><wbr>页面内容可编辑化演示</a><wbr> 和 <a href="http://www.aqee.net/2010/08/26/html5-code-example-of-contenteditable-and-localstorage/"><wbr>本地存储功能演示</a><wbr>。&nbsp; 今天，我将向大家分享一个简单的应用，用来演示使用<a href="http://www.w3.org/TR/FileAPI/#dfn-filereader"><wbr>FileReader</a><wbr>的方法, <a href="http://www.w3.org/TR/FileAPI/#dfn-filereader"><wbr>FileReader</a><wbr>是HTML5里提供的一个<a href="http://www.w3.org/TR/FileAPI/"><wbr>文件操作API</a><wbr>。&nbsp; <br /><span id="more-714"></span><br />
  <wbr></p>
<p><wbr><br />
    <wbr>当你在看我前面所写的HTML 5例子时，我正在思考创建一个简单但又适用的例子、以一种更新奇的方式来演练这些HTML5新特性。我的目标并不是想单纯的展示这些HTML 5 API，而是想用例子来告诉开发人员如何真正的以一种实用的和创新的方式实现这些API。<br />
    <wbr></p>
<p>  <wbr></p>
<p><wbr><br />
    <wbr>在HTML5里，从Web网页上访问本地文件系统变的十分的简单，那就是使用File API。这个File规范说明里提供了一个API来表现Web应用里的文件对象，你可以通过编程来选择它们，访问它们的信息。这个File API包括：<br />
    <wbr></p>
<p>  <wbr><br />
  <wbr></p>
<ul>
    <wbr></p>
<li>一个<b>FileList</b>序列，代表着由本地系统里选中的单个的文件组成的数组。用来选择文件的用户接口可以通过&lt;<wbr>input type=&#8221;<wbr>file&#8221;<wbr>&gt;<wbr>调用实现。</li>
<p>    <wbr>
  </ul>
<p>  <wbr></p>
<ul>
    <wbr></p>
<li>一个<b><wbr>Blob</b>接口，它代表原始二进制数据，通过Blob对象你可以访问里面的字节数据。</li>
<p>    <wbr>
  </ul>
<p>  <wbr></p>
<ul>
    <wbr></p>
<li>一个<b><wbr>File</b><wbr>接口，它里面存有文件的只读属性信息，像文件名，文件类型，文件数据访问的地址。</li>
<p>    <wbr>
  </ul>
<p>  <wbr></p>
<ul>
    <wbr></p>
<li>一个<b><wbr>FileReader</b><wbr>接口，它提供了读取一个文件的方法，和一个获取文件读取结果的事件模型。</li>
<p>    <wbr>
  </ul>
<p>  <wbr></p>
<ul>
    <wbr></p>
<li>一个<wbr><b><wbr>FileError</b><wbr>接口和一个FileException对象，它们用来定义这个规范中的错误产生条件。</li>
<p>    <wbr>
  </ul>
<p>  <wbr></p>
<p><wbr><b><wbr>如何使用这个例子：</b><wbr>在这个例子中，我给出了一个画板，你可以从本地文件系统里拖拽进去一个图片，或者你也可以用文件选择框来选择图片。例子中，请只选择图片文件，我并没有添加文件过滤和文件类型检查。请记住，没有一个浏览器完全实现了HTML5，这个例子需要在支持HTML5的浏览器上运行，比如Firefox3.5以上。 <br />
    <wbr></p>
<p>  <wbr></p>
<p><wbr><br />
    <wbr><b><wbr>下面就是这个例子</b><wbr> (拖拽一个图片到画板里)：<br />
    <wbr></p>
<p>  <wbr><br />
  <wbr><br />
  <center><br />
    <wbr><br />
    <iframe src="/docs/file_dd.html" width="100%" frameborder="0" height="210">&lt;wbr&gt; </iframe><br />
    <wbr><br />
  </center><br />
  <wbr> <br />
  <wbr></p>
<p><wbr><b><wbr>实现File API的主要方法非常的简单，就像下面：</b><wbr></p>
<p>  <wbr><br />
  <wbr></p>
<blockquote><p><wbr>function imag<wbr>esSe<wbr>lect<wbr>ed(m<wbr>yFil<wbr>es) {<br />
    <wbr>&nbsp; for (var i = 0, f; f = myFiles[i]; i++) {<br />
    <wbr>&nbsp;&nbsp;&nbsp; var imageReader = new FileReader();<br />
    <wbr>&nbsp;&nbsp;&nbsp; imageReader.onload = (function(aFile) {<br />
    <wbr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return function(e) {<br />
    <wbr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var span = docu<wbr>ment<wbr>.cre<wbr>ateE<wbr>leme<wbr>nt(&#8217;<wbr>span<wbr>&#8216;);<br />
    <wbr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; span.innerHTML = ['&lt;<wbr>img class="<wbr>images"<wbr> src="<wbr>', e.target.result,'"<wbr> title="<wbr>', aFile.name, '"<wbr>/&gt;<wbr>'].join(&#8221;);<br />
    <wbr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; docu<wbr>ment<wbr>.get<wbr>Elem<wbr>entB<wbr>yId(<wbr>&#8216;thu<wbr>mbs&#8217;<wbr>).in<wbr>sert<wbr>Befo<wbr>re(s<wbr>pan,<wbr> null);<br />
    <wbr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br />
    <wbr>&nbsp;&nbsp;&nbsp; })(f);<br />
    <wbr>&nbsp;&nbsp;&nbsp; imag<wbr>eRea<wbr>der.<wbr>read<wbr>AsDa<wbr>taUR<wbr>L(f)<wbr>;<br />
    <wbr>&nbsp; }<br />
    <wbr>}<br />
    <wbr><br />
    <wbr>function dropIt(e) {&nbsp; <br />
    <wbr>&nbsp;&nbsp; imag<wbr>esSe<wbr>lect<wbr>ed(e<wbr>.dat<wbr>aTra<wbr>nsfe<wbr>r.fi<wbr>les)<wbr>; <br />
    <wbr>&nbsp;&nbsp; e.st<wbr>opPr<wbr>opag<wbr>atio<wbr>n();<wbr>&nbsp; <br />
    <wbr>&nbsp;&nbsp; e.pr<wbr>even<wbr>tDef<wbr>ault<wbr>();&nbsp;<wbr>&nbsp; <br />
    <wbr>}&nbsp; <br />
    <wbr></p></blockquote>
<p>  <wbr><b><wbr>我选择在&lt;<wbr><wbr><wbr>td&gt;<wbr><wbr><wbr>上放置我的ondrop事件：<br />
  <wbr><wbr><wbr></b><wbr></p>
<div class="entryContentContainer"><wbr><wbr><wbr></p>
<blockquote><p><wbr><wbr><wbr>&lt;<wbr>td align=&#8221;<wbr>left&#8221;<wbr> height=&#8221;<wbr>105&#8243;<wbr> ondragenter=&#8221;<wbr>return false&#8221;<wbr> ondragover=&#8221;<wbr>return false&#8221;<wbr> ondrop=&#8221;<wbr>dropIt(event)&#8221;<wbr>&gt;<wbr>&nbsp;&nbsp;&nbsp; <br />
      <wbr>&nbsp;&nbsp; &lt;<wbr>output id=&#8221;<wbr>thumbs&#8221;<wbr>&gt;<wbr>&lt;<wbr>/output&gt;<wbr> <br />
      <wbr>&lt;<wbr>/td&gt;<wbr><br />
      <wbr><wbr><wbr></p></blockquote>
<p>    <wbr><wbr><wbr><b><wbr><wbr><wbr>你可以下载这个例子中所有HTML代码，</b><wbr><wbr><wbr> <a href="https://www.ibm.com/developerworks/mydeveloperworks/files/app?lang=en#/person/270000CN12/file/c12b834e-5ec2-457d-80fa-97df433938d7"><wbr>点击下载</a><wbr><wbr><wbr>。<br />
    <wbr><wbr><wbr></p>
<p><wbr><wbr><wbr><br />
      <wbr><wbr><wbr>这个例子中，我只是拖拽本地文件到画板里。然而我想它能向你表明File API的简单但强大的能力。 <br />
      <wbr></p>
<p>    <wbr></div>
<p>  <wbr><br />
  <wbr><br />
  <wbr> </p>
<hr />
<p><small>©  <a href="http://www.aqee.net">外刊IT评论</a>, 2010. |
<a href="http://www.aqee.net/2010/09/02/html5-code-example-of-file-api-drag-drop-hard-drive-files-to-a-webpage/">永久链接</a> |
<a href="http://www.aqee.net/2010/09/02/html5-code-example-of-file-api-drag-drop-hard-drive-files-to-a-webpage/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.aqee.net/2010/09/02/html5-code-example-of-file-api-drag-drop-hard-drive-files-to-a-webpage/&title=HTML5 &#8211; 一个访问本地文件的例子">del.icio.us</a>
<br/>
Post tags: <a href="http://www.aqee.net/tag/html5/" rel="tag">html5</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.aqee.net/2010/09/02/html5-code-example-of-file-api-drag-drop-hard-drive-files-to-a-webpage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【外刊IT评论】优秀的产品能得到用户，优秀的服务能赢得粉丝</title>
		<link>http://www.aqee.net/2010/09/02/make-a-great-product-gain-a-user-have-great-support-earn-a-fan/</link>
		<comments>http://www.aqee.net/2010/09/02/make-a-great-product-gain-a-user-have-great-support-earn-a-fan/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 16:29:18 +0000</pubDate>
		<dc:creator>花非花</dc:creator>
				<category><![CDATA[心得体会]]></category>
		<category><![CDATA[服务]]></category>
		<category><![CDATA[粉丝]]></category>

		<guid isPermaLink="false">http://www.aqee.net/?p=709</guid>
		<description><![CDATA[上周Amazon公司邮件通知我，一位负责S3的产品经理要跟我聊聊我们对他们的服务的使用情况。（我们使用Amazon的S3提供各种图片和视频的存贮服务）。看起来我们有个绝好的机会来跟Amazon里面的人谈谈我们遇到的问题和希望得到的功能。
一接通电话，我们就完全明白了，这个人完全不是来提供服务的。他只是想了解我们的想法，去计划如何提高销售额和留住客户。我不想在这上面浪费我的时间，也不想把购买计划告诉Amazon来让他们扩大业务。我在电话里直接表达了我的意思。
为什么不呢？因为他们的服务不好。Amazon并不在乎我，所以我也不在乎他们。他们有个好的产品，他们得到了我这个客户，但他们没有好的服务，所以他们不能使我成为粉丝。

当我们有问题时，他们并不是想着来帮助我们。他们想的是迫使我们付服务付费，这每月要花掉500美元或者产品购买额的20%，这可不少。随着我们业务的增长，这笔费用可承受不了。Amazon不但不关心他们最大的客户们，反而去惩罚他们。我们被迫离去。
我在电话中告诉那个人，要想留住我们这个客户，Amazon需要去做的应该是提供更好的服务。我们需要更好的工具来分析用户使用习惯。我们需要更好 的工具来阻止误用。我们需要当有问题时直接跟Amazon取得联系。Amazon的业务代表看来并不在意这些，他太关注报价了。
我们使用的另外一个提供商是Rackspace。他们的做法正好相反，他们尽可能的提供最好的客户服务。他们想尽办法让我们满意。因为他们优秀的服 务，我成了他们的粉丝。我总是介绍YC公司使用Rackspace。如果Rackspace需要帮助，我会随时准备帮助。我希望我能为他们做更多的事，因 为他们很出色。
有大量的公司都为我所尊敬。Costco,    American Express, Rackspace，还有其它许多公司，我一直的在向人们推荐，尽管我不从他们那里得到一分钱。我要这样做，因为喜欢这些公司，因为他们在意我。他们提供出色的客户服务。我是他们的粉丝。
创建一个成功的公司，你需要的不仅仅是大量的用户。你需要粉丝，由衷的祝福你成功的粉丝。要想做到这些，你需要给与他们出色的产品以及出色的服务。

©  外刊IT评论, 2010. &#124;
永久链接 &#124;
No comment &#124;
Add to
del.icio.us

Post tags: 服务, 粉丝
]]></description>
			<content:encoded><![CDATA[<p>上周Amazon公司邮件通知我，一位负责S3的产品经理要跟我聊聊我们对他们的服务的使用情况。（我们使用Amazon的S3提供各种图片和视频的存贮服务）。看起来我们有个绝好的机会来跟Amazon里面的人谈谈我们遇到的问题和希望得到的功能。</p>
<p>一接通电话，我们就完全明白了，这个人完全不是来提供服务的。他只是想了解我们的想法，去计划如何提高销售额和留住客户。我不想在这上面浪费我的时间，也不想把购买计划告诉Amazon来让他们扩大业务。我在电话里直接表达了我的意思。</p>
<p>为什么不呢？因为他们的服务不好。<strong>Amazon并不在乎我，所以我也不在乎他们。他们有个好的产品，他们得到了我这个客户，但他们没有好的服务，所以他们不能使我成为粉丝。</strong><br />
<span id="more-709"></span><br />
当我们有问题时，他们并不是想着来帮助我们。他们想的是迫使我们付服务付费，这每月要花掉500美元或者产品购买额的20%，这可不少。随着我们业务的增长，这笔费用可承受不了。<strong>Amazon不但不关心他们最大的客户们，反而去惩罚他们。</strong>我们被迫离去。</p>
<p>我在电话中告诉那个人，要想留住我们这个客户，Amazon需要去做的应该是提供更好的服务。我们需要更好的工具来分析用户使用习惯。我们需要更好 的工具来阻止误用。我们需要当有问题时直接跟Amazon取得联系。Amazon的业务代表看来并不在意这些，他太关注报价了。</p>
<p>我们使用的另外一个提供商是Rackspace。他们的做法正好相反，他们尽可能的提供最好的客户服务。他们想尽办法让我们满意。因为他们优秀的服 务，我成了他们的粉丝。我总是介绍YC公司使用Rackspace。如果Rackspace需要帮助，我会随时准备帮助。我希望我能为他们做更多的事，因 为他们很出色。</p>
<p>有大量的公司都为我所尊敬。Costco,    American Express, Rackspace，还有其它许多公司，我一直的在向人们推荐，尽管我不从他们那里得到一分钱。我要这样做，因为喜欢这些公司，因为他们在意我。他们提供出色的客户服务。我是他们的粉丝。</p>
<p>创建一个成功的公司，你需要的不仅仅是大量的用户。你需要粉丝，由衷的祝福你成功的粉丝。要想做到这些，你需要给与他们出色的产品以及出色的服务。</p>
<hr />
<p><small>©  <a href="http://www.aqee.net">外刊IT评论</a>, 2010. |
<a href="http://www.aqee.net/2010/09/02/make-a-great-product-gain-a-user-have-great-support-earn-a-fan/">永久链接</a> |
<a href="http://www.aqee.net/2010/09/02/make-a-great-product-gain-a-user-have-great-support-earn-a-fan/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.aqee.net/2010/09/02/make-a-great-product-gain-a-user-have-great-support-earn-a-fan/&title=优秀的产品能得到用户，优秀的服务能赢得粉丝">del.icio.us</a>
<br/>
Post tags: <a href="http://www.aqee.net/tag/%e6%9c%8d%e5%8a%a1/" rel="tag">服务</a>, <a href="http://www.aqee.net/tag/%e7%b2%89%e4%b8%9d/" rel="tag">粉丝</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.aqee.net/2010/09/02/make-a-great-product-gain-a-user-have-great-support-earn-a-fan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【外刊IT评论】Android = Java</title>
		<link>http://www.aqee.net/2010/09/01/android-java/</link>
		<comments>http://www.aqee.net/2010/09/01/android-java/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 16:08:39 +0000</pubDate>
		<dc:creator>花非花</dc:creator>
				<category><![CDATA[Java评论]]></category>
		<category><![CDATA[心得体会]]></category>
		<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://www.aqee.net/?p=704</guid>
		<description><![CDATA[最近整个Java阵营都陷于一场讨论Oracle和Google之间关于Android平台的专利诉讼官司的混战中。我已经在很多地方都发表过我的观点，但这确实是个 重大的话题，需要在所有地方反复重申这个观点 &#8230; 所以，这篇文章就是要再次的完全的揭露事实真相。
第八大千禧年问题： Android = Java?
前几天，有研究者宣称找到了P != NP的证据,这在编程界引起了不小的兴趣——至少为此狂热了好几天，直到开始有评论家指出证据中有很多的缺陷。我在做计算机科学系学生时研究过这个题目，但说实话，我的高等数学的水平还达不到看懂这些证据的水平（P = NP? 是克雷数学研究所提出的七个千禧年数学问题中的一个。）所以，还是让我们来讨论一个稍微简单点的问题：Android是否相当于Java？请注意，我并没有说相等，我说的是相当，就像P = NP里的那样。

相当的类/字节码格式
在很多层面上，Android和Java都有明显的相当。Android应用程序是用Java(TM)语言写成的，使用JDK的javac(或等效工具，例如ECJ)来编译。这个过程产生标准的Java字节码（.class文件）。这些文件再转化成Android的.dex文件，从使用的角度来看，它就是一种不同格式的Java class文件。不错，这是一种更优秀的格式；对Sun自从1994年以来的设计有了很大的改进。但就如你可以把一个GIF格式的图片转换成更高级的完美的完全等效的PNG格式，尽管它们的字节流完全的不同。
等效的文件格式在细节的实现上非常的不同，主要是为了优化。就好比，如果我们简单的满足于低效率的视频数据流，没有采用高端的、跨不同框架的压缩技术，那我们就可以避免跟MPEGLA视频解码专利做斗争的麻烦了。
Android特异的classfile设计有好几种动机；而为了避免和Sun的知识产权保护冲突显然是一个主要的因素。不管怎样，Google并没有走的离Java足够远。两种文件格式非常的类似。它们在特定的底层数据结构上有区别，但这些结构体在语法上一致的，存储完全相同的信息。我相信在JavaSE或JavaME VM里可以轻易的在它们的系统classloader里添加一个.dex分析器来加载&#8221;Android classes&#8221;。
Android SDK 依赖于.java -&#62; .class -&#62; .dex 转换的事实情况既微不足道也毫无损失。“毫无损失”的事实很重要：当GIF = PNG 时，跟受损的JPG文件就不等了 ——  它解码不出完全相同的信息。如果JVM和Dalvik都各自独立，你很难写出一个相对简单的工具将一种编译过的代码转换成另一种 ——  而且不做任何妥协：不丢失信息，不使用冗余来补偿某种特征在一种VM中是first-class而在另一种中却不是的情况，不需要额外的runtime层 上在一种VM中实现另一种VM的核心API。
(我知道dx转换器有多么的复杂。我看过它的源代码。那个字节码转换器是一个巨大的，全功能的反编译/重编译器，通 过SSA构造完成。但是这个转换器在概念上仍然是无足轻重的；从Java字节码到Dalvik字节码的映射在设计上是很平滑的。堆栈相对于寄存器架构中细 节上进行了优化；而重要的东西，例如VM层的类型系统是完全一致的。)
VM相当
这Dalvik 和 JVM 的相当也是很容易看清楚的。并不只是源代码或字节码格式上的问题：它们的runtime对等物上也一样。一但一个&#8221;Android class&#8221;被加载到Dalvik VM里，它就会像Java class一样运行，像Java class一样工作。 如果你懂得Java编程(深入到高级的，底层的细节)，你也就懂得Android编程。你只需要学一些新的API和框架概念。他们是对等的系统。
是否记得微软的.NET? 当.NET刚出世时，Java阵营迅速的反击指责.NET是对Java的剽窃。我也是其中的一份子，但今天我看问题更清楚了。是的，它过去是个严重的剽窃产品；C# 1.0 就是一个&#8230; 区分一种语言和另一种语言最简单的方法就是看它们的惯用风格 —— 例如toString() 相对于 ToString()。    [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_705" class="wp-caption alignright" style="width: 130px"><img class="size-full wp-image-705" title="opinali2_sml" src="http://www.aqee.net/wordpress/wp-content/uploads/2010/09/opinali2_sml.png" alt="作者opinali" width="120" height="120" /><p class="wp-caption-text">作者opinali</p></div>
<p>最近整个Java阵营都陷于一场讨论Oracle和Google之间关于Android平台的专利诉讼官司的混战中。我已经在很多地方都发表过我的观点，但这确实是个 重大的话题，需要在所有地方反复重申这个观点 &#8230; 所以，这篇文章就是要再次的完全的揭露事实真相。</p>
<h3>第八大千禧年问题： Android = Java?</h3>
<p>前几天，有研究者宣称找到了P != NP的证据,这在编程界引起了不小的兴趣——至少为此狂热了好几天，直到开始有评论家指出证据中有很多的缺陷。我在做计算机科学系学生时研究过这个题目，但说实话，我的高等数学的水平还达不到看懂这些证据的水平（P = NP? 是<a title="克雷数学研究所" href="http://zh.wikipedia.org/zh-cn/%E5%85%8B%E9%9B%B7%E6%95%B8%E5%AD%B8%E7%A0%94%E7%A9%B6%E6%89%80">克雷数学研究所</a>提出的七个千禧年数学问题中的一个。）所以，还是让我们来讨论一个稍微简单点的问题：<strong>Android是否相当于Java？</strong>请注意，我并没有说<em><strong>相等</strong></em>，我说的是<em><strong>相当</strong></em>，就像P = NP里的那样。<br />
<span id="more-704"></span></p>
<h3>相当的类/字节码格式</h3>
<p>在很多层面上，Android和Java都有明显的相当。Android应用程序是用Java(TM)语言写成的，使用JDK的<em>javac</em>(或等效工具，例如ECJ)来编译。这个过程产生标准的Java字节码（<em>.class</em>文件）。这些文件再转化成Android的<em>.dex</em>文件，从使用的角度来看，它就是一种不同格式的Java class文件。不错，这是一种更优秀的格式；对Sun自从1994年以来的设计有了很大的改进。但就如你可以把一个GIF格式的图片转换成更高级的完美的完全等效的PNG格式，尽管它们的字节流完全的不同。</p>
<p>等效的文件格式在细节的实现上非常的不同，主要是为了优化。就好比，如果我们简单的满足于低效率的视频数据流，没有采用高端的、跨不同框架的压缩技术，那我们就可以避免跟MPEGLA视频解码专利做斗争的麻烦了。</p>
<p>Android特异的classfile设计有好几种动机；而为了避免和Sun的知识产权保护冲突显然是一个主要的因素。不管怎样，Google并没有走的离Java足够远。两种文件格式<em>非常</em>的类似。它们在特定的底层数据结构上有区别，但这些结构体在语法上一致的，存储完全相同的信息。我相信在JavaSE或JavaME VM里可以轻易的在它们的系统classloader里添加一个<em>.dex</em>分析器来加载&#8221;Android classes&#8221;。</p>
<p>Android SDK <strong>依赖于</strong><em>.java</em> -&gt; <em>.class</em> -&gt; <em>.dex</em> 转换的事实情况既微不足道也毫无损失。“毫无损失”的事实很重要：当GIF = PNG 时，跟受损的JPG文件就不等了 ——  它解码不出完全相同的信息。如果JVM和Dalvik都各自独立，你很难写出一个相对简单的工具将一种编译过的代码转换成另一种 ——  而且不做任何妥协：不丢失信息，不使用冗余来补偿某种特征在一种VM中是first-class而在另一种中却不是的情况，不需要额外的runtime层 上在一种VM中实现另一种VM的核心API。</p>
<p><em>(我知道</em>dx<em>转换器有多么的复杂。我看过它的源代码。那个字节码转换器是一个巨大的，全功能的反编译/重编译器，通 过SSA构造完成。但是这个转换器在概念上仍然是无足轻重的；从Java字节码到Dalvik字节码的映射在设计上是很平滑的。堆栈相对于寄存器架构中细 节上进行了优化；而重要的东西，例如VM层的类型系统是完全一致的。)</em></p>
<h3>VM相当</h3>
<p>这Dalvik 和 JVM 的相当也是很容易看清楚的。并不只是源代码或字节码格式上的问题：它们的runtime对等物上也一样。一但一个&#8221;Android class&#8221;被加载到Dalvik VM里，<strong>它就会像Java class一样运行，像Java class一样工作。</strong> 如果你懂得Java编程(深入到高级的，底层的细节)，你也就懂得Android编程。你只需要学一些新的API和框架概念。他们是对等的系统。</p>
<p>是否记得微软的.NET? 当.NET刚出世时，Java阵营迅速的反击指责.NET是对Java的剽窃。我也是其中的一份子，但今天我看问题更清楚了。是的，它<em>过去</em>是个严重的剽窃产品；C# 1.0 就是一个&#8230; 区分一种语言和另一种语言最简单的方法就是看它们的惯用风格 —— 例如<em>toString()</em> 相对于 <em>ToString()</em>。     但在最重要的VM规范里，微软做了很大的功课。它的CLR,CLI,和核心框架，都非常的不同于Java，所以我们不能说JVM =  CLR这个等式。你不可能使用一个简单的文件格式转换工具把你编译好的Java class转换成能在.NET runtime上运行的代码。</p>
<p>要证据吗？你只需看一看<a href="http://www.ikvm.net/" target="_blank">IKVM</a>就知道了。这是一个非常有趣的项目，它能够使Java和.NET跨平台兼容，于是，你的Java代码可以在不做修改的情况下在CLR（或者是等效的.NET runtime，比如<a href="http://www.mono-project.com/" target="_blank">Mono</a>)上运行&#8230; 但IKVM<strong>并不是</strong>一个简单的、类<em>dx</em>的 文件格式转换器。对Java  class的转化、对Java核心API的适配，都是十分的复杂，即使对一个简单的HelloWorld程序也是这样。各个平台的内部机制，如反射，安 全，并行，异常处理，字节码验证，I/O，以及其它核心API，特征上大致相同，但是在细节上完全不同，一些死胡同的情况会迫使IKVM不得不钻越一个又 一个的火圈来让Java代码运行到了.NET  VM上。它需要依赖于一个巨大的额外的runtime层，来适配从OpenJDK源代码里来的完整JavaSE  API。我大致的关注IKVM的开发已经有数年了 —— 我阅读这精彩的<a href="http://weblog.ikvm.net/" target="_blank">IKVM 博客</a> &#8211; 所以我完全清楚他们为了让Java程序和JavaSE应用适配到.NET上所做的巨大的努力。(这项工作仍然没有完工；而且很多部分都需要以丧失某些性能为代价。)</p>
<p><em>(老的<span style="text-decoration: line-through;">Visual J++</span> Visual J# 也不是一个简单的      Java-to-.NET 转换器。我不想讨论它，但我们完全可以说Visual J# 对Java的兼容并不比最早期的IKVM强多少。)</em></p>
<p>我把P =  NP引进来了讨论；有些人把图灵等效(Turing-equivalence)理论引进来，说任何图灵完备的平台/语言/VM都是相互等价的。这也没错， 但与本论题无关。图灵模型这种方式太泛化了；使用这种表面价值来考量会把更个软件专利系统摧毁(尽管这不是个坏事！)。我们需要在地上为JVM等效画条 线，一条更接近实用需求而远离图灵等效的线。按我的观点，这微不足道的二进制格式转换，穷尽的高层源代码和runtime的兼容，使Android明显的 处于Java等效的这条线内。</p>
<h3>APIs 和 Runtime 相当</h3>
<p>Android使用了一个相当大的JavaSE APIs子集。这些APIs  (来自于Harmony项目)都是全新的实现，但它们是以JavaSE为模子。如果不是因为TCK许可证问题，Harmony完全可以取得JavaSE认 证。但这并没有改变这样的一个事实：Harmony 和      JavaSE APIs是 <em>完全的</em>等效的 —— 这是特意的，不是偶然的。就像Charles Nutter——有名的JRuby人物——<a href="http://blog.headius.com/2010/08/my-thoughts-on-oracle-v-google.html" target="_blank">最近写道</a>:</p>
<blockquote><p><em>Android支持一个不完整的（但相当大的）Java 1.5 类库子集。这个子集大到<strong>一个复杂的JRuby项目几乎不经任何修改就能在Android上运行，</strong>很少有限制情况。</em></p></blockquote>
<p>看起来Dalvik对JVM是如此的接近，它不得不完全兼容大部分的JVM规范，包括完全详细的JMM (就像Android支持Java风格的线程和并发，已经深入到了高级的<em>java.util.concurrent</em>包里了)。可为什么有如此多的”Dalvik是个新VM“或”Dalvik不能运行Java类“的说法呢(90%的讨论这场诉讼的论坛和博客都持这种观点)。</p>
<h3>最后的思考</h3>
<p>这篇博客并不是关于Oracle和Google诉讼官司的法律依据的。我将会忽略（我会删除掉）那些跑题的评论（跟Android = Java不相关的话）。我只是讨厌那些&#8221;<em>Android跟Java完全没关系</em>&#8220;的胡说八道;Google和 Android的拥护者必须要找一个更有意义的论据。</p>
<p><em>(我将拭目以待这场官司的进展，带着我所有的预见，直到所有细节和最终结果都出来。除非你有内部消息（我没有），<strong>不要太天真。</strong> <a href="http://www.java.net/blog/fabriziogiudici/archive/2010/08/13/oracle-vs-google-stay-cool">保持冷静。</a> 我们并不知道Oracle的 —— 或 Google的 ——  真正的全部动机和计划。我们并不知道这荧幕背后的故事，自从2007年Google首次宣告Android的诞生(这导致了JavaME生态环境的崩 溃),  Sun就痛恨不已，但最后还是不得不夹着尾巴行事。我不相信任何一个有10亿美金的股东控股公司会有利他主义的动机：Google不会，Oracle不 会，即使我喜爱的老的Sun公司也不会。我们等着看吧。</em><em>)</em></p>
<p>我不相信Google没有能力创造出一种既不背离Java太远，又以Java风格为基础的平台（就像.NET做的那样）。  Dalvik，以及Android框架，它们可能是在权衡了与大量的现有的Java程序，类库，Java天才，和Java工具链高度兼容的愿望的最后结 果。微软在一咬牙一跺脚后放弃了现成移植Java带来的好处，创造了全新的.NET。Google没有这样做。</p>
<p>这个Android =  Java等式显然并不是包括所有的东西（不是一一对应的）。每种平台都有自己一些独特的API，当然，Android是一个完整的操作系统，包括一个 Linux-based的内核，图形系统和电信堆栈，等等。很显然，我只是谈论其中最常用的部分：Java为中心的用户使用区/依赖于Java源代码、 Java classes（切不管什么格式）、Java APIs（包括成千上万的常用JavaSE  APIs)和出色的类Java的虚拟机的应用框架。对于Android和其它的Java平台之间的关系有个准确的说法，就是使用版本的概念。我曾记得有个 博客说过这样的话&#8221;<em>Android里没有&#8217;J&#8217;</em>&#8220;。那么，我现在说也不晚：我建议把Android改名为Java GE（Java Google Edition）。这样一来就再也不会导致混淆了。    <img src='http://www.aqee.net/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<hr />
<p><small>©  <a href="http://www.aqee.net">外刊IT评论</a>, 2010. |
<a href="http://www.aqee.net/2010/09/01/android-java/">永久链接</a> |
<a href="http://www.aqee.net/2010/09/01/android-java/#comments">One comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.aqee.net/2010/09/01/android-java/&title=Android = Java">del.icio.us</a>
<br/>
Post tags: <a href="http://www.aqee.net/tag/android/" rel="tag">android</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.aqee.net/2010/09/01/android-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>【外刊IT评论】HTML5 &#8211; 创建一个Web网页便利贴</title>
		<link>http://www.aqee.net/2010/08/26/html5-code-example-of-contenteditable-and-localstorage/</link>
		<comments>http://www.aqee.net/2010/08/26/html5-code-example-of-contenteditable-and-localstorage/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 15:42:25 +0000</pubDate>
		<dc:creator>花非花</dc:creator>
				<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://www.aqee.net/?p=689</guid>
		<description><![CDATA[
在我之前的博客里，我给大家分享了HTML5上 拖拽功能 的例子。在这篇文章里我将研究HTML5上2个新的功能:contenteditable 和 localStorage。当我看了HTML5、W3C规范说明后，我迫不及待的要在这同一个程序上写出例子来演示这些新功能。

当你在看我前面所写的HTML 5例子时，我正在思考创建一个简单但又适用的例子、以一种更新奇的方式来演练这些HTML5新特性。我的目标并不是想单纯的展示这些HTML 5 API，而是想用例子来告诉开发人员如何真正的以一种实用的和创新的方式实现这些API。
在九十年代中期，我曾注册了一个软件专利，它是一个“WEB便利贴”。用最简单的话来描述就是，它能创建一个“黄色的便利贴”，粘在你的网页上，就像现实生活中你贴在电脑显示器上的效果。HTML5的内容可编辑功能和本地存储(localStorage)功能使创建web便利贴的功能变得快速简单！
演示程序如何使用：
用鼠标点击便利贴的区域，敲入信息。这个程序会把你敲入的信息都存入本地存储里（不是cookie里）。当你重新访问这个页面时，你的便利贴信息就会记住你上次写的内容。请记住，没有一个浏览器完全实现了HTML5，这个例子需要在支持HTML5的浏览器上运行，比如Firefox3.5以上。
 
下面就是我的例子（点击，然后输入你的信息！）:
 
 
 
 


 
 &#60;wbr&#62; 
 

 
实现localStorage的关键方法很简单，就像这些：
 
 
function storeUserScribble(id) {
var scribble = document.getElementById(&#8217;scribble&#8217;).innerHTML;
localStorage.setItem(&#8217;userScribble&#8217;,scribble);
}
 
 
function getUserScribble() {
if ( localStorage.getItem(&#8217;userScribble&#8217;)) {
var scribble = localStorage.getItem(&#8217;userScribble&#8217;);
}
else {
var scribble = &#8216;&#60;font color=blue face=&#8221;Geneva, Arial&#8221; size=6&#62;&#60;i&#62;你可以在这个便利贴上随意编写&#8230; 而且下次你再访问我的博客时就会看到我记住了你输入的信息！&#60;/i&#62;&#60;/font&#62;&#8217;;
}
document.getElementById(&#8217;scribble&#8217;).innerHTML = scribble;
} 
 
 
 我选择在 &#60;td&#62;上放置我的内容可编辑属性和onkeyup事件：
 
&#60;td background=&#8221;https://www.ibm.com/developerworks/mydeveloperworks/blogs/bobleah/resource/stickynote.jpg&#8221; contenteditable=&#8221;true&#8221; id=&#8221;scribble&#8221; [...]]]></description>
			<content:encoded><![CDATA[<div class="entryContentContainer">
<p>在我之前的博客里，我给大家分享了HTML5上 <a href="http://www.aqee.net/2010/08/19/html5-an-example-of-drag-and-drop/">拖拽功能</a> 的例子。在这篇文章里我将研究HTML5上2个新的功能:<a href="http://www.w3.org/TR/2008/WD-html5-20080610/editing.html">contenteditable</a> 和 <a href="http://dev.w3.org/html5/webstorage/">localStorage</a>。当我看了HTML5、W3C规范说明后，我迫不及待的要在这同一个程序上写出例子来演示这些新功能。<br />
<span id="more-689"></span></p>
<p>当你在看我前面所写的HTML 5例子时，我正在思考创建一个简单但又适用的例子、以一种更新奇的方式来演练这些HTML5新特性。我的目标并不是想单纯的展示这些HTML 5 API，而是想用例子来告诉开发人员如何真正的以一种实用的和创新的方式实现这些API。</p>
<p>在九十年代中期，我曾注册了一个软件专利，它是一个“WEB便利贴”。用最简单的话来描述就是，它能创建一个“黄色的便利贴”，粘在你的网页上，就像现实生活中你贴在电脑显示器上的效果。HTML5的内容可编辑功能和本地存储(localStorage)功能使创建web便利贴的功能变得快速简单！</p>
<p><strong>演示程序如何使用：</strong><br />
用鼠标点击便利贴的区域，敲入信息。这个程序会把你敲入的信息都存入本地存储里（不是cookie里）。当你重新访问这个页面时，你的便利贴信息就会记住你上次写的内容。请记住，没有一个浏览器完全实现了HTML5，这个例子需要在支持HTML5的浏览器上运行，比如Firefox3.5以上。</p>
<p><strong> </strong></p>
<p><strong>下面就是我的例子（点击，然后输入你的信息！）:</strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong><br />
</strong></p>
<p><strong> </strong></p>
<p><strong> <iframe src="/docs/contenteditable/contenteditable.html" width="100%" frameborder="0" height="550">&lt;wbr&gt; </iframe></strong></p>
<p><strong> </strong><strong><br />
</strong></p>
<p><strong> </strong></p>
<p><strong><strong>实现localStorage的关键方法很简单，就像这些：</strong></strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<blockquote><p><strong>function storeUserScribble(id) {</strong></p>
<p><strong>var scribble = document.getElementById(&#8217;scribble&#8217;).innerHTML;</strong></p>
<p><strong>localStorage.setItem(&#8217;userScribble&#8217;,scribble);</strong></p>
<p><strong>}</strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>function getUserScribble() {</strong></p>
<p><strong>if ( localStorage.getItem(&#8217;userScribble&#8217;)) {</strong></p>
<p><strong>var scribble = localStorage.getItem(&#8217;userScribble&#8217;);</strong></p>
<p><strong>}</strong></p>
<p><strong>else {</strong></p>
<p><strong>var scribble = &#8216;&lt;font color=blue face=&#8221;Geneva, Arial&#8221; size=6&gt;&lt;i&gt;你可以在这个便利贴上随意编写&#8230; 而且下次你再访问我的博客时就会看到我记住了你输入的信息！&lt;/i&gt;&lt;/font&gt;&#8217;;</strong></p>
<p><strong>}</strong></p>
<p><strong>document.getElementById(&#8217;scribble&#8217;).innerHTML = scribble;</strong></p>
<p><strong>}<strong> </strong></strong></p>
<p><strong><strong> </strong></strong></p>
<p><strong> </strong></p></blockquote>
<p><strong> <strong>我选择在 &lt;td&gt;上放置我的内容可编辑属性和onkeyup事件：</strong></strong></p>
<p><strong><strong> </strong></strong></p>
<blockquote><p><strong>&lt;td background=&#8221;https://www.ibm.com/developerworks/mydeveloperworks/blogs/bobleah/resource/stickynote.jpg&#8221; contenteditable=&#8221;true&#8221; id=&#8221;scribble&#8221; onkeyup=&#8221;storeUserScribble(this.id)&#8221;&gt;&lt;/td&gt;</strong></p>
<p><strong> </strong></p></blockquote>
<p><strong> <strong>例子中完整的HTML代码可以</strong> <a href="https://www.ibm.com/developerworks/mydeveloperworks/files/app?lang=en#/person/270000CN12/file/e27c84f2-8a08-4e33-b447-8ffa620c4ada">点击这里</a>下载。</strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>在这个例子中，便利贴是可以缩放的。创建一个小便利贴，把它放在你的web网页上，这给你的网站或web应用增添了一个有趣的功能。</strong></p>
<p><strong> </strong></p>
<p><strong> </strong></div>
<hr />
<p><small>©  <a href="http://www.aqee.net">外刊IT评论</a>, 2010. |
<a href="http://www.aqee.net/2010/08/26/html5-code-example-of-contenteditable-and-localstorage/">永久链接</a> |
<a href="http://www.aqee.net/2010/08/26/html5-code-example-of-contenteditable-and-localstorage/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.aqee.net/2010/08/26/html5-code-example-of-contenteditable-and-localstorage/&title=HTML5 &#8211; 创建一个Web网页便利贴">del.icio.us</a>
<br/>
Post tags: <br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.aqee.net/2010/08/26/html5-code-example-of-contenteditable-and-localstorage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【外刊IT评论】漫画：嗨，我是Jim</title>
		<link>http://www.aqee.net/2010/08/26/this-is-jim/</link>
		<comments>http://www.aqee.net/2010/08/26/this-is-jim/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 16:11:44 +0000</pubDate>
		<dc:creator>花非花</dc:creator>
				<category><![CDATA[幽默讽刺]]></category>

		<guid isPermaLink="false">http://www.aqee.net/?p=679</guid>
		<description><![CDATA[点击查看大图

在崩溃之前先检查一下自己。
编者言：低头想想自己，真和图上的一样，每天上班，下班，上网，睡觉（一个人睡），自己好像还没感觉什么，可让外人分析一下，自己这样子就成了一个怪物了，这就是程序员的生活吗？

©  外刊IT评论, 2010. &#124;
永久链接 &#124;
6 comments &#124;
Add to
del.icio.us

Post tags: 
]]></description>
			<content:encoded><![CDATA[<p>点击<a href="http://www.aqee.net/wordpress/wp-content/uploads/2010/08/2010-08-11-8816ff7-2.png">查看大图</a></p>
<p><a href="http://www.aqee.net/wordpress/wp-content/uploads/2010/08/2010-08-11-8816ff7-2.png"><img class="size-full wp-image-686 alignnone" title="程序员的生活" src="http://www.aqee.net/wordpress/wp-content/uploads/2010/08/2010-08-11-8816ff7-2.png" alt="程序员的生活" width="500" height="1070" /></a></p>
<p><strong>在崩溃之前先检查一下自己。</strong></p>
<p><strong>编者言</strong>：低头想想自己，真和图上的一样，每天上班，下班，上网，睡觉（一个人睡），自己好像还没感觉什么，可让外人分析一下，自己这样子就成了一个怪物了，这就是程序员的生活吗？</p>
<hr />
<p><small>©  <a href="http://www.aqee.net">外刊IT评论</a>, 2010. |
<a href="http://www.aqee.net/2010/08/26/this-is-jim/">永久链接</a> |
<a href="http://www.aqee.net/2010/08/26/this-is-jim/#comments">6 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.aqee.net/2010/08/26/this-is-jim/&title=漫画：嗨，我是Jim">del.icio.us</a>
<br/>
Post tags: <br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.aqee.net/2010/08/26/this-is-jim/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>【外刊IT评论】证据就在代码里</title>
		<link>http://www.aqee.net/2010/08/24/the-proof-is-in-the-code/</link>
		<comments>http://www.aqee.net/2010/08/24/the-proof-is-in-the-code/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 15:55:40 +0000</pubDate>
		<dc:creator>花非花</dc:creator>
				<category><![CDATA[心得体会]]></category>
		<category><![CDATA[求职招聘]]></category>

		<guid isPermaLink="false">http://www.aqee.net/?p=674</guid>
		<description><![CDATA[招聘一个程序员，唯一对你有意义的是他能写出好程序的能力。 很少人像这样去招人，他们更喜欢去挑剔程序员的个人癖好和性格缺点。
我一说出这样的话，人们大量的评论就会批评道：你错了，错了，完全的错了。 好的程序员需要具备沟通交流的技能，他们要有跟他人一起合作的能力。团队里不止你一个人! 事实上，人们会说：最好折中一下对技术上的要求，这样可以找出更能适应企业文化的人。

你不如这样说更合适：找不到那种技术上又好、又能适应企业文化的人，我就等着，一直找到为止。
 我们很少有敢这样奢侈的公司，也许Google可以这样，就是Google这样的公司也一直处于一个“对招聘程序员感到绝望”的状态中。如果你决定去等，我可以预见到每招到一个程序员你都要等待一个漫长的时期，同时业务会因为缺乏程序员而崩溃，火烧眉毛。
那么，那种更好呢？
让我们来考虑要那些中等或下等的程序员，他们和蔼可亲，而且努力工作。 他们的程序写的不好 – 他们的程序根本不是按照他们想的那样工作，即使他们做到了，那也是烂程序，很难去维护。他们在基本的功能上挣扎探索，更不解决不了复杂的问题。但是他们却能跟上团队，项目进度每天点都在更新，可以看见他们每天都在座位上奋斗。一切都很好，你的经理会很高兴，因为整个团队看起来在平稳的向前推进。
当发布日期不得不往后推迟，产品Bug多的没法使用，人们会哀叹说软件本来就是很难做，于是投入更多的和蔼可亲的平庸的程序员去修复问题。 事情的结果我想大家都知道。
对于程序员，没有太多的事情可以用和蔼来解决。一个友善的平庸的程序员可以成为业务分析师，技术性的销售员，或着其它的能够利用他的和蔼和他的一点点的技术知识来工作的职位。这样的工作他们会很满意，但这都是在茶话会工作上的，可不是去找出有效的办法做出好的软件。
另外一个选择是，找个程序员，他能做出好的程序，但也许不善于和他人相处，或者老是迟到，或其他。他能开发出按照设计运转的软件，他能把复杂的问题抽象成一个简单的问题。软件好使，可维护，你随时可以按要求修改。
这个世界很真实，有太多的方式都会让我们把事情搞砸，但至少我们是有机会的。人可以给人留下不错的印象。团队可以建设的不错。员工在长时间的为你工作，不错。大量的业务没有按照预定的设计工作，但还是成功了，不错。但是绝对不会有伟大的软件会在平庸的程序员手下实现。.
证据就在代码里。 就这些。

©  外刊IT评论, 2010. &#124;
永久链接 &#124;
4 comments &#124;
Add to
del.icio.us

Post tags: 
]]></description>
			<content:encoded><![CDATA[<p><strong>招聘一个程序员，唯一对你有意义的是他能写出好程序的能力。</strong> 很少人像这样去招人，他们更喜欢去挑剔程序员的个人癖好和性格缺点。</p>
<p><strong>我一说出这样的话，人们大量的评论就会批评道：你错了，错了，完全的错了。</strong> 好的程序员需要具备沟通交流的技能，他们要有跟他人一起合作的能力。<em>团队里不止你一个人!</em> 事实上，人们会说：最好折中一下对技术上的要求，这样可以找出更能适应企业文化的人。</p>
<p><span id="more-674"></span></p>
<p>你不如这样说更合适：<strong>找不到那种技术上又好、又能适应企业文化的人，我就等着，一直找到为止。</strong><br />
 我们很少有敢这样奢侈的公司，也许Google可以这样，就是Google这样的公司也一直处于一个“对招聘程序员感到绝望”的状态中。如果你决定去等，我可以预见到每招到一个程序员你都要等待一个漫长的时期，同时业务会因为缺乏程序员而崩溃，火烧眉毛。</p>
<p>那么，那种更好呢？</p>
<p><strong>让我们来考虑要那些中等或下等的程序员，他们和蔼可亲，而且努力工作。</strong> 他们的程序写的不好 – 他们的程序根本不是按照他们想的那样工作，即使他们做到了，那也是烂程序，很难去维护。他们在基本的功能上挣扎探索，更不解决不了复杂的问题。但是他们却能跟上团队，项目进度每天点都在更新，可以看见他们每天都在座位上奋斗。一切都很好，你的经理会很高兴，因为整个团队看起来在平稳的向前推进。</p>
<p><strong>当发布日期不得不往后推迟，产品Bug多的没法使用，人们会哀叹说软件<em>本来就是很难做</em>，于是投入更多的和蔼可亲的平庸的程序员去修复问题。</strong> 事情的结果我想大家都知道。</p>
<p>对于程序员，没有太多的事情可以用和蔼来解决。一个友善的平庸的程序员可以成为业务分析师，技术性的销售员，或着其它的能够利用他的和蔼和他的一点点的技术知识来工作的职位。<strong>这样的工作他们会很满意，但这都是在茶话会工作上的，可不是去找出有效的办法做出好的软件。</strong></p>
<p><strong>另外一个选择是，找个程序员，他能做出好的程序，但也许不善于和他人相处，或者老是迟到，或其他。</strong>他能开发出按照设计运转的软件，他能把复杂的问题抽象成一个简单的问题。软件好使，可维护，你随时可以按要求修改。</p>
<p>这个世界很真实，有太多的方式都会让我们把事情搞砸，但至少我们是有<em>机会</em>的。人可以给人留下不错的印象。团队可以建设的不错。员工在长时间的为你工作，不错。大量的业务没有按照预定的设计工作，但还是成功了，不错。<em>但是绝对不会有伟大的软件会在平庸的程序员手下实现。</em>.</p>
<p><strong>证据就在代码里。</strong> 就这些。</p>
<hr />
<p><small>©  <a href="http://www.aqee.net">外刊IT评论</a>, 2010. |
<a href="http://www.aqee.net/2010/08/24/the-proof-is-in-the-code/">永久链接</a> |
<a href="http://www.aqee.net/2010/08/24/the-proof-is-in-the-code/#comments">4 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.aqee.net/2010/08/24/the-proof-is-in-the-code/&title=证据就在代码里">del.icio.us</a>
<br/>
Post tags: <br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.aqee.net/2010/08/24/the-proof-is-in-the-code/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>【外刊IT评论】嗨，兄弟，做不成有钱人完全没什么</title>
		<link>http://www.aqee.net/2010/08/24/hey-guys-its-totally-okay-if-you-dont-get-rich/</link>
		<comments>http://www.aqee.net/2010/08/24/hey-guys-its-totally-okay-if-you-dont-get-rich/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 16:01:37 +0000</pubDate>
		<dc:creator>花非花</dc:creator>
				<category><![CDATA[心得体会]]></category>

		<guid isPermaLink="false">http://www.aqee.net/?p=669</guid>
		<description><![CDATA[我有个很亲密的男性朋友，是搞技术的，他痴迷于发财致富。
他很聪明，受过很好的教育，是个吃苦耐劳的人，但是，说实话，他很可能就不是一个能干成大事业的料。他能轻松的在任何一个大公司里获得一个小六位数的薪水，但是他有一个根深蒂固的想法，就是要创办一个科技公司，获得巨大的成功，挣到无数的钞票，这才能幸福。我看着他慢慢的失去健康，失去理智，失去信任和一次次的失去女朋友，都是由于这个信念。“你这个想法最终会害了你的，”我对他说，“你必须马上停下来。”
但是他不会停下来。
后来，不止一个其他的男性朋友向我透露了他的金融危机感：“我感觉，如果没有挣到足够多的钱，我就不能算是个成功者。”

我可以打包票的说，从来没有一个女性朋友对我说过这样的话。我的女朋友们和我当然也都想成功；我们都想在自己的领域里取得重大的成就，我们对那些还没有实现的目标都倍感压力，但是没有一个人特别的关注如何发财致富。我们几乎很少谈论到钱。
再说了，这个世界也不必在乎我究竟挣了多大的钱。如果我想要很多的钱，而我又很苗条，足够漂亮，那我找个富人结婚就行了，不是吗？
看见了吧，我知道男人是如何体验渴望金钱上的成功所带来的压力的。我知道当走进一间屋子、发现我是这里最没有吸引力的女人时的感受，环顾四周，其他的所有女人都比我漂亮 –– 骨感，长发飘飘，傲慢的胸部，丰满的嘴唇，皮肤白嫩 &#8212; 想马上消失，感觉到惊恐，感觉鸡立鹤群，感觉到生命中做曾做的和正在做的事情都毫无意义了，因为此时的感觉太真实了。
但是，对于每张那些极富魅力的骨感的封面女郎照片，都会有成千上万的文章来告诉你女人真正需要的是什么，那是心灵上的东西。每当我感觉身体某处不符合某种标准时，总会感觉周围响起那些媒体尖叫的声音：“她化妆了！她做过整容手术！她有一个二十人组成的美发美容专业团队！你有一亿项其它的优秀品质，不要把时间浪费在外表上。”
可对男人们却不是这样。每当福布斯报道一个商业大亨时，内容总是讲他的公司如何成功，他的22岁的超级模特女友，他的欧洲的八套房子，没人去跑到电脑旁发布一个篇文章告诉大家不要把这要挣取荒唐数目的财富的压力放到男人身上，这些压力给了男人们的妻子和孩子慷慨的”特权“，男人还像历史上那样做唯一出去工作的人。没有人会冲着那些计划要开创下一个Facebook的人发出阻止的尖叫，同样，我想，明天醒来，又会蹦出一个跟西班牙影星Penelope Cruz长的极像的人。
我想这就是问题所在，我想有必要再次重申：我们给了男人太大的压力，让他们去建立一个王国，让他们挣钱建这个王国。男人深受其害，就像一个年轻的女人想拥有苗条的身材。我们并没有说什么。我们没有真正去阻止男人往这方面想。
为什么？
我认为，这种不平衡来自于一种单边的“女权主义”文化，总是强调在任何方面女人都是受害者，同时又无视现代男人们在感情上的挣扎。“你们很可怜，”我们总是对女人这样说，“这个世界是平等的，而你们总是能被轻易的伤害。”
我们从来就不该对男人说这样的话。当我们在谈论求美的压力对女人如此伤害时，就不要刺激男人那些固有的弱点。
财富的困扰通常是默默的到来，容易被伪装，容易被焦距，容易被激化，从来不像一个追求美丽的女人遇到的饮食不调或整容失败带来的痛苦那样明显。
我们都看到，一个男人失掉工作后，杀了妻子和孩子，然后自杀，这样的事情过去、现在都有。“多可怕的精神问题患者呀，”我们会这样说，我们会数天的谈论压力是如何把男人推向边缘，但我们的生活中却没有留下足够的空间来同情和讨论这种极端事情。
没有明显的观点，足够的根据，能证明这跟媒体的宣传有关。所以我们也就不在谈论，一些精神上崩溃的男人在这种压力下会感到非常的孤独。
我们有些人要开办公司，因为我们喜欢开公司 – 我们喜欢做自己的老板，定下自己的目标，那是一种白手起家的兴奋。而有些人开办公司是因为看到有人从中得到了大量的财富，我们也想成为富人中的一员。这两种都没有对错之分。
我就是要把这些情况说出来，我希望有人去说：嗨，兄弟，富不富真的没什么。就算你从来都没富过，那也没什么。生活中有很多比挣钱更有价值的东西，生活中那个你真正想得到的人知道这些。
而且，如果你变富了，你还会为我花钱做吸脂手术吗？

©  外刊IT评论, 2010. &#124;
永久链接 &#124;
3 comments &#124;
Add to
del.icio.us

Post tags: 
]]></description>
			<content:encoded><![CDATA[<div id="attachment_671" class="wp-caption alignright" style="width: 143px"><img class="size-full wp-image-671" title="作者 Sasha Pasulka" src="http://www.aqee.net/wordpress/wp-content/uploads/2010/08/05f9e0b95a244c33af41ab3062d6aa6d.jpg" alt="作者 Sasha Pasulka" width="133" height="200" /><p class="wp-caption-text">作者 Sasha Pasulka</p></div>
<p>我有个很亲密的男性朋友，是搞技术的，他痴迷于发财致富。<br />
他很聪明，受过很好的教育，是个吃苦耐劳的人，但是，说实话，他很可能就不是一个能干成大事业的料。他能轻松的在任何一个大公司里获得一个小六位数的薪水，但是他有一个根深蒂固的想法，就是要创办一个科技公司，获得巨大的成功，挣到无数的钞票，这才能幸福。我看着他慢慢的失去健康，失去理智，失去信任和一次次的失去女朋友，都是由于这个信念。“你这个想法最终会害了你的，”我对他说，“你必须马上停下来。”</p>
<p>但是他不会停下来。</p>
<p>后来，不止一个其他的男性朋友向我透露了他的金融危机感：“我感觉，如果没有挣到足够多的钱，我就不能算是个成功者。”<br />
<span id="more-669"></span><br />
我可以打包票的说，从来没有一个女性朋友对我说过这样的话。我的女朋友们和我当然也都想成功；我们都想在自己的领域里取得重大的成就，我们对那些还没有实现的目标都倍感压力，但是没有一个人特别的关注如何发财致富。我们几乎很少谈论到钱。</p>
<p>再说了，这个世界也不必在乎我究竟挣了多大的钱。如果我想要很多的钱，而我又很苗条，足够漂亮，那我找个富人结婚就行了，不是吗？</p>
<p>看见了吧，我知道男人是如何体验渴望金钱上的成功所带来的压力的。我知道当走进一间屋子、发现我是这里最没有吸引力的女人时的感受，环顾四周，其他的所有女人都比我漂亮 –– 骨感，长发飘飘，傲慢的胸部，丰满的嘴唇，皮肤白嫩 &#8212; 想马上消失，感觉到惊恐，感觉鸡立鹤群，感觉到生命中做曾做的和正在做的事情都毫无意义了，因为此时的感觉太真实了。</p>
<p>但是，对于每张那些极富魅力的骨感的封面女郎照片，都会有成千上万的文章来告诉你女人真正需要的是什么，那是心灵上的东西。每当我感觉身体某处不符合某种标准时，总会感觉周围响起那些媒体尖叫的声音：“她化妆了！她做过整容手术！她有一个二十人组成的美发美容专业团队！你有一亿项其它的优秀品质，不要把时间浪费在外表上。”</p>
<p>可对男人们却不是这样。每当福布斯报道一个商业大亨时，内容总是讲他的公司如何成功，他的22岁的超级模特女友，他的欧洲的八套房子，没人去跑到电脑旁发布一个篇文章告诉大家不要把这要挣取荒唐数目的财富的压力放到男人身上，这些压力给了男人们的妻子和孩子慷慨的”特权“，男人还像历史上那样做唯一出去工作的人。没有人会冲着那些计划要开创下一个Facebook的人发出阻止的尖叫，同样，我想，明天醒来，又会蹦出一个跟西班牙影星Penelope Cruz长的极像的人。</p>
<p>我想这就是问题所在，我想有必要再次重申：我们给了男人太大的压力，让他们去建立一个王国，让他们挣钱建这个王国。男人深受其害，就像一个年轻的女人想拥有苗条的身材。我们并没有说什么。我们没有真正去阻止男人往这方面想。</p>
<p>为什么？</p>
<p>我认为，这种不平衡来自于一种单边的“女权主义”文化，总是强调在任何方面女人都是受害者，同时又无视现代男人们在感情上的挣扎。“你们很可怜，”我们总是对女人这样说，“这个世界是平等的，而你们总是能被轻易的伤害。”</p>
<p>我们从来就不该对男人说这样的话。当我们在谈论求美的压力对女人如此伤害时，就不要刺激男人那些固有的弱点。<br />
财富的困扰通常是默默的到来，容易被伪装，容易被焦距，容易被激化，从来不像一个追求美丽的女人遇到的饮食不调或整容失败带来的痛苦那样明显。</p>
<p>我们都看到，一个男人失掉工作后，杀了妻子和孩子，然后自杀，这样的事情过去、现在都有。“多可怕的精神问题患者呀，”我们会这样说，我们会数天的谈论压力是如何把男人推向边缘，但我们的生活中却没有留下足够的空间来同情和讨论这种极端事情。</p>
<p>没有明显的观点，足够的根据，能证明这跟媒体的宣传有关。所以我们也就不在谈论，一些精神上崩溃的男人在这种压力下会感到非常的孤独。</p>
<p>我们有些人要开办公司，因为我们喜欢开公司 – 我们喜欢做自己的老板，定下自己的目标，那是一种白手起家的兴奋。而有些人开办公司是因为看到有人从中得到了大量的财富，我们也想成为富人中的一员。这两种都没有对错之分。</p>
<p>我就是要把这些情况说出来，我希望有人去说：嗨，兄弟，富不富真的没什么。就算你从来都没富过，那也没什么。生活中有很多比挣钱更有价值的东西，生活中那个你真正想得到的人知道这些。</p>
<p>而且，如果你变富了，你还会为我花钱做吸脂手术吗？</p>
<hr />
<p><small>©  <a href="http://www.aqee.net">外刊IT评论</a>, 2010. |
<a href="http://www.aqee.net/2010/08/24/hey-guys-its-totally-okay-if-you-dont-get-rich/">永久链接</a> |
<a href="http://www.aqee.net/2010/08/24/hey-guys-its-totally-okay-if-you-dont-get-rich/#comments">3 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.aqee.net/2010/08/24/hey-guys-its-totally-okay-if-you-dont-get-rich/&title=嗨，兄弟，做不成有钱人完全没什么">del.icio.us</a>
<br/>
Post tags: <br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.aqee.net/2010/08/24/hey-guys-its-totally-okay-if-you-dont-get-rich/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>【外刊IT评论】我的丈夫是个程序员</title>
		<link>http://www.aqee.net/2010/08/23/my-husband-is-a-programmer/</link>
		<comments>http://www.aqee.net/2010/08/23/my-husband-is-a-programmer/#comments</comments>
		<pubDate>Sun, 22 Aug 2010 16:05:05 +0000</pubDate>
		<dc:creator>花非花</dc:creator>
				<category><![CDATA[心得体会]]></category>

		<guid isPermaLink="false">http://www.aqee.net/?p=664</guid>
		<description><![CDATA[我在11年前认识了的我丈夫。当时是南缅因州大学新生入校的日子，我带着吉他去宿舍。他饶有兴趣的盯着我的吉他。之后他敲响了我的房门，自我介绍道：“嗨，我叫Adam，我就住在走廊的对面。我是个计算机程序员！”


  他做了一很勇敢的决定。 10年前当程序员并不像今天这么“火”，这个行业并不被社会重视，他似乎也根本不在意这些。不管怎样，我们相爱了。我当时并不懂编程，但却被他那义无反顾的精神和毫不在意被人当作怪人的态度打动。是发现了他也弹吉他使我们走到了一起。如果仅是他住在走廊我的对面，命运也不会做出这样的安排。
在随后的一周周，一月月，一年年，他慢慢的吸引了我的注意力，他会对着他的游戏机的硬件清单大发雷霆，他能在虚拟世界里的游戏竞赛中为我独尊，他在ColdFusion平台上制作了他的毕业论文项目，他会用长篇大论来解释他的编程理论。我会安静的坐着，惊奇的看他把一台PC机拆成零碎。我听他讲编程上的问题，看他开发网站。与此同时，我还只是朦胧的感觉到我未来的职业应该是跟科技和英语有关，但我着实对Adam的生活发生了兴趣。
几年以后，我很自然的就知道了，“Ruby”并不是指的七月的生日石，而“Ruby on Rails”也不是邻区的新潮人在火车轨道上举行的敬拜珍贵宝石的奇怪活动。几年时间里，我事实上也培养出了他的同样的兴趣。2005年末他深深的喜欢上了Ruby，我全力支持他，而且也知道Ruby的不可思议之处。几年后，当我决定了开始学习Ruby，我在博客上写了一篇关于Ruby社区的文章。很多人都很奇怪为什么一个像我这样的Ruby新手会对Ruby社区有如此的了解。答案是，我在决定学习Ruby编程之前已经关注这个社区很久了。在我曾经打开TextMate编辑器、保存第一个.rb文件之前，我就知道了这个社区里有那些大人物，Ruby的发展趋势，和历史事件。
当你的伴侣开始跟你讲编程的问题时，或讲最新的测试框架时，你的眼神里是否显露出一种呆滞和恍惚？事情并不是你想象的单调乏味。问他问题，尝试着去理解！如今当我遇到女人们时，我并不回避给她们谈我的工作，谈我喜欢的电脑游戏，谈我着迷于 D&#38;D 游戏以及其它这样的荒诞事情。通常我得到的回复是这样的几句：“编程？我想我丈夫做的好像也是这方面的。”对于此，我总是问道：“哦，真的吗？他用的是什么编程语言？”她们的回答每次都一样：”语言？哼，我可不知道。不止一种吗？我并不真正知道他在干什么。我对这些东西没兴趣。“
这每次都让我感慨万分。你嫁给了一个人，可是你对这个人花去将近40-50%的时间去做的事情一无所知——除了工作名称。我们是否可以把今天的高离婚率和他们对配偶的生活缺乏兴趣之间画一条危险的关联线呢？当两个人第一次相遇时，一个人很容易根据自己的”看法“而坠入爱河。但我认为如果配偶不能够对对方的爱好和生活工作有真正的了解，那么这两个人将很难经受的住生命的各种起起伏伏，艰难和考验，要知道，生活中每天都有挑战。如果你对配偶的每周40小时的工作内容没有一个基本的理解，你们就不能成为一体。

我并不是在建议当你遇到钟情的对象时要放弃自己个性和个人兴趣。而是要你睁大眼睛，用你的伴侣的视野去体验这个世界。我承认，有时Adam会在某天晚上对元数据编程谩骂个没完没了，此时我也就跟他的思想走不到一起了。但通常情况下我会投入到他的兴趣当中。而且为什么不呢？我爱他，这就要求我去了解他。而了解一个人就是要你们去相互讨论和理解对方的兴趣。 Adam会花数百小时艰难的听
  Ani Difranco, Dar Williams, 和 Iron &#38; Wine 唱片，我会在一旁神经质的给他解释所有的歌词。在我的鼓励下他学会了打网球，尽管现在不得不忍受每次被他打败的结果。在大学里他看过我的芭蕾舞表演，他甚至都知道了不少其中的姿势的叫法了。下面的照片是我和Adam在徒步翻越缅因州Tumbledown山时拍的。它见证了Adam自愿从计算机旁走开，参加到我喜欢的户外运动中的事情。他很顽强。

 徒步旅行 hiking up Tumbledown Mountain in Maine


参与到你的伴侣的兴趣中并不是一件难事。如果你觉得很难，那你也许要思考一下自己是不是太自我了。即使朋友之间，我也努力的聆听和理解他们的兴趣和爱好。我经常会听到一些新奇的东西，经常我会为自己找到了一些新爱好。


就我来说，如果当Adam在奇怪的跟计算机大喊大叫时，我只是发呆，那我就不会有今天的生活。
那是无数的小时的一起玩视频游戏，一起深夜编写手册，一起为新应用做头脑风暴式的讨论，一起野营旅行，一起听乡村音乐才铸就了我们之间的关系。即使你跟你的伴侣在事业上并不是相似的道路，通过对他工作和喜好的了解，你也可以使他为你打开他的心扉。这能扩大你的视野，帮助你减少生活中的不愉快。你们应成为一起工作的一体。我并不是像Adam那样做职业编程的；我也没有向那方面发展。我懂编程，但不幸的是，自小就没人给我积木做训练，在学校和家里也从来没人鼓励我学数学。工程学和解决问题的才能从来就没有培养出来。所以，当我想对编程感兴趣时，这对我的难度看起来比其他人大。但我的强项是写作，编程方面和技术方面的题材对我是个巨大的兴趣
   &#8211;  所以，能得到Intridea社区管理员的工作让我的世界真正的兴奋起来。我关注着我喜爱的世界，我能感受到它的脉搏，我所做的一直给我带来回报，给我快乐。

所以，如果你和新朋友们在一起，想办法培养自己对他们爱说的事情的兴趣。如果你和老朋友在一起，通过询问他们的工作、倾听他们的回复来再次发掘你的生活爱好。不要假装爱好。不要做那种连她丈夫使用什么编程语言都不知的女孩子。你要做那种让你的丈夫的朋友吃惊于你还知道Java时什么的酷妻子，不做那种在讨论Ruby社区里的自由派时说出“亲爱的，我不知道你原来还是个珠宝商哪！”的妻子。

©  外刊IT评论, 2010. &#124;
永久链接 &#124;
18 comments &#124;
Add to
del.icio.us

Post tags: 
]]></description>
			<content:encoded><![CDATA[<p>我在11年前认识了的我丈夫。当时是南缅因州大学新生入校的日子，我带着吉他去宿舍。他饶有兴趣的盯着我的吉他。之后他敲响了我的房门，自我介绍道：“嗨，我叫Adam，我就住在走廊的对面。我是个计算机程序员！”</p>
<p><span id="more-664"></span></p>
<p>
  他做了一很勇敢的决定。 10年前当程序员并不像今天这么“火”，这个行业并不被社会重视，他似乎也根本不在意这些。不管怎样，我们相爱了。我当时并不懂编程，但却被他那义无反顾的精神和毫不在意被人当作怪人的态度打动。是发现了他也弹吉他使我们走到了一起。如果仅是他住在走廊我的对面，命运也不会做出这样的安排。</p>
<p>在随后的一周周，一月月，一年年，他慢慢的吸引了我的注意力，他会对着他的游戏机的硬件清单大发雷霆，他能在虚拟世界里的游戏竞赛中为我独尊，他在ColdFusion平台上制作了他的毕业论文项目，他会用长篇大论来解释他的编程理论。我会安静的坐着，惊奇的看他把一台PC机拆成零碎。我听他讲编程上的问题，看他开发网站。与此同时，我还只是朦胧的感觉到我未来的职业应该是跟科技和英语有关，但我着实对Adam的生活发生了兴趣。</p>
<p>几年以后，我很自然的就知道了，“Ruby”并不是指的七月的生日石，而“Ruby on Rails”也不是邻区的新潮人在火车轨道上举行的敬拜珍贵宝石的奇怪活动。几年时间里，我事实上也培养出了他的同样的兴趣。2005年末他深深的喜欢上了Ruby，我全力支持他，而且也知道Ruby的不可思议之处。几年后，当我决定了开始学习Ruby，我在博客上写了一篇关于<a href="http://www.renaebair.com/2008/11/24/the-ranting-rubyists/" target="_blank">Ruby社区</a>的文章。很多人都很奇怪为什么一个像我这样的Ruby新手会对Ruby社区有如此的了解。答案是，我在决定学习Ruby编程之前已经关注这个社区很久了。在我曾经打开TextMate编辑器、保存第一个.rb文件之前，我就知道了这个社区里有那些大人物，Ruby的发展趋势，和历史事件。</p>
<p>当你的伴侣开始跟你讲编程的问题时，或讲最新的测试框架时，你的眼神里是否显露出一种呆滞和恍惚？事情并不是你想象的单调乏味。问他问题，尝试着去理解！如今当我遇到女人们时，我并不回避给她们谈我的工作，谈我喜欢的电脑游戏，谈我着迷于 D&amp;D 游戏以及其它这样的荒诞事情。通常我得到的回复是这样的几句：“编程？我想我丈夫做的好像也是这方面的。”对于此，我总是问道：“哦，真的吗？他用的是什么编程语言？”她们的回答每次都一样：”语言？哼，我可不知道。不止一种吗？我并不真正知道他在干什么。我对这些东西没兴趣。“</p>
<p>这每次都让我感慨万分。你嫁给了一个人，可是你对这个人花去将近40-50%的时间去做的事情一无所知——除了工作名称。我们是否可以把今天的高离婚率和他们对配偶的生活缺乏兴趣之间画一条危险的关联线呢？当两个人第一次相遇时，一个人很容易根据自己的”看法“而坠入爱河。但我认为如果配偶不能够对对方的爱好和生活工作有真正的了解，那么这两个人将很难经受的住生命的各种起起伏伏，艰难和考验，要知道，生活中每天都有挑战。如果你对配偶的每周40小时的工作内容没有一个基本的理解，你们就不能成为一体。</p>
<p>
我并不是在建议当你遇到钟情的对象时要放弃自己个性和个人兴趣。而是要你睁大眼睛，用你的伴侣的视野去体验这个世界。我承认，有时Adam会在某天晚上对元数据编程谩骂个没完没了，此时我也就跟他的思想走不到一起了。但通常情况下我会投入到他的兴趣当中。而且为什么不呢？我爱他，这就要求我去了解他。而了解一个人就是要你们去相互讨论和理解对方的兴趣。 Adam会花数百小时艰难的听<br />
  Ani Difranco, Dar Williams, 和 Iron &amp; Wine 唱片，我会在一旁神经质的给他解释所有的歌词。在我的鼓励下他学会了打网球，尽管现在不得不忍受每次被他打败的结果。在大学里他看过我的芭蕾舞表演，他甚至都知道了不少其中的姿势的叫法了。下面的照片是我和Adam在徒步翻越缅因州Tumbledown山时拍的。它见证了Adam自愿从计算机旁走开，参加到我喜欢的户外运动中的事情。他很顽强。</p>
<div class="wp-caption aligncenter" style="width: 460px;"><a href="http://farm3.static.flickr.com/2584/3751216922_e84ddc0699.jpg"><img class=" " title="Tumbledown" src="http://www.aqee.net/wordpress/wp-content/uploads/2010/08/3751216922_e84ddc0699.jpg" alt="hiking up Tumbledown Mountain in Maine" width="450" height="296"></a></p>
<p class="wp-caption-text"> 徒步旅行 hiking up Tumbledown Mountain in Maine</p>
</div>
<p>
参与到你的伴侣的兴趣中并不是一件难事。如果你觉得很难，那你也许要思考一下自己是不是太自我了。即使朋友之间，我也努力的聆听和理解他们的兴趣和爱好。我经常会听到一些新奇的东西，经常我会为自己找到了一些新爱好。
</p>
<p>
就我来说，如果当Adam在奇怪的跟计算机大喊大叫时，我只是发呆，那我就不会有今天的生活。<br />
那是无数的小时的一起玩视频游戏，一起深夜编写手册，一起为新应用做头脑风暴式的讨论，一起野营旅行，一起听乡村音乐才铸就了我们之间的关系。即使你跟你的伴侣在事业上并不是相似的道路，通过对他工作和喜好的了解，你也可以使他为你打开他的心扉。这能扩大你的视野，帮助你减少生活中的不愉快。你们应成为一起工作的一体。我并不是像Adam那样做职业编程的；我也没有向那方面发展。我懂编程，但不幸的是，自小就没人给我积木做训练，在学校和家里也从来没人鼓励我学数学。工程学和解决问题的才能从来就没有培养出来。所以，当我想对编程感兴趣时，这对我的难度看起来比其他人大。但我的强项是写作，编程方面和技术方面的题材对我是个巨大的兴趣<br />
   &#8211;  所以，能得到<a href="http://intridea.com/" target="_blank">Intridea</a>社区管理员的工作让我的世界真正的兴奋起来。我关注着我喜爱的世界，我能感受到它的脉搏，我所做的一直给我带来回报，给我快乐。</p>
<p>
所以，如果你和新朋友们在一起，想办法培养自己对他们爱说的事情的兴趣。如果你和老朋友在一起，通过询问他们的工作、倾听他们的回复来再次发掘你的生活爱好。不要假装爱好。不要做那种连她丈夫使用什么编程语言都不知的女孩子。你要做那种让你的丈夫的朋友吃惊于你还知道Java时什么的酷妻子，不做那种在讨论Ruby社区里的自由派时说出“亲爱的，我不知道你原来还是个珠宝商哪！”的妻子。</p>
<hr />
<p><small>©  <a href="http://www.aqee.net">外刊IT评论</a>, 2010. |
<a href="http://www.aqee.net/2010/08/23/my-husband-is-a-programmer/">永久链接</a> |
<a href="http://www.aqee.net/2010/08/23/my-husband-is-a-programmer/#comments">18 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.aqee.net/2010/08/23/my-husband-is-a-programmer/&title=我的丈夫是个程序员">del.icio.us</a>
<br/>
Post tags: <br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.aqee.net/2010/08/23/my-husband-is-a-programmer/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>【外刊IT评论】HTML5 &#8211; 一个拖拽功能的例子</title>
		<link>http://www.aqee.net/2010/08/19/html5-an-example-of-drag-and-drop/</link>
		<comments>http://www.aqee.net/2010/08/19/html5-an-example-of-drag-and-drop/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 15:46:37 +0000</pubDate>
		<dc:creator>花非花</dc:creator>
				<category><![CDATA[html5]]></category>
		<category><![CDATA[技术技巧]]></category>

		<guid isPermaLink="false">http://www.aqee.net/?p=657</guid>
		<description><![CDATA[ 我最近出席了一系列的研讨会，HTML5这个主题在这些会上反复出现。出于好奇我略看了几眼后，开始觉得应该好好的挖掘一下HTML5，看看它究竟会给我们今天技术上带来哪些好处。一个特别有意思的东西就是拖拽功能编程接口 &#8230; 早期的HTML编程开发者一直对此渴望却不可及。我感觉这个功能非常有用 &#8230; 拖拽功能的实现已经成了几个不费吹灰之力的函数调用了。
  

    为了演示拖拽用例，我要创建一个简单的网络配置工具(UI),管理员可以用它来收集资源。你能在各个区域之间拖拽资源，往区域里添加资源，删除没有用的资源。出于教学的目的，我尽量使这个例子简单，但可以看到，依据这些基本的做法，你可以开发出一个全功能的网络管理工具。
    
  

    下面就是我的例子，你可以试用一下 (需要Firefox 3.5 以上版本):
    
  

    
  
  
    
    &#60;wbr&#62; 
    
  
  [...]]]></description>
			<content:encoded><![CDATA[<p> <wbr>我最近出席了一系列的研讨会，HTML5这个主题在这些会上反复出现。出于好奇我略看了几眼后，开始觉得应该好好的挖掘一下HTML5，看看它究竟会给我们今天技术上带来哪些好处。一个特别有意思的东西就是拖拽功能编程接口 &#8230; 早期的HTML编程开发者一直对此渴望却不可及。我感觉这个功能非常有用 &#8230; 拖拽功能的实现已经成了几个不费吹灰之力的函数调用了。<br />
  <wbr></p>
<p><wbr><br />
    为了演示拖拽用例，我要创建一个简单的网络配置工具(UI),管理员可以用它来收集资源。你能在各个区域之间拖拽资源，往区域里添加资源，删除没有用的资源。出于教学的目的，我尽量使这个例子简单，但可以看到，依据这些基本的做法，你可以开发出一个全功能的网络管理工具。<br /><span id="more-657"></span><br />
    <wbr></p>
<p>  <wbr></p>
<p><wbr><br />
    <wbr><b><wbr>下面就是我的例子，你可以试用一下 </b><wbr>(需要Firefox 3.5 以上版本):<br />
    <wbr></p>
<p>  <wbr></p>
<p><wbr><br />
    <wbr></p>
<p>  <wbr><br />
  <center><br />
    <wbr><br />
    <iframe src="/docs/d_and_d.html" width="100%" frameborder="0" height="625">&lt;wbr&gt; </iframe><br />
    <wbr><br />
  </center><br />
  <wbr> <br />
  <wbr><br style="font-weight: bold;"><br />
  <wbr><span style="font-weight: bold;"><wbr>实现拖拽功能的关键方法非常的简单，就像下面写的这样：</span><wbr><br />
  <wbr><br />
  <wbr></p>
<blockquote><p><wbr>function dragIt(target, e) {<br />
    <wbr>&nbsp;&nbsp;&nbsp; e.da<wbr>taTr<wbr>ansf<wbr>er.s<wbr>etDa<wbr>ta(&#8217;<wbr>Span<wbr>Img&#8217;<wbr>, target.id);<br />
    <wbr>}<br />
    <wbr><br />
    <wbr>function dropIt(target, e) {<br />
    <wbr>&nbsp;&nbsp;&nbsp; var id = e.da<wbr>taTr<wbr>ansf<wbr>er.g<wbr>etDa<wbr>ta(&#8217;<wbr>Span<wbr>Img&#8217;<wbr>);<br />
    <wbr>&nbsp;&nbsp;&nbsp; targ<wbr>et.a<wbr>ppen<wbr>dChi<wbr>ld(d<wbr>ocum<wbr>ent.<wbr>getE<wbr>leme<wbr>ntBy<wbr>Id(i<wbr>d));<wbr><br />
    <wbr>&nbsp;&nbsp;&nbsp; e.preventDefault();<br />
    <wbr>}<br />
    <wbr></p></blockquote>
<p>  <wbr><span style="font-weight: bold;"><wbr>我使用了table元素来实现布局结构，并把它当做</span><wbr><u style="font-weight: bold;"><wbr>ondrop</u><wbr><span style="font-weight: bold;"><wbr>事件的目标：</span><wbr><br />
  <wbr></p>
<blockquote><p><wbr>&lt;<wbr>td align=&#8221;<wbr>center&#8221;<wbr> width=&#8221;<wbr>100&#8243;<wbr> id=&#8221;<wbr>blue&#8221;<wbr> ondrop=&#8221;<wbr>dropIt(this, event)&#8221;<wbr> ondragenter=&#8221;<wbr>return false&#8221;<wbr> ondragover=&#8221;<wbr>return false&#8221;<wbr>&gt;<wbr>&nbsp;&nbsp; &#8230;.&nbsp; &lt;<wbr>/td&gt;<wbr><br />
    <wbr></p></blockquote>
<p>  <wbr><span style="font-weight: bold;"><wbr>我使用了span元素（包裹住图片）做</span><wbr><u style="font-weight: bold;"><wbr>拖拽</u><wbr><span style="font-weight: bold;"><wbr>对象：</span><wbr><br />
  <wbr></p>
<blockquote><p><wbr>&lt;<wbr>span draggable=&#8221;<wbr>true&#8221;<wbr> id=&#8221;<wbr>t_1&#8243;<wbr> ondragstart=&#8221;<wbr>dragIt(this, event)&#8221;<wbr>&gt;<wbr>&lt;<wbr>img src=&#8221;<wbr>http<wbr>s://<wbr>www.<wbr>ibm.<wbr>com/<wbr>deve<wbr>lope<wbr>rwor<wbr>ks/m<wbr>ydev<wbr>elop<wbr>erwo<wbr>rks/<wbr>blog<wbr>s/bo<wbr>blea<wbr>h/re<wbr>sour<wbr>ce/t<wbr>ower<wbr>.jpg<wbr>&#8220;<wbr>&gt;<wbr>&lt;<wbr>/span&gt;<wbr><br />
    <wbr></p></blockquote>
<p>  <wbr>&nbsp;<br />
  <wbr><b><wbr>你可以下载拖拽例子中的所有的HTML代码</b><wbr> <a href="https://www.ibm.com/developerworks/mydeveloperworks/files/app?lang=en#/person/270000CN12/file/ca25c6eb-f34a-437c-85da-5b3b24b3b9bb"><wbr>点击下载</a><wbr>.&nbsp; <br />
  <wbr><br />
  <wbr></p>
<p><wbr><br />
    <wbr>以我这初始的体验来看，HTML5将会提供给我们令人激动的用途。目前，这些API是有限制的，只在个别的浏览器里有效；对于我的例子，你需要在Firefox 3.5 版本以上才能运行。我将继续探索有哪些新功能今天我们可以使用，继续写更多的例子 &#8230; 请耐心等待！ </p>
<hr />
<p><small>©  <a href="http://www.aqee.net">外刊IT评论</a>, 2010. |
<a href="http://www.aqee.net/2010/08/19/html5-an-example-of-drag-and-drop/">永久链接</a> |
<a href="http://www.aqee.net/2010/08/19/html5-an-example-of-drag-and-drop/#comments">2 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.aqee.net/2010/08/19/html5-an-example-of-drag-and-drop/&title=HTML5 &#8211; 一个拖拽功能的例子">del.icio.us</a>
<br/>
Post tags: <br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.aqee.net/2010/08/19/html5-an-example-of-drag-and-drop/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>【外刊IT评论】云计算的可伸缩性迫使App服务无状态化</title>
		<link>http://www.aqee.net/2010/08/19/why-does-elastic-nature-of-cloud-impose/</link>
		<comments>http://www.aqee.net/2010/08/19/why-does-elastic-nature-of-cloud-impose/#comments</comments>
		<pubDate>Wed, 18 Aug 2010 16:43:26 +0000</pubDate>
		<dc:creator>花非花</dc:creator>
				<category><![CDATA[心得体会]]></category>
		<category><![CDATA[技术技巧]]></category>
		<category><![CDATA[cloud]]></category>

		<guid isPermaLink="false">http://www.aqee.net/?p=645</guid>
		<description><![CDATA[场景内容
云计算因其软件上的按需付费模式而大获成功，它创造了一种伸缩性模型：

如果有两个公司，它们正好在相反的时区里，白天都需要10台服务器，晚上减少到1台。那么一个云计算服务商需要11台服务器就能同时为这两个公司提供服务——在任何一个时间点，拿出10台给一家公司用，1台给另一家。
如果这两家公司都使用自己的机器，他们每家都要买10台（总共20台）。其中9台机器会在夜里闲置。
时区可不是来共享这些闲置资源的唯一理由：

运算需求同样是一个很好的应用场景。有些公司会在圣诞节时需要很强的运算能力，而另外一些公司则是在财政年度结束时需要，等等。
有些公司很可能是不能预知何时需要多少资源。例如slashdot效应。不管是哪种情况都是通过共享来让他人使用你的空闲资源。这就使按需付费成为可能。


你可以把这种概念扩展到整个平台成本上——应用程序服务器，数据库和应用。



关于伸缩性的最重要的一点就是——根据负载的情况，白天给公司提供服务的9台机器在夜间自动缩减到1台。而这一台之外的其它8台机器开始给其它公司提供服务。云计算的这种能够允许两个租户（或更多）共享业务处理能力的特性就叫做过程共享的多重租赁。
那么为什么要无状态的系统架构呢？
假设个场景，就说白天时间有1000个用户分布在10台机器上，每台机器大概服务100个用户。在一个有状态的系统结构中，每台机器都只为在本机登录并产生了会话(session)的那100个用户服务。这个由http负载均衡来实现，叫做会话粘连(session stickiness)。
当夜间到来时，让我们假设有900个用户退出系统，其他的100个用户仍然在线。理想情况下，只需1台机器就可以为所有的这些人提供服务。然而，这100个用户可能会分布在所有的这10台机器上，每台10人。所以，缩减到一台机器是不可能的，这样一来，伸缩性就给限制了。
解决这个问题的一个方法就是把10台机器的所有会话状态都复制到一起。这样一来，任何一台机器都可以为这些用户服务。但每台机器就会用掉10倍的内存来保留所有用户的会话状态。这些会降低服务器的可用性，因为一旦有更多的用户使用时，集群中就需要加入更多的服务器。当你共享多重租赁的应用中的租户突然暴增时，你就没法应付了。
无状态化后情况会如何变化?
在无状态的应用中，你可以在任何一个地方执行用户的请求——会话粘连(session stickness)不再是个问题。当用户从1000减到100后，你可以立即释放9台服务器，调给其它公司使用，只用1台为这100个用户服务。.
这听起来很简单。而实际操作起来却不是那么容易。所有的应用都需要状态。如果应用服务器不去处理这些状态，你就必须想其它的办法。数据库就是一个明显的问题。当前的数据库已经在扩展问题上遇到了足够的麻烦了，再加上状态管理，那是绝对不可行的。所以NoSQL才要“分布式”存储。
在PaaS服务商中你会看到这是一种常见的架构模式：

Google App Engine &#8211; 无状态请求 + Big Table
Microsoft Azure &#8211; web角色 + Azure存储/SQL
当然了，还有我们公司 &#8211; OrangeScape，它是运行在GAE/Amazon EC2 之上的。
我估计VMforce也是这样的 &#8211; Spring stateless session beans + Force.com DB

那就都云计算吧！有状态的应用+SQL数据库已成昨日黄花了。(抱歉！实在忍不住。)

©  外刊IT评论, 2010. &#124;
永久链接 &#124;
One comment &#124;
Add to
del.icio.us

Post tags: cloud
]]></description>
			<content:encoded><![CDATA[<h3>场景内容</h3>
<p>云计算因其软件上的按需付费模式而大获成功，它创造了一种伸缩性模型：</p>
<ul>
<li>如果有两个公司，它们正好在相反的时区里，白天都需要10台服务器，晚上减少到1台。那么一个云计算服务商需要11台服务器就能同时为这两个公司提供服务——在任何一个时间点，拿出10台给一家公司用，1台给另一家。</li>
<li>如果这两家公司都使用自己的机器，他们每家都要买10台（总共20台）。其中9台机器会在夜里闲置。</li>
<li>时区可不是来共享这些闲置资源的唯一理由：
<ul>
<li>运算需求同样是一个很好的应用场景。有些公司会在圣诞节时需要很强的运算能力，而另外一些公司则是在财政年度结束时需要，等等。</li>
<li>有些公司很可能是不能预知何时需要多少资源。例如<a href="http://en.wikipedia.org/wiki/Slashdot_effect">slashdot效应</a>。不管是哪种情况都是通过共享来让他人使用你的空闲资源。这就使按需付费成为可能。</li>
</ul>
</li>
<li>你可以把这种概念扩展到整个平台成本上——应用程序服务器，数据库和应用。</li>
</ul>
<p><img class="alignnone size-full wp-image-650" title="Statelessness" src="http://www.aqee.net/wordpress/wp-content/uploads/2010/08/Statelessness.png" alt="Statelessness" width="540" height="405" /><br />
<span id="more-645"></span><br />
关于伸缩性的最重要的一点就是——根据负载的情况，白天给公司提供服务的9台机器在夜间自动缩减到1台。而这一台之外的其它8台机器开始给其它公司提供服务。云计算的这种能够允许两个租户（或更多）共享业务处理能力的特性就叫做过程共享的多重租赁。</p>
<h3>那么为什么要无状态的系统架构呢？</h3>
<p>假设个场景，就说白天时间有1000个用户分布在10台机器上，每台机器大概服务100个用户。在一个有状态的系统结构中，每台机器都只为在本机登录并产生了会话(session)的那100个用户服务。这个由http负载均衡来实现，叫做会话粘连(session stickiness)。</p>
<p>当夜间到来时，让我们假设有900个用户退出系统，其他的100个用户仍然在线。理想情况下，只需1台机器就可以为所有的这些人提供服务。然而，这100个用户可能会分布在所有的这10台机器上，每台10人。所以，缩减到一台机器是不可能的，这样一来，伸缩性就给限制了。</p>
<p>解决这个问题的一个方法就是把10台机器的所有会话状态都复制到一起。这样一来，任何一台机器都可以为这些用户服务。但每台机器就会用掉10倍的内存来保留所有用户的会话状态。这些会降低服务器的可用性，因为一旦有更多的用户使用时，集群中就需要加入更多的服务器。当你共享多重租赁的应用中的租户突然暴增时，你就没法应付了。</p>
<h3>无状态化后情况会如何变化?</h3>
<p>在无状态的应用中，你可以在任何一个地方执行用户的请求——会话粘连(session stickness)不再是个问题。当用户从1000减到100后，你可以立即释放9台服务器，调给其它公司使用，只用1台为这100个用户服务。.</p>
<p>这听起来很简单。而实际操作起来却不是那么容易。所有的应用都需要状态。如果应用服务器不去处理这些状态，你就必须想其它的办法。数据库就是一个明显的问题。当前的数据库已经在扩展问题上遇到了足够的麻烦了，再加上状态管理，那是绝对不可行的。所以NoSQL才要“分布式”存储。</p>
<p>在PaaS服务商中你会看到这是一种常见的架构模式：</p>
<ul>
<li>Google App Engine &#8211; 无状态请求 + Big Table</li>
<li>Microsoft Azure &#8211; web角色 + Azure存储/SQL</li>
<li>当然了，还有我们公司 &#8211; <a href="http://www.orangescape.com/">OrangeScape</a>，它是运行在GAE/Amazon EC2 之上的。</li>
<li>我估计VMforce也是这样的 &#8211; Spring stateless session beans + Force.com DB</li>
</ul>
<p>那就都云计算吧！有状态的应用+SQL数据库已成昨日黄花了。(抱歉！实在忍不住。)</p>
<hr />
<p><small>©  <a href="http://www.aqee.net">外刊IT评论</a>, 2010. |
<a href="http://www.aqee.net/2010/08/19/why-does-elastic-nature-of-cloud-impose/">永久链接</a> |
<a href="http://www.aqee.net/2010/08/19/why-does-elastic-nature-of-cloud-impose/#comments">One comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://www.aqee.net/2010/08/19/why-does-elastic-nature-of-cloud-impose/&title=云计算的可伸缩性迫使App服务无状态化">del.icio.us</a>
<br/>
Post tags: <a href="http://www.aqee.net/tag/cloud/" rel="tag">cloud</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.aqee.net/2010/08/19/why-does-elastic-nature-of-cloud-impose/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
