<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/temp01.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/aqee-net" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/aqee-net" type="application/rss+xml"></fs:self_link><lastBuildDate>Thu, 02 Feb 2012 16:11:08 GMT</lastBuildDate><title>外刊IT评论</title><description>国外IT评论,编程技巧,网站开发趋势</description><link>http://www.aqee.net</link><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><language>en</language><pubDate>Sat, 04 Feb 2012 08:01:31 GMT</pubDate><item><title>【外刊IT评论网】这张照片是免费的</title><link>http://www.aqee.net/this-photograph-is-free/</link><content:encoded>[本文英文原文链接：&lt;a href=&quot;http://standblog.org/blog/post/2012/01/11/This-photograph-is-free&quot;&gt;This photograph is free&lt;/a&gt; ]&lt;hr&gt;&lt;p&gt;我正好在Petapixel.com上看到&lt;a href=&quot;http://www.aqee.net/this-photograph-is-not-free/&quot;&gt;《这张照片不免费》&lt;/a&gt;这篇文章，我想，我需要解释一下为什么我不同意作者的观点，并决定把下面这张照片奉献给大家：&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Tour_eiffel_at_sunrise_from_the_trocadero.jpg&quot;&gt;&lt;img class=&quot;aligncenter&quot; title=&quot;巴黎埃菲尔铁塔&quot; src=&quot;http://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Tour_eiffel_at_sunrise_from_the_trocadero.jpg/400px-Tour_eiffel_at_sunrise_from_the_trocadero.jpg&quot; alt=&quot;巴黎埃菲尔铁塔&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-3344&quot;&gt;&lt;/span&gt;&lt;br /&gt;
上面这张照片上免费的。你可以使用它，就像在&lt;a href=&quot;http://commons.wikimedia.org/wiki/File:Tour_eiffel_at_sunrise_from_the_trocadero.jpg#Licensing&quot; hreflang=&quot;en&quot;&gt;许可条款&lt;/a&gt;里说明的一样。事实上，你将不会是使用这张照片唯一的人。很多刊物都使用过它，我发现这张照片出现在很多地方。&lt;/p&gt;
&lt;p&gt;我想，这是一张不错的照片。为了拍出这张照片，我花了不少钱。一个佳能单反相机，一个高端镜头，以及为了拍这张照片、编辑它、发布它我耗费的时间。还不算我使用的计算机。几千欧元总是有的。但是，用这种方式计算这个事情有点傻。我已经用这个相机拍了不下几千张照片，算下来实际上每张照片会低于1欧元&amp;#8230;&lt;/p&gt;
&lt;p&gt;我拍摄这张照片是因为我喜欢摄影。过去的27年里我在这些摄影设备上投入了大量的钱，但从来没有从中获取一分钱。而另一方面，我从中得到了巨大的乐趣和十足的自豪。拍出美丽照片的乐趣，成为一个受尊敬的摄影家的自豪。把我的作品奉献给大家，看到大家的&lt;a href=&quot;http://www.flickr.com/photos/nitot/1873777303/&quot;&gt;笑容&lt;/a&gt;，这是我的快乐所在。看到我的作品对大家有用，看到它们被他人所用，这是我成就感的来源。&lt;/p&gt;
&lt;p&gt;当然，在巴黎拍下这张埃菲尔铁塔的照片，可以说它耗费了我不少的金钱。所以我不该分享它。这照片应该放在我的硬盘里，让它远离那些企图“剽窃”它的人们的视线。&lt;/p&gt;
&lt;p&gt;可是相反，我把它放到了&lt;a href=&quot;http://commons.wikimedia.org/wiki/Main_Page&quot;&gt;维基百科&lt;/a&gt;上，这样，维基百科上的其它文章或其它地方都可以使用它。我还在维基百科上分享了&lt;a href=&quot;http://commons.wikimedia.org/wiki/User:Nitot&quot;&gt;其它很多照片&lt;/a&gt;。其中一部分被一些&lt;a href=&quot;http://livre.fnac.com/a2998621/Lorant-Deutsch-Metronome-illustre&quot;&gt;非常成功的书籍&lt;/a&gt;引用。&lt;/p&gt;
&lt;p&gt;我并不后悔把这些照片分享给那些我不认识的人。它们虽然花费了我不少精力财力，但我也得到了很多的回报。因为是我把它们带到了这个世界上。如果我决定把它藏在我的硬盘上，那这一切都不会发生。所以，如果你想使用它，请访问我的博客，我更愿意看到我的作品被你们使用，而不是被遗忘。更重要的，我很早以前就已经认识到的事：这个世界上，每个人都用自己的相机，在自己的业余时间，用神奇的各种工具，拍摄照片，发布照片，那么，通过摄影来谋取利益的事将不会再有。&lt;/p&gt;
&lt;hr&gt;本文来自&lt;a href=&quot;http://www.aqee.net&quot;&gt;外刊IT评论网&lt;/a&gt;(&lt;a href=&quot;http://www.aqee.net&quot;&gt;www.aqee.net&lt;/a&gt;)，原始地址：&lt;a href=&quot;http://www.aqee.net/this-photograph-is-free/&quot; rel=&quot;bookmark&quot;&gt;这张照片是免费的&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/601628196/aqee-net/feedsky/s.gif?r=http://www.aqee.net/this-photograph-is-free/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.aqee.net/this-photograph-is-free/feed/</wfw:commentRss><slash:comments>6</slash:comments><description>[本文英文原文链接：This photograph is free ]我正好在Petapixel.com上看到《这张照片不免费》这篇文章，我想，我需要解释一下为什么我不同意作者的观点，并决定把下面这张照片奉献给大家： 上面这张照片上免费的。你可以使用它，就像在许可条款里说明的一样。事实上，你将不会是使用这张照片唯一的人。很多刊物都使用过它，我发现这张照片出现在很多地方。 我想，这是一张不错的照片。为了拍出这张照片，我花了不少钱。一个佳能单反相机，一个高端镜头，以及为了拍这张照片、编辑它、发布它我耗费的时间。还不算我使用的计算机。几千欧元总是有的。但是，用这种方式计算这个事情有点傻。我已经用这个相机拍了不下几千张照片，算下来实际上每张照片会低于1欧元&amp;#8230; 我拍摄这张照片是因为我喜欢摄影。过去的27年里我在这些摄影设备上投入了大量的钱，但从来没有从中获取一分钱。而另一方面，我从中得到了巨大的乐趣和十足的自豪。拍出美丽照片的乐趣，成为一个受尊敬的摄影家的自豪。把我的作品奉献给大家，看到大家的笑容，这是我的快乐所在。看到我的作品对大家有用，看到它们被他人所用，这是我成就感的来源。 当然，在巴黎拍下这张埃菲尔铁塔的照片，可以说它耗费了我不少的金钱。所以我不该分享它。这照片应该放在我的硬盘里，让它远离那些企图“剽窃”它的人们的视线。 可是相反，我把它放到了维基百科上，这样，维基百科上的其它文章或其它地方都可以使用它。我还在维基百科上分享了其它很多照片。其中一部分被一些非常成功的书籍引用。 我并不后悔把这些照片分享给那些我不认识的人。它们虽然花费了我不少精力财力，但我也得到了很多的回报。因为是我把它们带到了这个世界上。如果我决定把它藏在我的硬盘上，那这一切都不会发生。所以，如果你想使用它，请访问我的博客，我更愿意看到我的作品被你们使用，而不是被遗忘。更重要的，我很早以前就已经认识到的事：这个世界上，每个人都用自己的相机，在自己的业余时间，用神奇的各种工具，拍摄照片，发布照片，那么，通过摄影来谋取利益的事将不会再有。 本文来自外刊IT评论网(www.aqee.net)，原始地址：这张照片是免费的&lt;img src=&quot;http://www1.feedsky.com/t1/601628196/aqee-net/feedsky/s.gif?r=http://www.aqee.net/this-photograph-is-free/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>批评评论</category><category>免费照片</category><pubDate>Fri, 03 Feb 2012 00:11:08 +0800</pubDate><author>Aqee</author><comments>http://www.aqee.net/this-photograph-is-free/#comments</comments><guid isPermaLink="false">http://www.aqee.net/?p=3344</guid><dc:creator>Aqee</dc:creator><fs:srclink>http://www.aqee.net/this-photograph-is-free/</fs:srclink><fs:srcfeed>http://www.aqee.net/feed/</fs:srcfeed><fs:itemid>feedsky/aqee-net/~7979574/601628196/6261835</fs:itemid></item><item><title>【外刊IT评论网】反for-if编程模式</title><link>http://www.aqee.net/introducing-the-for-if-anti-pattern/</link><content:encoded>[本文英文原文链接：&lt;a href=&quot;http://blogs.msdn.com/b/oldnewthing/archive/2011/12/27/10251210.aspx&quot;&gt;Introducing the for-if anti-pattern&lt;/a&gt; ]&lt;hr&gt;&lt;p&gt;这些年来，我看到过大量的反编程模式。我感觉应该向大家分享一些。&lt;span id=&quot;more-3381&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;今天，我要介绍的是被我称作反&lt;em&gt;for-if&lt;/em&gt;编程模式的反模式，也就是人们所说的”&lt;a href=&quot;http://www.aqee.net/he-bought-the-whole-seat-but-we-only-needed-the-edge/&quot;&gt;我们卖给你整个座位，但你需要的只是一个边&lt;/a&gt;。”&lt;br /&gt;
这是一个特殊的反&lt;em&gt;for-case&lt;/em&gt;模式，其中所有的情况中只有一次会是null。&lt;/p&gt;
&lt;pre&gt;for (int i = 0; i &amp;lt; 100; i++) {
  if (i == 42) { do_something(i); }
}&lt;/pre&gt;
&lt;p&gt;这种情况可以简单的写成&lt;/p&gt;
&lt;pre&gt;do_something(42);&lt;/pre&gt;
&lt;p&gt;这个反&lt;em&gt;for-if&lt;/em&gt;模式可以表现成各种各样的形式。比如：&lt;/p&gt;
&lt;pre&gt;foreach (string filename in Directory.GetFiles(&quot;.&quot;))
{
    if (filename.Equals(&quot;desktop.ini&quot;, &lt;a href=&quot;http://blogs.msdn.com/b/michkap/archive/2005/09/22/472596.aspx&quot;&gt;StringComparison.OrdinalIgnoreCase&lt;/a&gt;))
    {
        return new StreamReader(filename);
    }
}&lt;/pre&gt;
&lt;p&gt;它是在一个目录里遍历查找一个指定文件，如果找到了，就返回文件的数据流。这段代码的一种不是那么折腾的写法是&lt;/p&gt;
&lt;pre&gt;if (File.Exists(&quot;desktop.ini&quot;))
{
    return new StreamReader(&quot;desktop.ini&quot;);
}&lt;/pre&gt;
&lt;p&gt;请注意，两个版本的代码片段具有相同的竞争条件：如果这个&lt;code&gt;desktop.ini&lt;/code&gt;本来是存在的，但在你创建&lt;code&gt;Stream­Reader&lt;/code&gt;之前被删掉了，你就会得到一个&lt;code&gt;File­Not­Found­Exception&lt;/code&gt;错误。&lt;/p&gt;
&lt;p&gt;再举一个例子：&lt;/p&gt;
&lt;pre&gt;foreach (object o in hashtable.Keys)
{
    if (o == &quot;target&quot;) return hashtable[&quot;target&quot;];
}&lt;/pre&gt;
&lt;p&gt;等同于&lt;/p&gt;
&lt;pre&gt;return hashtable[&quot;target&quot;];&lt;/pre&gt;
&lt;p&gt;我猜测这些家伙不喜欢在图书馆里通过书名找一本书，因为他们的做法是如此的繁琐：&lt;br /&gt;
他们来到图书馆里员面前说，“把你所有的书都给我，”然后他们拿着装满了上千本书的篮子，坐到墙角里自言自语：&lt;br /&gt;
“不是，这本书的书名不对”，&lt;/p&gt;
&lt;p&gt;“不是，这本也不是”，&lt;/p&gt;
&lt;p&gt;“标题还是不对。”&lt;/p&gt;
&lt;p&gt;“这本书呢？”&lt;/p&gt;
&lt;p&gt;”不是，也不是这本。“&lt;/p&gt;
&lt;p&gt;”老天，我要这样一本一本翻到什么时候&amp;#8230;“&lt;/p&gt;
&lt;hr&gt;本文来自&lt;a href=&quot;http://www.aqee.net&quot;&gt;外刊IT评论网&lt;/a&gt;(&lt;a href=&quot;http://www.aqee.net&quot;&gt;www.aqee.net&lt;/a&gt;)，原始地址：&lt;a href=&quot;http://www.aqee.net/introducing-the-for-if-anti-pattern/&quot; rel=&quot;bookmark&quot;&gt;反for-if编程模式&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/601308599/aqee-net/feedsky/s.gif?r=http://www.aqee.net/introducing-the-for-if-anti-pattern/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.aqee.net/introducing-the-for-if-anti-pattern/feed/</wfw:commentRss><slash:comments>5</slash:comments><description>[本文英文原文链接：Introducing the for-if anti-pattern ]这些年来，我看到过大量的反编程模式。我感觉应该向大家分享一些。 今天，我要介绍的是被我称作反for-if编程模式的反模式，也就是人们所说的”我们卖给你整个座位，但你需要的只是一个边。” 这是一个特殊的反for-case模式，其中所有的情况中只有一次会是null。 for (int i = 0; i &amp;#60; 100; i++) { if (i == 42) { do_something(i); } } 这种情况可以简单的写成 do_something(42); 这个反for-if模式可以表现成各种各样的形式。比如： foreach (string filename in Directory.GetFiles(&quot;.&quot;)) { if (filename.Equals(&quot;desktop.ini&quot;, StringComparison.OrdinalIgnoreCase)) { return new &amp;#8230; &lt;a class=&quot;more-link&quot; href=&quot;http://www.aqee.net/introducing-the-for-if-anti-pattern/&quot;&gt;继续阅读 &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/601308599/aqee-net/feedsky/s.gif?r=http://www.aqee.net/introducing-the-for-if-anti-pattern/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>反模式</category><category>技术技巧</category><pubDate>Thu, 02 Feb 2012 00:24:22 +0800</pubDate><author>Aqee</author><comments>http://www.aqee.net/introducing-the-for-if-anti-pattern/#comments</comments><guid isPermaLink="false">http://www.aqee.net/?p=3381</guid><dc:creator>Aqee</dc:creator><fs:srclink>http://www.aqee.net/introducing-the-for-if-anti-pattern/</fs:srclink><fs:srcfeed>http://www.aqee.net/feed/</fs:srcfeed><fs:itemid>feedsky/aqee-net/~7979574/601308599/6261835</fs:itemid></item><item><title>【外刊IT评论网】你从未听说过的一种编程方式</title><link>http://www.aqee.net/a-programming-idiom-you-ve-never-heard-of/</link><content:encoded>[本文英文原文链接：&lt;a href=&quot;http://prog21.dadgum.com/121.html&quot;&gt;A Programming Idiom You've Never Heard Of&lt;/a&gt; ]&lt;hr&gt;&lt;p&gt;下面是一系列的动作：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;从小屋里拿出耙子，用它把院子里的树叶堆起来，然后把耙子放回小屋。&lt;/p&gt;
&lt;p&gt;飞到西雅图，看风景，然后飞回。&lt;/p&gt;
&lt;p&gt;把钥匙插进钥匙孔，打开，然后取出钥匙。&lt;/p&gt;
&lt;p&gt;点亮你的手机，查看时间，然后把它置回睡眠状态。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;看到这些模式没？&lt;span id=&quot;more-3377&quot;&gt;&lt;/span&gt;你做一种事情，然后做另外一种事情，然后又撤销你做的第一件事情。或者用更精确的说法，这最后的一步是第一步的反向操作。一旦你认识到这种模式，你会发现它无处不在。拿起茶杯，喝一口茶，放回茶杯。同样，在程序代码里有到处都是：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;打开一个文件，读取内容，关闭文件。&lt;/p&gt;
&lt;p&gt;分配一段内存，用它做一些事情，释放它。&lt;/p&gt;
&lt;p&gt;把内存地址内容加载到寄存器，修改它，然后存回内存。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;虽然这很容易解释，也很容易举出例子，但想实现它却不那么容易。我们需要的这种操作看起来应该像这个样子：&lt;tt&gt;idiom(Function1, Function2)&lt;/tt&gt;，于是我们上面说的打开文件的例子应该是&lt;tt&gt;idiom(Open, Read)&lt;/tt&gt;这个样子。问题是，需要有一种程序的方法能知道这“open”的反向操作是“close”。是否有一种语言，里面的方法可以反向执行？&lt;/p&gt;
&lt;p&gt;也许会让你惊讶：有。这就是&lt;a href=&quot;http://jsoftware.com/&quot;&gt;J&lt;/a&gt;语言。我在这里反复唠叨的这种编程模式，实际上是J语言里的一个内置函数，叫做&lt;em&gt;under&lt;/em&gt;。在英语里，这打开文件的例子可以说成“read under open”。&lt;/p&gt;
&lt;p&gt;“under”在J语言里一个非常常见的用处就是计算vector的数量级。算法非常简单：平方每个元素，把值加起来，然后取平方根。哈哈，这第三步正好是第一步的反向。求和 “under” 平方。在J语言里的写法是：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;mag =: +/&amp;amp;.:*:&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;tt&gt;+/&lt;/tt&gt; is “相加”。 这&amp;amp;号，点号，分号序列就是“under”。&lt;tt&gt;*:&lt;/tt&gt;就是“平方”。&lt;/p&gt;
&lt;hr&gt;本文来自&lt;a href=&quot;http://www.aqee.net&quot;&gt;外刊IT评论网&lt;/a&gt;(&lt;a href=&quot;http://www.aqee.net&quot;&gt;www.aqee.net&lt;/a&gt;)，原始地址：&lt;a href=&quot;http://www.aqee.net/a-programming-idiom-you-ve-never-heard-of/&quot; rel=&quot;bookmark&quot;&gt;你从未听说过的一种编程方式&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/600819827/aqee-net/feedsky/s.gif?r=http://www.aqee.net/a-programming-idiom-you-ve-never-heard-of/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.aqee.net/a-programming-idiom-you-ve-never-heard-of/feed/</wfw:commentRss><slash:comments>4</slash:comments><description>[本文英文原文链接：A Programming Idiom You've Never Heard Of ]下面是一系列的动作： 从小屋里拿出耙子，用它把院子里的树叶堆起来，然后把耙子放回小屋。 飞到西雅图，看风景，然后飞回。 把钥匙插进钥匙孔，打开，然后取出钥匙。 点亮你的手机，查看时间，然后把它置回睡眠状态。 看到这些模式没？你做一种事情，然后做另外一种事情，然后又撤销你做的第一件事情。或者用更精确的说法，这最后的一步是第一步的反向操作。一旦你认识到这种模式，你会发现它无处不在。拿起茶杯，喝一口茶，放回茶杯。同样，在程序代码里有到处都是： 打开一个文件，读取内容，关闭文件。 分配一段内存，用它做一些事情，释放它。 把内存地址内容加载到寄存器，修改它，然后存回内存。 虽然这很容易解释，也很容易举出例子，但想实现它却不那么容易。我们需要的这种操作看起来应该像这个样子：idiom(Function1, Function2)，于是我们上面说的打开文件的例子应该是idiom(Open, Read)这个样子。问题是，需要有一种程序的方法能知道这“open”的反向操作是“close”。是否有一种语言，里面的方法可以反向执行？ 也许会让你惊讶：有。这就是J语言。我在这里反复唠叨的这种编程模式，实际上是J语言里的一个内置函数，叫做under。在英语里，这打开文件的例子可以说成“read under open”。 “under”在J语言里一个非常常见的用处就是计算vector的数量级。算法非常简单：平方每个元素，把值加起来，然后取平方根。哈哈，这第三步正好是第一步的反向。求和 “under” 平方。在J语言里的写法是： mag =: +/&amp;#38;.:*: +/ is “相加”。 这&amp;#38;号，点号，分号序列就是“under”。*:就是“平方”。 本文来自外刊IT评论网(www.aqee.net)，原始地址：你从未听说过的一种编程方式&lt;img src=&quot;http://www1.feedsky.com/t1/600819827/aqee-net/feedsky/s.gif?r=http://www.aqee.net/a-programming-idiom-you-ve-never-heard-of/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>技术技巧</category><pubDate>Wed, 01 Feb 2012 00:13:28 +0800</pubDate><author>Aqee</author><comments>http://www.aqee.net/a-programming-idiom-you-ve-never-heard-of/#comments</comments><guid isPermaLink="false">http://www.aqee.net/?p=3377</guid><dc:creator>Aqee</dc:creator><fs:srclink>http://www.aqee.net/a-programming-idiom-you-ve-never-heard-of/</fs:srclink><fs:srcfeed>http://www.aqee.net/feed/</fs:srcfeed><fs:itemid>feedsky/aqee-net/~7979574/600819827/6261835</fs:itemid></item><item><title>【外刊IT评论网】关于返回 Null 值的问题</title><link>http://www.aqee.net/returning-null/</link><content:encoded>[本文英文原文链接：&lt;a href=&quot;http://zdsbs.blogspot.com/2009/08/returning-null.html&quot;&gt;Returning Null&lt;/a&gt; ]&lt;hr&gt;&lt;p&gt;我总感觉一个方法返回null值有问题。当读了Misko Hevery关于&lt;a href=&quot;http://misko.hevery.com/2009/07/31/how-to-think-about-oo/&quot;&gt;how to think about OO&lt;/a&gt;的博客文章后，又让我想起这个问题。&lt;span id=&quot;more-3371&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;我感觉返回null值是有问题的，它大量的被使用在一个方法有不同的返回类型时。简单的用谷歌搜索一下“returning null”，你就会发现有建议把返回类型做成一个null对象。返回一个Null对象在某些情况下是合适的，但并不适合当你需要向客户端传送两种不同的东西的情形。用Misko重构的一段代码来说明这个问题。他重构的是一段登录代码(我非常喜欢他的过程)，这段代码大概是这个样子：&lt;/p&gt;
&lt;pre&gt;  Cookie login(Ldap ldap) {
    if ( ldap.auth(user, password) )
      return new Cookie(user);
    return null;
  }&lt;/pre&gt;
&lt;p&gt;从这段代码，可以看出两种情况(从结构上讲)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果认证通过，客户端会被通知验证成功，生成一个新的Cookie&lt;/li&gt;
&lt;li&gt;如果认证失败，则通过返回的null值通知客户端&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;客户端的方法应该是什么样的？&lt;/p&gt;
&lt;pre&gt;  public void authenticateUser(User user) {
     Cookie userCookie = user.login(ldap);
     if (userCookie == null) {
           //notify someone that auth failed
     } eles {
           //register them as logged in
     }
  }&lt;/pre&gt;
&lt;p&gt;我们在两个地方做了相同的事情，只是在语法上有稍微的不同，每个地方，我们都要检查验证是否成功。如果我们使用&lt;a href=&quot;http://martinfowler.com/bliki/InversionOfControl.html&quot;&gt;IoC（反向控制）&lt;/a&gt;模式，或“Tell Don&amp;#8217;t Ask”模式或“Hollywood原则”，会如何？&lt;/p&gt;
&lt;pre&gt;  Cookie login(Ldap ldap, AuthenticationRegistry authenticationRegistry) {
    if ( ldap.auth(user, password) )
      authenticationRegistry.authSucceeded(new Cookie(user));
    authenticationRegistry.authFailed(user);
  }&lt;/pre&gt;
&lt;p&gt;客户端：&lt;/p&gt;
&lt;pre&gt;  public void authenticateUser(User user) {
     user.login(ldap,this);
  }

  public void authSucceeded(Cookie cookie) {
     //register them as logged in
  }

  public void authFailed(User user) {
     //register them as auth failed
  }&lt;/pre&gt;
&lt;p&gt;新代码稍微有点复杂，但我感觉它很清晰，实现的更直接。现在我们的两个实体能够相互通信，我们定义了它们通信的方式。我喜欢Misko的重构，我只是更进了一步。好坏可以再讨论，但我想，如果你遇到了这种需要返回两种情况的方法时，IoC是你应该的选择。&lt;/p&gt;
&lt;hr&gt;本文来自&lt;a href=&quot;http://www.aqee.net&quot;&gt;外刊IT评论网&lt;/a&gt;(&lt;a href=&quot;http://www.aqee.net&quot;&gt;www.aqee.net&lt;/a&gt;)，原始地址：&lt;a href=&quot;http://www.aqee.net/returning-null/&quot; rel=&quot;bookmark&quot;&gt;关于返回 Null 值的问题&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/600462543/aqee-net/feedsky/s.gif?r=http://www.aqee.net/returning-null/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.aqee.net/returning-null/feed/</wfw:commentRss><slash:comments>1</slash:comments><description>[本文英文原文链接：Returning Null ]我总感觉一个方法返回null值有问题。当读了Misko Hevery关于how to think about OO的博客文章后，又让我想起这个问题。 我感觉返回null值是有问题的，它大量的被使用在一个方法有不同的返回类型时。简单的用谷歌搜索一下“returning null”，你就会发现有建议把返回类型做成一个null对象。返回一个Null对象在某些情况下是合适的，但并不适合当你需要向客户端传送两种不同的东西的情形。用Misko重构的一段代码来说明这个问题。他重构的是一段登录代码(我非常喜欢他的过程)，这段代码大概是这个样子： Cookie login(Ldap ldap) { if ( ldap.auth(user, password) ) return new Cookie(user); return null; } 从这段代码，可以看出两种情况(从结构上讲) 如果认证通过，客户端会被通知验证成功，生成一个新的Cookie 如果认证失败，则通过返回的null值通知客户端 客户端的方法应该是什么样的？ public void authenticateUser(User user) { Cookie userCookie = user.login(ldap); if (userCookie &amp;#8230; &lt;a class=&quot;more-link&quot; href=&quot;http://www.aqee.net/returning-null/&quot;&gt;继续阅读 &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/600462543/aqee-net/feedsky/s.gif?r=http://www.aqee.net/returning-null/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>批评评论</category><pubDate>Tue, 31 Jan 2012 00:09:12 +0800</pubDate><author>Aqee</author><comments>http://www.aqee.net/returning-null/#comments</comments><guid isPermaLink="false">http://www.aqee.net/?p=3371</guid><dc:creator>Aqee</dc:creator><fs:srclink>http://www.aqee.net/returning-null/</fs:srclink><fs:srcfeed>http://www.aqee.net/feed/</fs:srcfeed><fs:itemid>feedsky/aqee-net/~7979574/600462543/6261835</fs:itemid></item><item><title>【外刊IT评论网】给程序员们的工资报价提醒</title><link>http://www.aqee.net/quick-salary-tip-for-software-engineers/</link><content:encoded>[本文英文原文链接：&lt;a href=&quot;http://markcunningham91.blogspot.com/2011/12/quick-salary-tip-for-software-engineers.html&quot;&gt;Quick Salary Tip for Software Engineers&lt;/a&gt; ]&lt;hr&gt;&lt;p&gt;　　在薪水上讨价还价的方式有很多种，我要说的这一点也许并不是最好的。然而，如果使用的得当，会收到很好的效果。如果你正在跟一家公司接触(没有经过职业中介)，而且事情看来很顺利，进度很快，你要保持这种面试的势头，但如果到了最后快要得到这个职位时，你要把节奏慢下来！&lt;span id=&quot;more-3365&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;　　这有个例子：&lt;/p&gt;
&lt;p&gt;　　你在四处求职，一个朋友，或一个同事，或一个以前公司的上司找到你，要给你一个职位。你面试了一次，你吸引住了他们。你进行了复试，你见到了CTO。一切都很顺利，因为你是一个有价值的人，你的资历说明了这些，CTO决定加快进度，决定给你这个职位。因为事情发展的太快，而且很顺利，很多程序员在这个时候都会在薪水上不是那么努力的讨价还价。毕竟，没有人希望打破这种和平的气氛。我遇到很多次有程序员对我说，“我非常喜欢这里的人，他们做的东西很酷，我对薪水并不打算斤斤计较”。&lt;/p&gt;
&lt;p&gt;　　如果你是这样想的，那你是在职业道路上把一大捆钞票丢到了路边。最近，我和一个非常不错的程序员谈话。我并不想称他为“天才”，但他绝对的非常出色。他最近的一份工作的薪水是9万美元/年。同样是在那一周，我遇到另外一位求职者，他的公司给他的薪水是10.5万美元/年。我很显然会把这两个人放到一起比较，他们是同一种职业，但一个拿9万美元/年，另一个是10.5万美元。讽刺的是，9万美元的那个家伙有计算机学位，而10.5万的没有！&lt;/p&gt;
&lt;p&gt;　　所以，我要给你一段有用的话，当你面对上面谈到的那种情形时(或任何关于薪水的问题时)，也许你派得上用场。当CTO或VP或人事部到你面前问你对工作的期望时，说这些：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;“说实话，我还没有好好想过薪水的问题。我的所有精力都放到了面试上，忙着跟所有的人面谈，我还没有机会能坐下来好好想想待遇问题。如果你不反对的话，我想回去，冷静一下，明天早上做出决定。不知可否？”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;　　通过这样，你在一个好机会面前轻踩刹车，使事情慢下来，重新审视一下你的目标，这份工作。不要把这当成儿戏，你面对的是一个在生意场上挣钱、省钱的公司。如果你成为他们最低收入而且快乐的员工，他们很乐意要你。毕竟，这是最好的生意。也许差值也就每月2-3千美元，但从你20多年4-5份工作上的积累，这意味着一辆新车，或你的孩子的大学学费。我在我的朋友圈里找不到一位能让这笔钱从身边溜走的人。&lt;/p&gt;
&lt;hr&gt;本文来自&lt;a href=&quot;http://www.aqee.net&quot;&gt;外刊IT评论网&lt;/a&gt;(&lt;a href=&quot;http://www.aqee.net&quot;&gt;www.aqee.net&lt;/a&gt;)，原始地址：&lt;a href=&quot;http://www.aqee.net/quick-salary-tip-for-software-engineers/&quot; rel=&quot;bookmark&quot;&gt;给程序员们的工资报价提醒&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/600164616/aqee-net/feedsky/s.gif?r=http://www.aqee.net/quick-salary-tip-for-software-engineers/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.aqee.net/quick-salary-tip-for-software-engineers/feed/</wfw:commentRss><slash:comments>3</slash:comments><description>[本文英文原文链接：Quick Salary Tip for Software Engineers ]　　在薪水上讨价还价的方式有很多种，我要说的这一点也许并不是最好的。然而，如果使用的得当，会收到很好的效果。如果你正在跟一家公司接触(没有经过职业中介)，而且事情看来很顺利，进度很快，你要保持这种面试的势头，但如果到了最后快要得到这个职位时，你要把节奏慢下来！ 　　这有个例子： 　　你在四处求职，一个朋友，或一个同事，或一个以前公司的上司找到你，要给你一个职位。你面试了一次，你吸引住了他们。你进行了复试，你见到了CTO。一切都很顺利，因为你是一个有价值的人，你的资历说明了这些，CTO决定加快进度，决定给你这个职位。因为事情发展的太快，而且很顺利，很多程序员在这个时候都会在薪水上不是那么努力的讨价还价。毕竟，没有人希望打破这种和平的气氛。我遇到很多次有程序员对我说，“我非常喜欢这里的人，他们做的东西很酷，我对薪水并不打算斤斤计较”。 　　如果你是这样想的，那你是在职业道路上把一大捆钞票丢到了路边。最近，我和一个非常不错的程序员谈话。我并不想称他为“天才”，但他绝对的非常出色。他最近的一份工作的薪水是9万美元/年。同样是在那一周，我遇到另外一位求职者，他的公司给他的薪水是10.5万美元/年。我很显然会把这两个人放到一起比较，他们是同一种职业，但一个拿9万美元/年，另一个是10.5万美元。讽刺的是，9万美元的那个家伙有计算机学位，而10.5万的没有！ 　　所以，我要给你一段有用的话，当你面对上面谈到的那种情形时(或任何关于薪水的问题时)，也许你派得上用场。当CTO或VP或人事部到你面前问你对工作的期望时，说这些： “说实话，我还没有好好想过薪水的问题。我的所有精力都放到了面试上，忙着跟所有的人面谈，我还没有机会能坐下来好好想想待遇问题。如果你不反对的话，我想回去，冷静一下，明天早上做出决定。不知可否？” 　　通过这样，你在一个好机会面前轻踩刹车，使事情慢下来，重新审视一下你的目标，这份工作。不要把这当成儿戏，你面对的是一个在生意场上挣钱、省钱的公司。如果你成为他们最低收入而且快乐的员工，他们很乐意要你。毕竟，这是最好的生意。也许差值也就每月2-3千美元，但从你20多年4-5份工作上的积累，这意味着一辆新车，或你的孩子的大学学费。我在我的朋友圈里找不到一位能让这笔钱从身边溜走的人。 本文来自外刊IT评论网(www.aqee.net)，原始地址：给程序员们的工资报价提醒&lt;img src=&quot;http://www1.feedsky.com/t1/600164616/aqee-net/feedsky/s.gif?r=http://www.aqee.net/quick-salary-tip-for-software-engineers/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>求职招聘</category><pubDate>Mon, 30 Jan 2012 00:58:04 +0800</pubDate><author>Aqee</author><comments>http://www.aqee.net/quick-salary-tip-for-software-engineers/#comments</comments><guid isPermaLink="false">http://www.aqee.net/?p=3365</guid><dc:creator>Aqee</dc:creator><fs:srclink>http://www.aqee.net/quick-salary-tip-for-software-engineers/</fs:srclink><fs:srcfeed>http://www.aqee.net/feed/</fs:srcfeed><fs:itemid>feedsky/aqee-net/~7979574/600164616/6261835</fs:itemid></item><item><title>【外刊IT评论网】他买下了整个座位，但我们只需要一个边</title><link>http://www.aqee.net/he-bought-the-whole-seat-but-we-only-needed-the-edge/</link><content:encoded>[本文英文原文链接：&lt;a href=&quot;http://blogs.msdn.com/b/oldnewthing/archive/2010/04/27/10002865.aspx&quot;&gt;He bought the whole seat, but we only needed the edge&lt;/a&gt; ]&lt;hr&gt;&lt;p&gt;在Windows 95交付给了生产商，但在正式对外发布之前，开发团队在多年的辛苦工作后终于有了一个放松和休息的机会。项目经理决定搞一个庆祝活动，让所有人聚到一起乐一乐。常见的庆祝活动可能是去看一场棒球比赛，租一个电影院看最近上映的动作片，或者简单点的去野营或看垒球比赛。&lt;/p&gt;
&lt;p&gt;但这回，项目经理决定来点与众不同的，有点野蛮的，发狂的，能让每个人都谈论数天的事情：他给每个人买了一张巨型卡车大赛的门票。&lt;br /&gt;
  (他买下了整个座位，尽管我们只需要边上一点的地方。) &lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;object width=&quot;480&quot; height=&quot;400&quot; classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0&quot;&gt;&lt;param name=&quot;src&quot; value=&quot;//player.ku6.com/refer/bx65QJkFw6StXg9hDacZrw../v.swf&quot; /&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot; /&gt;&lt;embed width=&quot;480&quot; height=&quot;400&quot; type=&quot;application/x-shockwave-flash&quot; src=&quot;//player.ku6.com/refer/bx65QJkFw6StXg9hDacZrw../v.swf&quot; allowscriptaccess=&quot;always&quot; /&gt;&lt;/object&gt;&lt;/center&gt;&lt;/p&gt;
&lt;hr&gt;本文来自&lt;a href=&quot;http://www.aqee.net&quot;&gt;外刊IT评论网&lt;/a&gt;(&lt;a href=&quot;http://www.aqee.net&quot;&gt;www.aqee.net&lt;/a&gt;)，原始地址：&lt;a href=&quot;http://www.aqee.net/he-bought-the-whole-seat-but-we-only-needed-the-edge/&quot; rel=&quot;bookmark&quot;&gt;他买下了整个座位，但我们只需要一个边&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/600164617/aqee-net/feedsky/s.gif?r=http://www.aqee.net/he-bought-the-whole-seat-but-we-only-needed-the-edge/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.aqee.net/he-bought-the-whole-seat-but-we-only-needed-the-edge/feed/</wfw:commentRss><slash:comments>6</slash:comments><description>[本文英文原文链接：He bought the whole seat, but we only needed the edge ]在Windows 95交付给了生产商，但在正式对外发布之前，开发团队在多年的辛苦工作后终于有了一个放松和休息的机会。项目经理决定搞一个庆祝活动，让所有人聚到一起乐一乐。常见的庆祝活动可能是去看一场棒球比赛，租一个电影院看最近上映的动作片，或者简单点的去野营或看垒球比赛。 但这回，项目经理决定来点与众不同的，有点野蛮的，发狂的，能让每个人都谈论数天的事情：他给每个人买了一张巨型卡车大赛的门票。 (他买下了整个座位，尽管我们只需要边上一点的地方。) 本文来自外刊IT评论网(www.aqee.net)，原始地址：他买下了整个座位，但我们只需要一个边&lt;img src=&quot;http://www1.feedsky.com/t1/600164617/aqee-net/feedsky/s.gif?r=http://www.aqee.net/he-bought-the-whole-seat-but-we-only-needed-the-edge/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>团队建设</category><category>微软</category><pubDate>Thu, 19 Jan 2012 00:06:11 +0800</pubDate><author>Aqee</author><comments>http://www.aqee.net/he-bought-the-whole-seat-but-we-only-needed-the-edge/#comments</comments><guid isPermaLink="false">http://www.aqee.net/?p=3339</guid><dc:creator>Aqee</dc:creator><fs:srclink>http://www.aqee.net/he-bought-the-whole-seat-but-we-only-needed-the-edge/</fs:srclink><fs:srcfeed>http://www.aqee.net/feed/</fs:srcfeed><fs:itemid>feedsky/aqee-net/~7979574/600164617/6261835</fs:itemid></item><item><title>【外刊IT评论网】创新与回报</title><link>http://www.aqee.net/hacker-news-and-saas/</link><content:encoded>[本文英文原文链接：&lt;a href=&quot;http://www.tristara.com/blog/2012/hacker-news-and-saas/&quot;&gt;Hacker News and SaaS&lt;/a&gt; ]&lt;hr&gt;&lt;p&gt;昨天在&lt;a href=&quot;http://news.ycombinator.com/&quot;&gt;Hacker News&lt;/a&gt;上发生了一件有趣的事情，反映了当今世界上创新与回报的复杂矛盾。&lt;span id=&quot;more-3351&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;有人给出了一个链接：&lt;a href=&quot;http://www.visitorjs.com/&quot;&gt;visitor.js&lt;/a&gt;，指向的是一个放在某服务器上的Javascript文件，这个js文件能提供你关于你的网站的访客的详细信息(比如他在哪个城市，最后访问日期等等)。这个脚本的创建者把它做成了以服务的形式提供给人们，但你要每月支付10美元的使用费。&lt;/p&gt;
&lt;p&gt;可是几个小时后，有人贴出了一个免费的&lt;a href=&quot;https://github.com/codejoust/visitor.js&quot;&gt;开源版本的visitor.js&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;不管你是如何感觉这个事情，下面这两点我觉得不能否认：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这个开源版的visitor.js的出现对整个软件行业来说是有积极作用的。所有的开发人员又多了一个新的软件工具，他们可以把它用在任何可以用到的地方。&lt;/li&gt;
&lt;li&gt;开源版的出现使得visitor.js的原创者更难从中获取收益。Hacker News对创新起到了一种抑制作用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;软件业的经济现象非常的有趣。如果你开发出一种服务，十分的复杂，没有人可以简单的复制(比如&lt;a href=&quot;http://www.twilio.com/&quot;&gt;Twilio&lt;/a&gt;)，你会活得很好。如果你做了一个网站，吸引了千万计的用户，没有人能轻易的把他们从你那抢走——即使他们可以复制你的作品。&lt;/p&gt;
&lt;p&gt;但是，如果你开发出一些很酷的东西，就像visitor.js，你在我们的软件技术系统里增加了有用的东西，但是，你从这种奉献中获取不到利益。&lt;/p&gt;
&lt;p&gt;这种冲突改变了这个世界，使得每个程序员在开发软件时变得更有效率，但与此同时，从这些开发中获取利益却变的更难。&lt;/p&gt;
&lt;hr&gt;本文来自&lt;a href=&quot;http://www.aqee.net&quot;&gt;外刊IT评论网&lt;/a&gt;(&lt;a href=&quot;http://www.aqee.net&quot;&gt;www.aqee.net&lt;/a&gt;)，原始地址：&lt;a href=&quot;http://www.aqee.net/hacker-news-and-saas/&quot; rel=&quot;bookmark&quot;&gt;创新与回报&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/600164618/aqee-net/feedsky/s.gif?r=http://www.aqee.net/hacker-news-and-saas/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.aqee.net/hacker-news-and-saas/feed/</wfw:commentRss><slash:comments>4</slash:comments><description>[本文英文原文链接：Hacker News and SaaS ]昨天在Hacker News上发生了一件有趣的事情，反映了当今世界上创新与回报的复杂矛盾。 有人给出了一个链接：visitor.js，指向的是一个放在某服务器上的Javascript文件，这个js文件能提供你关于你的网站的访客的详细信息(比如他在哪个城市，最后访问日期等等)。这个脚本的创建者把它做成了以服务的形式提供给人们，但你要每月支付10美元的使用费。 可是几个小时后，有人贴出了一个免费的开源版本的visitor.js。 不管你是如何感觉这个事情，下面这两点我觉得不能否认： 这个开源版的visitor.js的出现对整个软件行业来说是有积极作用的。所有的开发人员又多了一个新的软件工具，他们可以把它用在任何可以用到的地方。 开源版的出现使得visitor.js的原创者更难从中获取收益。Hacker News对创新起到了一种抑制作用。 软件业的经济现象非常的有趣。如果你开发出一种服务，十分的复杂，没有人可以简单的复制(比如Twilio)，你会活得很好。如果你做了一个网站，吸引了千万计的用户，没有人能轻易的把他们从你那抢走——即使他们可以复制你的作品。 但是，如果你开发出一些很酷的东西，就像visitor.js，你在我们的软件技术系统里增加了有用的东西，但是，你从这种奉献中获取不到利益。 这种冲突改变了这个世界，使得每个程序员在开发软件时变得更有效率，但与此同时，从这些开发中获取利益却变的更难。 本文来自外刊IT评论网(www.aqee.net)，原始地址：创新与回报&lt;img src=&quot;http://www1.feedsky.com/t1/600164618/aqee-net/feedsky/s.gif?r=http://www.aqee.net/hacker-news-and-saas/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>创业理想</category><pubDate>Wed, 18 Jan 2012 00:26:23 +0800</pubDate><author>Aqee</author><comments>http://www.aqee.net/hacker-news-and-saas/#comments</comments><guid isPermaLink="false">http://www.aqee.net/?p=3351</guid><dc:creator>Aqee</dc:creator><fs:srclink>http://www.aqee.net/hacker-news-and-saas/</fs:srclink><fs:srcfeed>http://www.aqee.net/feed/</fs:srcfeed><fs:itemid>feedsky/aqee-net/~7979574/600164618/6261835</fs:itemid></item><item><title>【外刊IT评论网】纽约市长布隆伯格的2012年新年计划：学会编程</title><link>http://www.aqee.net/mayor-bloomberg-will-learn-how-to-write-code-in-2012/</link><content:encoded>[本文英文原文链接：&lt;a href=&quot;http://idealab.talkingpointsmemo.com/2012/01/mayor-bloomberg-will-learn-how-to-write-code-in-2012.php&quot;&gt;Mayor Bloomberg Will Learn How To Write Code In 2012&lt;/a&gt; ]&lt;hr&gt;&lt;p&gt;纽约市市长迈克尔·布隆伯格(Michael Bloomberg)在过去的几年里不断的宣称自己对科技相关的所有的事情的热爱，而如今他的热爱上了一个新台阶。周二，布隆伯格在Twitter上发微博说他的新年计划是学会如何编程，要使用纽约本地的Codecademy网站上提供的有趣免费的，游戏方式的在线课程进行学习。&lt;span id=&quot;more-3358&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;布隆伯格在Twitter是说，“我的2012年新年计划是在Codecademy上学习编程！加入我吧。http://codeyear.com/ #codeyear”，很快这个#codeyear标签就在Twitter的纽约本地趋势榜上升到了首位。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://wkee.net/qee/wordpress/wp-content/uploads/2012/01/Michael_Bloomberg.jpg&quot; alt=&quot;纽约市市长迈克尔·布隆伯格&quot; title=&quot;纽约市市长迈克尔·布隆伯格&quot; width=&quot;340&quot; height=&quot;462&quot; class=&quot;aligncenter size-full wp-image-3362&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Codecademy网站迅速的给出了回复，感谢市长给他们做的免费宣传，并要提供市长特殊待遇：“谢谢——我们很高兴你能顺便访问我们的网站，我们将亲自为你解决问题！”Codecademy的Twitter帐户里这样回复。&lt;/p&gt;
&lt;p&gt;据应该BBC报道，他的这项举动甚至激励了伦敦市长Boris Johnson，他说他很“钦佩”布隆伯格，也考虑要加入他的行列，去学会，或至少要了解编程。&lt;/p&gt;
&lt;p&gt;“Codeyear”是一个Codecademy用来表述一个新的学年的词，人们在网上自学编程时用它来标注自己的在线课程。&lt;/p&gt;
&lt;p&gt;Codecademy这个网站成立仅5个月之久，但已经在纽约的创业公司里引起了巨大的关注，科技新闻界大量的报道赞扬其提供的在线编程教材及时和易用，更重要的是有趣和合适。&lt;/p&gt;
&lt;p&gt;据纽约时报报道，Codecademy网站是由一个之前是哥伦比亚学政治学的学生的Zach Simms，和一个程序员Ryan Bubinski，和他们的一些朋友，于2011年6月创建的。很讽刺的是，Simms创建这个网站的最初想法是来源于他的争取著名的Y Combinator投资公司的创业投资的失败。Simms一直感觉缺乏足够的编程知识来支撑他对一个绝好的创业原型的进行推销。于是，他和Bubinski决定把他的困难转变成一个创业想法。&lt;/p&gt;
&lt;p&gt;Y Combinator投资公司的创始人Paul Graham 很欣赏这个想法，于是编程学院(Code Academy)就诞生了。到了网站成立后的8月份，已经有20万人开始在这个网站上学习课程。一个月后，这个数目达到了50万人。巧合的是，自从平安夜发起了Code Year倡议后，将近又有20万人在网站上进行了注册。&lt;/p&gt;
&lt;p&gt;还不清楚有多少人访问这个网站是因为布隆伯格的声明，但可以推断的是，有大量的人是这位市长的粉丝。我们正在跟Codecademy和市长办公室联系，我们会公布获得的最新动态。&lt;/p&gt;
&lt;p&gt;除了对科技的热爱，Bloomberg如果能以一个科技精英政治家的身份出现，必将增加他的政治影响力。正如一位在网友在Codecademy的Facebook主页上的留言：“奥巴马已经在Instagram上注册了帐号，对于美国总统来说，成为科技精英变成了头等大事了吗？ &lt;img src='http://wkee.net/qee/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; 。”&lt;/p&gt;
&lt;hr&gt;本文来自&lt;a href=&quot;http://www.aqee.net&quot;&gt;外刊IT评论网&lt;/a&gt;(&lt;a href=&quot;http://www.aqee.net&quot;&gt;www.aqee.net&lt;/a&gt;)，原始地址：&lt;a href=&quot;http://www.aqee.net/mayor-bloomberg-will-learn-how-to-write-code-in-2012/&quot; rel=&quot;bookmark&quot;&gt;纽约市长布隆伯格的2012年新年计划：学会编程&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/600164619/aqee-net/feedsky/s.gif?r=http://www.aqee.net/mayor-bloomberg-will-learn-how-to-write-code-in-2012/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.aqee.net/mayor-bloomberg-will-learn-how-to-write-code-in-2012/feed/</wfw:commentRss><slash:comments>3</slash:comments><description>[本文英文原文链接：Mayor Bloomberg Will Learn How To Write Code In 2012 ]纽约市市长迈克尔·布隆伯格(Michael Bloomberg)在过去的几年里不断的宣称自己对科技相关的所有的事情的热爱，而如今他的热爱上了一个新台阶。周二，布隆伯格在Twitter上发微博说他的新年计划是学会如何编程，要使用纽约本地的Codecademy网站上提供的有趣免费的，游戏方式的在线课程进行学习。 布隆伯格在Twitter是说，“我的2012年新年计划是在Codecademy上学习编程！加入我吧。http://codeyear.com/ #codeyear”，很快这个#codeyear标签就在Twitter的纽约本地趋势榜上升到了首位。 Codecademy网站迅速的给出了回复，感谢市长给他们做的免费宣传，并要提供市长特殊待遇：“谢谢——我们很高兴你能顺便访问我们的网站，我们将亲自为你解决问题！”Codecademy的Twitter帐户里这样回复。 据应该BBC报道，他的这项举动甚至激励了伦敦市长Boris Johnson，他说他很“钦佩”布隆伯格，也考虑要加入他的行列，去学会，或至少要了解编程。 “Codeyear”是一个Codecademy用来表述一个新的学年的词，人们在网上自学编程时用它来标注自己的在线课程。 Codecademy这个网站成立仅5个月之久，但已经在纽约的创业公司里引起了巨大的关注，科技新闻界大量的报道赞扬其提供的在线编程教材及时和易用，更重要的是有趣和合适。 据纽约时报报道，Codecademy网站是由一个之前是哥伦比亚学政治学的学生的Zach Simms，和一个程序员Ryan Bubinski，和他们的一些朋友，于2011年6月创建的。很讽刺的是，Simms创建这个网站的最初想法是来源于他的争取著名的Y Combinator投资公司的创业投资的失败。Simms一直感觉缺乏足够的编程知识来支撑他对一个绝好的创业原型的进行推销。于是，他和Bubinski决定把他的困难转变成一个创业想法。 Y Combinator投资公司的创始人Paul Graham 很欣赏这个想法，于是编程学院(Code Academy)就诞生了。到了网站成立后的8月份，已经有20万人开始在这个网站上学习课程。一个月后，这个数目达到了50万人。巧合的是，自从平安夜发起了Code Year倡议后，将近又有20万人在网站上进行了注册。 还不清楚有多少人访问这个网站是因为布隆伯格的声明，但可以推断的是，有大量的人是这位市长的粉丝。我们正在跟Codecademy和市长办公室联系，我们会公布获得的最新动态。 除了对科技的热爱，Bloomberg如果能以一个科技精英政治家的身份出现，必将增加他的政治影响力。正如一位在网友在Codecademy的Facebook主页上的留言：“奥巴马已经在Instagram上注册了帐号，对于美国总统来说，成为科技精英变成了头等大事了吗？ 。” 本文来自外刊IT评论网(www.aqee.net)，原始地址：纽约市长布隆伯格的2012年新年计划：学会编程&lt;img src=&quot;http://www1.feedsky.com/t1/600164619/aqee-net/feedsky/s.gif?r=http://www.aqee.net/mayor-bloomberg-will-learn-how-to-write-code-in-2012/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>新闻资讯</category><pubDate>Tue, 17 Jan 2012 00:31:14 +0800</pubDate><author>Aqee</author><comments>http://www.aqee.net/mayor-bloomberg-will-learn-how-to-write-code-in-2012/#comments</comments><guid isPermaLink="false">http://www.aqee.net/?p=3358</guid><dc:creator>Aqee</dc:creator><fs:srclink>http://www.aqee.net/mayor-bloomberg-will-learn-how-to-write-code-in-2012/</fs:srclink><fs:srcfeed>http://www.aqee.net/feed/</fs:srcfeed><fs:itemid>feedsky/aqee-net/~7979574/600164619/6261835</fs:itemid></item><item><title>【外刊IT评论网】这张照片不是免费的</title><link>http://www.aqee.net/this-photograph-is-not-free/</link><content:encoded>[本文英文原文链接：&lt;a href=&quot;http://www.petapixel.com/2012/01/10/this-photograph-is-not-free/&quot;&gt;This Photograph Is Not Free&lt;/a&gt; ]&lt;hr&gt;&lt;p&gt;&lt;img class=&quot;aligncenter size-full wp-image-3335&quot; title=&quot;非免费照片&quot; src=&quot;http://wkee.net/qee/wordpress/wp-content/uploads/2012/01/notfree_mini.jpg&quot; alt=&quot;非免费照片&quot; width=&quot;366&quot; height=&quot;550&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这是我拍摄到的2012年第一个日出的照片。拍这张照片花费了我6612美元。&lt;span id=&quot;more-3334&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;12美元是去这个地点然后返回的油费。拍这张照片的相机花了我2500美元。镜头1600美元。Singh Ray Reverse Neutral Density 滤镜210美元。Lee广角适配器和基础配件200美元。Slik三角架130美元。shutter-release60美元。我回来后，把它上传到一台计算机上，这台计算机1200美元，然后处理文件的Lightroom 3软件200美元。从中导出的照片，我用Photoshop进行了修补，这个软件花了我500美元。&lt;/p&gt;
&lt;p&gt;12+2500+1600+210+200+130+60+1200+200+500= &lt;strong&gt;$6,612&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所以，如果你是个办杂志的，开网站的，开公司的，或是一个做体育的团队，广告商，想使用这张照片，请不要来信问我是否可以免费使用它，或以帮助宣传或“曝光”为交换。你应该明白，我照片显然是已经“曝光”了。你有你的广告预算，这就问题的根本。你不要想着一个写手，或一个秘书，或一个老板会做义务劳动。不要因为这种照片是电子版的就以为它是可以免费使用的。&lt;/p&gt;
&lt;p&gt;就像有人说的，这单张照片并不会花去我6612美元。但如果你想拍摄制作出这张照片，一切从头准备，就要花这么多钱。所以，如果它被盗用，我就按这个价索赔，如果我发现你没有经过我的授权使用了这张照片，你收到的我的律师发去的账单上就是这个数。&lt;/p&gt;
&lt;p&gt;如果你把你的照片以“获取赞誉”为条件供人使用，那最可能发生的事情是，有人看到了你的照片，联系你，问你否能使用一张你的照片&amp;#8230;并答应会“给予赞誉”。你可以试一下&amp;#8230;当你下次在一个餐馆里吃饭，告诉服务员，如果他能够让你免费吃一顿，你会向所有的朋友宣传说他的服务是多么的好。&lt;/p&gt;
&lt;hr&gt;本文来自&lt;a href=&quot;http://www.aqee.net&quot;&gt;外刊IT评论网&lt;/a&gt;(&lt;a href=&quot;http://www.aqee.net&quot;&gt;www.aqee.net&lt;/a&gt;)，原始地址：&lt;a href=&quot;http://www.aqee.net/this-photograph-is-not-free/&quot; rel=&quot;bookmark&quot;&gt;这张照片不是免费的&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/600164620/aqee-net/feedsky/s.gif?r=http://www.aqee.net/this-photograph-is-not-free/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.aqee.net/this-photograph-is-not-free/feed/</wfw:commentRss><slash:comments>24</slash:comments><description>[本文英文原文链接：This Photograph Is Not Free ] 这是我拍摄到的2012年第一个日出的照片。拍这张照片花费了我6612美元。 12美元是去这个地点然后返回的油费。拍这张照片的相机花了我2500美元。镜头1600美元。Singh Ray Reverse Neutral Density 滤镜210美元。Lee广角适配器和基础配件200美元。Slik三角架130美元。shutter-release60美元。我回来后，把它上传到一台计算机上，这台计算机1200美元，然后处理文件的Lightroom 3软件200美元。从中导出的照片，我用Photoshop进行了修补，这个软件花了我500美元。 12+2500+1600+210+200+130+60+1200+200+500= $6,612 所以，如果你是个办杂志的，开网站的，开公司的，或是一个做体育的团队，广告商，想使用这张照片，请不要来信问我是否可以免费使用它，或以帮助宣传或“曝光”为交换。你应该明白，我照片显然是已经“曝光”了。你有你的广告预算，这就问题的根本。你不要想着一个写手，或一个秘书，或一个老板会做义务劳动。不要因为这种照片是电子版的就以为它是可以免费使用的。 就像有人说的，这单张照片并不会花去我6612美元。但如果你想拍摄制作出这张照片，一切从头准备，就要花这么多钱。所以，如果它被盗用，我就按这个价索赔，如果我发现你没有经过我的授权使用了这张照片，你收到的我的律师发去的账单上就是这个数。 如果你把你的照片以“获取赞誉”为条件供人使用，那最可能发生的事情是，有人看到了你的照片，联系你，问你否能使用一张你的照片&amp;#8230;并答应会“给予赞誉”。你可以试一下&amp;#8230;当你下次在一个餐馆里吃饭，告诉服务员，如果他能够让你免费吃一顿，你会向所有的朋友宣传说他的服务是多么的好。 本文来自外刊IT评论网(www.aqee.net)，原始地址：这张照片不是免费的&lt;img src=&quot;http://www1.feedsky.com/t1/600164620/aqee-net/feedsky/s.gif?r=http://www.aqee.net/this-photograph-is-not-free/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>批评评论</category><category>免费照片</category><pubDate>Mon, 16 Jan 2012 00:45:52 +0800</pubDate><author>Aqee</author><comments>http://www.aqee.net/this-photograph-is-not-free/#comments</comments><guid isPermaLink="false">http://www.aqee.net/?p=3334</guid><dc:creator>Aqee</dc:creator><fs:srclink>http://www.aqee.net/this-photograph-is-not-free/</fs:srclink><fs:srcfeed>http://www.aqee.net/feed/</fs:srcfeed><fs:itemid>feedsky/aqee-net/~7979574/600164620/6261835</fs:itemid></item><item><title>【外刊IT评论网】为什么 ++[[]][+[]]+[+[]] = 10 ？</title><link>http://www.aqee.net/can-you-explain-why-10/</link><content:encoded>[本刊评论]&lt;hr&gt;&lt;p&gt;　　首先，&lt;a href=&quot;http://stackoverflow.com/questions/7202157/can-you-explain-why-10&quot; target=&quot;_blank&quot;&gt;问这个问题&lt;/a&gt;的人是个天才，他怎么会遇到这样的一个问题。其次，回答这个问题的人更是一个天才，我难以想象他会回答这个问题，更难以想象的是，他的回答是如此的详细和丰富和完整，真正称得上诲人不倦。&lt;span id=&quot;more-3327&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;　　既然遇到了这个问题，我们不妨也跟着提高一下。&lt;/p&gt;
&lt;p&gt;　　这是一个Javascript语言题目，一个完全有效的等式，不信自己可以试一下，下面看看高人的题解：&lt;/p&gt;
&lt;pre&gt;++[[]][+[]]+[+[]]&lt;/pre&gt;
&lt;p&gt;　　如果把这段表达式拆分开来，它相等于：&lt;/p&gt;
&lt;pre&gt;++[[]][+[]]
+
[+[]]&lt;/pre&gt;
&lt;p&gt;　　在JavaScript里，+[] === 0 是完全正确的。 + 会把一些字符转化成数字，在这里，这个式子会变成 +”&quot; 或 0。&lt;/p&gt;
&lt;p&gt;　　因此，我们可以简化一下(++ 比 + 有更高的优先级)：&lt;/p&gt;
&lt;pre&gt;++[[]][0]
+
[0]&lt;/pre&gt;
&lt;p&gt;　　因为 [[]][0] 的意思是：获取 [[]] 的第一个元素，这就得出了下面的结果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[[]][0] 返回内部数组 ([])。根据语言规范，我们说 [[]][0] === [] 是不正确的，但让我们把这个内部数组称作 A，以避免错误的写法。&lt;/li&gt;
&lt;li&gt;++[[]][0] == A + 1， 因为 ++ 的意思是“加一”。&lt;/li&gt;
&lt;li&gt;++[[]][0] === +(A + 1)；换句话说，你得到的永远是个数值( +1 并不一定得到的是个数值，但 ++ 一定是)。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;　　同样，我们可以把这一堆代码简化的更清晰。让我们把 A 换回成 [] :&lt;/p&gt;
&lt;pre&gt;+([] + 1)
+
[0]&lt;/pre&gt;
&lt;p&gt;　　在JavaScript里，这也是正确的：[] + 1 === “1&amp;#8243;，因为 [] == “” (这相当于一个空的数组的内部元素连接)，于是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;+([] + 1) === +(“” + 1)，并且&lt;/li&gt;
&lt;li&gt;+(“” + 1) === +(“1&amp;#8243;)，并且&lt;/li&gt;
&lt;li&gt;+(“1&amp;#8243;) === 1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;　　让我们再次简化一下：&lt;/p&gt;
&lt;pre&gt;1
+
[0]&lt;/pre&gt;
&lt;p&gt;　　同样，在Javascript里，这是正确的：[0] == “0&amp;#8243;，因为这是相当于一个有一个元素的数组的内部元素的连接。各元素会使用，分隔。当只有一个元素时，你可以推论出这个过程的结果就是它自身的第一个元素。&lt;/p&gt;
&lt;p&gt;　　所以，最终我们得到(数字 + 字符串 = 字符串)：&lt;/p&gt;
&lt;pre&gt;1
+
&quot;0&quot;

=== &quot;10&quot; // 耶！&lt;/pre&gt;
&lt;p&gt;　　如果你想知道更详细的信息，请访问&lt;a href=&quot;http://stackoverflow.com/questions/7202157/can-you-explain-why-10&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt;。&lt;/p&gt;
&lt;hr&gt;本文来自&lt;a href=&quot;http://www.aqee.net&quot;&gt;外刊IT评论网&lt;/a&gt;(&lt;a href=&quot;http://www.aqee.net&quot;&gt;www.aqee.net&lt;/a&gt;)，原始地址：&lt;a href=&quot;http://www.aqee.net/can-you-explain-why-10/&quot; rel=&quot;bookmark&quot;&gt;为什么 ++[[]][+[]]+[+[]] = 10 ？&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/600164621/aqee-net/feedsky/s.gif?r=http://www.aqee.net/can-you-explain-why-10/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.aqee.net/can-you-explain-why-10/feed/</wfw:commentRss><slash:comments>11</slash:comments><description>[本刊评论]　　首先，问这个问题的人是个天才，他怎么会遇到这样的一个问题。其次，回答这个问题的人更是一个天才，我难以想象他会回答这个问题，更难以想象的是，他的回答是如此的详细和丰富和完整，真正称得上诲人不倦。 　　既然遇到了这个问题，我们不妨也跟着提高一下。 　　这是一个Javascript语言题目，一个完全有效的等式，不信自己可以试一下，下面看看高人的题解： ++[[]][+[]]+[+[]] 　　如果把这段表达式拆分开来，它相等于： ++[[]][+[]] + [+[]] 　　在JavaScript里，+[] === 0 是完全正确的。 + 会把一些字符转化成数字，在这里，这个式子会变成 +”&quot; 或 0。 　　因此，我们可以简化一下(++ 比 + 有更高的优先级)： ++[[]][0] + [0] 　　因为 [[]][0] 的意思是：获取 [[]] 的第一个元素，这就得出了下面的结果： [[]][0] 返回内部数组 ([])。根据语言规范，我们说 [[]][0] === [] 是不正确的，但让我们把这个内部数组称作 A，以避免错误的写法。 ++[[]][0] == A &amp;#8230; &lt;a class=&quot;more-link&quot; href=&quot;http://www.aqee.net/can-you-explain-why-10/&quot;&gt;继续阅读 &lt;span class=&quot;meta-nav&quot;&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/600164621/aqee-net/feedsky/s.gif?r=http://www.aqee.net/can-you-explain-why-10/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>技术技巧</category><category>javascript</category><pubDate>Fri, 13 Jan 2012 00:07:12 +0800</pubDate><author>Aqee</author><comments>http://www.aqee.net/can-you-explain-why-10/#comments</comments><guid isPermaLink="false">http://www.aqee.net/?p=3327</guid><dc:creator>Aqee</dc:creator><fs:srclink>http://www.aqee.net/can-you-explain-why-10/</fs:srclink><fs:srcfeed>http://www.aqee.net/feed/</fs:srcfeed><fs:itemid>feedsky/aqee-net/~7979574/600164621/6261835</fs:itemid></item></channel></rss>
