<?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>Erlang-China &#187; study</title>
	<atom:link href="http://erlang-china.org/category/study/feed" rel="self" type="application/rss+xml" />
	<link>http://erlang-china.org</link>
	<description>erlang 中文社区</description>
	<lastBuildDate>Tue, 13 Jul 2010 02:53:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>CouchDB —— 可以期待的美好未来</title>
		<link>http://erlang-china.org/study/couchdb_good_future_to_expect.html</link>
		<comments>http://erlang-china.org/study/couchdb_good_future_to_expect.html#comments</comments>
		<pubDate>Tue, 16 Mar 2010 18:38:07 +0000</pubDate>
		<dc:creator>jackyz</dc:creator>
				<category><![CDATA[study]]></category>
		<category><![CDATA[CouchAPP]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://erlang-china.org/?p=675</guid>
		<description><![CDATA[有关 CouchDB 的最新动向是： Damien Katz 已经离开了 IBM ，他和他的团队，在 200w $ 投资的帮助之下，开始创业。美国投资人的魄力与专业素养，让我这个中国软件人羡慕不已，什么时候我们中国也会出现这种“纯粹谈技术就能够决定是否投你”的投资人呢？新公司名叫 Couch IO (请注意，名字当中，没有出现 DB 这两个字母)。是的，开源软件界备受瞩目的新星 —— CouchDB 团队已经踏上了全新的旅程，他们正朝着下一个目标进发。我很愿意见到他们取得成功！ 在 CouchDB 狐狸书 中，作者 Jan Lehnardt 描述了一种全新的 Web 开发模式，有这样一句话来形容这种新的开发方式。 CouchDB has changed the way I think about developing web applications 在有着 10+ 年 Web 开发经验的我看来，尤其是在确实理解了他们心目中的开发方式之后，我觉得，这并不是一句阿谀奉承的面子话。而是，实事求是地说 —— 完全没有夸张的成分。 我在这里极其“概略”的介绍一下这种匪夷所思开发方式的若干基本要素： CouchDB 是一个 NO-SQL 的“文档数据库”，以 B-Tree 提供 Powerful 的数据存储与访问能力 [...]]]></description>
		<wfw:commentRss>http://erlang-china.org/study/couchdb_good_future_to_expect.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>素数求解，兼谈Erlang的性能特性</title>
		<link>http://erlang-china.org/study/prime_case-and-erlang_performance.html</link>
		<comments>http://erlang-china.org/study/prime_case-and-erlang_performance.html#comments</comments>
		<pubDate>Tue, 24 Nov 2009 09:55:53 +0000</pubDate>
		<dc:creator>jackyz</dc:creator>
				<category><![CDATA[study]]></category>

		<guid isPermaLink="false">http://erlang-china.org/?p=625</guid>
		<description><![CDATA[javaeye 的 dachidahu 同学不久前提了一个关于 Erlang 的问题 —— 《Erlang 求解1到N 素数的效率问题》。我试了一下，这个问题并不复杂，但结果相当有趣。对于初学 Erlang 的朋友而言，这个程序作为一个了解 Erlang 语言性能特性的例子，非常具有典型性。因此，特地整理一番，与众初学者共享。 这是“求素数”的 Java 代码。基本来自 dachidahu 的帖子，为了测试方便，略做修改。 &#19979;&#36733;: Prime.java// javac Prime.java// java Prime 1000000public class Prime {&#160;&#160; &#160;public static void main(String[] args){&#160;&#160; &#160; &#160; &#160;int n = Integer.parseInt(args[0]);&#160;&#160; &#160; &#160; &#160;long start = System.currentTimeMillis();&#160;&#160; &#160; &#160; &#160;for(int i=2; i&#60;n; i++){&#160;&#160; &#160; &#160; &#160; [...]]]></description>
		<wfw:commentRss>http://erlang-china.org/study/prime_case-and-erlang_performance.html/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>[荐]Erlang和Python的互通</title>
		<link>http://erlang-china.org/study/erlang_call_python_in_port.html</link>
		<comments>http://erlang-china.org/study/erlang_call_python_in_port.html#comments</comments>
		<pubDate>Wed, 02 Sep 2009 02:48:39 +0000</pubDate>
		<dc:creator>jackyz</dc:creator>
				<category><![CDATA[study]]></category>

		<guid isPermaLink="false">http://erlang-china.org/?p=594</guid>
		<description><![CDATA[陈皓同学的博客建在 ZDNet 上，他最近正在研究 Erlang ，在官方文档上花了 24 个小时的研读之后，终于调通了 Erlang 通过 Port 机制调用 Python 的代码。或许，他的文章和代码能帮助更多的朋友节约更多的 24 个小时，尤其是对于那些想要写 Port 或正在用 Python 的朋友。故，在此推荐之。地址在［这里］。 其实 Port 对 Erlang 而言是一个很重要的扩展设施。在 Disco，在 CouchDB，在很多重量级的 Erlang 项目中，我们都能看到 Port 的使用。在大量的 Erlang 项目实战中，最初的快速原型开发确定之后，再将发现的瓶颈部分改为更加高效的本地 Port 来实现(如果能够确认这样的实现真的更加高效的话)，这似乎也是比较通行的做法。放在这样的应用场景下考虑，此时的 Port 其实充当着“ Worker 调用者”的角色，而 Erlang 自身则变成了动态机器集群的“粘合系统”。与“将一个机房/一堆机器当作一台机器来使用”的架构目标达成了极佳的重合。 对于大多数的 Erlanger 而言，在实际的工程实践中，对“效率”和“适用性”上的考量应该被放在第一位，对“是否纯粹”的执着则应该被看得更淡一些。]]></description>
		<wfw:commentRss>http://erlang-china.org/study/erlang_call_python_in_port.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>回“老赵”关于“Erlang中最大的问题”</title>
		<link>http://erlang-china.org/study/puzzle-in-erlang_pattern_match.html</link>
		<comments>http://erlang-china.org/study/puzzle-in-erlang_pattern_match.html#comments</comments>
		<pubDate>Fri, 10 Jul 2009 07:37:53 +0000</pubDate>
		<dc:creator>jackyz</dc:creator>
				<category><![CDATA[study]]></category>
		<category><![CDATA[best_practise]]></category>
		<category><![CDATA[language]]></category>
		<category><![CDATA[pattern_match]]></category>

		<guid isPermaLink="false">http://erlang-china.org/?p=563</guid>
		<description><![CDATA[活跃在博客园的“老赵”，是一位研究 .NET 非常深入的同学(因为我本人也是老赵——jackyz.zhao，所以，特地加了引号)。他最近很关注“在 .NET 下实现 Erlang 语言特性”的课题，并为此写了一系列的技术文章，相当不错，我一直都在关注。他自己写了一个名为 ActorLite 的小东西，此前做过介绍，是个不错的尝试。 最近“老赵”同学写了一篇《一种适合C# Actor的消息执行方式(上)》，其中提到“(在消息执行上) Erlang 中最大的问题”。这是一个很有意思的观点，而且因为富于代表性因而显得很有价值，很有必要拿出来和大家探讨。 其中提到： Erlang的优势与缺陷 　　Erlang在消息执行方式上的优势在于灵活。Erlang是弱类型语言，在实现的时候可以任意调整消息的内容，或是模式的要求。在 Erlang进行模式匹配时往往有种约定：使用“原子”来表示“做什么”，而使用“绑定”来获取操作所需要的“数据”，这种方式避免了冗余的cast和赋值，在使用的时候颇为灵活。然而，世上没有完美的事物，Erlang的消息执行方式也有缺陷，而且是较为明显的缺陷。 　　首先，Erlang的数据抽象能力实在太弱。如果编写一个略显复杂的应用程序，您会发现程序里充斥着复杂的元组。您可能会疲于应对那些拥有7、 8个单元（甚至跟多）的元组，一个一个数过来到底某个绑定匹配的是第几项，它的含义究竟是什么——一旦搞错，程序便会出错，而且想要调试都较为困难。因此，也有人戏称Erlang是一门“天生会损害人视力的语言”（令人惊讶的是，那篇文章居然搜不到了，我们只能从搜索引擎上看出点痕迹了）。 　　而我认为，这并不是Erlang语言中最大的问题，Erlang中最大的问题也是其“弱类型”特性。例如，现在有一个公用的Service Locator服务，任意类型的Actor都会像SL发送一个消息用于请求某个Service的位置，SL会在得到请求之后，向请求方发送一条消息表示应答。试想，如果SL的功能需要有所修改，作为回复的消息结构产生了变化，那么我们势必要修改每一个请求方中所匹配的模式。由于消息的发送方和接受方在实际上完全分离，没有基于任何协议，因此静态检查几乎无从做起。一旦遇到这种需要大规模的修改的情况，Erlang程序便很容易产生差错。因为一旦有所遗漏，系统便无法正常执行下去了。 这的确是对于动态类型语言很常见到的担心，而且，确实，如果不加注意会成为严重的问题。这种困扰确实是因为 Erlang 的“动态类型”和“基于消息”而造成的。但，这并非无解，实际上，在 Erlang 编程规范之中，已经给出了解决方案。 通常而言，Erlang 中的消息应该是以“控制流”为主，在消息的数据结构表达上，不同的消息通常都对应着不同的处理流程，在这里“控制”是消息中最为关注的内容。为此我们可以简单的引入一个 atom 来予以表达，这就是 Tag Messages 的最佳实践： 5.7 Tag messages All messages should be tagged. This makes the order in the receive statement less important and the implementation of [...]]]></description>
		<wfw:commentRss>http://erlang-china.org/study/puzzle-in-erlang_pattern_match.html/feed</wfw:commentRss>
		<slash:comments>162</slash:comments>
		</item>
		<item>
		<title>[转]Erlang的类型系统和静态分析</title>
		<link>http://erlang-china.org/study/erlang_type_and_dialyzer.html</link>
		<comments>http://erlang-china.org/study/erlang_type_and_dialyzer.html#comments</comments>
		<pubDate>Tue, 09 Jun 2009 02:31:07 +0000</pubDate>
		<dc:creator>jackyz</dc:creator>
				<category><![CDATA[study]]></category>
		<category><![CDATA[dialyzer]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[guide]]></category>
		<category><![CDATA[type]]></category>

		<guid isPermaLink="false">http://erlang-china.org/?p=523</guid>
		<description><![CDATA[转载说明 “Erlang 是动态类型的语言，因而不能进行静态分析，所生成的文档也不包含有助于理解的类型信息”——这是惯常的看法，广为流行，而且被看作是 Erlang 在开发大型系统时的一个短板(大型系统意味着更强烈的静态分析需求和更严重的依赖文档进行沟通)。 然而 Erlang 是一个有着 20 多年历史的成熟系统，它早已发展出了一套自己的类型标注系统，不仅用来生成文档，更重要的是可以据此对源码进行静态分析，通过程序来排除一些低级的和隐藏的错误。在这方面， Erlang OTP 的源码本身及其文档就是最好的例子。在 《Erlang 程序设计》 的附录A部分，对于这个系统的使用已经进行了充分的说明。 需要强调的一点是在 Erlang 语言的背后还有一个活跃的社区(后者更为重要)，其 EPP 过程一直都在持续不断地推进语言本身的进化。这方面最新的成果便是：在 R13 中，将此前文档级的 @spec，@type 标注升级为语言级的 -spec，-type 标注。可以预期的一点是，在未来的版本中，这些方面仍将持续推进。 litaocheng 同学的这篇“Erlang类型及函数声明规格”，风格严谨，论述详尽，涵盖了最新的语言特性，是任何一个程序员想要开发“严肃 Erlang 程序”的必读文档。 Erlang类型及函数声明规格 Author: litaocheng Mail: litaocheng@gmail.com Date: 2009.6.8 Copyright: This document has been placed in the public domain. Contents: 概述 意义 规范 类型及其定义语法 自定义类型定义 在record中使用类型声明 [...]]]></description>
		<wfw:commentRss>http://erlang-china.org/study/erlang_type_and_dialyzer.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[转] couchdb 上手指南</title>
		<link>http://erlang-china.org/study/couchdb-guide.html</link>
		<comments>http://erlang-china.org/study/couchdb-guide.html#comments</comments>
		<pubDate>Wed, 06 May 2009 08:59:39 +0000</pubDate>
		<dc:creator>jackyz</dc:creator>
				<category><![CDATA[study]]></category>

		<guid isPermaLink="false">http://erlang-china.org/?p=487</guid>
		<description><![CDATA[张沈鹏同学写了一篇不错的 couchdb 上手指南，以 wiki 格式发在 erlang-china 的 maillist 里。这里整理了一下格式，原文转贴出来，并郑重推荐之。 启动 balin couchdb #&#160; ./utils/run 参数有 -h display a short help message and exit -V display version information and exit -a FILE add configuration FILE to chain -A DIR add configuration DIR to chain -n reset configuration file chain (including system default) -c print configuration file [...]]]></description>
		<wfw:commentRss>http://erlang-china.org/study/couchdb-guide.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Tail Recursion in C [一]</title>
		<link>http://erlang-china.org/misc/tail-recursion-in-c-%e4%b8%80.html</link>
		<comments>http://erlang-china.org/misc/tail-recursion-in-c-%e4%b8%80.html#comments</comments>
		<pubDate>Fri, 27 Mar 2009 08:12:38 +0000</pubDate>
		<dc:creator>ph4nut</dc:creator>
				<category><![CDATA[misc]]></category>
		<category><![CDATA[study]]></category>

		<guid isPermaLink="false">http://erlang-china.org/?p=459</guid>
		<description><![CDATA[看了《写出正确的尾递归代码》一文，对尾递归的作用有了表面上的理解，但是关于编译器如何优化尾递归为一条跳转指令以及对递归堆栈的处理还不是很清楚。所以有了这篇小文，有什么错误的地方还请各位看官指出。 先来看一下在C语言里一个尾递归的例子： #include &#38;lt;stdio.h&#38;gt;   void&#160;add( int  n) {     printf(&#160;&#34; %d\n&#34;,n);     add(n + 1); }   int&#160;main() {     add(0);     return&#160;0; } 编译这段代码：gcc -o  add.exe add.c 如果运行这个程序的话，当n增加到一定值的话，程序就会推出，因为栈空间不够。 再来用gcc的O2选项(这个选项增加了对尾递归的优化)来优化这段代码并运行：gcc -o add.exe add.c  -O2 如果你运行这个程序，你会发现一直打印递增的n,而没有停止。 接下来我们来比较一下没有优化尾递归和优化后的汇编代码。 未优化尾递归的汇编代码：gcc -S add.c  .file &#34;add.c&#34;  .section .rdata,&#34;dr&#34; LC0:  .ascii &#34; %d\12&#34;  .text .globl _add  .def _add; .scl 2; .type 32; .endef _add:  pushl %ebp  movl %esp, %ebp  subl $8, [...]]]></description>
		<wfw:commentRss>http://erlang-china.org/misc/tail-recursion-in-c-%e4%b8%80.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>问个非常初级的问题</title>
		<link>http://erlang-china.org/study/about_epl_license.html</link>
		<comments>http://erlang-china.org/study/about_epl_license.html#comments</comments>
		<pubDate>Thu, 15 Jan 2009 10:38:21 +0000</pubDate>
		<dc:creator>huzht</dc:creator>
				<category><![CDATA[study]]></category>
		<category><![CDATA[erlang 授权]]></category>

		<guid isPermaLink="false">http://erlang-china.org/?p=379</guid>
		<description><![CDATA[我用了1天把erlang的EPL协议（也就是MPL协议改的），读了一下，感觉还有点没明白，我想问问如果我只使用默认配套的.beam文件和他的运行时环境，当然我肯定要自己做一些逻辑上的模块函数什么的，不包含他的.beam，只使用他的.beam，也不更改他的任何.erl文件，这样应该可以免费闭源使用吧？希望高手指点指点，谢谢！]]></description>
		<wfw:commentRss>http://erlang-china.org/study/about_epl_license.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>erlang 的源代码保护机制</title>
		<link>http://erlang-china.org/study/erlang_sourcecode_protect.html</link>
		<comments>http://erlang-china.org/study/erlang_sourcecode_protect.html#comments</comments>
		<pubDate>Wed, 14 Jan 2009 06:25:40 +0000</pubDate>
		<dc:creator>jackyz</dc:creator>
				<category><![CDATA[study]]></category>
		<category><![CDATA[protect]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[sourcecode]]></category>

		<guid isPermaLink="false">http://erlang-china.org/?p=354</guid>
		<description><![CDATA[稍微深入研究过一点 java 的同学，恐怕都知道什么叫做 “反编译” 。也就是说，随便拿一个 class 文件，找一个 jad 来，所有的 “智慧结晶” 就全都 “真相大白” 了，跟原先的 source code 相比，区别只是没有注释而已。 对于开源软件开发者来说，这本是无所谓的事，但对于商业开发者而言，这简直就是噩梦。在 java 的世界，道高一尺魔高一丈(及其反复迭代)的结果是，这件事最终演变得比较诡异，以至于专门诞生了一个名叫 “代码混淆” 的产业。在我上一次关注的时候，这个领域的最新进展是可以 “混淆” 程序执行的流程，以至于正常的人类阅读反编译出来的源码，将会导致严重的脑残。不过，传说又出了个叫做 “流程优化器” 的东东……(这个故事未完待续)。 其实，这件事困扰的不仅只是 java ，几乎所有 “有源代码” 的程序都有这个烦恼。比如，饱受折磨的还有 php, asp 以及 .net。不知道有没有高人能从 “机器码” 反编译出 C 和 C++ 的源程序呢，反正我挺好奇的。不过，话说回来， “没有源代码” 的程序，恐怕还真的没有。保护源代码，在我们现如今 “处处是山寨，遍地是豺狼” 的产业现状之下，似乎仍然是个不得不认真对待的事情。 在源代码保护的问题上，Erlang 的表现又会如何？今天体验了一把，应该说，设计得很细致，至于说这样的设计是否能够完全杜绝源代码的泄露，这个问题恐怕仍然需要留给 “专家” 们去研究。好吧，口水就喷到这里，下面上干货。 目前这个阶段，对 Erlang 源代码的保护，主要是在 debug_info 上做手脚，因为，在 debug_info 里面有完整的源代码，可以极其轻松的从中 [...]]]></description>
		<wfw:commentRss>http://erlang-china.org/study/erlang_sourcecode_protect.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Mnesia的分布式</title>
		<link>http://erlang-china.org/study/mnesia_dist.html</link>
		<comments>http://erlang-china.org/study/mnesia_dist.html#comments</comments>
		<pubDate>Thu, 18 Dec 2008 15:05:04 +0000</pubDate>
		<dc:creator>Godwit</dc:creator>
				<category><![CDATA[study]]></category>

		<guid isPermaLink="false">http://erlang-china.org/misc/mnesia%e7%9a%84%e5%88%86%e5%b8%83%e5%bc%8f.html</guid>
		<description><![CDATA[Mnesia的分布式如何使用呢？做了个简单的测试： 代码如下： -module( db ). -compile(&#160;export_all ). -include_lib(&#160;&#34;stdlib/include/qlc.hrl&#34; ). -include_lib(&#160;&#34;eunit/include/eunit.hrl&#34; ). &#160; %% player -record(&#160;player, { oid,&#160; &#160; &#160; &#160; %% object id username } ). &#160; table_data() -&#62; [&#160;%% The player table { player, 1, &#34;david1&#34; }, { player, 2, &#34;david2&#34; }, { player, 3, &#34;david3&#34; }, { player, 4, &#34;david4&#34; }, { player, [...]]]></description>
		<wfw:commentRss>http://erlang-china.org/study/mnesia_dist.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
