<?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>胡搞瞎搞工作室</title>
	<atom:link href="http://unbe.cn/feed/" rel="self" type="application/rss+xml" />
	<link>http://unbe.cn</link>
	<description></description>
	<lastBuildDate>Wed, 08 Sep 2010 01:57:51 +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>erlang的ms_transform模块文档</title>
		<link>http://unbe.cn/erlang_ms_transform_doc/</link>
		<comments>http://unbe.cn/erlang_ms_transform_doc/#comments</comments>
		<pubDate>Wed, 08 Sep 2010 01:49:44 +0000</pubDate>
		<dc:creator>达达</dc:creator>
				<category><![CDATA[作品]]></category>
		<category><![CDATA[Erlang]]></category>

		<guid isPermaLink="false">http://unbe.cn/?p=517</guid>
		<description><![CDATA[花了些时间翻译了erlang的ms_transform模块文档，希望对大家有所帮助。 原文地址：猛击打开链接 模块 ms_transform 概要 本模块通过parse_fransform机制，在编译时将“高阶函数”（fun）解析并翻译为“匹配规格”（match specifications）。 描述 本模块实现了parse_transform，以将ets和dbg的 fun2ms/1 调用转化为文字匹配的规格。它还为来自于erlang shell的调用实现了相同函数的后端。 高阶函数到匹配规格的翻译是通过调用两个“伪函数”：ets:fun2ms/1 和 dbg:fun2ms/1 实现的。 警告：要使用伪函数触发翻译，首先必须在代码中包含头文件 ms_transform.hrl。不这样做，将可能导致运行时错误而不是编译时，因为没有翻译的erlang程序可能被当成合法的表达式而不会触发编译时错误。 警告：被翻译的高阶函数必须在伪函数的参数列表中构造，而不能先绑定到一个变量再将变量传递给 ets:fun2ms 或 dbg:fun2ms ，即这种情况是合法的：ets:fun2ms(fun(A) -> A end) 而这种情况是不合法的：F = fun(A) -> A end, ets:fun2ms(F). 在正确包含了头文件的情况下后者将导致一个编译时错误，否则将在运行时出错。即使后面这种构造可以看起来正常运行，但事实不那样，所以请用于不要使用后一种构造。 对于被翻译成匹配规格的高阶函数有若干的限制。简单说来，你不能在fun中使用任何match_spac所不能使用的东西。这意味着，除了其它外，fun主要有下列几点限制： 不能调用erlang编写的任何函数，不论是本地函数、全局函数或是真正的高阶函数。 所有函数调用将被翻译成匹配规格的内置函数调用，因此调用 is_list(X) 将被翻译成 {&#180;is_list&#180;, &#180;$1&#180;} （&#180;$ 1&#180;只是一个例子，编号可能有所不同）。试图调用一个不是匹配规格内置的函数将会导致错误。 在高阶函数头部声明的变量，将被顺序性的替换为匹配规格变量，所以片段 fun({A,B,C}) 将被替换为 {&#180;$1&#180;, &#180;$2&#180;, &#180;$3&#180;} 。所有后续对这些变量的引用，都将以同样的方式被替换为匹配规格变量，所以高阶函数 fun({A,B}) when is_atom(A) -> B [...]]]></description>
		<wfw:commentRss>http://unbe.cn/erlang_ms_transform_doc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erlang监视并自动恢复子进程</title>
		<link>http://unbe.cn/erlang_auto_resume_process/</link>
		<comments>http://unbe.cn/erlang_auto_resume_process/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 15:19:37 +0000</pubDate>
		<dc:creator>达达</dc:creator>
				<category><![CDATA[实验]]></category>
		<category><![CDATA[Erlang]]></category>

		<guid isPermaLink="false">http://unbe.cn/?p=510</guid>
		<description><![CDATA[前段时间做过一个监视子进程并在子进程异常退出时自动重启子进程的实验，下面整理一下代码做个记录。 监视器模块 主要原理是通过process_flag(trap_exit, true)让父进程可以接收到子进程退出时的{&#8216;EXIT&#8217;, Pid, Reason}消息，然后通过Pid找到子进程的入口函数，重新spawn以实现重启子进程的目的。 以下是监视进程的代码，通过start函数先启动监视进程，然后通过spawn_and_watch函数启动并注册受监控的子进程。 -module(proc_watcher). -export([start/0, spawn_and_watch/4, proc_watcher_loop/0]). start () -&#62; register(proc_watcher, spawn(?MODULE, proc_watcher_loop, [])). spawn_and_watch (ProcName, Module, Function, Args) -&#62; proc_watcher ! {spawn, self(), {ProcName, Module, Function, Args}}, receive {spawn_ok, Pid} -&#62; {ok, Pid} end. proc_watcher_loop () -&#62; process_flag(trap_exit, true), receive {spawn, From, {ProcName, Module, Function, Args}} -&#62; case catch spawn_link(Module, [...]]]></description>
		<wfw:commentRss>http://unbe.cn/erlang_auto_resume_process/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Princess</title>
		<link>http://unbe.cn/princess/</link>
		<comments>http://unbe.cn/princess/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 12:49:53 +0000</pubDate>
		<dc:creator>elek</dc:creator>
				<category><![CDATA[作品]]></category>
		<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://unbe.cn/?p=479</guid>
		<description><![CDATA[UIAward 2010 手机类 最佳交互设计奖 &#8211; Princess]]></description>
		<wfw:commentRss>http://unbe.cn/princess/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erlang与Flash的Socket通讯－03</title>
		<link>http://unbe.cn/erlang_flash_socket_test_03/</link>
		<comments>http://unbe.cn/erlang_flash_socket_test_03/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 08:57:20 +0000</pubDate>
		<dc:creator>达达</dc:creator>
				<category><![CDATA[实验]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Socket]]></category>

		<guid isPermaLink="false">http://unbe.cn/?p=341</guid>
		<description><![CDATA[今天和阿灿为项目做一个多人在线行走的Demo，在Flash端遇到数据“粘包”的问题，下面记录一下原理和处理办法。 什么是“粘包”呢？粘包是指数据发送端希望接受端收到的数据包因为网络的“流”特性，使得连续的数据包的字节连贯在一起，导致接收端无法以数据包为单位处理数据的情况。 打个比方吧，A和B两个人通过一根水管互相传递水，他们通过每次接到的水的重量来判断对方表达的意思。如果A连续乘了不同重量的几杯水倒入水管中传递给B，B那一头打开水龙头接到的只能是连贯的水流，而不是一杯杯的水，数据在网络上传递也是同样道理，数据是以流的方式传递的，通讯双方需要通过一定的协议来分割数据流。 防止粘包的典型处理方式有两种，一种是通过判断结束符来分割数据包，这种方式就得确保分隔符不会出现在数据包的主体中，有一定的局限性；另一种是通过在数据包的开始部分加上固定字节长度的一个头部，用以表示数据包的长度。 Erlang天生就具备了解析数据包长度的功能，通过设置socket的{packet, 2}属性，Erlang会在接收到数据时会自动按数据的头两个字节表示的短整型值来分割数据包，所以在Erlang端没有粘包问题。但是在Flash端如果惯性思维的以为数据包会分次到达并分别触发SocketData事件那就会出问题了，由于网络的不可靠性，一个数据包有可能在触发N次SocketData事件后才完整接收完毕，也可能一次SocketData事件接收到的数据包含连续多个数据包，甚至尾部有可能包含最后一个数据包的起始部分但又不完整。 之前的实验有证明了Flash端通过writeUTF函数可以跟Erlang的{packet, 2}模式对应，但是这种方式只能传递字符串，当需要传递二进制数据的时候就只能靠自己拆包和解包了。下面是与Erlang的{packet, 2}模式对应的Flash客户端接收数据的代码： private static var pack_len : int; private static var buffer : ByteArray; private static function OnSocketData (event:ProgressEvent) : void { while (socket.bytesAvailable &#62; 0) { if (pack_len == -1) { pack_len = socket.readShort(); buffer = new ByteArray(); } socket.readBytes(buffer, 0, pack_len - buffer.length); if (buffer.length == [...]]]></description>
		<wfw:commentRss>http://unbe.cn/erlang_flash_socket_test_03/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu 10.04上编译安装Erlang R14A</title>
		<link>http://unbe.cn/compile_erlang-r14a_on_ubuntu-10-04/</link>
		<comments>http://unbe.cn/compile_erlang-r14a_on_ubuntu-10-04/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 17:50:46 +0000</pubDate>
		<dc:creator>达达</dc:creator>
				<category><![CDATA[实验]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://unbe.cn/?p=332</guid>
		<description><![CDATA[Ubuntu 10.04自带了基本的Erlang运行环境，但是版本比较久，要安装最新版还是得自己编译。记录一下过程，方便以后自己重新配置环境。 首先得卸载系统自带的Erlang和相关程序： sudo apt-get remove \ erlang-ssl \ couchdb-bin \ erlang-base \ erlang-xmerl \ erlang-inets \ erlang-crypto \ erlang-mnesia \ erlang-public-key \ erlang-syntax-tools \ erlang-runtime-tools 安装Erlang编译时依赖的各种库和工具： sudo apt-get install \ m4 \ fop \ xsltproc \ unixodbc \ libssl-dev \ unixodbc-dev \ openjdk-6-jdk \ freeglut3-dev \ libwxgtk2.8-dev \ libncurses5-dev \ build-essential 配置安装路径和参与编译的功能： ./configure \ [...]]]></description>
		<wfw:commentRss>http://unbe.cn/compile_erlang-r14a_on_ubuntu-10-04/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
