<?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>Glob Studio</title>
	<atom:link href="http://blog.globstudio.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.globstudio.com</link>
	<description>记录成长历程，专注软件开发</description>
	<lastBuildDate>Sat, 12 May 2012 15:28:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>在UITextField之外点击时隐藏keyboard</title>
		<link>http://blog.globstudio.com/1085.html</link>
		<comments>http://blog.globstudio.com/1085.html#comments</comments>
		<pubDate>Sat, 12 May 2012 15:28:29 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[移动开发]]></category>
		<category><![CDATA[IOS开发]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=1085</guid>
		<description><![CDATA[UITextField支持各种类型的键盘，不一一说明了 这里介绍两种效果的实现方法： 1，当点击键盘上Go按钮时（设置UITextField的keyboard为Go）隐藏键盘，并执行响应操作（如登陆） - &#40;BOOL&#41;textFieldShouldReturn:&#40;UITextField *&#41;textField &#123; if &#40;textField == textLoginname&#41; &#123; &#91;textPassword becomeFirstResponder&#93;; &#125; &#160; if &#40;textField == textPassword&#41; &#123; // Login &#91;self login&#93;; &#125; &#160; &#91;textField resignFirstResponder&#93;; return YES; &#125; 2，当在UITextField之外点击时隐藏keyboard - &#40;void&#41;touchesEnded:&#40;NSSet *&#41;touches withEvent:&#40;UIEvent *&#41;event &#123; &#91;super touchesEnded:touches withEvent:event&#93;; &#91;textLoginname resignFirstResponder&#93;; &#91;textPassword resignFirstResponder&#93;; &#125;]]></description>
			<content:encoded><![CDATA[<p>UITextField支持各种类型的键盘，不一一说明了</p>
<p>这里介绍两种效果的实现方法：</p>
<p>1，当点击键盘上Go按钮时（设置UITextField的keyboard为Go）隐藏键盘，并执行响应操作（如登陆）</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>textFieldShouldReturn<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITextField <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>textField
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>textField <span style="color: #002200;">==</span> textLoginname<span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
        <span style="color: #002200;">&#91;</span>textPassword becomeFirstResponder<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>textField <span style="color: #002200;">==</span> textPassword<span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
        <span style="color: #11740a; font-style: italic;">// Login</span>
        <span style="color: #002200;">&#91;</span>self login<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    <span style="color: #002200;">&#91;</span>textField resignFirstResponder<span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">return</span> <span style="color: #a61390;">YES</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p><span id="more-1085"></span></p>
<p>2，当在UITextField之外点击时隐藏keyboard</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>touchesEnded<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSSet</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>touches withEvent<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIEvent <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>event
<span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>super touchesEnded<span style="color: #002200;">:</span>touches withEvent<span style="color: #002200;">:</span>event<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>textLoginname resignFirstResponder<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>textPassword resignFirstResponder<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/1085.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【再占位】Burst VPS下Nginx性能测试报告</title>
		<link>http://blog.globstudio.com/1080.html</link>
		<comments>http://blog.globstudio.com/1080.html#comments</comments>
		<pubDate>Tue, 08 May 2012 17:36:23 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[电脑相关]]></category>
		<category><![CDATA[VPS]]></category>
		<category><![CDATA[性能]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=1080</guid>
		<description><![CDATA[Burst VPS $5.95/mo的廉价VPS上（洛杉矶机房）的nginx服务器性能测试报告 使用webbench进行测试，其实测的就是这个Blog 内容稍后补充 之前简单测试的结果是支持100个并发是没有问题的，还不至于出现520，只是页面要5秒才能打开。 50个并发轻松支持。]]></description>
			<content:encoded><![CDATA[<p>Burst VPS $5.95/mo的廉价VPS上（洛杉矶机房）的nginx服务器性能测试报告</p>
<p>使用webbench进行测试，其实测的就是这个Blog</p>
<p>内容稍后补充</p>
<p>之前简单测试的结果是支持100个并发是没有问题的，还不至于出现520，只是页面要5秒才能打开。</p>
<p>50个并发轻松支持。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/1080.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>【占位】Google App Engine1.6.5 + Python2.7 + Djangoappengine配置与总结</title>
		<link>http://blog.globstudio.com/1076.html</link>
		<comments>http://blog.globstudio.com/1076.html#comments</comments>
		<pubDate>Tue, 08 May 2012 17:20:45 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[PHP/Python]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[GAE]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=1076</guid>
		<description><![CDATA[安装过程 配置 django admin GAE datastore 总结 内容稍后补充]]></description>
			<content:encoded><![CDATA[<ol>
<li>安装过程</li>
<li>配置</li>
<li>django admin</li>
<li>GAE datastore</li>
<li>总结</li>
</ol>
<p>内容稍后补充</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/1076.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转]通天塔导游</title>
		<link>http://blog.globstudio.com/1074.html</link>
		<comments>http://blog.globstudio.com/1074.html#comments</comments>
		<pubDate>Thu, 03 May 2012 12:46:19 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[电脑相关]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=1074</guid>
		<description><![CDATA[通天塔导游 原文链接:https://code.google.com/p/windows-config/wiki/TourDeBabel (译注：圣经记载：在远古的时候，人类都使用一种语言，全世界的人决定一起造一座通天的塔，就是巴别塔，后来被上帝知道了，上帝就让人们使用不同的语言，这个塔就没能造起来。 巴别塔不建自毁，与其说上帝的分化将人类的语言复杂化，不如说是人类自身心灵和谐不再的分崩离析。之所以后来有了翻译，不仅是为了加强人类之间的交流，更寄达了一种愿望，希望能以此消除人际的隔阂，获求来自心灵的和谐及慰藉。真正的译者，把握血脉，抚平创痕，通传天籁，开启心门。) 这是我写的旋风式的编程语言简介—我本来为亚马逊开发者杂志本月的期刊写的，但是发现我写的东西没法…见人。 首先，我偶尔一不小心口出脏话，或者对上帝不恭的话，所以对很官方很正式的亚马逊上发表是不合适的; 所以我就把它塞到我的博客里了，我的博客反正没人看的。除了你以外。是的，只有你会看，你好啊。 其次，这是一项进行中的工程，现在只是东打一耙西搞一下，还没有精加工过的。又一个把它写到博客里的很大的理由。不需要很好，或很完整。就是我今天想说的一些话。请随便！ 我的旋风式简介会讲C，C++，Lisp，Java，Perl，(我们在亚马逊用到的所有语言)，Ruby (我就是喜欢)，和Python，把Python加进来是因为—好吧，你看了就知道了，现在我可不说。 C 你必须懂C。为哈? 因为出于所有现实的理由，这个世界上你过去，现在，将来会用到的每一台计算机都是一台冯·诺曼机器，而C是一种轻量级的，很有表达力的语法，能很好的展现冯·诺曼机器的能力。 冯·诺曼架构就是你每天都用的计算机的架构的标准：一个CPU，内存，硬盘，一条总线。多核计算机并没有带来本质上的变化。冯·诺曼机是一个很方便，很便宜，上世纪五十年代的实现图灵机的技术，图灵机是执行计算的最知名的抽象模型。 世上还有其他的计算的机器。比如，Lisp机器，是上世纪50年代对Lisp计算模型的实现。Lisp模型是基于lambda代数的一种计算语言表示法，后者是与图灵机同构的一种模型。不像图灵机，lambda代数能被人类读和写。但是这二者是同等能力的。它们同样精确的表示了计算机能干什么。 Lisp机现在不是很流行了，除了在跳蚤市场里。从谁更受欢迎来说，冯·诺曼机器赢了。还有一些其他的计算机，比如神经网络计算机，译者也不知道怎么翻的计算机(cellular automata)，但是这些都不够大众化，至少现在是这样的。 所以你必须知道C。 还有一个你必须知道C的原因是，Unix是用C写的。巧的是，Windows也是。基本上所有的其他操作系统都是用C写的。因为这些操作系统都是冯·诺曼机的操作系统，你还能用别的吗? 任何跟C很不一样的东西都会跟硬件的实际能力相差太远而导致无法满足性能上的需要，至少对一个操作系统来说是这样—至少在上个世纪是这样，碰巧这些系统都是上个世纪的。 你还应该知道Lisp。你不必用它来干实际工作，虽然它在很多GNU的软件里都会很用得着。尤其是，你应该学会Scheme，Lisp的一种小巧化的，纯洁的方言。GNU的版本叫Guile。 他们在麻省理工和加州伯克利教新学生一到两个学期的Scheme，这些学生都对他们为哈要学这么奇怪的语言抓破脑袋。实话实说，作为第一门学习的语言，这是一个很烂的选择，第二门也是很烂。你应该学会它，最终，但不是作为第一门或第二门语言。 这是很难的哦。这是很大的一步。学会怎么用Lisp写出像C语言的程序是不够的，那没有意义。C和Lisp一个就像红外线，一个就像紫外线，它们分布在光谱的最两端。它俩一个牛逼的地方刚好是另一个傻逼了的地方。 如果说，C是最靠近计算机是如何工作的语言模型，Lisp就是最能反映计算(注意，这里没有了“机”字，计算机和计算是很不同的！译者注)是如何工作的模型。你不需要懂很多Lisp，真的。紧咬Scheme就哦了，因为它是最简单最干净的。其他的Lisp已经发展成了很大，很复杂(很好很强大? 译者：-)的编程环境，就像C++和Java，要有很多库啊，工具啊等等之类。那些，你不需要知道。但是你应该能用Scheme写程序。如果你能够做出The Little Schemer和The Seasoned Schemer这两本书里的所有习题，你懂得就够多了，我认为。 但是对于你天天要做的编程工作，你应该基于以下条款选择你的语言：库，文档，工具支持，操作系统集成，资源，和一堆其他的东西。这些条款跟计算机如何工作关系很小，但是跟人类如何工作关系甚大。 人们还在用很直白的C语言写东西。很多东西。你应该懂C！ C++ C++是地球上最蠢的语言，即使是从蠢这个字的真正意义上出发。C++很无厘头。它不知道自己是什么东西。它没有内视(面向对象里的一个概念，译者注)。C也没有，但是C不是“面向对象”的，而面向对象很大程度上是关于要让你的程序知道它自己。对象就像演员。所以面向对象语言应该有运行时的自省机制，知道自己是个什么类的对象。C++不是这样的，真的，你不会那样用它。 关于C：写一个C的编译器是那么的简单，以至于你可以用C写一个关于C的工具，用起来就像是有内省机制。而C++呢，基本上是不可解析的，所以如果你想写一个很牛逼的工具用来—比如，告诉你你的虚函数的原型，或者帮你重构你的代码，你将不得不依赖别人的工具集，因为你自己在除非脑子进屎的情况下是根本不会去写一个C++的解析器的。而市面上所有的C++的解析器都很傻逼。 C++很蠢，你不能用蠢语言创造一个好系统。语言决定世界，蠢语言决定蠢世界。 所有的计算都基于抽象。你用低级的东西创造出高级的东西。但是你不能用分子创造出一个城市。尝试使用太低级别的抽象只会给你带来麻烦。 我们就惹上麻烦了 (是指亚马逊的员工，还是所有C++的程序员? 我也不知道，译者注)。 理智的情况下，你用C写的最大的东东就是一个操作系统。而操作系统其实不是很大的，真的。它们看起来很大，但那是因为它们有很多应用软件，操作系统本身的内核是蛮小的。 你用C++能写的最大的东东是…也是操作系统。好吧，或许稍微再大点儿。让我们说，再大三倍吧。或者10倍吧。但是操作系统内核最多也就，那啥，一百万行代码? 所以我说你能用C++写的最大的系统大概也就是一千万行代码吧，再大的话就开始不行了，这玩意儿你没法控制了，就像恐怖片里的… 我说的一千万行是指如果你那时候还能让你的系统编译通过的话。 我们(在亚马逊，译者注)有五千万行C++代码。不，现在还要更多了。我已经不知道有多少行了。上个圣诞节是五千万行，那是九个月前，而它以每季度八百万行的规模增长。增长率本身也增长，妈呀。 我们想这个系统里干点啥好像要一万年。一个亚马逊工程师有一次这样描述我们的代码库：“一座很大的屎山，你见过的最大的山，每次你想修正一个bug，你的工作就是爬到屎山的正中心去。” 伙计们，那哥们可是在四年前说的这话。他现在已经到更环保绿色的牧场上去了。真是太可惜了，他可是个实实在在的高手啊。 这都是C++的错。别跟我争论。就是的。我们用的是世上最蠢的语言。这简直有点老板级的蠢，你说呢? (译者注，meta在计算机术语里通常表示更高一个层次，比如，meta-language，比普通的language高一个层次，意思是关于语言的语言。哲学里应该会经常用到这个词。我不懂哲学，但是我觉得老板们总是比我们高一级，所以meta-dump我就翻译成老板级的蠢喽。：-) 说了以上这些难听的话，话得说回来了。用C++写出漂亮的代码显然是可以的，我的意思是说，这样的代码应该大部分还是C，偶尔很有品味的，很有节制的用一点C++。但是这种代码几乎从来不会被写出来。C++是个很好玩的游乐场，而如果你把它玩儿得门儿清的话你会觉得自己特牛，所以你总是被诱惑把你知道的所有的东西都用上。但是那是很难做好的，因为从一开始这个语言就太狗屎了，最终，你会弄得一塌糊涂，即使你很能干。 我知道，我说的都是异端邪说，该被钉到十字架上的。随便吧。我在大学里的时候老喜欢C++了，因为我那时候就只知道这一门语言。当我听到我的语言教授，Craig Chambers，绝对的厌憎C++，我想：“为啥呢? 我觉得它挺好的啊”。而当我听到STL(标准模板库)的发明者被采访时说他恨OOP(面向对象编程)时，我更是认为他肯定是磕药了。怎么会有人恨OOP呢，而这个人竟然还是STL的发明者? 亲不敬，熟生厌(语出圣经，译者注)。说的是在大多数情况下，跟一件事物熟悉了之后你就失去对它的膜拜尊敬了; 在计算机语言里情况不是这样的。光对一门语言熟悉不会导致你看轻这门语言。你必须成为另一门更优秀的语言的专家(才能让你明白原来那门语言有多么多的问题)。 所以如果你不喜欢我针对C++大放厥词，请你去学另一门语言并成为一个专家(我推荐Lisp)，只有那时你才有足够的武器与我争论。然而，那时你将不会跟我争了。你上了我的当了。你也会跟我一样变得不喜欢C++了，你或许会觉得我这个人很恶心，把你骗得不喜欢自己曾经的最爱了。所以或许你应该把我说的一切都忘了。C++挺好的其实，真的。它就是很棒棒(译者注，作者在这里用了ducky，这是一个女性喜欢用的夸某物好的词，近来也为玻璃们喜爱)。忘了我说的话。C++不错的。 [...]]]></description>
			<content:encoded><![CDATA[<p>通天塔导游</p>
<p>原文链接:<a href="https://code.google.com/p/windows-config/wiki/TourDeBabel">https://code.google.com/p/windows-config/wiki/TourDeBabel</a></p>
<p>(译注：圣经记载：在远古的时候，人类都使用一种语言，全世界的人决定一起造一座通天的塔，就是巴别塔，后来被上帝知道了，上帝就让人们使用不同的语言，这个塔就没能造起来。 巴别塔不建自毁，与其说上帝的分化将人类的语言复杂化，不如说是人类自身心灵和谐不再的分崩离析。之所以后来有了翻译，不仅是为了加强人类之间的交流，更寄达了一种愿望，希望能以此消除人际的隔阂，获求来自心灵的和谐及慰藉。真正的译者，把握血脉，抚平创痕，通传天籁，开启心门。)</p>
<p>这是我写的旋风式的编程语言简介—我本来为亚马逊开发者杂志本月的期刊写的，但是发现我写的东西没法…见人。</p>
<p>首先，我偶尔一不小心口出脏话，或者对上帝不恭的话，所以对很官方很正式的亚马逊上发表是不合适的; 所以我就把它塞到我的博客里了，我的博客反正没人看的。除了你以外。是的，只有你会看，你好啊。</p>
<p>其次，这是一项进行中的工程，现在只是东打一耙西搞一下，还没有精加工过的。又一个把它写到博客里的很大的理由。不需要很好，或很完整。就是我今天想说的一些话。请随便！</p>
<p>我的旋风式简介会讲C，C++，Lisp，Java，Perl，(我们在亚马逊用到的所有语言)，Ruby (我就是喜欢)，和Python，把Python加进来是因为—好吧，你看了就知道了，现在我可不说。</p>
<p><span id="more-1074"></span></p>
<h1><a name="C"></a>C</h1>
<p>你必须懂C。为哈? 因为出于所有现实的理由，这个世界上你过去，现在，将来会用到的每一台计算机都是一台冯·诺曼机器，而C是一种轻量级的，很有表达力的语法，能很好的展现冯·诺曼机器的能力。</p>
<p>冯·诺曼架构就是你每天都用的计算机的架构的标准：一个CPU，内存，硬盘，一条总线。多核计算机并没有带来本质上的变化。冯·诺曼机是一个很方便，很便宜，上世纪五十年代的实现图灵机的技术，图灵机是执行计算的最知名的抽象模型。</p>
<p>世上还有其他的计算的机器。比如，Lisp机器，是上世纪50年代对Lisp计算模型的实现。Lisp模型是基于lambda代数的一种计算语言表示法，后者是与图灵机同构的一种模型。不像图灵机，lambda代数能被人类读和写。但是这二者是同等能力的。它们同样精确的表示了计算机能干什么。</p>
<p>Lisp机现在不是很流行了，除了在跳蚤市场里。从谁更受欢迎来说，冯·诺曼机器赢了。还有一些其他的计算机，比如神经网络计算机，译者也不知道怎么翻的计算机(cellular automata)，但是这些都不够大众化，至少现在是这样的。</p>
<p>所以你必须知道C。</p>
<p>还有一个你必须知道C的原因是，Unix是用C写的。巧的是，Windows也是。基本上所有的其他操作系统都是用C写的。因为这些操作系统都是冯·诺曼机的操作系统，你还能用别的吗? 任何跟C很不一样的东西都会跟硬件的实际能力相差太远而导致无法满足性能上的需要，至少对一个操作系统来说是这样—至少在上个世纪是这样，碰巧这些系统都是上个世纪的。</p>
<p>你还应该知道Lisp。你不必用它来干实际工作，虽然它在很多GNU的软件里都会很用得着。尤其是，你应该学会Scheme，Lisp的一种小巧化的，纯洁的方言。GNU的版本叫Guile。</p>
<p>他们在麻省理工和加州伯克利教新学生一到两个学期的Scheme，这些学生都对他们为哈要学这么奇怪的语言抓破脑袋。实话实说，作为第一门学习的语言，这是一个很烂的选择，第二门也是很烂。你应该学会它，最终，但不是作为第一门或第二门语言。</p>
<p>这是很难的哦。这是很大的一步。学会怎么用Lisp写出像C语言的程序是不够的，那没有意义。C和Lisp一个就像红外线，一个就像紫外线，它们分布在光谱的最两端。它俩一个牛逼的地方刚好是另一个傻逼了的地方。</p>
<p>如果说，C是最靠近计算机是如何工作的语言模型，Lisp就是最能反映计算(注意，这里没有了“机”字，计算机和计算是很不同的！译者注)是如何工作的模型。你不需要懂很多Lisp，真的。紧咬Scheme就哦了，因为它是最简单最干净的。其他的Lisp已经发展成了很大，很复杂(很好很强大? 译者：-)的编程环境，就像C++和Java，要有很多库啊，工具啊等等之类。那些，你不需要知道。但是你应该能用Scheme写程序。如果你能够做出The Little Schemer和The Seasoned Schemer这两本书里的所有习题，你懂得就够多了，我认为。</p>
<p>但是对于你天天要做的编程工作，你应该基于以下条款选择你的语言：库，文档，工具支持，操作系统集成，资源，和一堆其他的东西。这些条款跟计算机如何工作关系很小，但是跟人类如何工作关系甚大。</p>
<p>人们还在用很直白的C语言写东西。很多东西。你应该懂C！</p>
<h1><a name="C++"></a>C++</h1>
<p>C++是地球上最蠢的语言，即使是从蠢这个字的真正意义上出发。C++很无厘头。它不知道自己是什么东西。它没有内视(面向对象里的一个概念，译者注)。C也没有，但是C不是“面向对象”的，而面向对象很大程度上是关于要让你的程序知道它自己。对象就像演员。所以面向对象语言应该有运行时的自省机制，知道自己是个什么类的对象。C++不是这样的，真的，你不会那样用它。</p>
<p>关于C：写一个C的编译器是那么的简单，以至于你可以用C写一个关于C的工具，用起来就像是有内省机制。而C++呢，基本上是不可解析的，所以如果你想写一个很牛逼的工具用来—比如，告诉你你的虚函数的原型，或者帮你重构你的代码，你将不得不依赖别人的工具集，因为你自己在除非脑子进屎的情况下是根本不会去写一个C++的解析器的。而市面上所有的C++的解析器都很傻逼。</p>
<p>C++很蠢，你不能用蠢语言创造一个好系统。语言决定世界，蠢语言决定蠢世界。</p>
<p>所有的计算都基于抽象。你用低级的东西创造出高级的东西。但是你不能用分子创造出一个城市。尝试使用太低级别的抽象只会给你带来麻烦。</p>
<p>我们就惹上麻烦了 (是指亚马逊的员工，还是所有C++的程序员? 我也不知道，译者注)。</p>
<p>理智的情况下，你用C写的最大的东东就是一个操作系统。而操作系统其实不是很大的，真的。它们看起来很大，但那是因为它们有很多应用软件，操作系统本身的内核是蛮小的。</p>
<p>你用C++能写的最大的东东是…也是操作系统。好吧，或许稍微再大点儿。让我们说，再大三倍吧。或者10倍吧。但是操作系统内核最多也就，那啥，一百万行代码? 所以我说你能用C++写的最大的系统大概也就是一千万行代码吧，再大的话就开始不行了，这玩意儿你没法控制了，就像恐怖片里的…</p>
<p>我说的一千万行是指如果你那时候还能让你的系统编译通过的话。</p>
<p>我们(在亚马逊，译者注)有五千万行C++代码。不，现在还要更多了。我已经不知道有多少行了。上个圣诞节是五千万行，那是九个月前，而它以每季度八百万行的规模增长。增长率本身也增长，妈呀。</p>
<p>我们想这个系统里干点啥好像要一万年。一个亚马逊工程师有一次这样描述我们的代码库：“一座很大的屎山，你见过的最大的山，每次你想修正一个bug，你的工作就是爬到屎山的正中心去。”</p>
<p>伙计们，那哥们可是在四年前说的这话。他现在已经到更环保绿色的牧场上去了。真是太可惜了，他可是个实实在在的高手啊。</p>
<p>这都是C++的错。别跟我争论。就是的。我们用的是世上最蠢的语言。这简直有点老板级的蠢，你说呢? (译者注，meta在计算机术语里通常表示更高一个层次，比如，meta-language，比普通的language高一个层次，意思是关于语言的语言。哲学里应该会经常用到这个词。我不懂哲学，但是我觉得老板们总是比我们高一级，所以meta-dump我就翻译成老板级的蠢喽。：-)</p>
<p>说了以上这些难听的话，话得说回来了。用C++写出漂亮的代码显然是可以的，我的意思是说，这样的代码应该大部分还是C，偶尔很有品味的，很有节制的用一点C++。但是这种代码几乎从来不会被写出来。C++是个很好玩的游乐场，而如果你把它玩儿得门儿清的话你会觉得自己特牛，所以你总是被诱惑把你知道的所有的东西都用上。但是那是很难做好的，因为从一开始这个语言就太狗屎了，最终，你会弄得一塌糊涂，即使你很能干。</p>
<p>我知道，我说的都是异端邪说，该被钉到十字架上的。随便吧。我在大学里的时候老喜欢C++了，因为我那时候就只知道这一门语言。当我听到我的语言教授，Craig Chambers，绝对的厌憎C++，我想：“为啥呢? 我觉得它挺好的啊”。而当我听到STL(标准模板库)的发明者被采访时说他恨OOP(面向对象编程)时，我更是认为他肯定是磕药了。怎么会有人恨OOP呢，而这个人竟然还是STL的发明者?</p>
<p>亲不敬，熟生厌(语出圣经，译者注)。说的是在大多数情况下，跟一件事物熟悉了之后你就失去对它的膜拜尊敬了; 在计算机语言里情况不是这样的。光对一门语言熟悉不会导致你看轻这门语言。你必须成为另一门更优秀的语言的专家(才能让你明白原来那门语言有多么多的问题)。</p>
<p>所以如果你不喜欢我针对C++大放厥词，请你去学另一门语言并成为一个专家(我推荐Lisp)，只有那时你才有足够的武器与我争论。然而，那时你将不会跟我争了。你上了我的当了。你也会跟我一样变得不喜欢C++了，你或许会觉得我这个人很恶心，把你骗得不喜欢自己曾经的最爱了。所以或许你应该把我说的一切都忘了。C++挺好的其实，真的。它就是很棒棒(译者注，作者在这里用了ducky，这是一个女性喜欢用的夸某物好的词，近来也为玻璃们喜爱)。忘了我说的话。C++不错的。</p>
<h1><a name="Lisp"></a>Lisp</h1>
<p>(我打赌这一节会让你觉得惊讶，即使你已经关注我的博客有一阵了 (译者注，作者也可能是说，即使你成为亚马逊的员工有一阵了)。)</p>
<p>亚马逊创业之初，我们有很多明星级的工程师。我不认识他们所有人，但是我认识几个。</p>
<p>比如? Shel Kaphan。大拿。Greg Linden。大拿。Eric Benson。即使在他加入亚马逊之前就已经有自己响亮的名气了。也是大拿。</p>
<p>他们写了Obidos服务器。是Obidos让亚马逊成功的。只是后来那些生产大便很拿手的工程师，网页开发者，搞前端的人—这些人因为生产大便很拿手而总是能让经理们满意—只是在后来这些人把Obidos搞糟了。(他们的大便)把整条河都堵了，打个比方说的话。但是Obidos是亚马逊最初的成功的一块关键的基石。</p>
<p>这些最早的牛人们在亚马逊神圣的代码库里只允许两种语言：C 和 Lisp。</p>
<p>你自己去想吧。</p>
<p>当然，他们所有人都使用Emacs。靠，Eric Benson是XEmacs的作者之一。这个世界上所有伟大的工程师都在用Emacs[注1]。那种世界因你而不同级别的伟大。不是坐在你旁边的格子里的那哥们那种伟大。也不是Fred，走廊尽头那哥们。我说的是我们这个行业里最伟大的软件开发者，那些能改变这个工业的面貌的人。像James Gosling们(Java语言设计者)，Donald Knuth们(这个人没有听说过的话赶紧改行吧，别搞计算机了)，Paul Graham们[注2]，Jamie Zawinski们，Eric Benson们。真正的工程师用Emacs。你必须很有点聪明才能把Emacs用好，而如果你能成为一个Emacs大师的话它会给你难以置信的牛力。有机会的话你应该站到Paul Nordstrom的肩后看看他是怎么工作的，如果你不相信我的话。对那些一辈子都在用烂Visual。Net之类的集成开发环境的人来说，一定会大开眼界的。</p>
<p>Emacs是那种你可以用100年的编辑器。</p>
<p>Shel，Eric，Greg，和其他像他们那样的人，我没有足够幸运能跟他们直接一起工作：他们禁止在这里使用C++，他们禁止使用Perl。(或者Java，为完整起见)。他们是明白人。</p>
<p>现在我们都在用C++，Java和Perl了，所有的代码都用这些语言。我们的前辈们已经到更环保的牧场上去了 (指没有大便的牧场，译者注)。</p>
<p>Shel用C写了Mailman，客服部的人把它用Lisp封装了一下。Emacs-Lisp。你不需要知道Mailman是什么东西。除非你是个Amazon的老员工，或许不是搞技术的，而且你曾经不得不让客户哈皮 (只有在这种情况下你才需要知道Mailman，译者注)。不是间接的，因为你用C++写的一个狗屎功能跑不起来了，让客户很生气，于是你不得不去搞定它以恢复客户的哈皮度。不，我是说直接的，意思是，你必须跟他们聊。我们可爱的，不识字的，呱呱其谈的，心地善良的，充满希望的，困惑的，能帮点小忙的，愤怒的，哈皮的客户们，真正的客户们，那些从咱们这里买东西的人，我们的客户们。(如果你必须跟他们打交道的话，)那你就会知道Mailman这个东西。</p>
<p>Mailman是客服部的客户电子邮件处理软件，我们用了它有…四，五年? 反正是很长时间。它是用Emacs写的，所有人都爱死它了。</p>
<p>人们现在还很爱它。直到今天，我依旧不得不听我们一些非技术员工跟我长篇大论的叨叨他们是多么的怀念Mailman。我可绝不是满嘴喷粪。上个圣诞节我参加了一个Amazon的派对，一个我不知道自己怎么会被邀请的派对，里面全是些西装笔挺的商务人士，谁都长得比我帅，比我光鲜。以及一些我在公司里曾经打过交道的人(这句不知道怎么译)。四个美女认出了我是在客服部里干的，把我包围了，跟我说了十五分钟她们是多么的怀念Mailman和Emacs，而现在的亚马逊(我们用JSP花了好多年准备换掉Mailman的那一套软件)是怎么的不能满足她们，让她们觉得跟以前一样爽。</p>
<p>这一切都太梦幻了，我觉得她们可能是喝多了。</p>
<p>Shel是个天才。Emacs是天才。连非技术人员都爱Emacs。我现在就是在Emacs里打这些文字。我绝不情愿在任何其他地方打字。这不只是关于让你的效率得到飞跃，通过那些地球上其他地方找不到的快捷键和文本编辑功能。我每分钟打一百三到一百四十个英文单词，在Emacs里，当我在写没有格式要求的文本的时候。我测过这个时间速度。自己写了一个测打字速度的Emacs应用。但我想跟你说的不只是这个。</p>
<p>Emacs有的是一种你叫不出名字来的品质。</p>
<p>我们现在不用Mailman了。那是因为我们有一种叫得出名字的品质—就是，烂。我们很烂。我们(当时)找不到Emacs-Lisp足够牛的人把Mailman继续搞下去。今天这应该不难了; 亚马逊现在到处都是Emacs Lisp的黑客。但是在那时候，客服部的人没法从别人那里得到帮助。于是他们就用他们当时手头有的资源去搞这件事。他们当时没有足够多的Emacs-Lisp的人。有一段时间，他们甚至找来Bob Glickstein当合同工，那个给O&#8217;Reilly写了那本Gnu Emacs扩展的书的家伙，坐在一个小办公室里给Emacs写Mailman的扩展。</p>
<p>客服应用部是Amazon的第一个两块比萨饼的团队(我也不知道什么意思，看下文)。这个团队是完全自立的。不管是那时还是现在。没人跟他们说话，没人帮他们。没有枪，没有炮，他们自己造。他们没有网页工程师，没有支持工程师。屁也没有。有的只是一堆骨灰级的工程师和一个能带新人的文化。这就是他们需要的一切了。</p>
<p>但他们最终不得不让Mailman光荣退休。妈哎。而我呢今天还听到人们说他们是多么的怀念它。甚至在派对上。</p>
<p>我想今天按人头比例来说，客服部仍然拥有比亚马逊任何其他团队更多的Lisp黑客。可能他们用到Lisp的机会不多了，但是Eric Raymond说过，即使你很少用Lisp写程序，学习Lisp会是意义深远的一个经历，能让你下辈子都成为一个更好的工程师。</p>
<p>卡尔，宗教现在已经不是大众的精神鸦片了。现在鸦片是集成开发环境了。(卡尔。马克思。这个人不知道的话应该打屁屁)。</p>
<h1><a name="Java"></a>Java</h1>
<p>Java是过去的10年中计算行业里发生过的最好的同时也是最坏的事。</p>
<p>一方面，Java把你从C++编程的很多枯燥易错的细节中解救出来了。没有数组越界了，没有core dump了。抛出来的异常能让你精确定位到出错的那一行代码，而且99%的时候都是正确的那一行出错了的代码。对象们在需要的时候能智能地把它们自己打印出来。等等等等。</p>
<p>另一方面，除了是一种语言，一个虚拟机，一个巨无霸的类库，一个安全模型，一个可移植的字节码格式，Java还是一个宗教。邪教。所以你不能太相信对它太虔诚的人。想要招一个好的Java工程师是一项很有技术挑战的活。</p>
<p>但是总的来说，Java是软件工程史上的一大进步。</p>
<p>从C++到Java不只是语法上的改变。这是一种需要一段时间去好好体会的一种震撼性的世界观的转变。这有点像突然你被配了一个执行助理。你知道老总们为什么总是好像有时间去开会，总是知道公司现在运行的情况，总是写出很酷酷的文档吗? 老总们常常忘记其实他们不是一个人在战斗，他们都是两个全职的人，他们和他们的执行助理们。有一个执行助理把你从琐事中解救出来让你有时间去思考那些真的需要你去解决的问题; 没有的话你将不得不花一半的时间在那些无聊的世俗的事情上。切换到Java编程语言就把你变成了两个程序员—一个处理那些你不需要关心的东西，另一个可以集中精力在问题本身上。这是一个很震人的改变，一个你应该很快就能习惯能喜欢上的改变。</p>
<p>就像Jamie Zawinski(Netscape牛人，开发Mozilla浏览器，好像学历是高中毕业?)在他著名的“Java真烂”那篇文章里说的：“先说那些好东西：Java没有free()函数。我必须一开始就承认，其他的东西都没什么了不起。(没有free)是能让我原谅其他所有东西的特性，不管其他东西有多烂。讲完这一点后，我的文章里其他一切几乎都完全没有重要性了。”</p>
<p>Jamie的文章写在1997年，按Java年来算的话是很早以前了，跟他写这篇文章时比Java已经有很大的改善; 一些他抱怨的东西甚至已经被fix了。</p>
<p>但是大多数还是没有被fix。Java作为一门语言还是有点烂。但就如Jamie指出的，Java“是今天为止最好的语言。我的意思是说，它是今天市面上那些烂得底儿掉地一堆语言比起来有那么一点能被我接受。”</p>
<p>真的，你应该读读他那篇文章。</p>
<p>Java几乎每一方面都很好，除了它的语言本身，而这是JWZ抱怨的主要对象。但那是一个很大的抱怨。再好的库也救不了一个烂语言。相信我：你可能比我知道多得多的东西，但是我知道好兵救不了烂将。在Geoworks搞了五年汇编语言都会了我这个道理。</p>
<p>跟C++比，Java作为一个语言还过得去。好吧，别扯了，Java要好很多。因为它有(内建)的字符串。哥们，你说一个没有内建的字符串的语言是人用的吗。</p>
<p>但是Java跟C++比少了一些好东西，比如(函数调用时)传引用，栈上的对象，typedef，宏，以及运算符重载。一些时不时地会很称手的东西。</p>
<p>哦，还有多重继承，我现在老了，反而挺欣赏了的多重继承。如果你认为我这个观点僵硬不灵活的家伙是多态教义很好的反例的话，我倒是可以给你举几个为什么你需要多态继承的好例子，或者至少像Ruby那样的mixin或者自动的派遣。下次问问我白龙马的事情。今天我要告诉你为什么Java的interface是个烂货。</p>
<p>几年前Gosling自己都说，如果一切都能重来的话，他不会搞出个interface的概念。</p>
<p>但是那正是Java的问题。当James说出那句话的时候，人们被雷到了。我甚至能感觉到那股雷劲儿，能感觉到Sun公司市场部和法务部的鸟人是多么想把James灭口，然后告诉大家他没那么说过。</p>
<p>Java的问题就是人们都被那帮人搞的广告效应蒙住了眼。C++，Perl，任何流行语言都有这个问题。这是很严重的，因为如果没有一些说大话吹牛逼的广告，一个语言是不会流行起来的。所以如果一个语言的设计者说他的语言没有被设计得很完美的话，就是赶紧用麻醉枪射击这胡说八道的家伙并关闭会议的时候了。</p>
<p>语言们需要放点儿卫星才能活，我只希望人们不要被卫星耀瞎了眼。</p>
<p>我学了面向对象编程， 我自己也对此大吹大擂。当我加入亚马逊时，我不能告诉你我有什么智慧或者经验，但我可以给你背诵出所有关于OOP的魔咒。多重继承是邪恶的，因为大家都这么说; 运算符重载是邪恶的，诸如此类。我甚至有点模糊地知道为什么是邪恶的，但实际上不知道。后来我明白了，这些都不邪恶，不是烂玩意儿，烂的是开发者，是我。我现在还是烂，但是希望每年都不烂一点起来。</p>
<p>上礼拜我碰到一个来面试的，他告诉我多继是邪恶的，因为，比如，你可以从头，胳膊，腿，躯干多重继承出一个人来。他既是对的，又是错的。那样的多继情形当然邪恶，但那都是因为他自己太邪恶了。那样继承出来的“东西”远远就能看见有多蠢，如果他还把这玩意儿弄进门来那就更邪恶了。</p>
<p>不良开发者，占了这世上开发者的大多数，他们能用你扔给他们随便什么语言写出不良的代码。</p>
<p>说了这些，还是得说回来，多继不是请客吃饭那么轻松的事儿; mixin看起来是更好的解决方案，但是还没人完美的解决这个问题。但我还是认为Java比C++好，即使它没有多继。因为我知道不管我的出发点是多么好，某一天我还是会被一堆不懂怎么写好代码的人包围，让他们用Java比用C++会带来更少的伤害。</p>
<p>此外，Java除了语言本身外还有老多其他的重要有用的东西。且Java语言本身也在进化，虽然像冰川一样慢，所以我们还是能看到希望。Java正是我们应该在亚马逊推荐使用的语言。</p>
<p>你就是得小心点儿，因为各其他任何语言一样，你能很容易找出一堆人，他们很懂一门语言及其编程环境，但对品味，计算或者其他任何重要的东西却一无所知。</p>
<p>当你有怀疑时，还是雇那种会好几门语言的Java程序员，那种厌憎J2EE/EJB之类松松跨跨的所谓框架的，那种使用Emacs的。这都是一些实战经验。</p>
<h1><a name="Perl"></a>Perl</h1>
<p>Perl，怎么说呢?</p>
<p>Perl是个老朋友。老老朋友。我开始写Perl代码的时候，可能是1995年? 而它为我很好的服务了差不多10年的时间。</p>
<p>它就像你骑了十万二十万英里的老自行车，你心里永远有一块地方装着它，虽然现在你已经换了一辆更加现代化的只有五磅重的自行车，而且这一辆也不像老的那辆顶得你屁眼疼了。</p>
<p>Perl受欢迎原因有仨：</p>
<ol>
<li>用Perl你很快就能搞定你的问题。而这是最终的衡量标准。</li>
<li>Perl有世上最好的市场推广。你可以写一本介绍他们市场推广有多绝的书。Sun公司砸大笔钱给Java推市场，Perl在受欢迎程度来说能跟Java齐头并进，但Perl纯粹是依靠Larry Wall和他那帮哥们的三寸不烂之舌做市场。哈佛商学院的人应该去研究Perl的市场是怎么做出来的。真的让人瞠目结舌。</li>
<li>直到差不多，呃，现在，Perl没有真正的竞争者。</li>
</ol>
<p>有比Perl“好”的语言。操，有很多比Perl好的语言，如果你定义“好”为“不是给疯子用的”的话。Lisp，Smalltalk，Python，妈呀，我可能可以列出二三十种比Perl“好”的语言。从这些语言不像这个夏天在台湾街头爆了肚皮的抹香鲸这个角度来说。鲸鱼肠子到处都是，汽车上，机车上，行人身上。这就是Perl。让人着迷，真的。</p>
<p>但是Perl有很多很多好的特性，直到最近，都是其他语言没有的。它们弥补了Perl肠子在外的不足。你可以从爆了肚皮的鲸鱼可以做很多有用的东西出来，比如香水。这很有用。Perl也是这样。</p>
<p>当其他的那些语言(尤其是Lisp和Smalltalk)都想假装操作系统并不存在，列表(Lisp的)和对象(Smalltalk的)就是把屎搞出来的唯一存在，Perl却走了截然相反的路子。Larry说：Unix和字符串是搞出屎来的唯一存在。</p>
<p>对很多任务来说，他绝对是正确的。所以Perl绝对是Unix系统管理和字符串处理的史上最强语言，除了一个，刚出来的一个，从哥斯拉(电影哥斯拉看过没)之地出来的一个。我一会儿会讲到那一个。</p>
<p>可惜，Larry太太太太在意Unix系统管理和字符串处理以致他压根忘了列表和对象，等他明白过来想改正的时候已经晚了。实际上，在Perl早期的…好吧，对鲸鱼肠子我实在不想用“设计”这个词，就说生命周期中吧，他犯的几个关键错误让把列表和对象加进来变得如此尴尬，以致Perl已经进化成一个真正的Rube Goldberg机器，至少当你想在Perl里用列表和对象的时候。(Rube Goldberg是一漫画家，常画一些很复杂的机器，但只完成简单的工作，比如一个小球滚过很多关卡，最后把门打开。译者注)。</p>
<p>列表和对象也他妈的是很重要的，Larry！(farging应该是作者不想说fucking那么直白，译者注)</p>
<p>Perl没法表达列表因为Larry一早犯了一个悲剧性的愚蠢的错误，把列表全抹平。于是(1，2，(3，4))魔术般地变成(1，2，3，4)。不是说你会想让它这样工作，而是Larry刚好那天在搞一个这样会更方便的问题。于是Perl的数据结构从此就变得爆炸了的鲸鱼了。</p>
<p>今天你看Perl的书，小教程或PPT的时候，不花三分之一的时间在“引用”上是不可能的。这就是Larry可怜的，坏了的，Goldberg(漫画家，想起来没? 译者注)式的对他那抹平列表的疯狂错误的解决方案。但是Perl的市场宣传做得那么难以置信地好以致它让你觉得这是你身上发生过的最好的东西。你可以对任何东西取它的引用。这很有趣！闻起来也很香（说肠子呢，译者注，呵呵）！</p>
<p>Perl不能支持面向对象编程因为Larry压根不相信这玩意儿。这可能没什么大不了; 我也不是很确定我是不是信这个OOP。但是那么为啥他又要试着把对象加进Perl呢? Perl的面向对象是个半成品，且在Perl社区里没多少人重视。它就是不像字符串处理或Unix集成那样充满灵感。</p>
<p>当然了，Perl还有其他很多怪怪的特性。比如它的“上下文”，这是Larry要有N个变量名字空间的喜剧式决定的一个恐怖片式的产物。这些空间由sigil来区分(就是Perl里变量名前面的‘$’，‘@’，‘%’字符)，看着像是从shell脚本里拷贝来的。在Perl里，所有的运算符，所有的函数，所有的操作其行为都是六取一的随机的，取决于当前的“上下文”。没有一些规则或助记法能帮你搞定这些特定操作在特定上下文里的特定行为。你得把它们全记在脑子里。</p>
<p>想要个例子? 这儿有一个：在一个值量(scalar，对应于vector，向量)上下文里对一个哈希取值你得到一个字符串，里面是个分数，分子是目前已分配的键，分母是总共有多少个桶。鲸鱼肠子，我告诉你。</p>
<p>但就像我说的—直到最近，没啥能像Perl那样把屎搞定。</p>
<h1><a name="Ruby"></a>Ruby</h1>
<p>每过15年左右，一门语言就会被更好的代替。C被C++代替，至少对大应用开发而又需要性能和数据类型的人们来说。C++被Java代替，而Java无疑在7年后又会被更好的东西代替—好吧，我说的是完全代替C++的7年后，这到目前为止还没有发生，主要是因为微软能在Java霸占桌面系统之前狙击它。但是在服务器上的应用而言，C++的阵地已经慢慢让给Java了。</p>
<p>Perl有一天也会消逝。那是因为一门新的语言Ruby刚刚终于被翻译成英语了。没错，它是在日本发明的，这么多地儿，没想到日本人搞出来了，还以为他们只是硬件和制造上占有名气，而不是他们的软件业，所以大家都跟你一样惊奇。为什么呢，大家可能都在想。但是我认为这都是跟打字有关。我根本不能想象他们以前能打字打得足够快，英文字母只有26个，他们却有上万个字。但是Emacs几年前支持多字节字符了，所以我猜他们现在打字速度他妈的快多了。(所以能搞出Ruby来了，译者猜作者是这个意思) (是的，他们也用Emacs—事实上日本人负责了Emacs多字节支持的大部工作，而且搞得坚不可摧。)</p>
<p>不管怎么样，Ruby从Perl那里偷师了所有的好东西; 实际上，Matz，Ruby的作者(Yukihiro Matsumoto，如果我没记错的话，但是他外号“Matz”)，觉得他从Perl那里偷的有点太多了，他的鞋上也粘了些鲸鱼肠子。但是只是一丢丢。</p>
<p>最重要的是，Ruby拿来了Perl的串处理和Unix集成，一点没改，就是说语法都是一样的，于是乎啥也不说了，你就拥有了Perl最好的那部分。这是个不错的开局，特别是如果你不把Perl剩下的东西也拿进来的话。</p>
<p>但是之后Matz还从Lisp那里拿来的最好的列表处理，Smalltalk和其他语言那里拿来了最好的面向对象，CLU那里拿来了最好的迭代器，以及基本上是每个人每个事的最好的东西。</p>
<p>而他让这些东西全部都跑起来，跑得那么顺，你都不会注意到这些东西在那儿。我比其他任何语言都快就学会了Ruby，我总共会三十到四十门语言; 而我花了大概三天时间就能用Ruby比Perl还流畅地工作了，当了八年的Perl黑客后。这些东西是这么的和谐你都能自己猜它们是怎么工作的，而且大多数时候你都能猜对。漂亮。有趣。靠谱。</p>
<p>如果把语言比成自行车，那么AWK就是一辆粉系的儿童自行车，前面有个白色小框，还插块小旗，Perl就是沙滩车(还记得那有多酷吧? 唉。)，而Ruby则是一辆七千五美金的钛合金山地自行车。从Perl飞跃到Ruby意义不下于从C++到Java的飞跃。却没有任何缺陷，因为Ruby几乎是Perl功能的一个超集，而Java却拿掉了一些人们想要的东西，且没有真正的提供一个替代品。</p>
<p>下次我会写更多关于Ruby的东西。我先需要灵感。去读读Lucky Stiff的(poignant) guide to Ruby吧。那本书是一本有灵感的书。真的，读一下。超赞。我不理解产生它的那种头脑，但它很有趣，很犀利，且全是关于Ruby的。好像。你会看到的。</p>
<h1><a name="Python"></a>Python</h1>
<p>啊，Python怎么说呢，一个不错的语言，这么多年来一直旁边在等待它的机会? Python社区很长时间以来是那些勇敢地吞下红药片从Perl骇客帝国中醒来的人的避难营。</p>
<p>啊，有点像Smalltalk的人们，他们永远在等待替代C++，没想到半路杀出Java一下把它们操翻了，漂亮地，永久地。哎哟。Ruby正在对Python做着同样的事，现在，今天。可能会在一夜之间吧。</p>
<p>Python本来可以统治世界，可惜它有两个致命缺陷：空格，和冷淡。</p>
<p>空格很简单，就是说Python是用缩进来表达代码块之间的嵌套。它强制你必须按一定格式把所有的东西缩进，他们这样做是为了让所有人写的代码看上去一样。不料蛮多程序员讨厌这点，因为他们觉得自己的自由被拿走了; 感觉就像Python侵犯了宪法赋予他们的可以随便缩进格式和全写在一行上的权利。</p>
<p>Python的作者，Guido Van Rossum，也在早期犯过一些很傻地技术错误—没有像Larry的失误那么严重，但是还是有几个。比如，最早Python没有字面变量范围，但它同时也没有动态变量范围，而动态变量范围可能会有它一些问题，但它还是有用的。Python却没有这些，只有全局的和本地(函数)的两种范围。所以即使它是一个真正的OO系统，类甚至不能访问它们自己的动态成员变量。你必须给成员函数传“self”参数，一大堆self参数很快就会把你搞疯掉，即使你不在意空格问题。</p>
<p>等等之类。</p>
<p>但在我看来，Python不行其实是因为冷淡。这阻止了它成为首选脚本语言，或者首选一切语言。靠，人们现在还在用Tcl作嵌入解释执行器，虽然Python比Tcl好得不要太多—除了，我说，这个冷淡问题。</p>
<p>此处开始我不知所云。呵呵，这样吧，把原文贴在最后面。</p>
<p>注1，Eric告诉我当时几乎全是Jamie Zawinski，当他们在Lucid工作的时候。</p>
<p>注2，我写了这个之后很多人告诉我Paul Graham是用VI的，想不到。</p>
<p>注3，为了有据可查，我个人根本不介意空格问题。我认为因为这个而不喜欢Python是很傻的。我只是说有一堆比例让人惊奇的<strong>其他</strong>工程师讨厌空格问题。</p>
<p>What&#8217;s the frost thing, you ask? Well, I used to have a lot of exceptionally mean stuff written here, but since Python&#8217;s actually quite pleasant to work with (if you can overlook its warts), I no longer think it&#8217;s such a great idea to bash on Pythonistas。The “frost thing” is just that they used to have a tendency to be a bit, well, frosty。Why?</p>
<p>Because they were so tired of hearing about the whitespace thing！</p>
<p>I think that&#8217;s why Python never reached Perl&#8217;s level of popularity, but maybe I&#8217;m just imagining things。</p>
<p>Coda</p>
<p>That was the ADJ article I really wanted to write。Or at least something like it。For some reason, though, my true feelings only seem to come out during insomniac attacks between 3am and 6am。Time for bed！2 hours &#8217;til my next meeting。</p>
<p>这才是我真正想给亚马逊开发者杂志写的文章。或者至少是这样的。出于某些原因，我的真感情好像只有在我凌晨三点到六点失眠的时候都会流露。该睡觉了！我下个会议再过两小时就开始了。</p>
<p>(发布于2004年9月，小小的更新在3/28/2006)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/1074.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>五一假期好像啥也没有干</title>
		<link>http://blog.globstudio.com/1072.html</link>
		<comments>http://blog.globstudio.com/1072.html#comments</comments>
		<pubDate>Tue, 01 May 2012 15:03:52 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[心情随笔]]></category>
		<category><![CDATA[IOS开发]]></category>
		<category><![CDATA[计划]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=1072</guid>
		<description><![CDATA[本来计划好的，很多事情要做的，可是现实和理想总是那么大差距。 前两天，身体不舒服，喉咙疼，智齿发炎，头昏脑胀的，昏睡了两天。 第三天，也就是今天，身体好点了，基本痊愈，搞了下ios imagepicker，实现了一个界面多个拍照区域。 后来发现无法真机调试了，ipod touch被升级到5.1系统了，奇怪的是我不知道什么时候升级的。 我装的Snow Leopard，最高只能升级到10.6.8，升级到Lion需要付钱的。Snow Leopard下ios SDK不支持5.1 后来没有办法，下载了XCode4.3.2，参照这里的方法http://www.cocoachina.com/bbs/3g/read.php?tid=97441使XCode4.2支持ios 5.1了 升级到XCode4.2之后，变化太大了，各种不适应。 1，没有Window-Based project了 To my understanding, here is the translation: Xcode 4.2 / Xcode 3 A Page-Based App is what was called a Navigation-Based App A Single View App is what was called a View-Based App A Tabbed App is obviously what was [...]]]></description>
			<content:encoded><![CDATA[<p>本来计划好的，很多事情要做的，可是现实和理想总是那么大差距。</p>
<p>前两天，身体不舒服，喉咙疼，智齿发炎，头昏脑胀的，昏睡了两天。</p>
<p>第三天，也就是今天，身体好点了，基本痊愈，搞了下ios imagepicker，实现了一个界面多个拍照区域。</p>
<p>后来发现无法真机调试了，ipod touch被升级到5.1系统了，奇怪的是我不知道什么时候升级的。</p>
<p>我装的Snow Leopard，最高只能升级到10.6.8，升级到Lion需要付钱的。Snow Leopard下ios SDK不支持5.1</p>
<p>后来没有办法，下载了XCode4.3.2，参照这里的方法<a href="http://www.cocoachina.com/bbs/3g/read.php?tid=97441">http://www.cocoachina.com/bbs/3g/read.php?tid=97441</a>使XCode4.2支持ios 5.1了</p>
<p>升级到XCode4.2之后，变化太大了，各种不适应。</p>
<p>1，没有Window-Based project了</p>
<p><span id="more-1072"></span></p>
<p>To my understanding, here is the translation: Xcode 4.2 / Xcode 3</p>
<ul>
<li>A Page-Based App is what was called a Navigation-Based App</li>
<li>A Single View App is what was called a View-Based App</li>
<li>A Tabbed App is obviously what was called a Tab Bar App</li>
<li>An Empty App is what was called a Window-Based App.</li>
</ul>
<p>这里有人介绍了如果从Empty App创建一个Xcode3时代的Window-Based App：<a href="http://www.trappers.tk/site/2011/06/16/mainwindow-xib/">http://www.trappers.tk/site/2011/06/16/mainwindow-xib/</a></p>
<p>这里有个讨论，是否还需要MainWindow.xib:<a href="http://stackoverflow.com/questions/7871241/is-a-mainwindow-xib-truly-needed-in-ios-application">http://stackoverflow.com/questions/7871241/is-a-mainwindow-xib-truly-needed-in-ios-application</a></p>
<p>2，ARC, Xcode 3时代是需要手动释放内存，4.2中加入了Automatic Reference Counting（ARC,自动引用计数），好事情，不过有点不适应，还是习惯自己release</p>
<p>3，窗口布局和菜单，这个应该说比3有提高，不过也需要适应一下。</p>
<p>很遗憾，预定的目标任务没有完成。</p>
<p>公司的项目，系统改造，本来要整理个文档的，可惜也没有去做。</p>
<p>好吧，这样就积累了一大堆事情要做了。要抓紧处理一下了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/1072.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google App Engine Quotas &#8211; GAE限额</title>
		<link>http://blog.globstudio.com/1067.html</link>
		<comments>http://blog.globstudio.com/1067.html#comments</comments>
		<pubDate>Thu, 26 Apr 2012 10:17:42 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[电脑相关]]></category>
		<category><![CDATA[GAE]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=1067</guid>
		<description><![CDATA[Google App Engine系统限额，最新整理2012-4-26 对一般用户来说，需要特别关注的是BlobStore和DataStore,分别是5G和1G。BlobStore + DataStore总大小不能超过5G 1，总限额(BlobStore) 包含所有存储在GAE一个应用下的数据大小。 Resource Free Default Limit Billing Enabled Default Limit Blobstore Stored Data 5 GB 5 GB free; no maximum 2,通道限额(Channel) 通道API创建一个与您的应用程序和谷歌服务器的持久连接，让您的应用程序，实时发送信息的JavaScript客户端，无需使用polling。立即更新对实时交互的APP是非常有用的。示例场景：协同应用系统，多玩家游戏，或聊天室。 Resource Free Default Limit Billing Enabled Default Limit Daily Limit Maximum Rate Daily Limit Maximum Rate Channel API Calls 657,000 calls 3,000 calls/minute 91,995,495 calls 32,000 calls/minute [...]]]></description>
			<content:encoded><![CDATA[<p>Google App Engine系统限额，最新整理2012-4-26</p>
<p>对一般用户来说，需要特别关注的是BlobStore和DataStore,分别是5G和1G。BlobStore + DataStore总大小不能超过5G</p>
<p><strong>1，总限额(BlobStore)</strong></p>
<p>包含<strong><span style="text-decoration: underline;">所有</span></strong>存储在GAE一个应用下的数据大小。</p>
<table border="1">
<tbody>
<tr>
<th width="30%">Resource</th>
<th width="35%">Free Default Limit</th>
<th width="35%">Billing Enabled Default Limit</th>
</tr>
<tr>
<td>Blobstore Stored Data</td>
<td style="text-align: left;">5 GB</td>
<td style="text-align: center;">5 GB free; no maximum</td>
</tr>
</tbody>
</table>
<p><strong>2,通道限额(Channel)</strong></p>
<p>通道API创建一个与您的应用程序和谷歌服务器的持久连接，让您的应用程序，实时发送信息的JavaScript客户端，无需使用polling。立即更新对实时交互的APP是非常有用的。示例场景：协同应用系统，多玩家游戏，或聊天室。</p>
<table border="1">
<tbody>
<tr>
<th rowspan="2" width="30%">Resource</th>
<th colspan="2" width="35%">Free Default Limit</th>
<th colspan="2" width="35%">Billing Enabled Default Limit</th>
</tr>
<tr>
<th width="17.5%">Daily Limit</th>
<th width="17.5%">Maximum Rate</th>
<th width="17.5%">Daily Limit</th>
<th width="17.5%">Maximum Rate</th>
</tr>
<tr>
<td width="30%">Channel API Calls</td>
<td width="17.5%">657,000 calls</td>
<td width="17.5%">3,000 calls/minute</td>
<td width="17.5%">91,995,495 calls</td>
<td width="17.5%">32,000 calls/minute</td>
</tr>
<tr>
<td>Channels Created</td>
<td>100 channels</td>
<td>6 creations/minute</td>
<td>Based on your budget</td>
<td>60 creations/minute</td>
</tr>
<tr>
<td>Channels Hours Requested</td>
<td>200 hours</td>
<td>12 hours requested/minute</td>
<td>Based on your budget</td>
<td>120 hours requested/minute</td>
</tr>
<tr>
<td>Channel Data Sent</td>
<td>Up to the Outgoing Bandwidth quota</td>
<td>22 MB/minute</td>
<td>2 GB</td>
<td>740 MB/minute</td>
</tr>
</tbody>
</table>
<p><span id="more-1067"></span></p>
<p><strong>3,转换(Conversion)</strong></p>
<p>Conversion是一个实验阶段的产品。</p>
<p>Conversion实现不同文件类型之间的转换。如Html,PDF,txt,image格式之间的转换，支持同步或异步方式。并且可以被用来进行字符识别（OCR)</p>
<table border="1">
<tbody>
<tr>
<th rowspan="2" width="30%">Resource</th>
<th colspan="2" width="35%">Free Default Limit</th>
<th colspan="2" width="35%">Billing Enabled Default Limit</th>
</tr>
<tr>
<th width="17.5%">Daily Limit</th>
<th width="17.5%">Maximum Rate</th>
<th width="17.5%">Daily Limit</th>
<th width="17.5%">Maximum Rate</th>
</tr>
<tr>
<td width="30%">Conversion API Calls</td>
<td width="17.5%">100 conversions</td>
<td width="17.5%">10 conversions/API call</td>
<td width="17.5%">100 conversions</td>
<td width="17.5%">10 conversions/API call</td>
</tr>
</tbody>
</table>
<p><strong>4，数据存储（DataStore）</strong></p>
<p>两种类型：付费的DataStrore指的是存储在Master/Slave Datastore, 任务队列，和BlobStore中的数据</p>
<p>其他情况下的DataStrore特指数据存储服务的限额</p>
<table border="1">
<tbody>
<tr>
<th width="30%">Resource</th>
<th width="35%">Free Default Limit</th>
<th width="35%">Billing Enabled Default Limit</th>
</tr>
<tr>
<td>Stored Data (<a href="https://developers.google.com/appengine/docs/quotas#Safety_Quotas_and_Billable_Resources">billable</a>)</td>
<td>1 GB</td>
<td>1 GB free; no maximum</td>
</tr>
<tr>
<td>Number of Indexes</td>
<td>200</td>
<td>200</td>
</tr>
</tbody>
</table>
<p><strong>5，部署（Deployments)</strong></p>
<p>每天可以上传你的应用的次数限额。当前限额是1000次每天</p>
<p><strong>6，邮件（Mail)</strong></p>
<p>使用Mail服务的限额</p>
<table border="1">
<tbody>
<tr>
<th rowspan="2" width="30%">Resource</th>
<th colspan="2" width="35%">Free Default Limit</th>
<th colspan="2" width="35%">Billing Enabled Default Limit</th>
</tr>
<tr>
<th width="17.5%">Daily Limit</th>
<th width="17.5%">Maximum Rate</th>
<th width="17.5%">Daily Limit</th>
<th width="17.5%">Maximum Rate</th>
</tr>
<tr>
<td width="30%">Mail API Calls</td>
<td width="17.5%">100 calls</td>
<td width="17.5%">32 calls/minute</td>
<td width="17.5%">1,700,000 calls</td>
<td width="17.5%">4,900 calls/minute</td>
</tr>
<tr>
<td>Recipients Emailed (<a href="https://developers.google.com/appengine/docs/quotas#Billable_Resources">billable</a>)</td>
<td>100 recipients</td>
<td>8 recipients/minute</td>
<td>100 recipients until first charge cleared; 100 recipients free and no maximum thereafter</td>
<td>5,100 recipients/minute</td>
</tr>
<tr>
<td>Admins Emailed</td>
<td>5,000 mails</td>
<td>24 mails/minute</td>
<td>3,000,000 mails</td>
<td>9,700 mails/minute</td>
</tr>
<tr>
<td>Message Body Data Sent</td>
<td>60 MB</td>
<td>340 KB/minute</td>
<td>29 GB</td>
<td>84 MB/minute</td>
</tr>
<tr>
<td>Attachments Sent</td>
<td>2,000 attachments</td>
<td>8 attachments/minute</td>
<td>2,900,000 attachments</td>
<td>8,100 attachments/minute</td>
</tr>
<tr>
<td>Attachment Data Sent</td>
<td>100 MB</td>
<td>10 MB/minute</td>
<td>100 GB</td>
<td>300 MB/minute</td>
</tr>
</tbody>
</table>
<p><strong>7, 请求数量（Requests)</strong></p>
<p>Outgoing是从你的应用到用户端的流量限额</p>
<p>InComing就是用户端到你的应用的流量限额</p>
<table border="1">
<tbody>
<tr>
<th rowspan="2" width="30%">Resource</th>
<th colspan="2" width="35%">Free Default Limit</th>
<th colspan="2" width="35%">Billing Enabled Default Limit</th>
</tr>
<tr>
<th width="17.5%">Daily Limit</th>
<th width="17.5%">Maximum Rate</th>
<th width="17.5%">Daily Limit</th>
<th width="17.5%">Maximum Rate</th>
</tr>
<tr>
<td>Outgoing Bandwidth (<a href="https://developers.google.com/appengine/docs/quotas#Billable_Resources">billable</a>, includes HTTPS)</td>
<td>1 GB</td>
<td>56 MB/minute</td>
<td>1 GB free; 14,400 GB maximum</td>
<td>10 GB/minute</td>
</tr>
<tr>
<td>Incoming Bandwidth (includes HTTPS)</td>
<td>1 GB; 14,400 GB maximum</td>
<td>56 MB/minute</td>
<td>none</td>
<td>none</td>
</tr>
</tbody>
</table>
<p><strong>8，任务队列（Task Queue)</strong></p>
<p>调用次数：</p>
<table border="1">
<tbody>
<tr>
<th rowspan="2" width="30%">Resource</th>
<th colspan="2" width="35%">Free Default Limit</th>
<th colspan="2" width="35%">Billing Enabled Default Limit</th>
</tr>
<tr>
<th width="17.5%">Daily Limit</th>
<th width="17.5%">Maximum Rate</th>
<th width="17.5%">Daily Limit</th>
<th width="17.5%">Maximum Rate</th>
</tr>
<tr>
<td width="30%">Task Queue API Calls</td>
<td width="17.5%">100,000</td>
<td width="17.5%"><em>n/a</em></td>
<td width="17.5%">1,000,000,000</td>
<td width="17.5%"><em>n/a</em></td>
</tr>
</tbody>
</table>
<p>存储限额：</p>
<table border="1">
<tbody>
<tr>
<th width="30%">Resource</th>
<th width="35%">Free Default Limit</th>
<th width="35%">Billing Enabled Default Limit</th>
</tr>
<tr>
<td>Task Queue Stored Task Count</td>
<td>1,000,000</td>
<td>10,000,000,000</td>
</tr>
<tr>
<td>Task Queue Stored Task Bytes</td>
<td>500 MB. Configurable up to 1 GB.</td>
<td>none MB. Configurable up to <strong>Stored Data (billable).</strong></td>
</tr>
</tbody>
</table>
<p><strong>9， Url抓取（URL Fetch)</strong></p>
<p>网址抓取服务。</p>
<p>就是你的应用访问别的网站的限额</p>
<table border="1">
<tbody>
<tr>
<th rowspan="2" width="30%">Resource</th>
<th colspan="2" width="35%">Free Default Limit</th>
<th colspan="2" width="35%">Billing Enabled Default Limit</th>
</tr>
<tr>
<th width="17.5%">Daily Limit</th>
<th width="17.5%">Maximum Rate</th>
<th width="17.5%">Daily Limit</th>
<th width="17.5%">Maximum Rate</th>
</tr>
<tr>
<td width="30%">UrlFetch API Calls</td>
<td width="17.5%">657,000 calls</td>
<td width="17.5%">3,000 calls/minute</td>
<td width="17.5%">46,000,000 calls</td>
<td width="17.5%">32,000 calls/minute</td>
</tr>
<tr>
<td>UrlFetch Data Sent</td>
<td>up to the Outgoing Bandwidth quota</td>
<td>22 MB/minute</td>
<td>up to the Outgoing Bandwidth quota</td>
<td>740 MB/minute</td>
</tr>
<tr>
<td>UrlFetch Data Received</td>
<td>up to the Incoming Bandwidth quota</td>
<td>22 MB/minute</td>
<td>up to the Incoming Bandwidth quota</td>
<td>740 MB/minute</td>
</tr>
</tbody>
</table>
<p><strong>10，XMPP</strong></p>
<p>Google大名鼎鼎的XMPP服务</p>
<table border="1">
<tbody>
<tr>
<th rowspan="2" width="30%">Resource</th>
<th colspan="2" width="35%">Free Default Limit</th>
<th colspan="2" width="35%">Billing Enabled Default Limit</th>
</tr>
<tr>
<th width="17.5%">Daily Limit</th>
<th width="17.5%">Maximum Rate</th>
<th width="17.5%">Daily Limit</th>
<th width="17.5%">Maximum Rate</th>
</tr>
<tr>
<td width="30%">XMPP API Calls</td>
<td width="17.5%">46,000,000 calls</td>
<td width="17.5%">257,280 calls/minute</td>
<td width="17.5%">46,000,000 calls</td>
<td width="17.5%">257,280 calls/minute</td>
</tr>
<tr>
<td>XMPP Data Sent</td>
<td>1 GB</td>
<td>5.81 GB/minute</td>
<td>1,046 GB</td>
<td>5.81 GB/minute</td>
</tr>
<tr>
<td>XMPP Recipients Messaged</td>
<td>46,000,000 recipients</td>
<td>257,280 recipients/minute</td>
<td>46,000,000 recipients</td>
<td>257,280 recipients/minute</td>
</tr>
<tr>
<td>XMPP Invitations Sent</td>
<td>100,000 invitations</td>
<td>2,000 invitations/minute</td>
<td>100,000 invitations</td>
<td>2,000 invitations/minute</td>
</tr>
<tr>
<td>XMPP Stanzas Sent</td>
<td>10,000 stanzas</td>
<td>n/a</td>
<td>Based on your budget</td>
<td>n/a</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/1067.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ios开发入门留念</title>
		<link>http://blog.globstudio.com/1063.html</link>
		<comments>http://blog.globstudio.com/1063.html#comments</comments>
		<pubDate>Wed, 25 Apr 2012 16:20:55 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[移动开发]]></category>
		<category><![CDATA[IOS开发]]></category>
		<category><![CDATA[总结]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=1063</guid>
		<description><![CDATA[经过一周多的时间的摸索，我可以宣布，我入门了 我独立开发了一个App，当然功能没啥特别的，并且还很不完善。（把公安部公布的通缉犯做成APP应用，哈哈） 从摸索VirtualBox下安装Snow Leopard到看书，写代码，再到开发证书，最终放到测试用的iPod上，颇有收获。 那么总结一下： 1，实践证明，虚拟机下开发ios应用是可行的，前提是你要装上Snow Leopard，并不是所有的电脑都能安装的。 2，不习惯看英文文档的找一本入门书籍，比如我看的《iPhone4应用程序开发入门与实践》 3，官方的Class Reference还是要看的，尤其是入门之后，真正做应用的时候哦。http://developer.apple.com/library/ios/navigation/#section=Resource%20Types&#38;topic=Reference 4，Apple的Sample Code也是不错的学习资料。http://developer.apple.com/library/ios/navigation/#section=Resource%20Types&#38;topic=Sample%20Code 5，开发证书，买吧，$99 6，真机需要吗，可能是需要的，模拟器其实也可以。如果重视体验的话，真机还是需要一个。iPod价格还能接受，考虑入手一个。 7，黑苹果的配置和问题解决，可以参考http://blog.globstudio.com/tag/ios%E5%BC%80%E5%8F%91 8，如果有c或c++经验，object-c是很简单的，完全不用在意 学习，总结，思考，分析 不要急躁，问题尽量自己解决，解决不了问google 感谢黑苹果]]></description>
			<content:encoded><![CDATA[<p>经过一周多的时间的摸索，我可以宣布，我入门了<br />
我独立开发了一个App，当然功能没啥特别的，并且还很不完善。（把公安部公布的通缉犯做成APP应用，哈哈）<br />
从摸索VirtualBox下安装Snow Leopard到看书，写代码，再到开发证书，最终放到测试用的iPod上，颇有收获。</p>
<p>那么总结一下：<br />
1，实践证明，虚拟机下开发ios应用是可行的，前提是你要装上Snow Leopard，并不是所有的电脑都能安装的。<br />
2，不习惯看英文文档的找一本入门书籍，比如我看的《iPhone4应用程序开发入门与实践》<br />
3，官方的Class Reference还是要看的，尤其是入门之后，真正做应用的时候哦。<a href="http://developer.apple.com/library/ios/navigation/#section=Resource%20Types&amp;topic=Reference">http://developer.apple.com/library/ios/navigation/#section=Resource%20Types&amp;topic=Reference</a></p>
<p><span id="more-1063"></span> 4，Apple的Sample Code也是不错的学习资料。<a href="http://developer.apple.com/library/ios/navigation/#section=Resource%20Types&amp;topic=Sample%20Code">http://developer.apple.com/library/ios/navigation/#section=Resource%20Types&amp;topic=Sample%20Code</a><br />
5，开发证书，买吧，$99<br />
6，真机需要吗，可能是需要的，模拟器其实也可以。如果重视体验的话，真机还是需要一个。iPod价格还能接受，考虑入手一个。<br />
7，黑苹果的配置和问题解决，可以参考<a href="http://blog.globstudio.com/tag/ios%E5%BC%80%E5%8F%91">http://blog.globstudio.com/tag/ios%E5%BC%80%E5%8F%91</a><br />
8，如果有c或c++经验，object-c是很简单的，完全不用在意</p>
<p>学习，总结，思考，分析<br />
不要急躁，问题尽量自己解决，解决不了问google</p>
<p>感谢黑苹果</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/1063.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>virtualbox下Snow Leopard连接iPod/iPhone</title>
		<link>http://blog.globstudio.com/1061.html</link>
		<comments>http://blog.globstudio.com/1061.html#comments</comments>
		<pubDate>Wed, 25 Apr 2012 09:46:44 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[移动开发]]></category>
		<category><![CDATA[IOS开发]]></category>
		<category><![CDATA[virtualbox]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=1061</guid>
		<description><![CDATA[之前在virtualbox下安装的Snow Leopard10.6.8使用了2个星期了 现在除了长时间不使用后鼠标消失的问题没有解决，其他一切正常。 今天想用XCode真机调试下，发现插上ipod后，虚拟机下无法识别。 经过一番折腾，终于识别出来了 1，VM全局设置中，添加Oracle VM VirtualBox Extension Pack,在扩展（Extension）中，选择“添加包”。Extension Pack从http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html#extpack下载。 2，Snow Leopard设置中，启用USB2.0（EHCI)控制器 3，USB设备筛选器中添加你的IPod设备。（你已经把iPod连接到电脑，即Windows可以识别的）这里能选择的时Windows下识别出的USB设备，分配给虚拟机后，Windows该设备将不可见 4，OK，已经可以了。 ================================================================= iPhone开发证书配置请参考http://www.cocoachina.com/bbs/read.php?tid-7923.html，写的非常详细了 ================================================================= 之前一直使用 EmprieEFI 光盘引导启动，其实可以安装EmprieEFI 光盘里的 myHack Installer，之后就可以不用光盘引导，知道从硬盘启动系统。]]></description>
			<content:encoded><![CDATA[<p>之前在virtualbox下安装的Snow Leopard10.6.8使用了2个星期了<br />
现在除了长时间不使用后鼠标消失的问题没有解决，其他一切正常。<br />
今天想用XCode真机调试下，发现插上ipod后，虚拟机下无法识别。<br />
经过一番折腾，终于识别出来了</p>
<p>1，VM全局设置中，添加Oracle VM VirtualBox Extension Pack,在扩展（Extension）中，选择“添加包”。Extension Pack从http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html#extpack下载。<br />
<span id="more-1061"></span><br />
2，Snow Leopard设置中，启用USB2.0（EHCI)控制器<br />
3，USB设备筛选器中添加你的IPod设备。（你已经把iPod连接到电脑，即Windows可以识别的）这里能选择的时Windows下识别出的USB设备，分配给虚拟机后，Windows该设备将不可见<br />
4，OK，已经可以了。</p>
<p>=================================================================<br />
iPhone开发证书配置请参考http://www.cocoachina.com/bbs/read.php?tid-7923.html，写的非常详细了<br />
=================================================================<br />
之前一直使用 EmprieEFI 光盘引导启动，其实可以安装EmprieEFI 光盘里的 myHack Installer，之后就可以不用光盘引导，知道从硬盘启动系统。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/1061.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>一个函数递归实现无限分级树状结构输出</title>
		<link>http://blog.globstudio.com/1056.html</link>
		<comments>http://blog.globstudio.com/1056.html#comments</comments>
		<pubDate>Tue, 24 Apr 2012 10:30:23 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[PHP/Python]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=1056</guid>
		<description><![CDATA[分类信息表，无限分级的（catid，parentid这样的） 需要把所有分类信息读取到一个树状结构的array中 以下是代码，使用了递归和引用 public function get_all&#40;$parentid = 0, $categorys = array&#40;&#41;&#41; &#123; $result = array&#40;&#41;; &#160; $this-&#62;db-&#62;select&#40;'catid, parentid, name, roleids'&#41;; $result = $this-&#62;db-&#62;get_where&#40;'pass9_monitor_category', array&#40;'parentid' =&#62; $parentid&#41;&#41;; &#160; if &#40;$result-&#62;num_rows&#40;&#41; &#62; 0&#41; &#123; $temp = $result-&#62;result_array&#40;&#41;; &#160; foreach &#40;$temp as $row&#41; &#123; $categorys&#91;$row&#91;'catid'&#93;&#93; = $row; $this-&#62;get_all&#40;$row&#91;'catid'&#93;, &#38;$categorys&#91;$row&#91;'catid'&#93;&#93;&#91;'child'&#93;&#41;; &#125; &#125; &#160; return $categorys; &#125; &#160; 调用代码: $categorys [...]]]></description>
			<content:encoded><![CDATA[<p>分类信息表，无限分级的（catid，parentid这样的）<br />
需要把所有分类信息读取到一个树状结构的array中<br />
以下是代码，使用了递归和引用</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> get_all<span style="color: #009900;">&#40;</span><span style="color: #000088;">$parentid</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$categorys</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">select</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'catid, parentid, name, roleids'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_where</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'pass9_monitor_category'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'parentid'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$parentid</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">num_rows</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$temp</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">result_array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$temp</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$categorys</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'catid'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$row</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_all</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'catid'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$categorys</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'catid'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'child'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$categorys</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span></pre></div></div>

<p><span id="more-1056"></span><br />
&nbsp;<br />
调用代码:</p>
<blockquote><p>
  $categorys = get_all(0, $categorys);</p>
<p>  echo “
<pre>";
  print_r($categorys);
  echo "</pre>
<p>“;
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/1056.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>查找某日期之后不存在xx历史记录的用户</title>
		<link>http://blog.globstudio.com/1054.html</link>
		<comments>http://blog.globstudio.com/1054.html#comments</comments>
		<pubDate>Tue, 24 Apr 2012 03:17:24 +0000</pubDate>
		<dc:creator>henry.wu</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://blog.globstudio.com/?p=1054</guid>
		<description><![CDATA[查找某日期之后不存在xx历史记录的用户 需求是查找某日期之后不存在积分历史的用户 最常规的，效率比较低（两次全表扫描之后再hash join） SELECT DISTINCT &#40;to_uuid&#41; FROM JF_CHANGE_HISTORY WHERE update_ts &#60; = to_date&#40;'2011-06-30 23:59:59', 'yyyy-mm-dd hh24:mi:ss'&#41; AND to_uuid NOT IN &#40;SELECT to_uuid FROM JF_CHANGE_HISTORY WHERE update_ts &#62; to_date&#40;'2011-06-30 23:59:59', 'yyyy-mm-dd hh24:mi:ss'&#41;&#41;; 改进后的： 一次全表扫描，一次group by SELECT to_uuid FROM &#40;SELECT to_uuid, MAX&#40;update_ts&#41; AS update_ts FROM jf_change_history GROUP BY to_uuid&#41; WHERE update_ts &#60; = to_date&#40;'2011-06-30 23:59:59', 'yyyy-mm-dd [...]]]></description>
			<content:encoded><![CDATA[<p>查找某日期之后不存在xx历史记录的用户</p>
<p>需求是查找某日期之后不存在积分历史的用户<br />
最常规的，效率比较低（两次全表扫描之后再hash join）</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #993333; font-weight: bold;">DISTINCT</span> <span style="color: #66cc66;">&#40;</span>to_uuid<span style="color: #66cc66;">&#41;</span>
  <span style="color: #993333; font-weight: bold;">FROM</span> JF_CHANGE_HISTORY
 <span style="color: #993333; font-weight: bold;">WHERE</span> update_ts <span style="color: #66cc66;">&lt;</span> <span style="color: #66cc66;">=</span> to_date<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'2011-06-30 23:59:59'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'yyyy-mm-dd hh24:mi:ss'</span><span style="color: #66cc66;">&#41;</span>
   <span style="color: #993333; font-weight: bold;">AND</span> to_uuid <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">IN</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> to_uuid
          <span style="color: #993333; font-weight: bold;">FROM</span> JF_CHANGE_HISTORY
         <span style="color: #993333; font-weight: bold;">WHERE</span> update_ts <span style="color: #66cc66;">&gt;</span>
               to_date<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'2011-06-30 23:59:59'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'yyyy-mm-dd hh24:mi:ss'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>改进后的：<br />
一次全表扫描，一次group by<br />
<span id="more-1054"></span></p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> to_uuid
  <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> to_uuid<span style="color: #66cc66;">,</span> <span style="color: #993333; font-weight: bold;">MAX</span><span style="color: #66cc66;">&#40;</span>update_ts<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> update_ts
          <span style="color: #993333; font-weight: bold;">FROM</span> jf_change_history
         <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">BY</span> to_uuid<span style="color: #66cc66;">&#41;</span>
 <span style="color: #993333; font-weight: bold;">WHERE</span> update_ts <span style="color: #66cc66;">&lt;</span> <span style="color: #66cc66;">=</span> to_date<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'2011-06-30 23:59:59'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'yyyy-mm-dd hh24:mi:ss'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.globstudio.com/1054.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

